commit dd3f408ff90b5a247eae71eeb1cf0675165d44c2 Author: lishenfeng Date: Mon May 19 14:26:18 2025 +0800 init(): 初始化 diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..4f79a0f --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +GENERATE_SOURCEMAP=false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/craco.config.js b/craco.config.js new file mode 100644 index 0000000..0b17bd0 --- /dev/null +++ b/craco.config.js @@ -0,0 +1,19 @@ +const CracoLessPlugin = require('craco-less'); + +module.exports = { + plugins: [ + { + plugin: CracoLessPlugin, + options: { + lessLoaderOptions: { + lessOptions: { + modifyVars: { + '@layout-header-background': '#061436', + }, + javascriptEnabled: true, + }, + }, + }, + }, + ], +}; diff --git a/debug.log b/debug.log new file mode 100644 index 0000000..4abc6b0 --- /dev/null +++ b/debug.log @@ -0,0 +1,6 @@ +[1114/095321.464:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) +[1116/091828.461:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) +[1117/102526.529:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) +[1125/095515.441:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) +[1214/094537.239:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) +[1215/094539.088:ERROR:directory_reader_win.cc(43)] FindFirstFile: ϵͳҲָ· (0x3) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4a04a93 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18687 @@ +{ + "name": "hplcs-web", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", + "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", + "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.6", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "requires": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@craco/craco": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-5.9.0.tgz", + "integrity": "sha512-2Q8gIB4W0/nPiUxr9iAKUhGsFlXYN0/wngUdK1VWtfV2NtBv+yllNn2AjieaLbttgpQinuOYmDU65vocC0NMDg==", + "requires": { + "cross-spawn": "^7.0.0", + "lodash": "^4.17.15", + "webpack-merge": "^4.2.2" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "@date-io/core": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", + "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==" + }, + "@date-io/moment": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-1.3.13.tgz", + "integrity": "sha512-3kJYusJtQuOIxq6byZlzAHoW/18iExJer9qfRF5DyyzdAk074seTuJfdofjz4RFfTd/Idk8WylOQpWtERqvFuQ==", + "requires": { + "@date-io/core": "^1.3.13" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@fullcalendar/core": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-4.4.2.tgz", + "integrity": "sha512-vq7KQGuAJ1ieFG5tUqwxwUwmXYtblFOTjHaLAVHo6iEPB52mS7DS45VJfkhaQmX4+5/+BHRpg82G1qkuAINwtg==" + }, + "@fullcalendar/daygrid": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-4.4.2.tgz", + "integrity": "sha512-axjfMhxEXHShV3r2TZjf+2niJ1C6LdAxkHKmg7mVq4jXtUQHOldU5XsjV0v2lUAt1urJBFi2zajfK8798ukL3Q==" + }, + "@fullcalendar/interaction": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-4.4.2.tgz", + "integrity": "sha512-3ItpGFnxcYQT4NClqhq93QTQwOI8x3mlMf5M4DgK5avVaSzpv9g8p+opqeotK2yzpFeINps06cuQyB1h7vcv1Q==" + }, + "@fullcalendar/react": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-4.4.2.tgz", + "integrity": "sha512-CObyC53Ph2wer83XOm2ae7gEDP5YuENbycetnKgXPLrUVx94hxJGo+G8lZFI4LeUG1nkecfNCpazoa3+x0yKsQ==", + "requires": { + "@fullcalendar/core": "~4.4.0", + "fast-deep-equal": "^2.0.1" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.5" + } + }, + "@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" + }, + "@mapbox/mapbox-gl-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.0.tgz", + "integrity": "sha512-zu4udqYiBrKMQKwpKJ4hhPON7tz0QR/JZ3iGpHnNWFmH3Sv/ysxlICATUtGCFpsyJf2v1WpFhlzaZ3GhhKmPMA==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, + "@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@material-ui/core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.4.tgz", + "integrity": "sha512-oqb+lJ2Dl9HXI9orc6/aN8ZIAMkeThufA5iZELf2LQeBn2NtjVilF5D2w7e9RpntAzDb4jK5DsVhkfOvFY/8fg==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.11.3", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz", + "integrity": "sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@material-ui/pickers": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.10.tgz", + "integrity": "sha512-hS4pxwn1ZGXVkmgD4tpFpaumUaAg2ZzbTrxltfC5yPw4BJV+mGkfnQOB4VpWEYZw2jv65Z0wLwDE/piQiPPZ3w==", + "requires": { + "@babel/runtime": "^7.6.0", + "@date-io/core": "1.x", + "@types/styled-jsx": "^2.2.8", + "clsx": "^1.0.2", + "react-transition-group": "^4.0.0", + "rifm": "^0.7.0" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz", + "integrity": "sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "@rematch/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rematch/core/-/core-1.4.0.tgz", + "integrity": "sha512-1zy9cTYxbvDHP0PwIL1QqkwagCEnqA0uWMmPf8v2BYvLi2OsxIfX1xiV+vCP3sdJAjjZ0b9+IbSmj0DL2MEgLQ==", + "requires": { + "redux": "^4.0.5" + } + }, + "@rematch/persist": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rematch/persist/-/persist-1.1.6.tgz", + "integrity": "sha512-gqrMAJrTpisU+AYVLkMjXaYECj80RKtLflguvCcAU/VmhBcJAfQZ1v/MCobIh8n2ez1y30ztA7oNbuB4/WVfzA==", + "requires": { + "redux-persist": "^5.10.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@turf/along": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/along/-/along-5.1.5.tgz", + "integrity": "sha1-YdbmplhKzdq1asVYTge/jL5fi+s=", + "requires": { + "@turf/bearing": "^5.1.5", + "@turf/destination": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/area": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-5.1.5.tgz", + "integrity": "sha1-79iZv9Jgzb0VQbKjwVX4pdLu+h0=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/bbox": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-5.1.5.tgz", + "integrity": "sha1-MFHfUUrUxQ9KT5uKLRX9i2hA7aM=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/bbox-clip": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-5.1.5.tgz", + "integrity": "sha1-M2S1Mo3/nzz0HZ4C7a/zdNFQzIQ=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "lineclip": "^1.1.5" + } + }, + "@turf/bbox-polygon": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-5.1.5.tgz", + "integrity": "sha1-auuk7VHYXSluD3w4uIwznwHu4CQ=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/bearing": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-5.1.5.tgz", + "integrity": "sha1-egt5ATbE70eX8CRjBdRcvi0ns/c=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/bezier-spline": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-5.1.5.tgz", + "integrity": "sha1-WaJ7ul17l+8Vqz/VpA+9I4cEm8o=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/boolean-clockwise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-5.1.5.tgz", + "integrity": "sha1-MwK32sYsXikaB4nimvcoM4f6nes=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/boolean-contains": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-5.1.5.tgz", + "integrity": "sha1-WW1jruY2961T7pn5/yTJaZSg7xQ=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/boolean-point-on-line": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/boolean-crosses": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-5.1.5.tgz", + "integrity": "sha1-Ab+uollvFk3kpNMlCU3HwlXHFdY=", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/polygon-to-line": "^5.1.5" + } + }, + "@turf/boolean-disjoint": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-5.1.6.tgz", + "integrity": "sha512-KHvUS6SBNYHBCLIJEJrg04pF5Oy+Fqn8V5G9U+9pti5vI9tyX7Ln2g7RSB7iJ1Cxsz8QAi6OukhXjEF2/8ZpGg==", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/polygon-to-line": "^5.1.5" + } + }, + "@turf/boolean-equal": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-5.1.5.tgz", + "integrity": "sha1-Kfj21gu4RQff12WzIlTbjnLJOKQ=", + "requires": { + "@turf/clean-coords": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "geojson-equality": "0.1.6" + } + }, + "@turf/boolean-overlap": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-5.1.5.tgz", + "integrity": "sha1-DU5kxSx3CijpPZ7834qLg3OsznU=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/line-overlap": "^5.1.5", + "@turf/meta": "^5.1.5", + "geojson-equality": "0.1.6" + } + }, + "@turf/boolean-parallel": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-5.1.5.tgz", + "integrity": "sha1-c5NYR16ltlx+GCejw+DopofTqF0=", + "requires": { + "@turf/clean-coords": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/line-segment": "^5.1.5", + "@turf/rhumb-bearing": "^5.1.5" + } + }, + "@turf/boolean-point-in-polygon": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-5.1.5.tgz", + "integrity": "sha1-8BzBlNHgMKVIv9qYHLpDz9YpQbc=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/boolean-point-on-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-5.1.5.tgz", + "integrity": "sha1-9jPF/4Aq0ku48Vja269v9KAj3Xs=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/boolean-within": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-5.1.5.tgz", + "integrity": "sha1-RxBdVtB1Kp0Pv81Dw2pfkUnchpc=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/boolean-point-on-line": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/buffer": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-5.1.5.tgz", + "integrity": "sha1-hByWJ8+5dLEirE4alW8EZrwCMcQ=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/center": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/projection": "^5.1.5", + "d3-geo": "1.7.1", + "turf-jsts": "*" + } + }, + "@turf/center": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/center/-/center-5.1.5.tgz", + "integrity": "sha1-RKss2VT2PA03dX9xWKmcPvURS4A=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/center-mean": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-5.1.5.tgz", + "integrity": "sha1-jI6YdTkeXwnw5uePXWYbiLIQigo=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/center-median": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-5.1.5.tgz", + "integrity": "sha1-u0Yb/noqSGAdikcnaFcYcjoUqHI=", + "requires": { + "@turf/center-mean": "^5.1.5", + "@turf/centroid": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/center-of-mass": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-5.1.5.tgz", + "integrity": "sha1-TTvXnYhJjbq4Mk1PafAyL2Uguco=", + "requires": { + "@turf/centroid": "^5.1.5", + "@turf/convex": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/centroid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-5.1.5.tgz", + "integrity": "sha1-d4radCFjNQIa2P0OemWoNJ1Tx2k=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/circle": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-5.1.5.tgz", + "integrity": "sha1-mxV3g1UIq1L7HBCypQZcuiuHtqU=", + "requires": { + "@turf/destination": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/clean-coords": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-5.1.5.tgz", + "integrity": "sha1-EoAKmKeMmkUqcuxChJPEOs8q2h8=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/clone": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", + "integrity": "sha1-JT6NNUdxgZduM636tQoPAqfw42c=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/clusters": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-5.1.5.tgz", + "integrity": "sha1-ZzpeXxsZycq6vFfJCO6t1oIiTdQ=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/clusters-dbscan": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-5.1.5.tgz", + "integrity": "sha1-V4H7TmVsdHoLjpk333MYHAMJ4m8=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "density-clustering": "1.3.0" + } + }, + "@turf/clusters-kmeans": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-5.1.5.tgz", + "integrity": "sha1-/W3+qLEzuovcI3CsPKzuFYejAvE=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "skmeans": "0.9.7" + } + }, + "@turf/collect": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-5.1.5.tgz", + "integrity": "sha1-/pjJqMIY7PJP/DPXApUXt8GbKj4=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5", + "rbush": "^2.0.1" + }, + "dependencies": { + "quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "requires": { + "quickselect": "^1.0.1" + } + } + } + }, + "@turf/combine": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-5.1.5.tgz", + "integrity": "sha1-uxS976VVBDVxlfwaEkzX1TqMiQU=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/concave": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-5.1.5.tgz", + "integrity": "sha1-I7uqw4fQNLlldKG9cNBZI3qdIRA=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/tin": "^5.1.5", + "topojson-client": "3.x", + "topojson-server": "3.x" + } + }, + "@turf/convex": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-5.1.5.tgz", + "integrity": "sha1-Dfk3fdACIWzpghsH9wXgN9rj4B0=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5", + "concaveman": "*" + } + }, + "@turf/destination": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-5.1.5.tgz", + "integrity": "sha1-7TU4G9zoO73cvQei4rzivd/7zCY=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/difference": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-5.1.5.tgz", + "integrity": "sha1-ok1pCnvKgD8QkKnuO52Qb8Q3H0I=", + "requires": { + "@turf/area": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "turf-jsts": "*" + } + }, + "@turf/dissolve": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-5.1.5.tgz", + "integrity": "sha1-LPEzqQIdIWODHD16lY1lB/nYGTg=", + "requires": { + "@turf/boolean-overlap": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/union": "^5.1.5", + "geojson-rbush": "2.1.0", + "get-closest": "*" + } + }, + "@turf/distance": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-5.1.5.tgz", + "integrity": "sha1-Oc8YIEu/h1h9cH5gmmARiQkVZAk=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/ellipse": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-5.1.5.tgz", + "integrity": "sha1-1XyrhTmFkgzeYCKKeNgEWAJcVL4=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/rhumb-destination": "^5.1.5", + "@turf/transform-rotate": "^5.1.5" + } + }, + "@turf/envelope": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-5.1.5.tgz", + "integrity": "sha1-UBMwnFP91D369LWIplw/7X28EIo=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/bbox-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/explode": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-5.1.5.tgz", + "integrity": "sha1-sSsvd0AEobSPYrqVsgocZVo94Rg=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/flatten": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-5.1.5.tgz", + "integrity": "sha1-2iknBnEz7WFpsLnWB7khVoiqE1g=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/flip": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-5.1.5.tgz", + "integrity": "sha1-Q29kOnIvDKU7n85jjkaT2zYIpoo=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/great-circle": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-5.1.5.tgz", + "integrity": "sha1-3r+2cc5HVQnLY3MBwV/PzPo1mpM=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha1-FTQFInq5M9AEpbuWQantmZ/L4M8=" + }, + "@turf/hex-grid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-5.1.5.tgz", + "integrity": "sha1-m3ul/s9QUfHoWJL3E/zlxVBQKmo=", + "requires": { + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/intersect": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/interpolate": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-5.1.5.tgz", + "integrity": "sha1-DxLwq3VtbdEK+ykMpuh3ve8BPqo=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/centroid": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/hex-grid": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/point-grid": "^5.1.5", + "@turf/square-grid": "^5.1.5", + "@turf/triangle-grid": "^5.1.5" + } + }, + "@turf/intersect": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-5.1.6.tgz", + "integrity": "sha512-KXyNv/GXdoGAOy03qZF53rgtXC2tNhF/4jLwTKiVRrBQH6kcEpipGStdJ+QkYIlarQPa8f7I9UlVAB19et4MfQ==", + "requires": { + "@turf/clean-coords": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/truncate": "^5.1.5", + "turf-jsts": "*" + } + }, + "@turf/invariant": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.1.5.tgz", + "integrity": "sha1-9Z9P76CSJLFdzhZR+QPIaNV6JOE=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/isobands": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-5.1.5.tgz", + "integrity": "sha1-a0TO9YTVUaMTBBh68jtKFYLj8I0=", + "requires": { + "@turf/area": "^5.1.5", + "@turf/bbox": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/explode": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/isolines": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-5.1.5.tgz", + "integrity": "sha1-irTn9Cuz38VGFOW/FVln9+VdLeE=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/kinks": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-5.1.5.tgz", + "integrity": "sha1-irtpYdm7AQchO63fLCwmQNAlaYA=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/length": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/length/-/length-5.1.5.tgz", + "integrity": "sha1-86X4ZMK5lqi7RxeUU1ofrxLuvvs=", + "requires": { + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/line-arc": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-5.1.5.tgz", + "integrity": "sha1-AHinRHg1oSrkFKIR+aZNEYYVDhU=", + "requires": { + "@turf/circle": "^5.1.5", + "@turf/destination": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/line-chunk": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-5.1.5.tgz", + "integrity": "sha1-kQqFwFwG2dD5w4l3oF4IGNUIXEI=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/length": "^5.1.5", + "@turf/line-slice-along": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/line-intersect": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-5.1.5.tgz", + "integrity": "sha1-DikHGuQDKV5JFyO8SfXPrI0R3fM=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-segment": "^5.1.5", + "@turf/meta": "^5.1.5", + "geojson-rbush": "2.1.0" + } + }, + "@turf/line-offset": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-5.1.5.tgz", + "integrity": "sha1-KrWy8In4yRPiMdmUN4553KkLWh4=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/line-overlap": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-5.1.5.tgz", + "integrity": "sha1-lDxvh6A4bcQ9+sEdKz/5wRLNP2A=", + "requires": { + "@turf/boolean-point-on-line": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-segment": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/nearest-point-on-line": "^5.1.5", + "geojson-rbush": "2.1.0" + } + }, + "@turf/line-segment": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-5.1.5.tgz", + "integrity": "sha1-Mgeq7lRqskw9jcPMY/kcdwuAE+U=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/line-slice": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-5.1.5.tgz", + "integrity": "sha1-Hs/OFGKjeFeXVM7fRGTN4mgp8rU=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/nearest-point-on-line": "^5.1.5" + } + }, + "@turf/line-slice-along": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-5.1.5.tgz", + "integrity": "sha1-7drQoh70efKWihG9LdcomiEy6aU=", + "requires": { + "@turf/bearing": "^5.1.5", + "@turf/destination": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/line-split": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-5.1.5.tgz", + "integrity": "sha1-Wy30w3YZty73JbUWPPmSbVVArLc=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/line-segment": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/nearest-point-on-line": "^5.1.5", + "@turf/square": "^5.1.5", + "@turf/truncate": "^5.1.5", + "geojson-rbush": "2.1.0" + } + }, + "@turf/line-to-polygon": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-5.1.5.tgz", + "integrity": "sha1-ITz0Gmj4Ikd4ujnTGH3sPouBhlo=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/mask": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-5.1.5.tgz", + "integrity": "sha1-mrD+8aJyyY/j70kvn/thggayQtU=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/union": "^5.1.5", + "rbush": "^2.0.1" + }, + "dependencies": { + "quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "requires": { + "quickselect": "^1.0.1" + } + } + } + }, + "@turf/meta": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.1.6.tgz", + "integrity": "sha1-wgqGPt7Qhp+yhUje6Ik0G8y0akY=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/midpoint": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-5.1.5.tgz", + "integrity": "sha1-4mH2srDqgSTM7/VSomLdRlydBfA=", + "requires": { + "@turf/bearing": "^5.1.5", + "@turf/destination": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/nearest-point": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-5.1.5.tgz", + "integrity": "sha1-EgUN5Bw5hEMiTHl43g9iE5ANNPs=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/nearest-point-on-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-5.1.5.tgz", + "integrity": "sha1-VgauKX8VlHUkvqUaKp71HsG/nDY=", + "requires": { + "@turf/bearing": "^5.1.5", + "@turf/destination": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-intersect": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/nearest-point-to-line": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-5.1.6.tgz", + "integrity": "sha512-ZSvDIEiHhifn/vNwLXZI/E8xmEz5yBPqfUR7BVHRZrB1cP7jLhKZvkbidjG//uW8Fr1Ulc+PFOXczLspIcx/lw==", + "requires": { + "@turf/helpers": "6.x", + "@turf/invariant": "6.x", + "@turf/meta": "6.x", + "@turf/point-to-line-distance": "^5.1.5", + "object-assign": "*" + }, + "dependencies": { + "@turf/helpers": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.4.0.tgz", + "integrity": "sha512-7vVpWZwHP0Qn8DDSlM++nhs3/6zfPt+GODjvLVZ+sWIG4S3vOtUUOfO5eIjRzxsUHHqhgiIL0QA17u79uLM+mQ==" + }, + "@turf/invariant": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.4.0.tgz", + "integrity": "sha512-ncAiOLkL6Ul6NnyOZSSmEbTwcZZ8PTx7O1IzB89Ed/mAe1g5PvFnyFieWbcnERGmuqH1ftzgtWMFFHFi2PQLsg==", + "requires": { + "@turf/helpers": "^6.4.0" + } + }, + "@turf/meta": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.4.0.tgz", + "integrity": "sha512-fMra6vMskwz1knn0/tb22ppOeE8CCmpvOvTIxLdV1WYWAoC4bJ4WdXKvZRsJKpHOX5iFehx4DT8aaGdROA4Y3Q==", + "requires": { + "@turf/helpers": "^6.4.0" + } + } + } + }, + "@turf/planepoint": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-5.1.5.tgz", + "integrity": "sha1-GLvfAG91ne9eQsagBsn53oGyt/8=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/point-grid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-5.1.5.tgz", + "integrity": "sha1-MFFBJI9Quv42zn5mukuX56sjaIc=", + "requires": { + "@turf/boolean-within": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/point-on-feature": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-5.1.5.tgz", + "integrity": "sha1-MMfwMkMCd8ZBjZbSieRba/shP+c=", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/center": "^5.1.5", + "@turf/explode": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/nearest-point": "^5.1.5" + } + }, + "@turf/point-to-line-distance": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-5.1.6.tgz", + "integrity": "sha512-PE3hiTeeDEi4ZLPtI8XAzFYW9nHo1EVsZGm/4ZVV8jo39d3X1oLVHxY3e1PkCmWwRapXy4QLqvnTQ7nU4wspNw==", + "requires": { + "@turf/bearing": "6.x", + "@turf/distance": "6.x", + "@turf/helpers": "6.x", + "@turf/invariant": "6.x", + "@turf/meta": "6.x", + "@turf/projection": "6.x", + "@turf/rhumb-bearing": "6.x", + "@turf/rhumb-distance": "6.x" + }, + "dependencies": { + "@turf/bearing": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.4.0.tgz", + "integrity": "sha512-CmMsT8hSzzhZWe0+49OP48m/EAXryZjNh/7D/0nqMIlayslRZ+bHuV3KcrOCD20xoDFtBuSEdwEd6i4+2Nw3LA==", + "requires": { + "@turf/helpers": "^6.4.0", + "@turf/invariant": "^6.4.0" + } + }, + "@turf/clone": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.4.0.tgz", + "integrity": "sha512-m0MzpW601CQJ7al3XireJNPrKz6KHMnbWysS6p4qkG7E70c+S8ST0y6gj1CfdkdS7ee3GevEg7V6sxdj2lCs4w==", + "requires": { + "@turf/helpers": "^6.4.0" + } + }, + "@turf/distance": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.4.0.tgz", + "integrity": "sha512-EyNEfHfFNVwLHsD31hIpaDInoxlwUFZAVryTWxDu6O+XNE+VfVomMUxLYPm3t0tVqVNUGwOhYo5Z4HfTlr6V1g==", + "requires": { + "@turf/helpers": "^6.4.0", + "@turf/invariant": "^6.4.0" + } + }, + "@turf/helpers": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.4.0.tgz", + "integrity": "sha512-7vVpWZwHP0Qn8DDSlM++nhs3/6zfPt+GODjvLVZ+sWIG4S3vOtUUOfO5eIjRzxsUHHqhgiIL0QA17u79uLM+mQ==" + }, + "@turf/invariant": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.4.0.tgz", + "integrity": "sha512-ncAiOLkL6Ul6NnyOZSSmEbTwcZZ8PTx7O1IzB89Ed/mAe1g5PvFnyFieWbcnERGmuqH1ftzgtWMFFHFi2PQLsg==", + "requires": { + "@turf/helpers": "^6.4.0" + } + }, + "@turf/meta": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.4.0.tgz", + "integrity": "sha512-fMra6vMskwz1knn0/tb22ppOeE8CCmpvOvTIxLdV1WYWAoC4bJ4WdXKvZRsJKpHOX5iFehx4DT8aaGdROA4Y3Q==", + "requires": { + "@turf/helpers": "^6.4.0" + } + }, + "@turf/projection": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.4.0.tgz", + "integrity": "sha512-UtirO+dz0XMgQUG1y50anzHpFsfGObSwT3zsYJIWm3nsJmYMWOBJpsSQ6hMNua3P9GeQrzphG4qJTsQPQveOcA==", + "requires": { + "@turf/clone": "^6.4.0", + "@turf/helpers": "^6.4.0", + "@turf/meta": "^6.4.0" + } + }, + "@turf/rhumb-bearing": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.4.0.tgz", + "integrity": "sha512-6KeNTzKsTjmvladtKKtaF3/QLPey9Ui954PuNvb6YGW6FSvS4qlMgznyYz18YYhBAkN1OqSjcqTeVvFjXfzoRw==", + "requires": { + "@turf/helpers": "^6.4.0", + "@turf/invariant": "^6.4.0" + } + }, + "@turf/rhumb-distance": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.4.0.tgz", + "integrity": "sha512-r4dsy8sPyp8k5rR6FwXek8c1RG+nLNH1B43yjmIpaLDKcRYoXJSGt1K8SWOkFOGHl36nukq46Meh2IcH43K6aw==", + "requires": { + "@turf/helpers": "^6.4.0", + "@turf/invariant": "^6.4.0" + } + } + } + }, + "@turf/points-within-polygon": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-5.1.5.tgz", + "integrity": "sha1-K4VaXfOq2lfC7oIKB1SrlJKKIzc=", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/polygon-tangents": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-5.1.5.tgz", + "integrity": "sha1-K/AJkUcwJbF44lDcfLmuVAm71lI=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/polygon-to-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-5.1.5.tgz", + "integrity": "sha1-I7tEjYTcTGUZmaxhGjbZHFklA2o=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/polygonize": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-5.1.5.tgz", + "integrity": "sha1-BJP6EYefOdELmtAs5qI+lC0IqjI=", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/envelope": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/projection": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-5.1.5.tgz", + "integrity": "sha1-JFF+7rLzaBa6n3EueubWo2jt91c=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/random": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/random/-/random-5.1.5.tgz", + "integrity": "sha1-sy78k0Vgroulfo67UfJBw5+6Lns=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/rewind": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", + "integrity": "sha1-nqPbSmi3PB/R3RH1djGxQ8/vock=", + "requires": { + "@turf/boolean-clockwise": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/rhumb-bearing": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-5.1.5.tgz", + "integrity": "sha1-rPalAkJ+uMSeGM2mrg7/qwxd3NI=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/rhumb-destination": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-5.1.5.tgz", + "integrity": "sha1-sbKuuSFUfyrAwamUtqEw+SRjx0I=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/rhumb-distance": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-5.1.5.tgz", + "integrity": "sha1-GAaFdiX0IlOE2tQT5p85U4/192U=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/sample": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-5.1.5.tgz", + "integrity": "sha1-6ctEikeJzFbuPeLdZ4HiNDQ1tBE=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/sector": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-5.1.5.tgz", + "integrity": "sha1-rCu5TBPt1gNPb9wrZwCBNdIPXgc=", + "requires": { + "@turf/circle": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/line-arc": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/shortest-path": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-5.1.5.tgz", + "integrity": "sha1-hUroCW9rw+EwD6ynfz6PZ9j5Nas=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/bbox-polygon": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/clean-coords": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/transform-scale": "^5.1.5" + } + }, + "@turf/simplify": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-5.1.5.tgz", + "integrity": "sha1-Csjyei60IYGD7dmZjDJ1q+QIuSY=", + "requires": { + "@turf/clean-coords": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/square": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/square/-/square-5.1.5.tgz", + "integrity": "sha1-qnsh5gM8ySUsOlvW89iNq9b+0YA=", + "requires": { + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5" + } + }, + "@turf/square-grid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-5.1.5.tgz", + "integrity": "sha1-G9X3uesU8LYLwjH+/nNR0aMvGlE=", + "requires": { + "@turf/boolean-contains": "^5.1.5", + "@turf/boolean-overlap": "^5.1.5", + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/intersect": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/standard-deviational-ellipse": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-5.1.5.tgz", + "integrity": "sha1-hc0oO14ayljyG9ZkEuQUtW2FIyQ=", + "requires": { + "@turf/center-mean": "^5.1.5", + "@turf/ellipse": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/points-within-polygon": "^5.1.5" + } + }, + "@turf/tag": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-5.1.5.tgz", + "integrity": "sha1-0e4aUIjs/UoUEQGcmCOczypJfSA=", + "requires": { + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/tesselate": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-5.1.5.tgz", + "integrity": "sha1-MqWU6cIaAEIKn5DSxD3z4RZgYc0=", + "requires": { + "@turf/helpers": "^5.1.5", + "earcut": "^2.0.0" + } + }, + "@turf/tin": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-5.1.5.tgz", + "integrity": "sha1-KCI+r8X76a6azKgc3P6l0UJMkX0=", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/transform-rotate": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-5.1.5.tgz", + "integrity": "sha1-0Jbt2eMA/jFQadVNjkWMQJIh7fs=", + "requires": { + "@turf/centroid": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/rhumb-bearing": "^5.1.5", + "@turf/rhumb-destination": "^5.1.5", + "@turf/rhumb-distance": "^5.1.5" + } + }, + "@turf/transform-scale": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-5.1.5.tgz", + "integrity": "sha1-cP064BhWz3uunxWtVhzf6PiQAbk=", + "requires": { + "@turf/bbox": "^5.1.5", + "@turf/center": "^5.1.5", + "@turf/centroid": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/rhumb-bearing": "^5.1.5", + "@turf/rhumb-destination": "^5.1.5", + "@turf/rhumb-distance": "^5.1.5" + } + }, + "@turf/transform-translate": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-5.1.5.tgz", + "integrity": "sha1-Uwolf7Hccmja3Ks05nkB6yo97GM=", + "requires": { + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5", + "@turf/rhumb-destination": "^5.1.5" + } + }, + "@turf/triangle-grid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-5.1.5.tgz", + "integrity": "sha1-ezZ2IQhVTBTyjK/zxIsc/ILI3IE=", + "requires": { + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/intersect": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/truncate": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-5.1.5.tgz", + "integrity": "sha1-nu37Oxi6gfLJjT6tCUMcyhiErYk=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "@turf/turf": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-5.1.6.tgz", + "integrity": "sha1-wxIlkoh+0jS3VGi4qMRb+Ib7+PY=", + "requires": { + "@turf/along": "5.1.x", + "@turf/area": "5.1.x", + "@turf/bbox": "5.1.x", + "@turf/bbox-clip": "5.1.x", + "@turf/bbox-polygon": "5.1.x", + "@turf/bearing": "5.1.x", + "@turf/bezier-spline": "5.1.x", + "@turf/boolean-clockwise": "5.1.x", + "@turf/boolean-contains": "5.1.x", + "@turf/boolean-crosses": "5.1.x", + "@turf/boolean-disjoint": "5.1.x", + "@turf/boolean-equal": "5.1.x", + "@turf/boolean-overlap": "5.1.x", + "@turf/boolean-parallel": "5.1.x", + "@turf/boolean-point-in-polygon": "5.1.x", + "@turf/boolean-point-on-line": "5.1.x", + "@turf/boolean-within": "5.1.x", + "@turf/buffer": "5.1.x", + "@turf/center": "5.1.x", + "@turf/center-mean": "5.1.x", + "@turf/center-median": "5.1.x", + "@turf/center-of-mass": "5.1.x", + "@turf/centroid": "5.1.x", + "@turf/circle": "5.1.x", + "@turf/clean-coords": "5.1.x", + "@turf/clone": "5.1.x", + "@turf/clusters": "5.1.x", + "@turf/clusters-dbscan": "5.1.x", + "@turf/clusters-kmeans": "5.1.x", + "@turf/collect": "5.1.x", + "@turf/combine": "5.1.x", + "@turf/concave": "5.1.x", + "@turf/convex": "5.1.x", + "@turf/destination": "5.1.x", + "@turf/difference": "5.1.x", + "@turf/dissolve": "5.1.x", + "@turf/distance": "5.1.x", + "@turf/ellipse": "5.1.x", + "@turf/envelope": "5.1.x", + "@turf/explode": "5.1.x", + "@turf/flatten": "5.1.x", + "@turf/flip": "5.1.x", + "@turf/great-circle": "5.1.x", + "@turf/helpers": "5.1.x", + "@turf/hex-grid": "5.1.x", + "@turf/interpolate": "5.1.x", + "@turf/intersect": "5.1.x", + "@turf/invariant": "5.1.x", + "@turf/isobands": "5.1.x", + "@turf/isolines": "5.1.x", + "@turf/kinks": "5.1.x", + "@turf/length": "5.1.x", + "@turf/line-arc": "5.1.x", + "@turf/line-chunk": "5.1.x", + "@turf/line-intersect": "5.1.x", + "@turf/line-offset": "5.1.x", + "@turf/line-overlap": "5.1.x", + "@turf/line-segment": "5.1.x", + "@turf/line-slice": "5.1.x", + "@turf/line-slice-along": "5.1.x", + "@turf/line-split": "5.1.x", + "@turf/line-to-polygon": "5.1.x", + "@turf/mask": "5.1.x", + "@turf/meta": "5.1.x", + "@turf/midpoint": "5.1.x", + "@turf/nearest-point": "5.1.x", + "@turf/nearest-point-on-line": "5.1.x", + "@turf/nearest-point-to-line": "5.1.x", + "@turf/planepoint": "5.1.x", + "@turf/point-grid": "5.1.x", + "@turf/point-on-feature": "5.1.x", + "@turf/point-to-line-distance": "5.1.x", + "@turf/points-within-polygon": "5.1.x", + "@turf/polygon-tangents": "5.1.x", + "@turf/polygon-to-line": "5.1.x", + "@turf/polygonize": "5.1.x", + "@turf/projection": "5.1.x", + "@turf/random": "5.1.x", + "@turf/rewind": "5.1.x", + "@turf/rhumb-bearing": "5.1.x", + "@turf/rhumb-destination": "5.1.x", + "@turf/rhumb-distance": "5.1.x", + "@turf/sample": "5.1.x", + "@turf/sector": "5.1.x", + "@turf/shortest-path": "5.1.x", + "@turf/simplify": "5.1.x", + "@turf/square": "5.1.x", + "@turf/square-grid": "5.1.x", + "@turf/standard-deviational-ellipse": "5.1.x", + "@turf/tag": "5.1.x", + "@turf/tesselate": "5.1.x", + "@turf/tin": "5.1.x", + "@turf/transform-rotate": "5.1.x", + "@turf/transform-scale": "5.1.x", + "@turf/transform-translate": "5.1.x", + "@turf/triangle-grid": "5.1.x", + "@turf/truncate": "5.1.x", + "@turf/union": "5.1.x", + "@turf/unkink-polygon": "5.1.x", + "@turf/voronoi": "5.1.x" + } + }, + "@turf/union": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/union/-/union-5.1.5.tgz", + "integrity": "sha1-UyhbYJQEf8WNlqrA6pCGXsNNRUs=", + "requires": { + "@turf/helpers": "^5.1.5", + "turf-jsts": "*" + } + }, + "@turf/unkink-polygon": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-5.1.5.tgz", + "integrity": "sha1-ewGEfFD7V0riV54Z5Ey6hSbSE8M=", + "requires": { + "@turf/area": "^5.1.5", + "@turf/boolean-point-in-polygon": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5", + "rbush": "^2.0.1" + }, + "dependencies": { + "quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "requires": { + "quickselect": "^1.0.1" + } + } + } + }, + "@turf/voronoi": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-5.1.5.tgz", + "integrity": "sha1-6FbpQG3MLyXWbdyJhYTifC6/ymY=", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "d3-voronoi": "1.1.2" + } + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.0.tgz", + "integrity": "sha512-IilJZ1hJBUZwMOVDNTdflOOLzJB/ZtljYVa7k3gEZN/jqIJIPkWHC6dvbX+DD2CwZDHB9wAKzZPzzqMIkW37/w==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.49.tgz", + "integrity": "sha512-K1AFuMe8a+pXmfHTtnwBvqoEylNKVeaiKYkjmcEAdytMQVJ/i9Fu7sc13GxgXdO49gkE7Hy8SyJonUZUn+eVaw==" + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + }, + "@types/http-proxy": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.6.tgz", + "integrity": "sha512-+qsjqR75S/ib0ig0R9WN+CDoZeOBU6F2XLewgC4KVgdXiNHiKKHFEMRHOrs5PbYE97D5vataw5wPj4KLYfUkuQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "@types/node": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.0.tgz", + "integrity": "sha512-um/+/ip3QZmwLfIkWZSNtQIJNVAqrJ92OkLMeuZrjZMTAJniI7fh8N8OICyDhAJ2mzgk/fmYFo72jRr5HyZ1EQ==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-NVkb4p4YjI8E3O6+1m8I+8JlMpFZwfSbPGdaw0wXuyPRTEz0SLKwBUWNSO7Maoi8tQMPC8JLZNWkrcKPI7/sLA==" + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "@types/react": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.13.tgz", + "integrity": "sha512-D/G3PiuqTfE3IMNjLn/DCp6umjVCSvtZTPdtAFy5+Ved6CsdRvivfKeCzw79W4AatShtU4nGqgvOv5Gro534vQ==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "@types/react-redux": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.16.tgz", + "integrity": "sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "@types/styled-jsx": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.8.tgz", + "integrity": "sha512-Yjye9VwMdYeXfS71ihueWRSxrruuXTwKCbzue4+5b2rjnQ//AtyM7myZ1BEhNhBQ/nL/RE7bdToUoLln2miKvg==", + "requires": { + "@types/react": "*" + } + }, + "@types/tapable": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", + "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/webpack": { + "version": "4.41.29", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", + "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.1.tgz", + "integrity": "sha512-9yfcNpDaNGQ6/LQOX/KhUFTR1sCKH+PBr234k6hI9XJ0VP5UqGxap0AnNwBnWFk1MNyWBylJH9ZkzBXC+5akZQ==", + "requires": { + "@typescript-eslint/experimental-utils": "4.28.1", + "@typescript-eslint/scope-manager": "4.28.1", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.1.tgz", + "integrity": "sha512-n8/ggadrZ+uyrfrSEchx3jgODdmcx7MzVM2sI3cTpI/YlfSm0+9HEUaWw3aQn2urL2KYlWYMDgn45iLfjDYB+Q==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.1", + "@typescript-eslint/types": "4.28.1", + "@typescript-eslint/typescript-estree": "4.28.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.1.tgz", + "integrity": "sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg==", + "requires": { + "@typescript-eslint/scope-manager": "4.28.1", + "@typescript-eslint/types": "4.28.1", + "@typescript-eslint/typescript-estree": "4.28.1", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.1.tgz", + "integrity": "sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA==", + "requires": { + "@typescript-eslint/types": "4.28.1", + "@typescript-eslint/visitor-keys": "4.28.1" + } + }, + "@typescript-eslint/types": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.1.tgz", + "integrity": "sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.1.tgz", + "integrity": "sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ==", + "requires": { + "@typescript-eslint/types": "4.28.1", + "@typescript-eslint/visitor-keys": "4.28.1", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.1.tgz", + "integrity": "sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg==", + "requires": { + "@typescript-eslint/types": "4.28.1", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "add-px-to-style": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-px-to-style/-/add-px-to-style-1.0.0.tgz", + "integrity": "sha1-0ME1RB+oAUqBN5BFMQlvZ/KPJjo=" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brcast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.2.tgz", + "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001241", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz", + "integrity": "sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concaveman": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.0.tgz", + "integrity": "sha512-OcqechF2/kubbffomKqjGEkb0ndlYhEbmyg/fxIGqdfYp5AZjD2Kl5hc97Hh3ngEuHU2314Z4KDbxL7qXGWrQQ==", + "requires": { + "point-in-polygon": "^1.0.1", + "rbush": "^3.0.0", + "robust-predicates": "^2.0.4", + "tinyqueue": "^2.0.3" + } + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", + "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==" + }, + "core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", + "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "craco-less": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/craco-less/-/craco-less-1.18.0.tgz", + "integrity": "sha512-Q11HHh5rh2u2Ujub/FgkjLzRtrnEOQIt/kMxyflIGW1xJTm/5FFkM2+RRZ77Vo2ma7MDcEFhvU/vp6oA7FKY8w==", + "requires": { + "less": "^4.1.1", + "less-loader": "^7.3.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "csstype": { + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-contour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "requires": { + "d3-array": "2" + }, + "dependencies": { + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + } + } + }, + "d3-geo": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", + "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", + "requires": { + "d3-array": "1" + } + }, + "d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" + }, + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "density-clustering": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", + "integrity": "sha1-3J9ZyPCrl+FiSsZJMP0xlIF9ysU=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-align": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz", + "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-css": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-css/-/dom-css-2.1.0.tgz", + "integrity": "sha1-/bwtWgFdCj4YcuEUcrvQ57nmogI=", + "requires": { + "add-px-to-style": "1.0.0", + "prefix-style": "2.0.1", + "to-camel-case": "1.0.0" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "requires": { + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "earcut": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", + "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" + }, + "echarts": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz", + "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==", + "requires": { + "zrender": "4.3.2" + } + }, + "echarts-for-react": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-2.0.16.tgz", + "integrity": "sha512-VmHCktay2qKt/+wpL/C7thbvIa7dYBEey0/U4Zaqo+qeA4wx+uiCd5NeCsPIhD/0Pv+2qqNswqiNiUCtcgccOw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "size-sensor": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, + "electron-to-chromium": { + "version": "1.3.765", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.765.tgz", + "integrity": "sha512-4NhcsfZYlr1x4FehYkK+R9CNNTOZ8vLcIu8Y1uWehxYp5r/jlCGAfBqChIubEfdtX+rBQpXx4yJuX/dzILH/nw==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.8.0.tgz", + "integrity": "sha512-feK1xnUTsMSNTOw9jFw7aVgZl7Ep+ghpta/YEoaV6jbXU6Yso30B7BIj9ObHLzZ5TFJL7D98az080wfykLCrcw==", + "requires": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + } + } + }, + "eslint-plugin-react": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + }, + "eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "requires": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + } + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", + "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "geojson-equality": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", + "integrity": "sha1-oXE3TvBD5dR5eZWEC65GSOB1LXI=", + "requires": { + "deep-equal": "^1.0.0" + } + }, + "geojson-rbush": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-2.1.0.tgz", + "integrity": "sha1-O9c745H8ELCuaT2bis6iquC4Oo0=", + "requires": { + "@turf/helpers": "*", + "@turf/meta": "*", + "rbush": "*" + } + }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-closest": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/get-closest/-/get-closest-0.0.4.tgz", + "integrity": "sha1-JprHdtHmAiqg/Vht1wjop9Miaa8=" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "requires": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + }, + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "requires": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jss": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + } + } + }, + "jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "requires": { + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-compose": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz", + "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==" + }, + "jss-expand": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.3.0.tgz", + "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==" + }, + "jss-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.2.0.tgz", + "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==" + }, + "jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-plugin-camel-case": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.7.1" + } + }, + "jss-plugin-default-unit": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-global": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-nested": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.7.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz", + "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.7.1" + } + }, + "jss-preset-default": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.5.0.tgz", + "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", + "requires": { + "jss-camel-case": "^6.1.0", + "jss-compose": "^5.0.0", + "jss-default-unit": "^8.0.2", + "jss-expand": "^5.3.0", + "jss-extend": "^6.2.0", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-template": "^1.0.1", + "jss-vendor-prefixer": "^7.0.0" + } + }, + "jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==" + }, + "jss-template": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz", + "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", + "requires": { + "warning": "^3.0.0" + } + }, + "jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "requires": { + "css-vendor": "^0.3.8" + }, + "dependencies": { + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", + "requires": { + "is-in-browser": "^1.0.2" + } + } + } + }, + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "requires": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + } + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "less": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + } + }, + "less-loader": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "requires": { + "immediate": "~3.0.5" + } + }, + "lineclip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/lineclip/-/lineclip-1.1.5.tgz", + "integrity": "sha1-K/JgZ9lDVP6r+R5CdoI221YW/RM=" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "localforage": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz", + "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", + "requires": { + "lie": "3.1.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mapbox-gl": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-2.3.1.tgz", + "integrity": "sha512-xGohzbxxdN3UhHMHy0aweaueYwSoOspSg90gi1T7DIl8Ev0YLjl+ApV6VYtNnR1B9lmwDn8jITfG6Y2JiSEuwg==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^2.0.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.2.5", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.3.0", + "grid-index": "^1.1.0", + "minimist": "^1.2.5", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.3", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "point-in-polygon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" + }, + "polylabel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", + "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", + "requires": { + "tinyqueue": "^2.0.3" + } + }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "requires": { + "postcss": "^7" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "requires": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "requires": { + "postcss": "^8.1.0" + }, + "dependencies": { + "postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "potpack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", + "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + }, + "prefix-style": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/prefix-style/-/prefix-style-2.0.1.tgz", + "integrity": "sha1-ZrupqHDP2jCKXcIOhekSCTLJWgY=" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" + } + }, + "rc-align": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz", + "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.3.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-motion": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz", + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.2.1" + } + }, + "rc-resize-observer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz", + "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-tree": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.2.1.tgz", + "integrity": "sha512-uBIJ2/CMsR3I53W14WjyX+m3AY54qG7AuqlVr0jqIBWxiRtnOkKCCBpYLuUIxbqjJ9+QvNtHyxjwxHG0v/zD5g==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.0.0", + "rc-virtual-list": "^3.0.1" + } + }, + "rc-trigger": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.9.tgz", + "integrity": "sha512-0Bxsh2Xe+etejMn73am+jZBcOpsueAZiEKLiGoDfA0fvm/JHLNOiiww3zJ0qgyPOTmbYxhsxFcGOZu+VcbaZhQ==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.5.0" + } + }, + "rc-util": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.13.1.tgz", + "integrity": "sha512-Dws2tjXBBihfjVQFlG5JzZ/5O3Wutctm0W94Wb1+M7GD2roWJPrQdSa4AkWm2pn0Ms32zoVPPkWodFeAYZPLfA==", + "requires": { + "@babel/runtime": "^7.12.5", + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "rc-virtual-list": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.3.0.tgz", + "integrity": "sha512-lVXpGWC6yMdwV2SHo6kc63WlqjCnb3eO72V726KA2/wh9KA6wi/swcdR3zAowuA8hJxG/lRANmY5kpLZ+Pz3iQ==", + "requires": { + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.0.7" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "requires": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + } + }, + "react-custom-scrollbars": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-custom-scrollbars/-/react-custom-scrollbars-4.2.1.tgz", + "integrity": "sha1-gw/ZUCkn6X6KeMIIaBOJmyqLZts=", + "requires": { + "dom-css": "^2.0.0", + "prop-types": "^15.5.10", + "raf": "^3.1.0" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-double-marquee": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-double-marquee/-/react-double-marquee-1.1.0.tgz", + "integrity": "sha512-MWsX3JeQDY23iC9VvRMS44fLZ+l1sJBRFLCsra+qstAtE51jG3AvVUArCx1Y51Pw2Z5IrrywwObHtDqhNh084g==", + "requires": { + "prop-types": "^15.7.2", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-json-pretty": "^2.2.0", + "react-jss": "^8.6.1" + }, + "dependencies": { + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-hook-form": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.9.0.tgz", + "integrity": "sha512-1SazsTvsC5A4jLxc8fIf0bB92kEp4MGjP69k8s+2nI1spHPha5UkLwaebOXhO9vY95aGqcyBU67pRiv+6T5KZQ==" + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-json-pretty": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-json-pretty/-/react-json-pretty-2.2.0.tgz", + "integrity": "sha512-3UMzlAXkJ4R8S4vmkRKtvJHTewG4/rn1Q18n0zqdu/ipZbUPLVZD+QwC7uVcD/IAY3s8iNVHlgR2dMzIUS0n1A==", + "requires": { + "prop-types": "^15.6.2" + } + }, + "react-jss": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz", + "integrity": "sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ==", + "requires": { + "hoist-non-react-statics": "^2.5.0", + "jss": "^9.7.0", + "jss-preset-default": "^4.3.0", + "prop-types": "^15.6.0", + "theming": "^1.3.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "requires": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + } + } + } + }, + "react-redux": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redux": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz", + "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-persist": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-5.10.0.tgz", + "integrity": "sha512-sSJAzNq7zka3qVHKce1hbvqf0Vf5DuTVm7dr4GtsqQVOexnrvbV47RWFiPxQ8fscnyiuWyD2O92DOxPl0tGCRg==" + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve-url-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rifm": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz", + "integrity": "sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ==", + "requires": { + "@babel/runtime": "^7.3.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "robust-predicates": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", + "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "size-sensor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.1.tgz", + "integrity": "sha512-QTy7MnuugCFXIedXRpUSk9gUnyNiaxIdxGfUjr8xxXOqIB3QvBUYP9+b51oCg2C4dnhaeNk/h57TxjbvoJrJUA==" + }, + "skmeans": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz", + "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-7+bR4FbF5SYsmkHfDp61QiwCKtwNDyPsddk9TzfsDA5DQr5Goii5CVD2SXjglweFCxjrzVZf945ahqYfUIk8UA==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "terser": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", + "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "theming": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz", + "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", + "requires": { + "brcast": "^3.0.1", + "is-function": "^1.0.1", + "is-plain-object": "^2.0.1", + "prop-types": "^15.5.8" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-camel-case": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-camel-case/-/to-camel-case-1.0.0.tgz", + "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", + "requires": { + "to-space-case": "^1.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-no-case": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", + "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "to-space-case": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", + "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", + "requires": { + "to-no-case": "^1.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, + "topojson-server": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", + "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", + "requires": { + "commander": "2" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "turf-jsts": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/turf-jsts/-/turf-jsts-1.2.3.tgz", + "integrity": "sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "requires": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "requires": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + } + }, + "workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "requires": { + "workbox-core": "^5.1.4" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zrender": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz", + "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dc3bca8 --- /dev/null +++ b/package.json @@ -0,0 +1,58 @@ +{ + "name": "hplcs-web", + "version": "0.1.0", + "private": true, + "dependencies": { + "@craco/craco": "^5.8.0", + "@date-io/moment": "^1.3.13", + "@fullcalendar/core": "^4.2.0", + "@fullcalendar/daygrid": "^4.2.0", + "@fullcalendar/interaction": "^4.2.0", + "@fullcalendar/react": "^4.2.0", + "@material-ui/core": "^4.11.0", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/pickers": "^3.2.10", + "@rematch/core": "^1.4.0", + "@rematch/persist": "^1.1.6", + "@turf/turf": "^5.1.6", + "clone": "^2.1.2", + "clsx": "^1.1.1", + "craco-less": "^1.17.0", + "d3-contour": "^2.0.0", + "echarts": "^4.9.0", + "echarts-for-react": "^2.0.16", + "http-proxy-middleware": "^1.0.6", + "localforage": "^1.9.0", + "mapbox-gl": "^2.2.0", + "moment": "^2.29.1", + "polylabel": "^1.1.0", + "rc-tree": "^4.1.5", + "rc-trigger": "^5.2.5", + "react": "^17.0.1", + "react-custom-scrollbars": "^4.2.1", + "react-dom": "^17.0.1", + "react-double-marquee": "^1.0.6", + "react-hook-form": "^7.2.1", + "react-redux": "^7.2.2", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "react-scripts": "^4.0.0", + "react-transition-group": "^4.4.1", + "redux": "^4.0.5", + "reselect": "^4.0.0" + }, + "scripts": { + "start": "craco start", + "build": "craco build" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not op_mini all" + ] +} diff --git a/public/assets/logo.mp4 b/public/assets/logo.mp4 new file mode 100644 index 0000000..9e4d7c3 Binary files /dev/null and b/public/assets/logo.mp4 differ diff --git a/public/assets/logo1.mp4 b/public/assets/logo1.mp4 new file mode 100644 index 0000000..2ff6a5a Binary files /dev/null and b/public/assets/logo1.mp4 differ diff --git a/public/assets/menu/pic01.png b/public/assets/menu/pic01.png new file mode 100644 index 0000000..873a61f Binary files /dev/null and b/public/assets/menu/pic01.png differ diff --git a/public/assets/menu/pic02.png b/public/assets/menu/pic02.png new file mode 100644 index 0000000..6af95dc Binary files /dev/null and b/public/assets/menu/pic02.png differ diff --git a/public/assets/menu/pic03.png b/public/assets/menu/pic03.png new file mode 100644 index 0000000..3e493f2 Binary files /dev/null and b/public/assets/menu/pic03.png differ diff --git a/public/assets/menu/pic04.png b/public/assets/menu/pic04.png new file mode 100644 index 0000000..4c8cf3c Binary files /dev/null and b/public/assets/menu/pic04.png differ diff --git a/public/assets/menu/pic05.png b/public/assets/menu/pic05.png new file mode 100644 index 0000000..5aa1a4b Binary files /dev/null and b/public/assets/menu/pic05.png differ diff --git a/public/assets/menu/pic06.png b/public/assets/menu/pic06.png new file mode 100644 index 0000000..43d0b41 Binary files /dev/null and b/public/assets/menu/pic06.png differ diff --git a/public/assets/menu/pic07.png b/public/assets/menu/pic07.png new file mode 100644 index 0000000..00b1c58 Binary files /dev/null and b/public/assets/menu/pic07.png differ diff --git a/public/assets/menu/实时数据.png b/public/assets/menu/实时数据.png new file mode 100644 index 0000000..39b791a Binary files /dev/null and b/public/assets/menu/实时数据.png differ diff --git a/public/assets/menu/水利设施.png b/public/assets/menu/水利设施.png new file mode 100644 index 0000000..2efd023 Binary files /dev/null and b/public/assets/menu/水利设施.png differ diff --git a/public/assets/menu/病险水库.png b/public/assets/menu/病险水库.png new file mode 100644 index 0000000..34df53e Binary files /dev/null and b/public/assets/menu/病险水库.png differ diff --git a/public/assets/menu/辅助决策.png b/public/assets/menu/辅助决策.png new file mode 100644 index 0000000..881af8f Binary files /dev/null and b/public/assets/menu/辅助决策.png differ diff --git a/public/assets/menu/防洪形势.png b/public/assets/menu/防洪形势.png new file mode 100644 index 0000000..d7c6734 Binary files /dev/null and b/public/assets/menu/防洪形势.png differ diff --git a/public/assets/menu/降雨中心.png b/public/assets/menu/降雨中心.png new file mode 100644 index 0000000..7809dd8 Binary files /dev/null and b/public/assets/menu/降雨中心.png differ diff --git a/public/assets/menu/预警分析.png b/public/assets/menu/预警分析.png new file mode 100644 index 0000000..957baf3 Binary files /dev/null and b/public/assets/menu/预警分析.png differ diff --git a/public/assets/mov_bbb.mp4 b/public/assets/mov_bbb.mp4 new file mode 100644 index 0000000..0a4dd5b Binary files /dev/null and b/public/assets/mov_bbb.mp4 differ diff --git a/public/assets/pump/主机组.png b/public/assets/pump/主机组.png new file mode 100644 index 0000000..5399e64 Binary files /dev/null and b/public/assets/pump/主机组.png differ diff --git a/public/assets/pump/功率因素.png b/public/assets/pump/功率因素.png new file mode 100644 index 0000000..18f1672 Binary files /dev/null and b/public/assets/pump/功率因素.png differ diff --git a/public/assets/pump/外江.png b/public/assets/pump/外江.png new file mode 100644 index 0000000..5aaa094 Binary files /dev/null and b/public/assets/pump/外江.png differ diff --git a/public/assets/pump/水池.png b/public/assets/pump/水池.png new file mode 100644 index 0000000..74cb8af Binary files /dev/null and b/public/assets/pump/水池.png differ diff --git a/public/assets/pump/水闸.png b/public/assets/pump/水闸.png new file mode 100644 index 0000000..77ecb67 Binary files /dev/null and b/public/assets/pump/水闸.png differ diff --git a/public/assets/pump/河道.png b/public/assets/pump/河道.png new file mode 100644 index 0000000..b761e85 Binary files /dev/null and b/public/assets/pump/河道.png differ diff --git a/public/assets/pump/流量.png b/public/assets/pump/流量.png new file mode 100644 index 0000000..a6a79b3 Binary files /dev/null and b/public/assets/pump/流量.png differ diff --git a/public/assets/pump/进入.png b/public/assets/pump/进入.png new file mode 100644 index 0000000..954584d Binary files /dev/null and b/public/assets/pump/进入.png differ diff --git a/public/assets/pump/退出.png b/public/assets/pump/退出.png new file mode 100644 index 0000000..6aa4ccc Binary files /dev/null and b/public/assets/pump/退出.png differ diff --git a/public/assets/weather/100.png b/public/assets/weather/100.png new file mode 100644 index 0000000..e06d8fd Binary files /dev/null and b/public/assets/weather/100.png differ diff --git a/public/assets/weather/101.png b/public/assets/weather/101.png new file mode 100644 index 0000000..0847a52 Binary files /dev/null and b/public/assets/weather/101.png differ diff --git a/public/assets/weather/102.png b/public/assets/weather/102.png new file mode 100644 index 0000000..740ea6b Binary files /dev/null and b/public/assets/weather/102.png differ diff --git a/public/assets/weather/103.png b/public/assets/weather/103.png new file mode 100644 index 0000000..ca194d6 Binary files /dev/null and b/public/assets/weather/103.png differ diff --git a/public/assets/weather/104.png b/public/assets/weather/104.png new file mode 100644 index 0000000..2adca0e Binary files /dev/null and b/public/assets/weather/104.png differ diff --git a/public/assets/weather/150.png b/public/assets/weather/150.png new file mode 100644 index 0000000..5d93e20 Binary files /dev/null and b/public/assets/weather/150.png differ diff --git a/public/assets/weather/153.png b/public/assets/weather/153.png new file mode 100644 index 0000000..33bffb1 Binary files /dev/null and b/public/assets/weather/153.png differ diff --git a/public/assets/weather/154.png b/public/assets/weather/154.png new file mode 100644 index 0000000..96a296d Binary files /dev/null and b/public/assets/weather/154.png differ diff --git a/public/assets/weather/300.png b/public/assets/weather/300.png new file mode 100644 index 0000000..8543e30 Binary files /dev/null and b/public/assets/weather/300.png differ diff --git a/public/assets/weather/301.png b/public/assets/weather/301.png new file mode 100644 index 0000000..47fc1eb Binary files /dev/null and b/public/assets/weather/301.png differ diff --git a/public/assets/weather/302.png b/public/assets/weather/302.png new file mode 100644 index 0000000..83f312b Binary files /dev/null and b/public/assets/weather/302.png differ diff --git a/public/assets/weather/303.png b/public/assets/weather/303.png new file mode 100644 index 0000000..88bcb84 Binary files /dev/null and b/public/assets/weather/303.png differ diff --git a/public/assets/weather/304.png b/public/assets/weather/304.png new file mode 100644 index 0000000..6c63872 Binary files /dev/null and b/public/assets/weather/304.png differ diff --git a/public/assets/weather/305.png b/public/assets/weather/305.png new file mode 100644 index 0000000..f8a16f9 Binary files /dev/null and b/public/assets/weather/305.png differ diff --git a/public/assets/weather/306.png b/public/assets/weather/306.png new file mode 100644 index 0000000..deeadf6 Binary files /dev/null and b/public/assets/weather/306.png differ diff --git a/public/assets/weather/307.png b/public/assets/weather/307.png new file mode 100644 index 0000000..a6b9cd0 Binary files /dev/null and b/public/assets/weather/307.png differ diff --git a/public/assets/weather/308.png b/public/assets/weather/308.png new file mode 100644 index 0000000..3cf2267 Binary files /dev/null and b/public/assets/weather/308.png differ diff --git a/public/assets/weather/309.png b/public/assets/weather/309.png new file mode 100644 index 0000000..31fdba1 Binary files /dev/null and b/public/assets/weather/309.png differ diff --git a/public/assets/weather/310.png b/public/assets/weather/310.png new file mode 100644 index 0000000..991ee2b Binary files /dev/null and b/public/assets/weather/310.png differ diff --git a/public/assets/weather/311.png b/public/assets/weather/311.png new file mode 100644 index 0000000..e237dd2 Binary files /dev/null and b/public/assets/weather/311.png differ diff --git a/public/assets/weather/312.png b/public/assets/weather/312.png new file mode 100644 index 0000000..73b5843 Binary files /dev/null and b/public/assets/weather/312.png differ diff --git a/public/assets/weather/313.png b/public/assets/weather/313.png new file mode 100644 index 0000000..7f39836 Binary files /dev/null and b/public/assets/weather/313.png differ diff --git a/public/assets/weather/314.png b/public/assets/weather/314.png new file mode 100644 index 0000000..007667f Binary files /dev/null and b/public/assets/weather/314.png differ diff --git a/public/assets/weather/315.png b/public/assets/weather/315.png new file mode 100644 index 0000000..bdc90fa Binary files /dev/null and b/public/assets/weather/315.png differ diff --git a/public/assets/weather/316.png b/public/assets/weather/316.png new file mode 100644 index 0000000..a758db3 Binary files /dev/null and b/public/assets/weather/316.png differ diff --git a/public/assets/weather/317.png b/public/assets/weather/317.png new file mode 100644 index 0000000..dd6fdba Binary files /dev/null and b/public/assets/weather/317.png differ diff --git a/public/assets/weather/318.png b/public/assets/weather/318.png new file mode 100644 index 0000000..66e81da Binary files /dev/null and b/public/assets/weather/318.png differ diff --git a/public/assets/weather/350.png b/public/assets/weather/350.png new file mode 100644 index 0000000..bb9ec1d Binary files /dev/null and b/public/assets/weather/350.png differ diff --git a/public/assets/weather/351.png b/public/assets/weather/351.png new file mode 100644 index 0000000..22cf94d Binary files /dev/null and b/public/assets/weather/351.png differ diff --git a/public/assets/weather/399.png b/public/assets/weather/399.png new file mode 100644 index 0000000..c9f69ed Binary files /dev/null and b/public/assets/weather/399.png differ diff --git a/public/assets/weather/400.png b/public/assets/weather/400.png new file mode 100644 index 0000000..7c394d0 Binary files /dev/null and b/public/assets/weather/400.png differ diff --git a/public/assets/weather/401.png b/public/assets/weather/401.png new file mode 100644 index 0000000..cc515c8 Binary files /dev/null and b/public/assets/weather/401.png differ diff --git a/public/assets/weather/402.png b/public/assets/weather/402.png new file mode 100644 index 0000000..18a3dc7 Binary files /dev/null and b/public/assets/weather/402.png differ diff --git a/public/assets/weather/403.png b/public/assets/weather/403.png new file mode 100644 index 0000000..3649ce7 Binary files /dev/null and b/public/assets/weather/403.png differ diff --git a/public/assets/weather/404.png b/public/assets/weather/404.png new file mode 100644 index 0000000..77e373c Binary files /dev/null and b/public/assets/weather/404.png differ diff --git a/public/assets/weather/405.png b/public/assets/weather/405.png new file mode 100644 index 0000000..9ed83e3 Binary files /dev/null and b/public/assets/weather/405.png differ diff --git a/public/assets/weather/406.png b/public/assets/weather/406.png new file mode 100644 index 0000000..0ca43f1 Binary files /dev/null and b/public/assets/weather/406.png differ diff --git a/public/assets/weather/407.png b/public/assets/weather/407.png new file mode 100644 index 0000000..b59208d Binary files /dev/null and b/public/assets/weather/407.png differ diff --git a/public/assets/weather/408.png b/public/assets/weather/408.png new file mode 100644 index 0000000..d8253a4 Binary files /dev/null and b/public/assets/weather/408.png differ diff --git a/public/assets/weather/409.png b/public/assets/weather/409.png new file mode 100644 index 0000000..c8aca0c Binary files /dev/null and b/public/assets/weather/409.png differ diff --git a/public/assets/weather/410.png b/public/assets/weather/410.png new file mode 100644 index 0000000..f5cb3a3 Binary files /dev/null and b/public/assets/weather/410.png differ diff --git a/public/assets/weather/456.png b/public/assets/weather/456.png new file mode 100644 index 0000000..83564f9 Binary files /dev/null and b/public/assets/weather/456.png differ diff --git a/public/assets/weather/457.png b/public/assets/weather/457.png new file mode 100644 index 0000000..d3fde4e Binary files /dev/null and b/public/assets/weather/457.png differ diff --git a/public/assets/weather/499.png b/public/assets/weather/499.png new file mode 100644 index 0000000..66863b9 Binary files /dev/null and b/public/assets/weather/499.png differ diff --git a/public/assets/weather/500.png b/public/assets/weather/500.png new file mode 100644 index 0000000..2d9e467 Binary files /dev/null and b/public/assets/weather/500.png differ diff --git a/public/assets/weather/501.png b/public/assets/weather/501.png new file mode 100644 index 0000000..41e9cbe Binary files /dev/null and b/public/assets/weather/501.png differ diff --git a/public/assets/weather/502.png b/public/assets/weather/502.png new file mode 100644 index 0000000..48af382 Binary files /dev/null and b/public/assets/weather/502.png differ diff --git a/public/assets/weather/503.png b/public/assets/weather/503.png new file mode 100644 index 0000000..9a5556f Binary files /dev/null and b/public/assets/weather/503.png differ diff --git a/public/assets/weather/504.png b/public/assets/weather/504.png new file mode 100644 index 0000000..f6fa6c0 Binary files /dev/null and b/public/assets/weather/504.png differ diff --git a/public/assets/weather/507.png b/public/assets/weather/507.png new file mode 100644 index 0000000..2e8a073 Binary files /dev/null and b/public/assets/weather/507.png differ diff --git a/public/assets/weather/508.png b/public/assets/weather/508.png new file mode 100644 index 0000000..6e5a041 Binary files /dev/null and b/public/assets/weather/508.png differ diff --git a/public/assets/weather/509.png b/public/assets/weather/509.png new file mode 100644 index 0000000..1e493b9 Binary files /dev/null and b/public/assets/weather/509.png differ diff --git a/public/assets/weather/510.png b/public/assets/weather/510.png new file mode 100644 index 0000000..110fd8d Binary files /dev/null and b/public/assets/weather/510.png differ diff --git a/public/assets/weather/511.png b/public/assets/weather/511.png new file mode 100644 index 0000000..886f100 Binary files /dev/null and b/public/assets/weather/511.png differ diff --git a/public/assets/weather/512.png b/public/assets/weather/512.png new file mode 100644 index 0000000..71cf968 Binary files /dev/null and b/public/assets/weather/512.png differ diff --git a/public/assets/weather/513.png b/public/assets/weather/513.png new file mode 100644 index 0000000..b75b24d Binary files /dev/null and b/public/assets/weather/513.png differ diff --git a/public/assets/weather/514.png b/public/assets/weather/514.png new file mode 100644 index 0000000..a819d46 Binary files /dev/null and b/public/assets/weather/514.png differ diff --git a/public/assets/weather/515.png b/public/assets/weather/515.png new file mode 100644 index 0000000..43c02db Binary files /dev/null and b/public/assets/weather/515.png differ diff --git a/public/assets/weather/900.png b/public/assets/weather/900.png new file mode 100644 index 0000000..c432982 Binary files /dev/null and b/public/assets/weather/900.png differ diff --git a/public/assets/weather/901.png b/public/assets/weather/901.png new file mode 100644 index 0000000..8a2f456 Binary files /dev/null and b/public/assets/weather/901.png differ diff --git a/public/assets/weather/999.png b/public/assets/weather/999.png new file mode 100644 index 0000000..c167cbb Binary files /dev/null and b/public/assets/weather/999.png differ diff --git a/public/assets/weather/LICENSE b/public/assets/weather/LICENSE new file mode 100644 index 0000000..477d149 --- /dev/null +++ b/public/assets/weather/LICENSE @@ -0,0 +1,14 @@ +# License + +Attribution: Heweather https://www.heweather.com + +This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ + +版权所有人:和风天气 https://www.heweather.com + +本作品采用知识共享 署名 4.0 国际 许可协议进行许可。访问 http://creativecommons.org/licenses/by/4.0/ 查看该许可协议。 + + + + + diff --git a/public/assets/weather_img01.png b/public/assets/weather_img01.png new file mode 100644 index 0000000..7782fb9 Binary files /dev/null and b/public/assets/weather_img01.png differ diff --git a/public/assets/防汛值班表模板.xlsx b/public/assets/防汛值班表模板.xlsx new file mode 100644 index 0000000..e7faf8e Binary files /dev/null and b/public/assets/防汛值班表模板.xlsx differ diff --git a/public/d3.min.js b/public/d3.min.js new file mode 100644 index 0000000..47279ba --- /dev/null +++ b/public/d3.min.js @@ -0,0 +1,8 @@ +// https://d3js.org Version 4.8.0. Copyright 2017 Mike Bostock. +(function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})})(this,function(t){"use strict";function n(t){return function(n,e){return Rs(t(n),e)}}function e(t,n){return[t,n]}function r(t,n,e){var r=(n-t)/Math.max(0,e),i=Math.floor(Math.log(r)/Math.LN10),o=r/Math.pow(10,i);return i>=0?(o>=Qs?10:o>=Ks?5:o>=tf?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=Qs?10:o>=Ks?5:o>=tf?2:1)}function i(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=Qs?i*=10:o>=Ks?i*=5:o>=tf&&(i*=2),n=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}function y(t,n){for(var e,r=0,i=t.length;r=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}function k(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;rn?1:t>=n?0:NaN}function U(t){return function(){this.removeAttribute(t)}}function D(t){return function(){this.removeAttributeNS(t.space,t.local)}}function O(t,n){return function(){this.setAttribute(t,n)}}function F(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function I(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function Y(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function B(t){return function(){this.style.removeProperty(t)}}function j(t,n,e){return function(){this.style.setProperty(t,n,e)}}function H(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}function X(t){return function(){delete this[t]}}function V(t,n){return function(){this[t]=n}}function $(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function W(t){return t.trim().split(/^|\s+/)}function Z(t){return t.classList||new G(t)}function G(t){this._node=t,this._names=W(t.getAttribute("class")||"")}function J(t,n){for(var e=Z(t),r=-1,i=n.length;++r>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1)):(n=ql.exec(t))?Nt(parseInt(n[1],16)):(n=Ul.exec(t))?new Ct(n[1],n[2],n[3],1):(n=Dl.exec(t))?new Ct(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=Ol.exec(t))?kt(n[1],n[2],n[3],n[4]):(n=Fl.exec(t))?kt(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=Il.exec(t))?zt(n[1],n[2]/100,n[3]/100,1):(n=Yl.exec(t))?zt(n[1],n[2]/100,n[3]/100,n[4]):Bl.hasOwnProperty(t)?Nt(Bl[t]):"transparent"===t?new Ct(NaN,NaN,NaN,0):null}function Nt(t){return new Ct(t>>16&255,t>>8&255,255&t,1)}function kt(t,n,e,r){return r<=0&&(t=n=e=NaN),new Ct(t,n,e,r)}function Et(t){return t instanceof Tt||(t=St(t)),t?(t=t.rgb(),new Ct(t.r,t.g,t.b,t.opacity)):new Ct}function At(t,n,e,r){return 1===arguments.length?Et(t):new Ct(t,n,e,null==r?1:r)}function Ct(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function zt(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Rt(t,n,e,r)}function Pt(t){if(t instanceof Rt)return new Rt(t.h,t.s,t.l,t.opacity);if(t instanceof Tt||(t=St(t)),!t)return new Rt;if(t instanceof Rt)return t;t=t.rgb();var n=t.r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),u=NaN,a=o-i,c=(o+i)/2;return a?(u=n===o?(e-r)/a+6*(e0&&c<1?0:u,new Rt(u,a,c,t.opacity)}function Lt(t,n,e,r){return 1===arguments.length?Pt(t):new Rt(t,n,e,null==r?1:r)}function Rt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function qt(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}function Ut(t){if(t instanceof Ot)return new Ot(t.l,t.a,t.b,t.opacity);if(t instanceof Xt){var n=t.h*jl;return new Ot(t.l,Math.cos(n)*t.c,Math.sin(n)*t.c,t.opacity)}t instanceof Ct||(t=Et(t));var e=Bt(t.r),r=Bt(t.g),i=Bt(t.b),o=Ft((.4124564*e+.3575761*r+.1804375*i)/Xl),u=Ft((.2126729*e+.7151522*r+.072175*i)/Vl);return new Ot(116*u-16,500*(o-u),200*(u-Ft((.0193339*e+.119192*r+.9503041*i)/$l)),t.opacity)}function Dt(t,n,e,r){return 1===arguments.length?Ut(t):new Ot(t,n,e,null==r?1:r)}function Ot(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Ft(t){return t>Jl?Math.pow(t,1/3):t/Gl+Wl}function It(t){return t>Zl?t*t*t:Gl*(t-Wl)}function Yt(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Bt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function jt(t){if(t instanceof Xt)return new Xt(t.h,t.c,t.l,t.opacity);t instanceof Ot||(t=Ut(t));var n=Math.atan2(t.b,t.a)*Hl;return new Xt(n<0?n+360:n,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function Ht(t,n,e,r){return 1===arguments.length?jt(t):new Xt(t,n,e,null==r?1:r)}function Xt(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}function Vt(t){if(t instanceof Wt)return new Wt(t.h,t.s,t.l,t.opacity);t instanceof Ct||(t=Et(t));var n=t.r/255,e=t.g/255,r=t.b/255,i=(oh*r+rh*n-ih*e)/(oh+rh-ih),o=r-i,u=(eh*(e-i)-th*o)/nh,a=Math.sqrt(u*u+o*o)/(eh*i*(1-i)),c=a?Math.atan2(u,o)*Hl-120:NaN;return new Wt(c<0?c+360:c,a,i,t.opacity)}function $t(t,n,e,r){return 1===arguments.length?Vt(t):new Wt(t,n,e,null==r?1:r)}function Wt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Zt(t,n,e,r,i){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u)*e+(1+3*t+3*o-3*u)*r+u*i)/6}function Gt(t,n){return function(e){return t+e*n}}function Jt(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}function Qt(t,n){var e=n-t;return e?Gt(t,e>180||e<-180?e-360*Math.round(e/360):e):dh(isNaN(t)?n:t)}function Kt(t){return 1==(t=+t)?tn:function(n,e){return e-n?Jt(n,e,t):dh(isNaN(n)?e:n)}}function tn(t,n){var e=n-t;return e?Gt(t,e):dh(isNaN(t)?n:t)}function nn(t){return function(n){var e,r,i=n.length,o=new Array(i),u=new Array(i),a=new Array(i);for(e=0;e180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:xh(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}function a(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:xh(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}function c(t,n,e,r,o,u){if(t!==e||n!==r){var a=o.push(i(o)+"scale(",null,",",null,")");u.push({i:a-4,x:xh(t,e)},{i:a-2,x:xh(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}return function(n,e){var r=[],i=[];return n=t(n),e=t(e),o(n.translateX,n.translateY,e.translateX,e.translateY,r,i),u(n.rotate,e.rotate,r,i),a(n.skewX,e.skewX,r,i),c(n.scaleX,n.scaleY,e.scaleX,e.scaleY,r,i),n=e=null,function(t){for(var n,e=-1,o=i.length;++e=0&&n._call.call(null,t),n=n._next;--Yh}function xn(){Vh=(Xh=Wh.now())+$h,Yh=Bh=0;try{mn()}finally{Yh=0,wn(),Vh=0}}function bn(){var t=Wh.now(),n=t-Xh;n>Hh&&($h-=n,Xh=t)}function wn(){for(var t,n,e=fh,r=1/0;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:fh=n);lh=t,Mn(r)}function Mn(t){if(!Yh){Bh&&(Bh=clearTimeout(Bh));var n=t-Vh;n>24?(t<1/0&&(Bh=setTimeout(xn,n)),jh&&(jh=clearInterval(jh))):(jh||(Xh=Vh,jh=setInterval(bn,Hh)),Yh=1,Zh(xn))}}function Tn(t,n){var e=t.__transition;if(!e||!(e=e[n])||e.state>tp)throw new Error("too late");return e}function Sn(t,n){var e=t.__transition;if(!e||!(e=e[n])||e.state>ep)throw new Error("too late");return e}function Nn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("too late");return e}function kn(t,n,e){function r(t){e.state=np,e.timer.restart(i,e.delay,e.time),e.delay<=t&&i(t-e.delay)}function i(r){var s,f,l,h;if(e.state!==np)return u();for(s in c)if(h=c[s],h.name===e.name){if(h.state===rp)return Gh(i);h.state===ip?(h.state=up,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete c[s]):+s=0&&(t=t.slice(0,n)),!t||"start"===t})}function Xn(t,n,e){var r,i,o=Hn(n)?Tn:Sn;return function(){var u=o(this,t),a=u.on;a!==r&&(i=(r=a).copy()).on(n,e),u.on=i}}function Vn(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}function $n(t,n){var e,r,i;return function(){var o=cl(this).getComputedStyle(this,null),u=o.getPropertyValue(t),a=(this.style.removeProperty(t),o.getPropertyValue(t));return u===a?null:u===e&&a===r?i:i=n(e=u,r=a)}}function Wn(t){return function(){this.style.removeProperty(t)}}function Zn(t,n,e){var r,i;return function(){var o=cl(this).getComputedStyle(this,null).getPropertyValue(t);return o===e?null:o===r?i:i=n(r=o,e)}}function Gn(t,n,e){var r,i,o;return function(){var u=cl(this).getComputedStyle(this,null),a=u.getPropertyValue(t),c=e(this);return null==c&&(this.style.removeProperty(t),c=u.getPropertyValue(t)),a===c?null:a===r&&c===i?o:o=n(r=a,i=c)}}function Jn(t,n,e){function r(){var r=this,i=n.apply(r,arguments);return i&&function(n){r.style.setProperty(t,i(n),e)}}return r._value=n,r}function Qn(t){return function(){this.textContent=t}}function Kn(t){return function(){var n=t(this);this.textContent=null==n?"":n}}function te(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function ne(t){return _t().transition(t)}function ee(){return++Ap}function re(t){return+t}function ie(t){return t*t}function oe(t){return t*(2-t)}function ue(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}function ae(t){return t*t*t}function ce(t){return--t*t*t+1}function se(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}function fe(t){return 1-Math.cos(t*qp)}function le(t){return Math.sin(t*qp)}function he(t){return(1-Math.cos(Rp*t))/2}function pe(t){return Math.pow(2,10*t-10)}function de(t){return 1-Math.pow(2,-10*t)}function ve(t){return((t*=2)<=1?Math.pow(2,10*t-10):2-Math.pow(2,10-10*t))/2}function _e(t){return 1-Math.sqrt(1-t*t)}function ge(t){return Math.sqrt(1- --t*t)}function ye(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}function me(t){return 1-xe(1-t)}function xe(t){return(t=+t)Math.abs(t[1]-O[1])?M=!0:w=!0),O=t,b=!0,od(),o()}function o(){var t;switch(m=O[0]-D[0],x=O[1]-D[1],N){case ad:case ud:k&&(m=Math.max(P-l,Math.min(R-v,m)),h=l+m,_=v+m),E&&(x=Math.max(L-p,Math.min(q-g,x)),d=p+x,y=g+x);break;case cd:k<0?(m=Math.max(P-l,Math.min(R-l,m)),h=l+m,_=v):k>0&&(m=Math.max(P-v,Math.min(R-v,m)),h=l,_=v+m),E<0?(x=Math.max(L-p,Math.min(q-p,x)),d=p+x,y=g):E>0&&(x=Math.max(L-g,Math.min(q-g,x)),d=p,y=g+x);break;case sd:k&&(h=Math.max(P,Math.min(R,l-m*k)),_=Math.max(P,Math.min(R,v+m*k))),E&&(d=Math.max(L,Math.min(q,p-x*E)),y=Math.max(L,Math.min(q,g+x*E)))}_0&&(l=h-m),E<0?g=y-x:E>0&&(p=d-x),N=ad,Y.attr("cursor",pd.selection),o());break;default:return}od()}function s(){switch(t.event.keyCode){case 16:U&&(w=M=U=!1,o());break;case 18:N===sd&&(k<0?v=_:k>0&&(l=h),E<0?g=y:E>0&&(p=d),N=cd,o());break;case 32:N===ad&&(t.event.altKey?(k&&(v=_-m*k,l=h+m*k),E&&(g=y-x*E,p=d+x*E),N=sd):(k<0?v=_:k>0&&(l=h),E<0?g=y:E>0&&(p=d),N=cd),Y.attr("cursor",pd[S]),o());break;default:return}od()}if(t.event.touches){if(t.event.changedTouches.length=(o=(v+g)/2))?v=o:g=o,(f=e>=(u=(_+y)/2))?_=u:y=u,i=p,!(p=p[l=f<<1|s]))return i[l]=d,t;if(a=+t._x.call(null,p.data),c=+t._y.call(null,p.data),n===a&&e===c)return d.next=p,i?i[l]=d:t._root=d,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(s=n>=(o=(v+g)/2))?v=o:g=o,(f=e>=(u=(_+y)/2))?_=u:y=u}while((l=f<<1|s)==(h=(c>=u)<<1|a>=o));return i[h]=p,i[l]=d,t}function Ke(t){var n,e,r,i,o=t.length,u=new Array(o),a=new Array(o),c=1/0,s=1/0,f=-1/0,l=-1/0;for(e=0;ef&&(f=r),il&&(l=i));for(f",i=n[3]||"-",o=n[4]||"",u=!!n[5],a=n[6]&&+n[6],c=!!n[7],s=n[8]&&+n[8].slice(1),f=n[9]||"";"n"===f?(c=!0, +f="g"):kv[f]||(f=""),(u||"0"===e&&"="===r)&&(u=!0,e="0",r="="),this.fill=e,this.align=r,this.sign=i,this.symbol=o,this.zero=u,this.width=a,this.comma=c,this.precision=s,this.type=f}function dr(n){return Av=Pv(n),t.format=Av.format,t.formatPrefix=Av.formatPrefix,Av}function vr(){this.reset()}function _r(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}function gr(t){return t>1?0:t<-1?__:Math.acos(t)}function yr(t){return t>1?g_:t<-1?-g_:Math.asin(t)}function mr(t){return(t=C_(t/2))*t}function xr(){}function br(t,n){t&&q_.hasOwnProperty(t.type)&&q_[t.type](t,n)}function wr(t,n,e){var r,i=-1,o=t.length-e;for(n.lineStart();++i=0?1:-1,i=r*e,o=S_(n),u=C_(n),a=Yv*u,c=Iv*o+a*S_(i),s=a*r*C_(i);D_.add(T_(s,c)),Fv=t,Iv=o,Yv=u}function Er(t){return[T_(t[1],t[0]),yr(t[2])]}function Ar(t){var n=t[0],e=t[1],r=S_(e);return[r*S_(n),r*C_(n),C_(e)]}function Cr(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function zr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Pr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Lr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Rr(t){var n=P_(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function qr(t,n){Gv.push(Jv=[Bv=t,Hv=t]),nXv&&(Xv=n)}function Ur(t,n){var e=Ar([t*b_,n*b_]);if(Zv){var r=zr(Zv,e),i=[r[1],-r[0],0],o=zr(i,r);Rr(o),o=Er(o);var u,a=t-Vv,c=a>0?1:-1,s=o[0]*x_*c,f=w_(a)>180;f^(c*VvXv&&(Xv=u):(s=(s+360)%360-180,f^(c*VvXv&&(Xv=n))),f?tBr(Bv,Hv)&&(Hv=t):Br(t,Hv)>Br(Bv,Hv)&&(Bv=t):Hv>=Bv?(tHv&&(Hv=t)):t>Vv?Br(Bv,t)>Br(Bv,Hv)&&(Hv=t):Br(t,Hv)>Br(Bv,Hv)&&(Bv=t)}else Gv.push(Jv=[Bv=t,Hv=t]);nXv&&(Xv=n),Zv=e,Vv=t}function Dr(){B_.point=Ur}function Or(){Jv[0]=Bv,Jv[1]=Hv,B_.point=qr,Zv=null}function Fr(t,n){if(Zv){var e=t-Vv;Y_.add(w_(e)>180?e+(e>0?360:-360):e)}else $v=t,Wv=n;F_.point(t,n),Ur(t,n)}function Ir(){F_.lineStart()}function Yr(){Fr($v,Wv),F_.lineEnd(),w_(Y_)>v_&&(Bv=-(Hv=180)),Jv[0]=Bv,Jv[1]=Hv,Zv=null}function Br(t,n){return(n-=t)<0?n+360:n}function jr(t,n){return t[0]-n[0]}function Hr(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n__?t-m_:t<-__?t+m_:t,n]}function ei(t,n,e){return(t%=m_)?n||e?$_(ii(t),oi(n,e)):ii(t):n||e?oi(n,e):ni}function ri(t){return function(n,e){return n+=t,[n>__?n-m_:n<-__?n+m_:n,e]}}function ii(t){var n=ri(t);return n.invert=ri(-t),n}function oi(t,n){function e(t,n){var e=S_(n),a=S_(t)*e,c=C_(t)*e,s=C_(n),f=s*r+a*i;return[T_(c*o-f*u,a*r-s*i),yr(f*o+c*u)]}var r=S_(t),i=C_(t),o=S_(n),u=C_(n);return e.invert=function(t,n){var e=S_(n),a=S_(t)*e,c=C_(t)*e,s=C_(n),f=s*o-c*u;return[T_(c*o+s*u,a*r+f*i),yr(f*r-a*i)]},e}function ui(t,n,e,r,i,o){if(e){var u=S_(n),a=C_(n),c=r*e;null==i?(i=n+r*m_,o=n-c/2):(i=ai(u,i),o=ai(u,o),(r>0?io)&&(i+=r*m_));for(var s,f=i;r>0?f>o:f0)do{s.point(0===f||3===f?t:e,f>1?r:n)}while((f=(f+a+4)%4)!==l);else s.point(o[0],o[1])}function u(r,i){return w_(r[0]-t)0?0:3:w_(r[0]-e)0?2:1:w_(r[1]-n)0?1:0:i>0?3:2}function a(t,n){return c(t.x,n.x)}function c(t,n){var e=u(t,1),r=u(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(u){function c(t,n){i(t,n)&&N.point(t,n)}function s(){for(var n=0,e=0,i=_.length;er&&(l-o)*(r-u)>(h-u)*(t-o)&&++n:h<=r&&(l-o)*(r-u)<(h-u)*(t-o)&&--n;return n}function f(){N=k,v=[],_=[],S=!0}function l(){var t=s(),n=S&&t,e=(v=lf(v)).length;(n||e)&&(u.polygonStart(),n&&(u.lineStart(),o(null,null,1,u),u.lineEnd()),e&&fg(v,a,t,o,u),u.polygonEnd()),N=u,v=_=g=null}function h(){E.point=d,_&&_.push(g=[]),T=!0,M=!1,b=w=NaN}function p(){v&&(d(y,m),x&&M&&k.rejoin(),v.push(k.result())),E.point=c,M&&N.lineEnd()}function d(o,u){var a=i(o,u);if(_&&g.push([o,u]),T)y=o,m=u,x=a,T=!1,a&&(N.lineStart(),N.point(o,u));else if(a&&M)N.point(o,u);else{var c=[b=Math.max(hg,Math.min(lg,b)),w=Math.max(hg,Math.min(lg,w))],s=[o=Math.max(hg,Math.min(lg,o)),u=Math.max(hg,Math.min(lg,u))];cg(c,s,t,n,e,r)?(M||(N.lineStart(),N.point(c[0],c[1])),N.point(s[0],s[1]),a||N.lineEnd(),S=!1):a&&(N.lineStart(),N.point(o,u),S=!1)}b=o,w=u,M=a}var v,_,g,y,m,x,b,w,M,T,S,N=u,k=ag(),E={point:c,lineStart:h,lineEnd:p,polygonStart:f,polygonEnd:l};return E}}function li(){gg.point=pi,gg.lineEnd=hi}function hi(){gg.point=gg.lineEnd=xr}function pi(t,n){t*=b_,n*=b_,W_=t,Z_=C_(n),G_=S_(n),gg.point=di}function di(t,n){t*=b_,n*=b_;var e=C_(n),r=S_(n),i=w_(t-W_),o=S_(i),u=C_(i),a=r*u,c=G_*e-Z_*r*o,s=Z_*e+G_*r*o;_g.add(T_(P_(a*a+c*c),s)),W_=t,Z_=e,G_=r}function vi(t,n){return!(!t||!Mg.hasOwnProperty(t.type))&&Mg[t.type](t,n)}function _i(t,n){return 0===bg(t,n)}function gi(t,n){var e=bg(t[0],t[1]);return bg(t[0],n)+bg(n,t[1])<=e+v_}function yi(t,n){return!!vg(t.map(mi),xi(n))}function mi(t){return t=t.map(xi),t.pop(),t}function xi(t){return[t[0]*b_,t[1]*b_]}function bi(t,n,e){var r=Js(t,n-v_,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function wi(t,n,e){var r=Js(t,n-v_,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function Mi(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return Js(N_(o/_)*_,i,_).map(h).concat(Js(N_(s/g)*g,c,g).map(p)).concat(Js(N_(r/d)*d,e,d).filter(function(t){return w_(t%_)>v_}).map(f)).concat(Js(N_(a/v)*v,u,v).filter(function(t){return w_(t%g)>v_}).map(l))}var e,r,i,o,u,a,c,s,f,l,h,p,d=10,v=d,_=90,g=360,y=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(p(c).slice(1),h(i).reverse().slice(1),p(s).reverse().slice(1))]}},t.extent=function(n){return arguments.length?t.extentMajor(n).extentMinor(n):t.extentMinor()},t.extentMajor=function(n){return arguments.length?(o=+n[0][0],i=+n[1][0],s=+n[0][1],c=+n[1][1],o>i&&(n=o,o=i,i=n),s>c&&(n=s,s=c,c=n),t.precision(y)):[[o,s],[i,c]]},t.extentMinor=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],a=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),a>u&&(n=a,a=u,u=n),t.precision(y)):[[r,a],[e,u]]},t.step=function(n){return arguments.length?t.stepMajor(n).stepMinor(n):t.stepMinor()},t.stepMajor=function(n){return arguments.length?(_=+n[0],g=+n[1],t):[_,g]},t.stepMinor=function(n){return arguments.length?(d=+n[0],v=+n[1],t):[d,v]},t.precision=function(n){return arguments.length?(y=+n,f=bi(a,u,90),l=wi(r,e,y),h=bi(s,c,90),p=wi(o,i,y),t):y},t.extentMajor([[-180,-90+v_],[180,90-v_]]).extentMinor([[-180,-80-v_],[180,80+v_]])}function Ti(){return Mi()()}function Si(){Ag.point=Ni}function Ni(t,n){Ag.point=ki,J_=K_=t,Q_=tg=n}function ki(t,n){Eg.add(tg*t-K_*n),K_=t,tg=n}function Ei(){ki(J_,Q_)}function Ai(t,n){tPg&&(Pg=t),nLg&&(Lg=n)}function Ci(t,n){qg+=t,Ug+=n,++Dg}function zi(){Hg.point=Pi}function Pi(t,n){Hg.point=Li,Ci(rg=t,ig=n)}function Li(t,n){var e=t-rg,r=n-ig,i=P_(e*e+r*r);Og+=i*(rg+t)/2,Fg+=i*(ig+n)/2,Ig+=i,Ci(rg=t,ig=n)}function Ri(){Hg.point=Ci}function qi(){Hg.point=Di}function Ui(){Oi(ng,eg)}function Di(t,n){Hg.point=Oi,Ci(ng=rg=t,eg=ig=n)}function Oi(t,n){var e=t-rg,r=n-ig,i=P_(e*e+r*r);Og+=i*(rg+t)/2,Fg+=i*(ig+n)/2,Ig+=i,i=ig*t-rg*n,Yg+=i*(rg+t),Bg+=i*(ig+n),jg+=3*i,Ci(rg=t,ig=n)}function Fi(t){this._context=t}function Ii(t,n){Jg.point=Yi,Vg=Wg=t,$g=Zg=n}function Yi(t,n){Wg-=t,Zg-=n,Gg.add(P_(Wg*Wg+Zg*Zg)),Wg=t,Zg=n}function Bi(){this._string=[]}function ji(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Hi(t){return t.length>1}function Xi(t,n){return((t=t.x)[0]<0?t[1]-g_-v_:g_-t[1])-((n=n.x)[0]<0?n[1]-g_-v_:g_-n[1])}function Vi(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,u){var a=o>0?__:-__,c=w_(o-e);w_(c-__)0?g_:-g_),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),n=0):i!==a&&c>=__&&(w_(e-i)v_?M_((C_(n)*(o=S_(r))*C_(e)-C_(r)*(i=S_(n))*C_(t))/(i*o*u)):(n+r)/2}function Wi(t,n,e,r){var i;if(null==t)i=e*g_,r.point(-__,i),r.point(0,i),r.point(__,i),r.point(__,0),r.point(__,-i),r.point(0,-i),r.point(-__,-i),r.point(-__,0),r.point(-__,i);else if(w_(t[0]-n[0])>v_){var o=t[0]4*n&&v--){var x=u+h,b=a+p,w=c+d,M=P_(x*x+b*b+w*w),T=yr(w/=M),S=w_(w_(w)-1)n||w_((g*A+y*C)/m-.5)>.3||u*h+a*p+c*d2?t[2]%360*b_:0,i()):[b*x_,w*x_,M*x_]},n.precision=function(t){return arguments.length?(A=oy(r,E=t*t),o()):P_(E)},n.fitExtent=function(t,e){return Ji(n,t,e)},n.fitSize=function(t,e){return Qi(n,t,e)},function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,i()}}function ro(t){var n=0,e=__/3,r=eo(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*b_,e=t[1]*b_):[n*x_,e*x_]},i}function io(t){function n(t,n){return[t*e,C_(n)/e]}var e=S_(t);return n.invert=function(t,n){return[t/e,yr(n*e)]},n}function oo(t,n){function e(t,n){var e=P_(o-2*i*C_(n))/i;return[e*C_(t*=i),u-e*S_(t)]}var r=C_(t),i=(r+C_(n))/2;if(w_(i)0?n<-g_+v_&&(n=-g_+v_):n>g_-v_&&(n=g_-v_);var e=o/A_(lo(n),i);return[e*C_(i*t),o-e*S_(i*t)]}var r=S_(t),i=t===n?C_(t):E_(r/S_(n))/E_(lo(n)/lo(t)),o=r*A_(lo(t),i)/i;return i?(e.invert=function(t,n){var e=o-n,r=z_(i)*P_(t*t+e*e);return[T_(t,w_(e))/i*z_(e),2*M_(A_(o/r,1/i))-g_]},e):so}function po(t,n){return[t,n]}function vo(t,n){function e(t,n){var e=o-n,r=i*t;return[e*C_(r),o-e*S_(r)]}var r=S_(t),i=t===n?C_(t):(r-S_(n))/(n-t),o=r/i+t;return w_(i)=0;)n+=e[r].value;else n=1;t.value=n}function Ao(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}function Co(t,n){var e,r,i,o,u,a=new qo(t),c=+t.value&&(a.value=t.value),s=[a];for(null==n&&(n=Po);e=s.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(u=i.length))for(e.children=new Array(u),o=u-1;o>=0;--o)s.push(r=e.children[o]=new qo(i[o])),r.parent=e,r.depth=e.depth+1;return a.eachBefore(Ro)}function zo(){return Co(this).eachBefore(Lo)}function Po(t){return t.children}function Lo(t){t.data=t.data.data}function Ro(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function qo(t){this.data=t,this.depth=this.height=0,this.parent=null}function Uo(t){this._=t,this.next=null}function Do(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r-n.r;return i*i+1e-6>e*e+r*r}function Oo(t,n){var e,r,i,o=null,u=t.head;switch(n.length){case 1:e=Fo(n[0]);break;case 2:e=Io(n[0],n[1]);break;case 3:e=Yo(n[0],n[1],n[2])}for(;u;)i=u._,r=u.next,e&&Do(e,i)?o=u:(o?(t.tail=o,o.next=null):t.head=t.tail=null,n.push(i),e=Oo(t,n),n.pop(),t.head?(u.next=t.head,t.head=u):(u.next=null,t.head=t.tail=u),o=t.tail,o.next=r),u=r;return t.tail=o,e}function Fo(t){return{x:t.x,y:t.y,r:t.r}}function Io(t,n){var e=t.x,r=t.y,i=t.r,o=n.x,u=n.y,a=n.r,c=o-e,s=u-r,f=a-i,l=Math.sqrt(c*c+s*s);return{x:(e+o+c/l*f)/2,y:(r+u+s/l*f)/2,r:(l+i+a)/2}}function Yo(t,n,e){var r=t.x,i=t.y,o=t.r,u=n.x,a=n.y,c=n.r,s=e.x,f=e.y,l=e.r,h=2*(r-u),p=2*(i-a),d=2*(c-o),v=r*r+i*i-o*o-u*u-a*a+c*c,_=2*(r-s),g=2*(i-f),y=2*(l-o),m=r*r+i*i-o*o-s*s-f*f+l*l,x=_*p-h*g,b=(p*m-g*v)/x-r,w=(g*d-p*y)/x,M=(_*v-h*m)/x-i,T=(h*y-_*d)/x,S=w*w+T*T-1,N=2*(b*w+M*T+o),k=b*b+M*M-o*o,E=(-N-Math.sqrt(N*N-4*S*k))/(2*S);return{x:b+w*E+r,y:M+T*E+i,r:E}}function Bo(t,n,e){var r=t.x,i=t.y,o=n.r+e.r,u=t.r+e.r,a=n.x-r,c=n.y-i,s=a*a+c*c;if(s){var f=.5+((u*=u)-(o*=o))/(2*s),l=Math.sqrt(Math.max(0,2*o*(u+s)-(u-=s)*u-o*o))/(2*s);e.x=r+f*a+l*c,e.y=i+f*c-l*a}else e.x=r+u,e.y=i}function jo(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r+n.r;return i*i-1e-6>e*e+r*r}function Ho(t,n,e){var r=t._,i=t.next._,o=r.r+i.r,u=(r.x*i.r+i.x*r.r)/o-n,a=(r.y*i.r+i.y*r.r)/o-e;return u*u+a*a}function Xo(t){this._=t,this.next=null,this.previous=null}function Vo(t){if(!(i=t.length))return 0;var n,e,r,i;if(n=t[0],n.x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;Bo(e,n,r=t[2]);var o,u,a,c,s,f,l,h=n.r*n.r,p=e.r*e.r,d=r.r*r.r,v=h+p+d,_=h*n.x+p*e.x+d*r.x,g=h*n.y+p*e.y+d*r.y;n=new Xo(n),e=new Xo(e),r=new Xo(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(a=3;a=0;)n=i[o],n.z+=e,n.m+=e,e+=n.s+(r+=n.c)}function au(t,n,e){return t.a.parent===n.parent?t.a:e}function cu(t,n){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=n}function su(t){for(var n,e,r,i,o,u=new cu(t,0),a=[u];n=a.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)a.push(e=n.children[i]=new cu(r[i],i)),e.parent=n;return(u.parent=new cu(null,0)).children=[u],u}function fu(t,n,e,r,i,o){for(var u,a,c,s,f,l,h,p,d,v,_,g=[],y=n.children,m=0,x=0,b=y.length,w=n.value;mh&&(h=a),_=f*f*v,(p=Math.max(h/_,_/l))>d){f-=a;break}d=p}g.push(u={value:f,dice:c1&&rm(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function pu(t){if(!(t>=1))throw new Error;this._size=t,this._call=this._error=null,this._tasks=[],this._data=[],this._waiting=this._active=this._ended=this._start=0}function du(t){if(!t._start)try{vu(t)}catch(n){if(t._tasks[t._ended+t._active-1])gu(t,n);else if(!t._data)throw n}}function vu(t){for(;t._start=t._waiting&&t._active=0;)if((e=t._tasks[r])&&(t._tasks[r]=null,e.abort))try{e.abort()}catch(n){}t._active=NaN,yu(t)}function yu(t){if(!t._active&&t._call){var n=t._data;t._data=void 0,t._call(t._error,n)}}function mu(t){return new pu(arguments.length?+t:1/0)}function xu(t){return function(n,e){t(null==n?e:null)}}function bu(t){var n=t.responseType;return n&&"text"!==n?t.response:t.responseText}function wu(t,n){return function(e){return t(e.responseText,n)}}function Mu(t){function n(n){var o=n+"",u=e.get(o);if(!u){if(i!==km)return i;e.set(o,u=r.push(n))}return t[(u-1)%t.length]}var e=Be(),r=[],i=km;return t=null==t?[]:Nm.call(t),n.domain=function(t){if(!arguments.length)return r.slice();r=[],e=Be();for(var i,o,u=-1,a=t.length;++u=e?1:r(t)}}}function Au(t){return function(n,e){var r=t(n=+n,e=+e);return function(t){return t<=0?n:t>=1?e:r(t)}}}function Cu(t,n,e,r){var i=t[0],o=t[1],u=n[0],a=n[1];return o2?zu:Cu,o=u=null,r}function r(n){return(o||(o=i(a,c,f?Eu(t):t,s)))(+n)}var i,o,u,a=Cm,c=Cm,s=Sh,f=!1;return r.invert=function(t){return(u||(u=i(c,a,ku,f?Au(n):n)))(+t)},r.domain=function(t){return arguments.length?(a=Sm.call(t,Am),e()):a.slice()},r.range=function(t){return arguments.length?(c=Nm.call(t),e()):c.slice()},r.rangeRound=function(t){return c=Nm.call(t),s=Nh,e()},r.clamp=function(t){return arguments.length?(f=!!t,e()):f},r.interpolate=function(t){return arguments.length?(s=t,e()):s},e()}function Ru(t){var n=t.domain;return t.ticks=function(t){var e=n();return nf(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){return zm(n(),t,e)},t.nice=function(e){var r=n(),o=r.length-1,u=null==e?10:e,a=r[0],c=r[o],s=i(a,c,u);return s&&(s=i(Math.floor(a/s)*s,Math.ceil(c/s)*s,u),r[0]=Math.floor(a/s)*s,r[o]=Math.ceil(c/s)*s,n(r)),t},t}function qu(){var t=Lu(ku,xh);return t.copy=function(){return Pu(t,qu())},Ru(t)}function Uu(){function t(t){return+t}var n=[0,1];return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=Sm.call(e,Am),t):n.slice()},t.copy=function(){return Uu().domain(n)},Ru(t)}function Du(t,n){return(n=Math.log(n/t))?function(e){return Math.log(e/t)/n}:Em(n)}function Ou(t,n){return t<0?function(e){return-Math.pow(-n,e)*Math.pow(-t,1-e)}:function(e){return Math.pow(n,e)*Math.pow(t,1-e)}}function Fu(t){return isFinite(t)?+("1e"+t):t<0?0:t}function Iu(t){return 10===t?Fu:t===Math.E?Math.exp:function(n){return Math.pow(t,n)}}function Yu(t){return t===Math.E?Math.log:10===t&&Math.log10||2===t&&Math.log2||(t=Math.log(t),function(n){return Math.log(n)/t})}function Bu(t){return function(n){return-t(-n)}}function ju(){function n(){return o=Yu(i),u=Iu(i),r()[0]<0&&(o=Bu(o),u=Bu(u)),e}var e=Lu(Du,Ou).domain([1,10]),r=e.domain,i=10,o=Yu(10),u=Iu(10);return e.base=function(t){return arguments.length?(i=+t,n()):i},e.domain=function(t){return arguments.length?(r(t),n()):r()},e.ticks=function(t){var n,e=r(),a=e[0],c=e[e.length-1];(n=c0){for(;hc)break;v.push(l)}}else for(;h=1;--f)if(!((l=s*f)c)break;v.push(l)}}else v=nf(h,p,Math.min(p-h,d)).map(u);return n?v.reverse():v},e.tickFormat=function(n,r){if(null==r&&(r=10===i?".0e":","),"function"!=typeof r&&(r=t.format(r)),n===1/0)return r;null==n&&(n=10);var a=Math.max(1,i*n/e.ticks().length);return function(t){var n=t/u(Math.round(o(t)));return n*i0?i[n-1]:e[0],n=i?[o[i-1],r]:[o[n-1],o[n]]},t.copy=function(){return Wu().domain([e,r]).range(u)},Ru(t)}function Zu(){function t(t){if(t<=t)return e[Ds(n,t,0,r)]}var n=[.5],e=[0,1],r=1;return t.domain=function(i){return arguments.length?(n=Nm.call(i),r=Math.min(n.length,e.length-1),t):n.slice()},t.range=function(i){return arguments.length?(e=Nm.call(i),r=Math.min(n.length,e.length-1),t):e.slice()},t.invertExtent=function(t){var r=e.indexOf(t);return[n[r-1],n[r]]},t.copy=function(){return Zu().domain(n).range(e)},t}function Gu(t,n,e,r){function i(n){return t(n=new Date(+n)),n}return i.floor=i,i.ceil=function(e){return t(e=new Date(e-1)),n(e,1),t(e),e},i.round=function(t){var n=i(t),e=i.ceil(t);return t-n0))return u;do{u.push(new Date(+e))}while(n(e,o),t(e),e=n)for(;t(n),!e(n);)n.setTime(n-1)},function(t,r){if(t>=t)for(;--r>=0;)for(;n(t,1),!e(t););})},e&&(i.count=function(n,r){return Lm.setTime(+n),Rm.setTime(+r),t(Lm),t(Rm),Math.floor(e(Lm,Rm))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}function Ju(t){return Gu(function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+7*n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Dm)/Om})}function Qu(t){return Gu(function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+7*n)},function(t,n){return(n-t)/Om})}function Ku(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function ta(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function na(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function ea(t){function n(t,n){return function(e){var r,i,o,u=[],a=-1,c=0,s=t.length;for(e instanceof Date||(e=new Date(+e));++a=c)return-1;if(37===(i=n.charCodeAt(u++))){if(i=n.charAt(u++),!(o=B[i in Ux?n.charAt(u++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function i(t,n,e){var r=C.exec(n.slice(e));return r?(t.p=z[r[0].toLowerCase()],e+r[0].length):-1}function o(t,n,e){var r=R.exec(n.slice(e));return r?(t.w=q[r[0].toLowerCase()],e+r[0].length):-1}function u(t,n,e){var r=P.exec(n.slice(e));return r?(t.w=L[r[0].toLowerCase()],e+r[0].length):-1}function a(t,n,e){var r=O.exec(n.slice(e));return r?(t.m=F[r[0].toLowerCase()],e+r[0].length):-1}function c(t,n,e){var r=U.exec(n.slice(e));return r?(t.m=D[r[0].toLowerCase()],e+r[0].length):-1}function s(t,n,e){return r(t,w,n,e)}function f(t,n,e){return r(t,M,n,e)}function l(t,n,e){return r(t,T,n,e)}function h(t){return k[t.getDay()]}function p(t){return N[t.getDay()]}function d(t){return A[t.getMonth()]}function v(t){return E[t.getMonth()]}function _(t){return S[+(t.getHours()>=12)]}function g(t){return k[t.getUTCDay()]}function y(t){return N[t.getUTCDay()]}function m(t){return A[t.getUTCMonth()]}function x(t){return E[t.getUTCMonth()]}function b(t){return S[+(t.getUTCHours()>=12)]}var w=t.dateTime,M=t.date,T=t.time,S=t.periods,N=t.days,k=t.shortDays,E=t.months,A=t.shortMonths,C=oa(S),z=ua(S),P=oa(N),L=ua(N),R=oa(k),q=ua(k),U=oa(E),D=ua(E),O=oa(A),F=ua(A),I={a:h,A:p,b:d,B:v,c:null,d:ba,e:ba,H:wa,I:Ma,j:Ta,L:Sa,m:Na,M:ka,p:_,S:Ea,U:Aa,w:Ca,W:za,x:null,X:null,y:Pa,Y:La,Z:Ra,"%":Za},Y={a:g,A:y,b:m,B:x,c:null,d:qa,e:qa,H:Ua,I:Da,j:Oa,L:Fa,m:Ia,M:Ya,p:b,S:Ba,U:ja,w:Ha,W:Xa,x:null,X:null,y:Va,Y:$a,Z:Wa,"%":Za},B={a:o,A:u,b:a,B:c,c:s,d:da,e:da,H:_a,I:_a,j:va,L:ma,m:pa,M:ga,p:i,S:ya,U:ca,w:aa,W:sa,x:f,X:l,y:la,Y:fa,Z:ha,"%":xa};return I.x=n(M,I),I.X=n(T,I),I.c=n(w,I),Y.x=n(M,Y),Y.X=n(T,Y),Y.c=n(w,Y),{format:function(t){var e=n(t+="",I);return e.toString=function(){return t},e},parse:function(t){var n=e(t+="",Ku);return n.toString=function(){return t},n},utcFormat:function(t){var e=n(t+="",Y);return e.toString=function(){return t},e},utcParse:function(t){var n=e(t,ta);return n.toString=function(){return t},n}}}function ra(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o68?1900:2e3),e+r[0].length):-1}function ha(t,n,e){var r=/^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function pa(t,n,e){var r=Dx.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function da(t,n,e){var r=Dx.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function va(t,n,e){var r=Dx.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function _a(t,n,e){var r=Dx.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function ga(t,n,e){var r=Dx.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function ya(t,n,e){var r=Dx.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function ma(t,n,e){var r=Dx.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function xa(t,n,e){var r=Ox.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function ba(t,n){return ra(t.getDate(),n,2)}function wa(t,n){return ra(t.getHours(),n,2)}function Ma(t,n){return ra(t.getHours()%12||12,n,2)}function Ta(t,n){return ra(1+Xm.count(sx(t),t),n,3)}function Sa(t,n){return ra(t.getMilliseconds(),n,3)}function Na(t,n){return ra(t.getMonth()+1,n,2)}function ka(t,n){return ra(t.getMinutes(),n,2)}function Ea(t,n){return ra(t.getSeconds(),n,2)}function Aa(t,n){return ra($m.count(sx(t),t),n,2)}function Ca(t){return t.getDay()}function za(t,n){return ra(Wm.count(sx(t),t),n,2)}function Pa(t,n){return ra(t.getFullYear()%100,n,2)}function La(t,n){return ra(t.getFullYear()%1e4,n,4)}function Ra(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+ra(n/60|0,"0",2)+ra(n%60,"0",2)}function qa(t,n){return ra(t.getUTCDate(),n,2)}function Ua(t,n){return ra(t.getUTCHours(),n,2)}function Da(t,n){return ra(t.getUTCHours()%12||12,n,2)}function Oa(t,n){return ra(1+vx.count(Lx(t),t),n,3)}function Fa(t,n){return ra(t.getUTCMilliseconds(),n,3)}function Ia(t,n){return ra(t.getUTCMonth()+1,n,2)}function Ya(t,n){return ra(t.getUTCMinutes(),n,2)}function Ba(t,n){return ra(t.getUTCSeconds(),n,2)}function ja(t,n){return ra(gx.count(Lx(t),t),n,2)}function Ha(t){return t.getUTCDay()}function Xa(t,n){return ra(yx.count(Lx(t),t),n,2)}function Va(t,n){return ra(t.getUTCFullYear()%100,n,2)}function $a(t,n){return ra(t.getUTCFullYear()%1e4,n,4)}function Wa(){return"+0000"}function Za(){return"%"}function Ga(n){return Rx=ea(n),t.timeFormat=Rx.format,t.timeParse=Rx.parse,t.utcFormat=Rx.utcFormat,t.utcParse=Rx.utcParse,Rx}function Ja(t){return t.toISOString()}function Qa(t){var n=new Date(t);return isNaN(n)?null:n}function Ka(t){return new Date(t)}function tc(t){return t instanceof Date?+t:+new Date(+t)}function nc(t,n,e,r,o,u,a,c,s){function f(i){return(a(i)1?0:t<-1?xb:Math.acos(t)}function oc(t){return t>=1?bb:t<=-1?-bb:Math.asin(t)}function uc(t){return t.innerRadius}function ac(t){return t.outerRadius}function cc(t){return t.startAngle}function sc(t){return t.endAngle}function fc(t){return t&&t.padAngle}function lc(t,n,e,r,i,o,u,a){var c=e-t,s=r-n,f=u-i,l=a-o,h=(f*(n-o)-l*(t-i))/(l*c-f*s);return[t+h*c,n+h*s]}function hc(t,n,e,r,i,o,u){var a=t-e,c=n-r,s=(u?o:-o)/yb(a*a+c*c),f=s*c,l=-s*a,h=t+f,p=n+l,d=e+f,v=r+l,_=(h+d)/2,g=(p+v)/2,y=d-h,m=v-p,x=y*y+m*m,b=i-o,w=h*v-d*p,M=(m<0?-1:1)*yb(vb(0,b*b*x-w*w)),T=(w*m-y*M)/x,S=(-w*y-m*M)/x,N=(w*m+y*M)/x,k=(-w*y+m*M)/x,E=T-_,A=S-g,C=N-_,z=k-g;return E*E+A*A>C*C+z*z&&(T=N,S=k),{cx:T,cy:S,x01:-f,y01:-l,x11:T*(i/b-1),y11:S*(i/b-1)}}function pc(t){this._context=t}function dc(t){return t[0]}function vc(t){return t[1]}function _c(t){this._curve=t}function gc(t){function n(n){return new _c(t(n))}return n._curve=t,n}function yc(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(gc(t)):n()._curve},t}function mc(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function xc(t){this._context=t}function bc(t){this._context=t}function wc(t){this._context=t}function Mc(t,n){this._basis=new xc(t),this._beta=n}function Tc(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function Sc(t,n){this._context=t,this._k=(1-n)/6}function Nc(t,n){this._context=t,this._k=(1-n)/6}function kc(t,n){this._context=t,this._k=(1-n)/6}function Ec(t,n,e){var r=t._x1,i=t._y1,o=t._x2,u=t._y2;if(t._l01_a>mb){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>mb){var s=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*s+t._x1*t._l23_2a-n*t._l12_2a)/f,u=(u*s+t._y1*t._l23_2a-e*t._l12_2a)/f}t._context.bezierCurveTo(r,i,o,u,t._x2,t._y2)}function Ac(t,n){this._context=t,this._alpha=n}function Cc(t,n){this._context=t,this._alpha=n}function zc(t,n){this._context=t,this._alpha=n}function Pc(t){this._context=t}function Lc(t){return t<0?-1:1}function Rc(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),u=(e-t._y1)/(i||r<0&&-0),a=(o*i+u*r)/(r+i);return(Lc(o)+Lc(u))*Math.min(Math.abs(o),Math.abs(u),.5*Math.abs(a))||0}function qc(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Uc(t,n,e){var r=t._x0,i=t._y0,o=t._x1,u=t._y1,a=(o-r)/3;t._context.bezierCurveTo(r+a,i+a*n,o-a,u-a*e,o,u)}function Dc(t){this._context=t}function Oc(t){this._context=new Fc(t)}function Fc(t){this._context=t}function Ic(t){return new Dc(t)}function Yc(t){return new Oc(t)}function Bc(t){this._context=t}function jc(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),u=new Array(r);for(i[0]=0,o[0]=2,u[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(u[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n0)){if(o/=d,d<0){if(o0){if(o>p)return;o>h&&(h=o)}if(o=r-c,d||!(o<0)){if(o/=d,d<0){if(o>p)return;o>h&&(h=o)}else if(d>0){if(o0)){if(o/=v,v<0){if(o0){if(o>p)return;o>h&&(h=o)}if(o=i-s,v||!(o<0)){if(o/=v,v<0){if(o>p)return;o>h&&(h=o)}else if(v>0){if(o0||p<1)||(h>0&&(t[0]=[c+h*d,s+h*v]),p<1&&(t[1]=[c+p*d,s+p*v]),!0)}}}}}function us(t,n,e,r,i){var o=t[1];if(o)return!0;var u,a,c=t[0],s=t.left,f=t.right,l=s[0],h=s[1],p=f[0],d=f[1],v=(l+p)/2,_=(h+d)/2;if(d===h){if(v=r)return;if(l>p){if(c){if(c[1]>=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]1)if(l>p){if(c){if(c[1]>=i)return}else c=[(e-a)/u,e];o=[(i-a)/u,i]}else{if(c){if(c[1]=r)return}else c=[n,u*n+a];o=[r,u*r+a]}else{if(c){if(c[0]zw||Math.abs(i[0][1]-i[1][1])>zw)||delete Ew[o]}function cs(t){return Nw[t.index]={site:t,halfedges:[]}}function ss(t,n){var e=t.site,r=n.left,i=n.right;return e===i&&(i=r,r=e),i?Math.atan2(i[1]-r[1],i[0]-r[0]):(e===r?(r=n[1],i=n[0]):(r=n[0],i=n[1]),Math.atan2(r[0]-i[0],i[1]-r[1]))}function fs(t,n){return n[+(n.left!==t.site)]}function ls(t,n){return n[+(n.left===t.site)]}function hs(){for(var t,n,e,r,i=0,o=Nw.length;izw||Math.abs(v-h)>zw)&&(c.splice(a,0,Ew.push(rs(u,p,Math.abs(d-t)zw?[t,Math.abs(l-t)zw?[Math.abs(h-r)zw?[e,Math.abs(l-e)zw?[Math.abs(h-n)=-Pw)){var p=c*c+s*s,d=f*f+l*l,v=(l*p-s*d)/h,_=(c*d-f*p)/h,g=Aw.pop()||new ds;g.arc=t,g.site=i,g.x=v+u,g.y=(g.cy=_+a)+Math.sqrt(v*v+_*_),t.circle=g;for(var y=null,m=kw._;m;)if(g.yzw)a=a.L;else{if(!((i=o-Ms(a,u))>zw)){r>-zw?(n=a.P,e=a):i>-zw?(n=a,e=a.N):n=e=a;break}if(!a.R){n=a;break}a=a.R}cs(t);var c=ys(t);if(Sw.insert(n,c),n||e){if(n===e)return _s(n),e=ys(n.site),Sw.insert(c,e),c.edge=e.edge=es(n.site,c.site),vs(n),void vs(e);if(!e)return void(c.edge=es(n.site,c.site));_s(n),_s(e);var s=n.site,f=s[0],l=s[1],h=t[0]-f,p=t[1]-l,d=e.site,v=d[0]-f,_=d[1]-l,g=2*(h*_-p*v),y=h*h+p*p,m=v*v+_*_,x=[(_*y-p*m)/g+f,(h*m-v*y)/g+l];is(e.edge,s,d,x),c.edge=es(s,t,null,x),e.edge=es(t,d,null,x),vs(n),vs(e)}}function ws(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var u=t.P;if(!u)return-1/0;e=u.site;var a=e[0],c=e[1],s=c-n;if(!s)return a;var f=a-r,l=1/o-1/s,h=f/s;return l?(-h+Math.sqrt(h*h-2*l*(f*f/(-2*s)-c+s/2+i-o/2)))/l+r:(r+a)/2}function Ms(t,n){var e=t.N;if(e)return ws(e,n);var r=t.site;return r[1]===n?r[0]:1/0}function Ts(t,n,e){return(t[0]-e[0])*(n[1]-t[1])-(t[0]-n[0])*(e[1]-t[1])}function Ss(t,n){return n[1]-t[1]||n[0]-t[0]}function Ns(t,n){var e,r,i,o=t.sort(Ss).pop();for(Ew=[],Nw=new Array(t.length),Sw=new Jc,kw=new Jc;;)if(i=Tw,o&&(!i||o[1]n?1:t>=n?0:NaN},qs=function(t){return 1===t.length&&(t=n(t)),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}},Us=qs(Rs),Ds=Us.right,Os=Us.left,Fs=function(t,n){null==n&&(n=e);for(var r=0,i=t.length-1,o=t[0],u=new Array(i<0?0:i);rt?1:n>=t?0:NaN},Bs=function(t){return null===t?NaN:+t},js=function(t,n){var e,r,i=t.length,o=0,u=-1,a=0,c=0;if(null==n)for(;++u1)return c/(o-1)},Hs=function(t,n){var e=js(t,n);return e?Math.sqrt(e):e},Xs=function(t,n){var e,r,i,o=t.length,u=-1;if(null==n){for(;++u=e)for(r=i=e;++ue&&(r=e),i=e)for(r=i=e;++ue&&(r=e),i0)for(t=Math.ceil(t/u),n=Math.floor(n/u),o=new Array(i=Math.ceil(n-t+1));++cl;)h.pop(),--p;var d,v=new Array(p+1);for(o=0;o<=p;++o)d=v[o]=[],d.x0=o>0?h[o-1]:f,d.x1=o=1)return+e(t[r-1],r-1,t);var r,i=(r-1)*n,o=Math.floor(i),u=+e(t[o],o,t);return u+(+e(t[o+1],o+1,t)-u)*(i-o)}},uf=function(t,n,e){return t=Ws.call(t,Bs).sort(Rs),Math.ceil((e-n)/(2*(of(t,.75)-of(t,.25))*Math.pow(t.length,-1/3)))},af=function(t,n,e){return Math.ceil((e-n)/(3.5*Hs(t)*Math.pow(t.length,-1/3)))},cf=function(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r},sf=function(t,n){var e,r=t.length,i=r,o=-1,u=0;if(null==n)for(;++o=0;)for(r=t[i],n=r.length;--n>=0;)e[--u]=r[n];return e},hf=function(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r},pf=function(t,n){for(var e=n.length,r=new Array(e);e--;)r[e]=t[n[e]];return r},df=function(t,n){if(e=t.length){var e,r,i=0,o=0,u=t[o];for(null==n&&(n=Rs);++i0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),Ef.hasOwnProperty(n)?{space:Ef[n],local:t}:t},Cf=function(t){var n=Af(t);return(n.local?b:x)(n)},zf=0;M.prototype=w.prototype={constructor:M,get:function(t){for(var n=this._;!(n in t);)if(!(t=t.parentNode))return;return t[n]},set:function(t,n){return t[this._]=n},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}};var Pf=function(t){return function(){return this.matches(t)}};if("undefined"!=typeof document){var Lf=document.documentElement;if(!Lf.matches){var Rf=Lf.webkitMatchesSelector||Lf.msMatchesSelector||Lf.mozMatchesSelector||Lf.oMatchesSelector;Pf=function(t){return function(){return Rf.call(this,t)}}}}var qf=Pf,Uf={};if(t.event=null,"undefined"!=typeof document){"onmouseenter"in document.documentElement||(Uf={mouseenter:"mouseover",mouseleave:"mouseout"})}var Df=function(t,n,e){var r,i,o=N(t+""),u=o.length;{if(!(arguments.length<2)){for(a=n?E:k,null==e&&(e=!1),r=0;r=x&&(x=m+1);!(y=_[x])&&++x=0;)(r=i[o])&&(u&&u!==r.nextSibling&&u.parentNode.insertBefore(r,u),u=r);return this},tl=function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=q);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?B:"function"==typeof n?H:j)(t,n,null==e?"":e)):cl(r=this.node()).getComputedStyle(r,null).getPropertyValue(t)},fl=function(t,n){return arguments.length>1?this.each((null==n?X:"function"==typeof n?$:V)(t,n)):this.node()[t]};G.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var n=this._names.indexOf(t);n>=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ll=function(t,n){var e=W(t+"");if(arguments.length<2){for(var r=Z(this.node()),i=-1,o=e.length;++i=240?t-240:t+120,i,r),qt(t,i,r),qt(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var jl=Math.PI/180,Hl=180/Math.PI,Xl=.95047,Vl=1,$l=1.08883,Wl=4/29,Zl=6/29,Gl=3*Zl*Zl,Jl=Zl*Zl*Zl;Cl(Ot,Dt,Mt(Tt,{brighter:function(t){return new Ot(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new Ot(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,e=isNaN(this.b)?t:t-this.b/200;return t=Vl*It(t),n=Xl*It(n),e=$l*It(e),new Ct(Yt(3.2404542*n-1.5371385*t-.4985314*e),Yt(-.969266*n+1.8760108*t+.041556*e),Yt(.0556434*n-.2040259*t+1.0572252*e),this.opacity)}})),Cl(Xt,Ht,Mt(Tt,{brighter:function(t){return new Xt(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new Xt(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return Ut(this).rgb()}}));var Ql=-.14861,Kl=1.78277,th=-.29227,nh=-.90649,eh=1.97294,rh=eh*nh,ih=eh*Kl,oh=Kl*th-nh*Ql;Cl(Wt,$t,Mt(Tt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Wt(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Wt(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*jl,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new Ct(255*(n+e*(Ql*r+Kl*i)),255*(n+e*(th*r+nh*i)),255*(n+e*(eh*r)),this.opacity)}}));var uh,ah,ch,sh,fh,lh,hh=function(t){var n=t.length-1;return function(e){var r=e<=0?e=0:e>=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],u=r>0?t[r-1]:2*i-o,a=ro&&(i=n.slice(o,i),a[u]?a[u]+=i:a[++u]=i),(e=e[0])===(r=r[0])?a[u]?a[u]+=r:a[++u]=r:(a[++u]=null,c.push({i:u,x:xh(e,r)})),o=Mh.lastIndex;return oep&&e.statenp&&e.name===n)return new te([[t]],nd,n,+r)}return null},rd=function(t){return function(){return t}},id=function(t,n,e){this.target=t,this.type=n,this.selection=e},od=function(){t.event.preventDefault(),t.event.stopImmediatePropagation()},ud={name:"drag"},ad={name:"space"},cd={name:"handle"},sd={name:"center"},fd={name:"x",handles:["e","w"].map(Te),input:function(t,n){return t&&[[t[0],n[0][1]],[t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},ld={name:"y",handles:["n","s"].map(Te),input:function(t,n){return t&&[[n[0][0],t[0]],[n[1][0],t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},hd={name:"xy",handles:["n","e","s","w","nw","ne","se","sw"].map(Te),input:function(t){return t},output:function(t){return t}},pd={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},dd={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},vd={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},_d={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},gd={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1},yd=function(){return Pe(hd)},md=Math.cos,xd=Math.sin,bd=Math.PI,wd=bd/2,Md=2*bd,Td=Math.max,Sd=function(){function t(t){var o,u,a,c,s,f,l=t.length,h=[],p=Js(l),d=[],v=[],_=v.groups=new Array(l),g=new Array(l*l);for(o=0,s=-1;++s1e-6)if(Math.abs(f*a-c*s)>1e-6&&i){var h=e-o,p=r-u,d=a*a+c*c,v=h*h+p*p,_=Math.sqrt(d),g=Math.sqrt(l),y=i*Math.tan((Ed-Math.acos((d+l-v)/(2*_*g)))/2),m=y/g,x=y/_;Math.abs(m-1)>1e-6&&(this._+="L"+(t+m*s)+","+(n+m*f)),this._+="A"+i+","+i+",0,0,"+ +(f*h>s*p)+","+(this._x1=t+x*a)+","+(this._y1=n+x*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,e=+e;var u=e*Math.cos(r),a=e*Math.sin(r),c=t+u,s=n+a,f=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+s:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-s)>1e-6)&&(this._+="L"+c+","+s),e&&(l<0&&(l=l%Ad+Ad),l>Cd?this._+="A"+e+","+e+",0,1,"+f+","+(t-u)+","+(n-a)+"A"+e+","+e+",0,1,"+f+","+(this._x1=c)+","+(this._y1=s):l>1e-6&&(this._+="A"+e+","+e+",0,"+ +(l>=Ed)+","+f+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};var zd=function(){function t(){var t,a=Nd.call(arguments),c=n.apply(this,a),s=e.apply(this,a),f=+r.apply(this,(a[0]=c,a)),l=i.apply(this,a)-wd,h=o.apply(this,a)-wd,p=f*md(l),d=f*xd(l),v=+r.apply(this,(a[0]=s,a)),_=i.apply(this,a)-wd,g=o.apply(this,a)-wd;if(u||(u=t=qe()),u.moveTo(p,d),u.arc(0,0,f,l,h),l===_&&h===g||(u.quadraticCurveTo(0,0,v*md(_),v*xd(_)),u.arc(0,0,v,_,g)),u.quadraticCurveTo(0,0,p,d),u.closePath(),t)return u=null,t+""||null}var n=Ue,e=De,r=Oe,i=Fe,o=Ie,u=null;return t.radius=function(n){return arguments.length?(r="function"==typeof n?n:kd(+n),t):r},t.startAngle=function(n){return arguments.length?(i="function"==typeof n?n:kd(+n),t):i},t.endAngle=function(n){return arguments.length?(o="function"==typeof n?n:kd(+n),t):o},t.source=function(e){return arguments.length?(n=e,t):n},t.target=function(n){return arguments.length?(e=n,t):e},t.context=function(n){return arguments.length?(u=null==n?null:n,t):u},t};Ye.prototype=Be.prototype={constructor:Ye,has:function(t){return"$"+t in this},get:function(t){return this["$"+t]},set:function(t,n){return this["$"+t]=n,this},remove:function(t){var n="$"+t;return n in this&&delete this[n]},clear:function(){for(var t in this)"$"===t[0]&&delete this[t]},keys:function(){var t=[];for(var n in this)"$"===n[0]&&t.push(n.slice(1));return t},values:function(){var t=[];for(var n in this)"$"===n[0]&&t.push(this[n]);return t},entries:function(){var t=[];for(var n in this)"$"===n[0]&&t.push({key:n.slice(1),value:this[n]});return t},size:function(){var t=0;for(var n in this)"$"===n[0]&&++t;return t},empty:function(){for(var t in this)if("$"===t[0])return!1;return!0},each:function(t){for(var n in this)"$"===n[0]&&t(this[n],n.slice(1),this)}};var Pd=function(){function t(n,i,u,a){if(i>=o.length)return null!=r?r(n):null!=e?n.sort(e):n;for(var c,s,f,l=-1,h=n.length,p=o[i++],d=Be(),v=u();++lo.length)return t;var i,a=u[e-1];return null!=r&&e>=o.length?i=t.entries():(i=[],t.each(function(t,r){i.push({key:r,values:n(t,e)})})),null!=a?i.sort(function(t,n){return a(t.key,n.key)}):i}var e,r,i,o=[],u=[];return i={object:function(n){return t(n,0,je,He)},map:function(n){return t(n,0,Xe,Ve)},entries:function(e){return n(t(e,0,Xe,Ve),0)},key:function(t){return o.push(t),i},sortKeys:function(t){return u[o.length-1]=t,i},sortValues:function(t){return e=t,i},rollup:function(t){return r=t,i}}},Ld=Be.prototype;$e.prototype=We.prototype={constructor:$e,has:Ld.has,add:function(t){return t+="",this["$"+t]=t,this},remove:Ld.remove,clear:Ld.clear,values:Ld.keys,size:Ld.size,empty:Ld.empty,each:Ld.each};var Rd=function(t){var n=[];for(var e in t)n.push(e);return n},qd=function(t){var n=[];for(var e in t)n.push(t[e]);return n},Ud=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},Dd=function(t){function n(t,n){var r,i,o=e(t,function(t,e){if(r)return r(t,e-1);i=t,r=n?Ge(t,n):Ze(t)});return o.columns=i,o}function e(t,n){function e(){if(f>=s)return u;if(i)return i=!1,o;var n,e=f;if(34===t.charCodeAt(e)){for(var r=e;r++t||t>i||r>n||n>o))return this;var u,a,c=i-e,s=this._root;switch(a=(n<(r+o)/2)<<1|t<(e+i)/2){case 0:do{u=new Array(4),u[a]=s,s=u}while(c*=2,i=e+c,o=r+c,t>i||n>o);break;case 1:do{u=new Array(4),u[a]=s,s=u}while(c*=2,e=i-c,o=r+c,e>t||n>o);break;case 2:do{u=new Array(4),u[a]=s,s=u}while(c*=2,i=e+c,r=o-c,t>i||r>n);break;case 3:do{u=new Array(4),u[a]=s,s=u}while(c*=2,e=i-c,r=o-c,e>t||r>n)}this._root&&this._root.length&&(this._root=s)}return this._x0=e,this._y0=r,this._x1=i,this._y1=o,this},Kd=function(){var t=[];return this.visit(function(n){if(!n.length)do{t.push(n.data)}while(n=n.next)}),t},tv=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},nv=function(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i},ev=function(t,n,e){var r,i,o,u,a,c,s,f=this._x0,l=this._y0,h=this._x1,p=this._y1,d=[],v=this._root;for(v&&d.push(new nv(v,f,l,h,p)),null==e?e=1/0:(f=t-e,l=n-e,h=t+e,p=n+e,e*=e);c=d.pop();)if(!(!(v=c.node)||(i=c.x0)>h||(o=c.y0)>p||(u=c.x1)=g)<<1|t>=_)&&(c=d[d.length-1],d[d.length-1]=d[d.length-1-s],d[d.length-1-s]=c)}else{var y=t-+this._x.call(null,v.data),m=n-+this._y.call(null,v.data),x=y*y+m*m;if(x=(a=(d+_)/2))?d=a:_=a,(f=u>=(c=(v+g)/2))?v=c:g=c,n=p,!(p=p[l=f<<1|s]))return this;if(!p.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;p.data!==t;)if(r=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(p=n[0]||n[1]||n[2]||n[3])&&p===(n[3]||n[2]||n[1]||n[0])&&!p.length&&(e?e[h]=p:this._root=p),this):(this._root=i,this)},iv=function(){return this._root},ov=function(){var t=0;return this.visit(function(n){if(!n.length)do{++t}while(n=n.next)}),t},uv=function(t){var n,e,r,i,o,u,a=[],c=this._root;for(c&&a.push(new nv(c,this._x0,this._y0,this._x1,this._y1));n=a.pop();)if(!t(c=n.node,r=n.x0,i=n.y0,o=n.x1,u=n.y1)&&c.length){var s=(r+o)/2,f=(i+u)/2;(e=c[3])&&a.push(new nv(e,s,f,o,u)),(e=c[2])&&a.push(new nv(e,r,f,s,u)),(e=c[1])&&a.push(new nv(e,s,i,o,f)),(e=c[0])&&a.push(new nv(e,r,i,s,f))}return this},av=function(t){var n,e=[],r=[];for(this._root&&e.push(new nv(this._root,this._x0,this._y0,this._x1,this._y1));n=e.pop();){var i=n.node;if(i.length){var o,u=n.x0,a=n.y0,c=n.x1,s=n.y1,f=(u+c)/2,l=(a+s)/2;(o=i[0])&&e.push(new nv(o,u,a,f,l)),(o=i[1])&&e.push(new nv(o,f,a,c,l)),(o=i[2])&&e.push(new nv(o,u,l,f,s)),(o=i[3])&&e.push(new nv(o,f,l,c,s))}r.push(n)}for(;n=r.pop();)t(n.node,n.x0,n.y0,n.x1,n.y1);return this},cv=function(t){return arguments.length?(this._x=t,this):this._x},sv=function(t){return arguments.length?(this._y=t,this):this._y},fv=rr.prototype=ir.prototype;fv.copy=function(){var t,n,e=new ir(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=or(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=or(n));return e},fv.add=Jd,fv.addAll=Ke,fv.cover=Qd,fv.data=Kd,fv.extent=tv,fv.find=ev,fv.remove=rv,fv.removeAll=tr,fv.root=iv,fv.size=ov,fv.visit=uv,fv.visitAfter=av,fv.x=cv,fv.y=sv;var lv,hv=function(t){function n(){function t(t,n,e,r,i){var o=t.data,a=t.r,p=l+a;{if(!o)return n>s+p||rf+p||ic.index){var d=s-o.x-o.vx,v=f-o.y-o.vy,_=d*d+v*v;_t.r&&(t.r=t[n].r)}function r(){if(i){var n,e,r=i.length;for(o=new Array(r),n=0;n1?(null==n?l.remove(t):l.set(t,i(n)),o):l.get(t)},find:function(n,e,r){var i,o,u,a,c,s=0,f=t.length;for(null==r?r=1/0:r*=r,s=0;s1?(p.on(t,n),o):p.on(t)}}},gv=function(){function t(t){var n,a=i.length,c=rr(i,fr,lr).visitAfter(e);for(u=t,n=0;n=f)){(t.data!==o||t.next)&&(0===i&&(i=Gd(),p+=i*i),0===c&&(c=Gd(),p+=c*c),p1?r[0]+r.slice(2):r,+t.slice(e+1)]},bv=function(t){return t=xv(Math.abs(t)),t?t[1]:NaN},wv=function(t,n){return function(e,r){for(var i=e.length,o=[],u=0,a=t[0],c=0;i>0&&a>0&&(c+a+1>r&&(a=Math.max(1,r-c)),o.push(e.substring(i-=a,i+a)),!((c+=a+1)>r));)a=t[u=(u+1)%t.length];return o.reverse().join(n)}},Mv=function(t){return function(n){return n.replace(/[0-9]/g,function(n){return t[+n]})}},Tv=function(t,n){t=t.toPrecision(n);t:for(var e,r=t.length,i=1,o=-1;i0&&(o=0)}return o>0?t.slice(0,o)+t.slice(e+1):t},Sv=function(t,n){var e=xv(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(lv=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,u=r.length;return o===u?r:o>u?r+new Array(o-u+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+xv(t,Math.max(0,n+o-1))[0]},Nv=function(t,n){var e=xv(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")},kv={"":Tv,"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return Nv(100*t,n)},r:Nv,s:Sv,X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}},Ev=/^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;hr.prototype=pr.prototype,pr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+this.type};var Av,Cv=function(t){return t},zv=["y","z","a","f","p","n","","m","","k","M","G","T","P","E","Z","Y"],Pv=function(t){function n(t){function n(t){var n,i,a,f=_,x=g;if("c"===v)x=y(t)+x,t="";else{t=+t;var b=t<0;if(t=y(Math.abs(t),d),b&&0==+t&&(b=!1),f=(b?"("===s?s:"-":"-"===s||"("===s?"":s)+f,x=x+("s"===v?zv[8+lv/3]:"")+(b&&"("===s?")":""),m)for(n=-1,i=t.length;++n(a=t.charCodeAt(n))||a>57){x=(46===a?o+t.slice(n+1):t.slice(n))+x,t=t.slice(0,n);break}}p&&!l&&(t=r(t,1/0));var w=f.length+t.length+x.length,M=w>1)+f+t+x+M.slice(w);break;default:t=M+f+t+x}return u(t)}t=hr(t);var e=t.fill,c=t.align,s=t.sign,f=t.symbol,l=t.zero,h=t.width,p=t.comma,d=t.precision,v=t.type,_="$"===f?i[0]:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",g="$"===f?i[1]:/[%p]/.test(v)?a:"",y=kv[v],m=!v||/[defgprs%]/.test(v);return d=null==d?v?6:12:/[gprs]/.test(v)?Math.max(1,Math.min(21,d)):Math.max(0,Math.min(20,d)),n.toString=function(){return t+""},n}function e(t,e){var r=n((t=hr(t),t.type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(bv(e)/3))),o=Math.pow(10,-i),u=zv[8+i/3];return function(t){return r(o*t)+u}}var r=t.grouping&&t.thousands?wv(t.grouping,t.thousands):Cv,i=t.currency,o=t.decimal,u=t.numerals?Mv(t.numerals):Cv,a=t.percent||"%";return{format:n,formatPrefix:e}};dr({decimal:".",thousands:",",grouping:[3],currency:["$",""]});var Lv=function(t){return Math.max(0,-bv(Math.abs(t)))},Rv=function(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(bv(n)/3)))-bv(Math.abs(t)))},qv=function(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,bv(n)-bv(t))+1},Uv=function(){return new vr};vr.prototype={constructor:vr,reset:function(){this.s=this.t=0},add:function(t){_r(d_,t,this.t),_r(this,d_.s,this.s),this.s?this.t+=d_.t:this.s=d_.t},valueOf:function(){return this.s}};var Dv,Ov,Fv,Iv,Yv,Bv,jv,Hv,Xv,Vv,$v,Wv,Zv,Gv,Jv,Qv,Kv,t_,n_,e_,r_,i_,o_,u_,a_,c_,s_,f_,l_,h_,p_,d_=new vr,v_=1e-6,__=Math.PI,g_=__/2,y_=__/4,m_=2*__,x_=180/__,b_=__/180,w_=Math.abs,M_=Math.atan,T_=Math.atan2,S_=Math.cos,N_=Math.ceil,k_=Math.exp,E_=Math.log,A_=Math.pow,C_=Math.sin,z_=Math.sign||function(t){return t>0?1:t<0?-1:0},P_=Math.sqrt,L_=Math.tan,R_={Feature:function(t,n){br(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++rv_?Xv=90:Y_<-v_&&(jv=-90),Jv[0]=Bv,Jv[1]=Hv}},j_=function(t){var n,e,r,i,o,u,a;if(Xv=Hv=-(Bv=jv=1/0),Gv=[],U_(t,B_),e=Gv.length){for(Gv.sort(jr),n=1,r=Gv[0],o=[r];nBr(r[0],r[1])&&(r[1]=i[1]),Br(i[0],r[1])>Br(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(u=-1/0,e=o.length-1,n=0,r=o[e];n<=e;r=i,++n)i=o[n],(a=Br(r[1],i[0]))>u&&(u=a,Bv=i[0],Hv=r[1])}return Gv=Jv=null,Bv===1/0||jv===1/0?[[NaN,NaN],[NaN,NaN]]:[[Bv,jv],[Hv,Xv]]},H_={sphere:xr,point:Xr,lineStart:$r,lineEnd:Gr,polygonStart:function(){H_.lineStart=Jr,H_.lineEnd=Qr},polygonEnd:function(){H_.lineStart=$r,H_.lineEnd=Gr}},X_=function(t){Qv=Kv=t_=n_=e_=r_=i_=o_=u_=a_=c_=0,U_(t,H_);var n=u_,e=a_,r=c_,i=n*n+e*e+r*r;return i<1e-12&&(n=r_,e=i_,r=o_,Kv2?t[2]*b_:0),n.invert=function(n){return n=t.invert(n[0]*b_,n[1]*b_),n[0]*=x_,n[1]*=x_,n},n},ug=function(){function t(t,n){e.push(t=r(t,n)),t[0]*=x_,t[1]*=x_}function n(){var t=i.apply(this,arguments),n=o.apply(this,arguments)*b_,c=u.apply(this,arguments)*b_;return e=[],r=ei(-t[0]*b_,-t[1]*b_,0).invert,ui(a,n,c,1),t={type:"Polygon",coordinates:[e]},e=r=null,t}var e,r,i=V_([0,0]),o=V_(90),u=V_(6),a={point:t};return n.center=function(t){return arguments.length?(i="function"==typeof t?t:V_([+t[0],+t[1]]),n):i},n.radius=function(t){return arguments.length?(o="function"==typeof t?t:V_(+t),n):o},n.precision=function(t){return arguments.length?(u="function"==typeof t?t:V_(+t),n):u},n},ag=function(){var t,n=[];return{point:function(n,e){t.push([n,e])},lineStart:function(){n.push(t=[])},lineEnd:xr,rejoin:function(){n.length>1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}},cg=function(t,n,e,r,i,o){var u,a=t[0],c=t[1],s=n[0],f=n[1],l=0,h=1,p=s-a,d=f-c;if(u=e-a,p||!(u>0)){if(u/=p,p<0){if(u0){if(u>h)return;u>l&&(l=u)}if(u=i-a,p||!(u<0)){if(u/=p,p<0){if(u>h)return;u>l&&(l=u)}else if(p>0){if(u0)){if(u/=d,d<0){if(u0){if(u>h)return;u>l&&(l=u)}if(u=o-c,d||!(u<0)){if(u/=d,d<0){if(u>h)return;u>l&&(l=u)}else if(d>0){if(u0&&(t[0]=a+l*p,t[1]=c+l*d),h<1&&(n[0]=a+h*p,n[1]=c+h*d),!0}}}}},sg=function(t,n){return w_(t[0]-n[0])=0;--o)i.point((f=s[o])[0],f[1]);else r(h.x,h.p.x,-1,i);h=h.p}h=h.o,s=h.z,p=!p}while(!h.v);i.lineEnd()}}},lg=1e9,hg=-lg,pg=function(){var t,n,e,r=0,i=0,o=960,u=500;return e={stream:function(e){return t&&n===e?t:t=fi(r,i,o,u)(n=e)},extent:function(a){return arguments.length?(r=+a[0][0],i=+a[0][1],o=+a[1][0],u=+a[1][1],t=n=null,e):[[r,i],[o,u]]}}},dg=Uv(),vg=function(t,n){var e=n[0],r=n[1],i=[C_(e),-S_(e),0],o=0,u=0;dg.reset();for(var a=0,c=t.length;a=0?1:-1,T=M*w,S=T>__,N=d*x;if(dg.add(T_(N*M*C_(T),v*b+N*S_(T))),o+=S?w+M*m_:w,S^h>=e^y>=e){var k=zr(Ar(l),Ar(g));Rr(k);var E=zr(i,k);Rr(E);var A=(S^w>=0?-1:1)*yr(E[2]);(r>A||r===A&&(k[0]||k[1]))&&(u+=S^w>=0?1:-1)}}return(o<-v_||o0){for(x||(o.polygonStart(),x=!0),o.lineStart(),t=0;t1&&2&i&&u.push(u.pop().concat(u.shift())),d.push(u.filter(Hi))}var p,d,v,_=n(o),g=i.invert(r[0],r[1]),y=ag(),m=n(y),x=!1,b={point:u,lineStart:c,lineEnd:s,polygonStart:function(){b.point=f,b.lineStart=l,b.lineEnd=h,d=[],p=[]},polygonEnd:function(){b.point=u,b.lineStart=c,b.lineEnd=s,d=lf(d);var t=vg(p,g);d.length?(x||(o.polygonStart(),x=!0),fg(d,Xi,t,e,o)):t&&(x||(o.polygonStart(),x=!0),o.lineStart(),e(null,null,1,o),o.lineEnd()),x&&(o.polygonEnd(),x=!1),d=p=null},sphere:function(){o.polygonStart(),o.lineStart(),e(null,null,1,o),o.lineEnd(),o.polygonEnd()}};return b}},ty=Kg(function(){return!0},Vi,Wi,[-__,-g_]),ny=function(t,n){function e(e,r,i,o){ui(o,t,n,i,e,r)}function r(t,n){return S_(t)*S_(n)>a}function i(t){var n,e,i,a,f;return{lineStart:function(){a=i=!1,f=1},point:function(l,h){var p,d=[l,h],v=r(l,h),_=c?v?0:u(l,h):v?u(l+(l<0?__:-__),h):0;if(!n&&(a=i=v)&&t.lineStart(),v!==i&&(p=o(n,d),(sg(n,p)||sg(d,p))&&(d[0]+=v_,d[1]+=v_,v=r(d[0],d[1]))),v!==i)f=0,v?(t.lineStart(),p=o(d,n),t.point(p[0],p[1])):(p=o(n,d),t.point(p[0],p[1]),t.lineEnd()),n=p;else if(s&&n&&c^v){var g;_&e||!(g=o(d,n,!0))||(f=0,c?(t.lineStart(),t.point(g[0][0],g[0][1]),t.point(g[1][0],g[1][1]),t.lineEnd()):(t.point(g[1][0],g[1][1]),t.lineEnd(),t.lineStart(),t.point(g[0][0],g[0][1])))}!v||n&&sg(n,d)||t.point(d[0],d[1]),n=d,i=v,e=_},lineEnd:function(){i&&t.lineEnd(),n=null},clean:function(){return f|(a&&i)<<1}}}function o(t,n,e){var r=Ar(t),i=Ar(n),o=[1,0,0],u=zr(r,i),c=Cr(u,u),s=u[0],f=c-s*s;if(!f)return!e&&t;var l=a*c/f,h=-a*s/f,p=zr(o,u),d=Lr(o,l);Pr(d,Lr(u,h));var v=p,_=Cr(d,v),g=Cr(v,v),y=_*_-g*(Cr(d,d)-1);if(!(y<0)){var m=P_(y),x=Lr(v,(-_-m)/g);if(Pr(x,d),x=Er(x),!e)return x;var b,w=t[0],M=n[0],T=t[1],S=n[1];M0^x[1]<(w_(x[0]-w)__^(w<=x[0]&&x[0]<=M)){var A=Lr(v,(-_+m)/g);return Pr(A,d),[x,Er(A)]}}}function u(n,e){var r=c?t:__-t,i=0;return n<-r?i|=1:n>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var a=S_(t),c=a>0,s=w_(a)>v_;return Kg(r,i,e,c?[0,-t]:[-__,t-__])},ey=function(t){return{stream:Zi(t)}};Gi.prototype={constructor:Gi,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var ry=16,iy=S_(30*b_),oy=function(t,n){return+n?to(t,n):Ki(t)},uy=Zi({point:function(t,n){this.stream.point(t*b_,n*b_)}}),ay=function(){return ro(oo).scale(155.424).center([0,33.6442])},cy=function(){return ay().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])},sy=function(){function t(t){var n=t[0],e=t[1];return a=null,i.point(n,e),a||(o.point(n,e),a)||(u.point(n,e),a)}function n(){return e=r=null,t}var e,r,i,o,u,a,c=cy(),s=ay().rotate([154,0]).center([-2,58.5]).parallels([55,65]),f=ay().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(t,n){a=[t,n]}};return t.invert=function(t){var n=c.scale(),e=c.translate(),r=(t[0]-e[0])/n,i=(t[1]-e[1])/n;return(i>=.12&&i<.234&&r>=-.425&&r<-.214?s:i>=.166&&i<.234&&r>=-.214&&r<-.115?f:c).invert(t)},t.stream=function(t){return e&&r===t?e:e=uo([c.stream(r=t),s.stream(t),f.stream(t)])},t.precision=function(t){return arguments.length?(c.precision(t),s.precision(t),f.precision(t),n()):c.precision()},t.scale=function(n){return arguments.length?(c.scale(n),s.scale(.35*n),f.scale(n),t.translate(c.translate())):c.scale()},t.translate=function(t){if(!arguments.length)return c.translate();var e=c.scale(),r=+t[0],a=+t[1];return i=c.translate(t).clipExtent([[r-.455*e,a-.238*e],[r+.455*e,a+.238*e]]).stream(l),o=s.translate([r-.307*e,a+.201*e]).clipExtent([[r-.425*e+v_,a+.12*e+v_],[r-.214*e-v_,a+.234*e-v_]]).stream(l),u=f.translate([r-.205*e,a+.212*e]).clipExtent([[r-.214*e+v_,a+.166*e+v_],[r-.115*e-v_,a+.234*e-v_]]).stream(l),n()},t.fitExtent=function(n,e){return Ji(t,n,e)},t.fitSize=function(n,e){return Qi(t,n,e)},t.scale(1070)},fy=ao(function(t){return P_(2/(1+t))});fy.invert=co(function(t){return 2*yr(t/2)});var ly=function(){return no(fy).scale(124.75).clipAngle(179.999)},hy=ao(function(t){return(t=gr(t))&&t/C_(t)});hy.invert=co(function(t){return t});var py=function(){return no(hy).scale(79.4188).clipAngle(179.999)};so.invert=function(t,n){return[t,2*M_(k_(n))-g_]};var dy=function(){return fo(so).scale(961/m_)},vy=function(){return ro(ho).scale(109.5).parallels([30,30])};po.invert=po;var _y=function(){return no(po).scale(152.63)},gy=function(){return ro(vo).scale(131.154).center([0,13.9389])};_o.invert=co(M_);var yy=function(){return no(_o).scale(144.049).clipAngle(60)},my=function(){function t(){return i=o=null,u}var n,e,r,i,o,u,a=1,c=0,s=0,f=1,l=1,h=Ng,p=null,d=Ng;return u={stream:function(t){return i&&o===t?i:i=h(d(o=t))},clipExtent:function(i){return arguments.length?(d=null==i?(p=n=e=r=null,Ng):fi(p=+i[0][0],n=+i[0][1],e=+i[1][0],r=+i[1][1]),t()):null==p?null:[[p,n],[e,r]]},scale:function(n){return arguments.length?(h=go((a=+n)*f,a*l,c,s),t()):a},translate:function(n){return arguments.length?(h=go(a*f,a*l,c=+n[0],s=+n[1]),t()):[c,s]},reflectX:function(n){return arguments.length?(h=go(a*(f=n?-1:1),a*l,c,s),t()):f<0},reflectY:function(n){return arguments.length?(h=go(a*f,a*(l=n?-1:1),c,s),t()):l<0},fitExtent:function(t,n){return Ji(u,t,n)},fitSize:function(t,n){return Qi(u,t,n)}}};yo.invert=co(yr);var xy=function(){return no(yo).scale(249.5).clipAngle(90+v_)};mo.invert=co(function(t){return 2*M_(t)});var by=function(){return no(mo).scale(250).clipAngle(142)};xo.invert=function(t,n){return[-n,2*M_(k_(t))-g_]};var wy=function(){var t=fo(xo),n=t.center,e=t.rotate;return t.center=function(t){return arguments.length?n([-t[1],t[0]]):(t=n(),[t[1],-t[0]])},t.rotate=function(t){return arguments.length?e([t[0],t[1],t.length>2?t[2]+90:90]):(t=e(),[t[0],t[1],t[2]-90])},e([0,0,90]).scale(159.155)},My=function(){function t(t){var o,u=0;t.eachAfter(function(t){var e=t.children;e?(t.x=wo(e),t.y=To(e)):(t.x=o?u+=n(t,o):0,t.y=0,o=t)});var a=No(t),c=ko(t),s=a.x-n(a,c)/2,f=c.x+n(c,a)/2;return t.eachAfter(i?function(n){n.x=(n.x-t.x)*e,n.y=(t.y-n.y)*r}:function(n){n.x=(n.x-s)/(f-s)*e,n.y=(1-(t.y?n.y/t.y:1))*r})}var n=bo,e=1,r=1,i=!1;return t.separation=function(e){return arguments.length?(n=e,t):n},t.size=function(n){return arguments.length?(i=!1,e=+n[0],r=+n[1],t):i?null:[e,r]},t.nodeSize=function(n){return arguments.length?(i=!0,e=+n[0],r=+n[1],t):i?[e,r]:null},t},Ty=function(){return this.eachAfter(Eo)},Sy=function(t){var n,e,r,i,o=this,u=[o];do{for(n=u.reverse(),u=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=0;--e)i.push(n[e]);return this},ky=function(t){for(var n,e,r,i=this,o=[i],u=[];i=o.pop();)if(u.push(i),n=i.children)for(e=0,r=n.length;e=0;)e+=r[i].value;n.value=e})},Ay=function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},Cy=function(t){for(var n=this,e=Ao(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},zy=function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},Py=function(){var t=[];return this.each(function(n){t.push(n)}),t},Ly=function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},Ry=function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n};qo.prototype=Co.prototype={constructor:qo,count:Ty,each:Sy,eachAfter:ky,eachBefore:Ny,sum:Ey,sort:Ay,path:Cy,ancestors:zy,descendants:Py,leaves:Ly,links:Ry,copy:zo};var qy=function(t){for(var n=(t=t.slice()).length,e=null,r=e;n;){var i=new Uo(t[n-1]);r=r?r.next=i:e=i,t[void 0]=t[--n]}return{head:e,tail:r}},Uy=function(t){return Oo(qy(t),[])},Dy=function(t){return Vo(t),t},Oy=function(t){return function(){return t}},Fy=function(){function t(t){return t.x=e/2,t.y=r/2,n?t.eachBefore(Jo(n)).eachAfter(Qo(i,.5)).eachBefore(Ko(1)):t.eachBefore(Jo(Go)).eachAfter(Qo(Zo,1)).eachAfter(Qo(i,t.r/Math.min(e,r))).eachBefore(Ko(Math.min(e,r)/(2*t.r))),t}var n=null,e=1,r=1,i=Zo;return t.radius=function(e){return arguments.length?(n=$o(e),t):n},t.size=function(n){return arguments.length?(e=+n[0],r=+n[1],t):[e,r]},t.padding=function(n){return arguments.length?(i="function"==typeof n?n:Oy(+n),t):i},t},Iy=function(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)},Yy=function(t,n,e,r,i){for(var o,u=t.children,a=-1,c=u.length,s=t.value&&(r-n)/t.value;++a0)throw new Error("cycle");return o}var n=tu,e=nu;return t.id=function(e){return arguments.length?(n=Wo(e),t):n},t.parentId=function(n){return arguments.length?(e=Wo(n),t):e},t};cu.prototype=Object.create(qo.prototype);var $y=function(){function t(t){var r=su(t);if(r.eachAfter(n),r.parent.m=-r.z,r.eachBefore(e),c)t.eachBefore(i);else{var s=t,f=t,l=t;t.eachBefore(function(t){t.xf.x&&(f=t),t.depth>l.depth&&(l=t)});var h=s===f?1:o(s,f)/2,p=h-s.x,d=u/(f.x+h+p),v=a/(l.depth||1);t.eachBefore(function(t){t.x=(t.x+p)*d,t.y=t.depth*v})}return t}function n(t){var n=t.children,e=t.parent.children,i=t.i?e[t.i-1]:null;if(n){uu(t);var u=(n[0].z+n[n.length-1].z)/2;i?(t.z=i.z+o(t._,i._),t.m=t.z-u):t.z=u}else i&&(t.z=i.z+o(t._,i._));t.parent.A=r(t,i,t.parent.A||e[0])}function e(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function r(t,n,e){if(n){for(var r,i=t,u=t,a=n,c=i.parent.children[0],s=i.m,f=u.m,l=a.m,h=c.m;a=iu(a),i=ru(i),a&&i;)c=ru(c),u=iu(u),u.a=t,r=a.z+l-i.z-s+o(a._,i._),r>0&&(ou(au(a,t,e),t,r),s+=r,f+=r),l+=a.m,s+=i.m,h+=c.m,f+=u.m;a&&!iu(u)&&(u.t=a,u.m+=l-f),i&&!ru(c)&&(c.t=i,c.m+=s-h,e=t)}return e}function i(t){t.x*=u,t.y=t.depth*a}var o=eu,u=1,a=1,c=null;return t.separation=function(n){return arguments.length?(o=n,t):o},t.size=function(n){return arguments.length?(c=!1,u=+n[0],a=+n[1],t):c?null:[u,a]},t.nodeSize=function(n){return arguments.length?(c=!0,u=+n[0],a=+n[1],t):c?[u,a]:null},t},Wy=function(t,n,e,r,i){for(var o,u=t.children,a=-1,c=u.length,s=t.value&&(i-e)/t.value;++a1?n:1)},e}(Zy),Jy=function(){function t(t){return t.x0=t.y0=0,t.x1=i,t.y1=o,t.eachBefore(n),u=[0],r&&t.eachBefore(Iy),t}function n(t){var n=u[t.depth],r=t.x0+n,i=t.y0+n,o=t.x1-n,h=t.y1-n;o=n-1){var s=c[t];return s.x0=r,s.y0=i,s.x1=u,s.y1=a,void 0}for(var l=f[t],h=e/2+l,p=t+1,d=n-1;p>>1;f[v]a-i){var y=(r*g+u*_)/e;o(t,p,_,r,i,y,a),o(p,n,g,y,i,u,a)}else{var m=(i*g+a*_)/e;o(t,p,_,r,i,u,m),o(p,n,g,r,m,u,a)}}var u,a,c=t.children,s=c.length,f=new Array(s+1);for(f[0]=a=u=0;u1?n:1)},e}(Zy),nm=function(t){for(var n,e=-1,r=t.length,i=t[r-1],o=0;++e=0;--n)s.push(t[r[o[n]][2]]);for(n=+a;na!=s>a&&u<(c-e)*(a-r)/(s-r)+e&&(f=!f),c=e,s=r;return f},um=function(t){for(var n,e,r=-1,i=t.length,o=t[i-1],u=o[0],a=o[1],c=0;++r1);return t+n*i*Math.sqrt(-2*Math.log(r)/r)}},lm=function(){var t=fm.apply(this,arguments);return function(){return Math.exp(t())}},hm=function(t){return function(){for(var n=0,e=0;e=200&&e<300||304===e){if(o)try{n=o.call(r,s)}catch(t){return void a.call("error",r,t)}else n=s;a.call("load",r,n)}else a.call("error",r,t)}var r,i,o,u,a=v("beforesend","progress","load","error"),c=Be(),s=new XMLHttpRequest,f=null,l=null,h=0;if("undefined"==typeof XDomainRequest||"withCredentials"in s||!/^(http(s)?:)?\/\//.test(t)||(s=new XDomainRequest),"onload"in s?s.onload=s.onerror=s.ontimeout=e:s.onreadystatechange=function(t){s.readyState>3&&e(t)},s.onprogress=function(t){a.call("progress",r,t)},r={header:function(t,n){return t=(t+"").toLowerCase(),arguments.length<2?c.get(t):(null==n?c.remove(t):c.set(t,n+""),r)},mimeType:function(t){return arguments.length?(i=null==t?null:t+"",r):i},responseType:function(t){return arguments.length?(u=t,r):u},timeout:function(t){return arguments.length?(h=+t,r):h},user:function(t){return arguments.length<1?f:(f=null==t?null:t+"",r)},password:function(t){return arguments.length<1?l:(l=null==t?null:t+"",r)},response:function(t){return o=t,r},get:function(t,n){return r.send("GET",t,n)},post:function(t,n){return r.send("POST",t,n)},send:function(n,e,o){return s.open(n,t,!0,f,l),null==i||c.has("accept")||c.set("accept",i+",*/*"),s.setRequestHeader&&c.each(function(t,n){s.setRequestHeader(n,t)}),null!=i&&s.overrideMimeType&&s.overrideMimeType(i),null!=u&&(s.responseType=u),h>0&&(s.timeout=h),null==o&&"function"==typeof e&&(o=e,e=null),null!=o&&1===o.length&&(o=xu(o)),null!=o&&r.on("error",o).on("load",function(t){o(null,t)}),a.call("beforesend",r,s),s.send(null==e?null:e),r},abort:function(){return s.abort(),r},on:function(){var t=a.on.apply(a,arguments);return t===a?r:t}},null!=n){if("function"!=typeof n)throw new Error("invalid callback: "+n);return r.get(n)}return r},_m=function(t,n){return function(e,r){var i=vm(e).mimeType(t).response(n);if(null!=r){if("function"!=typeof r)throw new Error("invalid callback: "+r);return i.get(r)}return i}},gm=_m("text/html",function(t){return document.createRange().createContextualFragment(t.responseText)}),ym=_m("application/json",function(t){return JSON.parse(t.responseText)}),mm=_m("text/plain",function(t){return t.responseText}),xm=_m("application/xml",function(t){var n=t.responseXML;if(!n)throw new Error("parse error");return n}),bm=function(t,n){return function(e,r,i){arguments.length<3&&(i=r,r=null);var o=vm(e).mimeType(t);return o.row=function(t){return arguments.length?o.response(wu(n,r=t)):r},o.row(r),i?o.get(i):o}},wm=bm("text/csv",Fd),Mm=bm("text/tab-separated-values",Hd),Tm=Array.prototype,Sm=Tm.map,Nm=Tm.slice,km={name:"implicit"},Em=function(t){return function(){return t}},Am=function(t){return+t},Cm=[0,1],zm=function(n,e,r){var o,u=n[0],a=n[n.length-1],c=i(u,a,null==e?10:e);switch(r=hr(null==r?",f":r),r.type){case"s":var s=Math.max(Math.abs(u),Math.abs(a));return null!=r.precision||isNaN(o=Rv(c,s))||(r.precision=o),t.formatPrefix(r,s);case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(o=qv(c,Math.max(Math.abs(u),Math.abs(a))))||(r.precision=o-("e"===r.type));break;case"f":case"%":null!=r.precision||isNaN(o=Lv(c))||(r.precision=o-2*("%"===r.type))}return t.format(r)},Pm=function(t,n){t=t.slice();var e,r=0,i=t.length-1,o=t[r],u=t[i];return u0?t>1?Gu(function(n){n.setTime(Math.floor(n/t)*t)},function(n,e){n.setTime(+n+e*t)},function(n,e){return(e-n)/t}):qm:null};var Um=qm.range,Dm=6e4,Om=6048e5,Fm=Gu(function(t){t.setTime(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(+t+1e3*n)},function(t,n){return(n-t)/1e3},function(t){return t.getUTCSeconds()}),Im=Fm.range,Ym=Gu(function(t){t.setTime(Math.floor(t/Dm)*Dm)},function(t,n){t.setTime(+t+n*Dm)},function(t,n){return(n-t)/Dm},function(t){return t.getMinutes()}),Bm=Ym.range,jm=Gu(function(t){var n=t.getTimezoneOffset()*Dm%36e5;n<0&&(n+=36e5),t.setTime(36e5*Math.floor((+t-n)/36e5)+n)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getHours()}),Hm=jm.range,Xm=Gu(function(t){t.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Dm)/864e5},function(t){return t.getDate()-1}),Vm=Xm.range,$m=Ju(0),Wm=Ju(1),Zm=Ju(2),Gm=Ju(3),Jm=Ju(4),Qm=Ju(5),Km=Ju(6),tx=$m.range,nx=Wm.range,ex=Zm.range,rx=Gm.range,ix=Jm.range,ox=Qm.range,ux=Km.range,ax=Gu(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,n){t.setMonth(t.getMonth()+n)},function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),cx=ax.range,sx=Gu(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t,n){return n.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});sx.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Gu(function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)},function(n,e){n.setFullYear(n.getFullYear()+e*t)}):null};var fx=sx.range,lx=Gu(function(t){t.setUTCSeconds(0,0)},function(t,n){t.setTime(+t+n*Dm)},function(t,n){return(n-t)/Dm},function(t){return t.getUTCMinutes()}),hx=lx.range,px=Gu(function(t){t.setUTCMinutes(0,0,0)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getUTCHours()}),dx=px.range,vx=Gu(function(t){t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+n)},function(t,n){return(n-t)/864e5},function(t){return t.getUTCDate()-1}),_x=vx.range,gx=Qu(0),yx=Qu(1),mx=Qu(2),xx=Qu(3),bx=Qu(4),wx=Qu(5),Mx=Qu(6),Tx=gx.range,Sx=yx.range,Nx=mx.range,kx=xx.range,Ex=bx.range,Ax=wx.range,Cx=Mx.range,zx=Gu(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCMonth(t.getUTCMonth()+n)},function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),Px=zx.range,Lx=Gu(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)},function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});Lx.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Gu(function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)}):null};var Rx,qx=Lx.range,Ux={"-":"",_:" ",0:"0"},Dx=/^\s*\d+/,Ox=/^%/,Fx=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;Ga({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Ix=Date.prototype.toISOString?Ja:t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ"),Yx=+new Date("2000-01-01T00:00:00.000Z")?Qa:t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"),Bx=1e3,jx=60*Bx,Hx=60*jx,Xx=24*Hx,Vx=7*Xx,$x=30*Xx,Wx=365*Xx,Zx=function(){return nc(sx,ax,$m,Xm,jm,Ym,Fm,qm,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)])},Gx=function(){return nc(Lx,zx,gx,vx,px,lx,Fm,qm,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)])},Jx=function(t){return t.match(/.{6}/g).map(function(t){return"#"+t})},Qx=Jx("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),Kx=Jx("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"),tb=Jx("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"),nb=Jx("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"),eb=Fh($t(300,.5,0),$t(-240,.5,1)),rb=Fh($t(-100,.75,.35),$t(80,1.5,.8)),ib=Fh($t(260,.75,.35),$t(80,1.5,.8)),ob=$t(),ub=function(t){(t<0||t>1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return ob.h=360*t-100,ob.s=1.5-1.5*n,ob.l=.8-.9*n,ob+""},ab=ec(Jx("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),cb=ec(Jx("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),sb=ec(Jx("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),fb=ec(Jx("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")),lb=function(t){return function(){return t}},hb=Math.abs,pb=Math.atan2,db=Math.cos,vb=Math.max,_b=Math.min,gb=Math.sin,yb=Math.sqrt,mb=1e-12,xb=Math.PI,bb=xb/2,wb=2*xb,Mb=function(){function t(){var t,s,f=+n.apply(this,arguments),l=+e.apply(this,arguments),h=o.apply(this,arguments)-bb,p=u.apply(this,arguments)-bb,d=hb(p-h),v=p>h;if(c||(c=t=qe()),lmb)if(d>wb-mb)c.moveTo(l*db(h),l*gb(h)),c.arc(0,0,l,h,p,!v),f>mb&&(c.moveTo(f*db(p),f*gb(p)),c.arc(0,0,f,p,h,v));else{var _,g,y=h,m=p,x=h,b=p,w=d,M=d,T=a.apply(this,arguments)/2,S=T>mb&&(i?+i.apply(this,arguments):yb(f*f+l*l)),N=_b(hb(l-f)/2,+r.apply(this,arguments)),k=N,E=N;if(S>mb){var A=oc(S/f*gb(T)),C=oc(S/l*gb(T));(w-=2*A)>mb?(A*=v?1:-1,x+=A,b-=A):(w=0,x=b=(h+p)/2),(M-=2*C)>mb?(C*=v?1:-1,y+=C,m-=C):(M=0,y=m=(h+p)/2)}var z=l*db(y),P=l*gb(y),L=f*db(b),R=f*gb(b);if(N>mb){var q=l*db(m),U=l*gb(m),D=f*db(x),O=f*gb(x);if(dmb?lc(z,P,D,O,q,U,L,R):[L,R],I=z-F[0],Y=P-F[1],B=q-F[0],j=U-F[1],H=1/gb(ic((I*B+Y*j)/(yb(I*I+Y*Y)*yb(B*B+j*j)))/2),X=yb(F[0]*F[0]+F[1]*F[1]);k=_b(N,(f-X)/(H-1)),E=_b(N,(l-X)/(H+1))}}M>mb?E>mb?(_=hc(D,O,z,P,l,E,v),g=hc(q,U,L,R,l,E,v),c.moveTo(_.cx+_.x01,_.cy+_.y01),Emb&&w>mb?k>mb?(_=hc(L,R,q,U,f,-k,v),g=hc(z,P,D,O,f,-k,v),c.lineTo(_.cx+_.x01,_.cy+_.y01),k=f;--l)s.point(_[l],g[l]);s.lineEnd(),s.areaEnd()}v&&(_[n]=+e(h,n,t),g[n]=+i(h,n,t),s.point(r?+r(h,n,t):_[n],o?+o(h,n,t):g[n]))}if(p)return s=null,p+""||null}function n(){return Sb().defined(u).curve(c).context(a)}var e=dc,r=null,i=lb(0),o=vc,u=lb(!0),a=null,c=Tb,s=null;return t.x=function(n){return arguments.length?(e="function"==typeof n?n:lb(+n),r=null,t):e},t.x0=function(n){return arguments.length?(e="function"==typeof n?n:lb(+n),t):e},t.x1=function(n){return arguments.length?(r=null==n?null:"function"==typeof n?n:lb(+n),t):r},t.y=function(n){return arguments.length?(i="function"==typeof n?n:lb(+n),o=null,t):i},t.y0=function(n){return arguments.length?(i="function"==typeof n?n:lb(+n),t):i},t.y1=function(n){return arguments.length?(o=null==n?null:"function"==typeof n?n:lb(+n),t):o},t.lineX0=t.lineY0=function(){return n().x(e).y(i)},t.lineY1=function(){return n().x(e).y(o)},t.lineX1=function(){return n().x(r).y(i)},t.defined=function(n){return arguments.length?(u="function"==typeof n?n:lb(!!n),t):u},t.curve=function(n){return arguments.length?(c=n,null!=a&&(s=c(a)),t):c},t.context=function(n){return arguments.length?(null==n?a=s=null:s=c(a=n),t):a},t},kb=function(t,n){return nt?1:n>=t?0:NaN},Eb=function(t){return t},Ab=function(){function t(t){var a,c,s,f,l,h=t.length,p=0,d=new Array(h),v=new Array(h),_=+i.apply(this,arguments),g=Math.min(wb,Math.max(-wb,o.apply(this,arguments)-_)),y=Math.min(Math.abs(g)/h,u.apply(this,arguments)),m=y*(g<0?-1:1);for(a=0;a0&&(p+=l);for(null!=e?d.sort(function(t,n){return e(v[t],v[n])}):null!=r&&d.sort(function(n,e){return r(t[n],t[e])}),a=0,s=p?(g-h*m)/p:0;a0?l*s:0)+m,v[c]={data:t[c],index:a,value:l,startAngle:_,endAngle:f,padAngle:y};return v}var n=Eb,e=kb,r=null,i=lb(0),o=lb(wb),u=lb(0);return t.value=function(e){return arguments.length?(n="function"==typeof e?e:lb(+e),t):n},t.sortValues=function(n){return arguments.length?(e=n,r=null,t):e},t.sort=function(n){return arguments.length?(r=n,e=null,t):r},t.startAngle=function(n){return arguments.length?(i="function"==typeof n?n:lb(+n),t):i},t.endAngle=function(n){return arguments.length?(o="function"==typeof n?n:lb(+n),t):o},t.padAngle=function(n){return arguments.length?(u="function"==typeof n?n:lb(+n),t):u},t},Cb=gc(Tb);_c.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var zb=function(){return yc(Sb().curve(Cb))},Pb=function(){var t=Nb().curve(Cb),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return yc(e())},delete t.lineX0,t.lineEndAngle=function(){return yc(r())},delete t.lineX1,t.lineInnerRadius=function(){return yc(i())},delete t.lineY0,t.lineOuterRadius=function(){return yc(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(gc(t)):n()._curve},t},Lb={draw:function(t,n){var e=Math.sqrt(n/xb);t.moveTo(e,0),t.arc(0,0,e,0,wb)}},Rb={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},qb=Math.sqrt(1/3),Ub=2*qb,Db={draw:function(t,n){var e=Math.sqrt(n/Ub),r=e*qb;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},Ob=Math.sin(xb/10)/Math.sin(7*xb/10),Fb=Math.sin(wb/10)*Ob,Ib=-Math.cos(wb/10)*Ob,Yb={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=Fb*e,i=Ib*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var u=wb*o/5,a=Math.cos(u),c=Math.sin(u);t.lineTo(c*e,-a*e),t.lineTo(a*r-c*i,c*r+a*i)}t.closePath()}},Bb={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},jb=Math.sqrt(3),Hb={draw:function(t,n){var e=-Math.sqrt(n/(3*jb));t.moveTo(0,2*e),t.lineTo(-jb*e,-e),t.lineTo(jb*e,-e),t.closePath()}},Xb=-.5,Vb=Math.sqrt(3)/2,$b=1/Math.sqrt(12),Wb=3*($b/2+1),Zb={draw:function(t,n){var e=Math.sqrt(n/Wb),r=e/2,i=e*$b,o=r,u=e*$b+e,a=-o,c=u;t.moveTo(r,i),t.lineTo(o,u),t.lineTo(a,c),t.lineTo(Xb*r-Vb*i,Vb*r+Xb*i),t.lineTo(Xb*o-Vb*u,Vb*o+Xb*u),t.lineTo(Xb*a-Vb*c,Vb*a+Xb*c),t.lineTo(Xb*r+Vb*i,Xb*i-Vb*r),t.lineTo(Xb*o+Vb*u,Xb*u-Vb*o),t.lineTo(Xb*a+Vb*c,Xb*c-Vb*a),t.closePath()}},Gb=[Lb,Rb,Db,Bb,Yb,Hb,Zb],Jb=function(){function t(){var t;if(r||(r=t=qe()),n.apply(this,arguments).draw(r,+e.apply(this,arguments)),t)return r=null,t+""||null}var n=lb(Lb),e=lb(64),r=null;return t.type=function(e){return arguments.length?(n="function"==typeof e?e:lb(e),t):n},t.size=function(n){return arguments.length?(e="function"==typeof n?n:lb(+n),t):e},t.context=function(n){return arguments.length?(r=null==n?null:n,t):r},t},Qb=function(){};xc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:mc(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:mc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}};var Kb=function(t){return new xc(t)};bc.prototype={areaStart:Qb,areaEnd:Qb,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:mc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}};var tw=function(t){return new bc(t)};wc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:mc(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}};var nw=function(t){return new wc(t)};Mc.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],u=t[e]-i,a=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*u),this._beta*n[c]+(1-this._beta)*(o+r*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var ew=function t(n){function e(t){return 1===n?new xc(t):new Mc(t,n)}return e.beta=function(n){return t(+n)},e}(.85);Sc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Tc(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:Tc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var rw=function t(n){function e(t){return new Sc(t,n)}return e.tension=function(n){return t(+n)},e}(0);Nc.prototype={areaStart:Qb,areaEnd:Qb,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Tc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var iw=function t(n){function e(t){return new Nc(t,n)}return e.tension=function(n){return t(+n)},e}(0);kc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Tc(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var ow=function t(n){function e(t){return new kc(t,n)}return e.tension=function(n){return t(+n)},e}(0);Ac.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN, +this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Ec(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var uw=function t(n){function e(t){return n?new Ac(t,n):new Sc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);Cc.prototype={areaStart:Qb,areaEnd:Qb,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Ec(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var aw=function t(n){function e(t){return n?new Cc(t,n):new Nc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);zc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ec(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var cw=function t(n){function e(t){return n?new zc(t,n):new kc(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);Pc.prototype={areaStart:Qb,areaEnd:Qb,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,n){t=+t,n=+n,this._point?this._context.lineTo(t,n):(this._point=1,this._context.moveTo(t,n))}};var sw=function(t){return new Pc(t)};Dc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Uc(this,this._t0,qc(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){var e=NaN;if(t=+t,n=+n,t!==this._x1||n!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,Uc(this,qc(this,e=Rc(this,t,n)),e);break;default:Uc(this,this._t0,e=Rc(this,t,n))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n,this._t0=e}}},(Oc.prototype=Object.create(Dc.prototype)).point=function(t,n){Dc.prototype.point.call(this,n,t)},Fc.prototype={moveTo:function(t,n){this._context.moveTo(n,t)},closePath:function(){this._context.closePath()},lineTo:function(t,n){this._context.lineTo(n,t)},bezierCurveTo:function(t,n,e,r,i,o){this._context.bezierCurveTo(n,t,r,e,o,i)}},Bc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,n=this._y,e=t.length;if(e)if(this._line?this._context.lineTo(t[0],n[0]):this._context.moveTo(t[0],n[0]),2===e)this._context.lineTo(t[1],n[1]);else for(var r=jc(t),i=jc(n),o=0,u=1;u=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}};var lw=function(t){return new Hc(t,.5)},hw=Array.prototype.slice,pw=function(t,n){if((r=t.length)>1)for(var e,r,i=1,o=t[n[0]],u=o.length;i=0;)e[n]=n;return e},vw=function(){function t(t){var o,u,a=n.apply(this,arguments),c=t.length,s=a.length,f=new Array(s);for(o=0;o0){for(var e,r,i,o=0,u=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,u=1;u=a)return null;var c=t-i.site[0],s=n-i.site[1],f=c*c+s*s;do{i=o.cells[r=u],u=null,i.halfedges.forEach(function(e){var r=o.edges[e],a=r.left;if(a!==i.site&&a||(a=r.right)){var c=t-a[0],s=n-a[1],l=c*c+s*s;le?(e+r)/2:Math.min(0,e)||Math.max(0,r),o>i?(i+o)/2:Math.min(0,i)||Math.max(0,o))}function o(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function u(t,n,e){t.on("start.zoom",function(){a(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){a(this,arguments).end()}).tween("zoom",function(){var t=this,r=arguments,i=a(t,r),u=m.apply(t,r),c=e||o(u),s=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),f=t.__zoom,l="function"==typeof n?n.apply(t,r):n,h=k(f.invert(c).concat(s/f.k),l.invert(c).concat(s/l.k));return function(t){if(1===t)t=l;else{var n=h(t),e=s/n[2];t=new Es(e,c[0]-n[0]*e,c[1]-n[1]*e)}i.zoom(null,t)}})}function a(t,n){for(var e,r=0,i=E.length;r0?wl(this).transition().duration(N).call(u,f,a):wl(this).call(n.transform,f)}}function h(){if(y.apply(this,arguments)){var n,e,r,i,o=a(this,arguments),u=t.event.changedTouches,c=u.length;for(Cs(),e=0;e0;case l.ACK:case l.BINARY_ACK:return Array.isArray(e)}}}]),n}(h);e.Decoder=b;var m=function(){function t(e){u(this,t),this.packet=e,this.buffers=[],this.reconPack=e}return p(t,[{key:"takeBinaryData",value:function(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){var e=y.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null}},{key:"finishedReconstruction",value:function(){this.reconPack=null,this.buffers=[]}}]),t}()},function(t,e){var n=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];t.exports=function(t){var e=t,o=t.indexOf("["),i=t.indexOf("]");-1!=o&&-1!=i&&(t=t.substring(0,o)+t.substring(o,i).replace(/:/g,";")+t.substring(i,t.length));for(var s,c,a=n.exec(t||""),u={},f=14;f--;)u[r[f]]=a[f]||"";return-1!=o&&-1!=i&&(u.source=e,u.host=u.host.substring(1,u.host.length-1).replace(/;/g,":"),u.authority=u.authority.replace("[","").replace("]","").replace(/;/g,":"),u.ipv6uri=!0),u.pathNames=function(t,e){var n=e.replace(/\/{2,9}/g,"/").split("/");"/"!=e.substr(0,1)&&0!==e.length||n.splice(0,1);"/"==e.substr(e.length-1,1)&&n.splice(n.length-1,1);return n}(0,u.path),u.queryKey=(s=u.query,c={},s.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,e,n){e&&(c[e]=n)})),c),u}},function(t,e,n){"use strict";function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){for(var n=0;n=this._reconnectionAttempts)this.backoff.reset(),i(u(v.prototype),"emit",this).call(this,"reconnect_failed"),this._reconnecting=!1;else{var n=this.backoff.duration();this._reconnecting=!0;var r=setTimeout((function(){e.skipReconnect||(i(u(v.prototype),"emit",t).call(t,"reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open((function(n){n?(e._reconnecting=!1,e.reconnect(),i(u(v.prototype),"emit",t).call(t,"reconnect_error",n)):e.onreconnect()})))}),n);this.subs.push((function(){clearTimeout(r)}))}}},{key:"onreconnect",value:function(){var t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),i(u(v.prototype),"emit",this).call(this,"reconnect",t)}}])&&o(e.prototype,n),a&&o(e,a),v}(l);e.Manager=v},function(t,e,n){var r=n(9),o=n(22),i=n(26),s=n(27);e.polling=function(t){var e=!1,n=!1,s=!1!==t.jsonp;if("undefined"!=typeof location){var c="https:"===location.protocol,a=location.port;a||(a=c?443:80),e=t.hostname!==location.hostname||a!==t.port,n=t.secure!==c}if(t.xdomain=e,t.xscheme=n,"open"in new r(t)&&!t.forceJSONP)return new o(t);if(!s)throw new Error("JSONP disabled");return new i(t)},e.websocket=s},function(t,e,n){var r=n(21),o=n(2);t.exports=function(t){var e=t.xdomain,n=t.xscheme,i=t.enablesXDR;try{if("undefined"!=typeof XMLHttpRequest&&(!e||r))return new XMLHttpRequest}catch(t){}try{if("undefined"!=typeof XDomainRequest&&!n&&i)return new XDomainRequest}catch(t){}if(!e)try{return new(o[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}}},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var n=0;n0);return e}function u(){var t=a(+new Date);return t!==r?(s=0,r=t):t+"."+a(s++)}for(;c<64;c++)i[o[c]]=c;u.encode=a,u.decode=function(t){var e=0;for(c=0;c1?e-1:0),r=1;r=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,c=!0,a=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return c=t.done,t},e:function(t){a=!0,s=t},f:function(){try{c||null==n.return||n.return()}finally{if(a)throw s}}}}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?e-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return i(this,l),e=f.call(this),t&&"object"===o(t)&&(n=t,t=null),t?(t=y(t),n.hostname=t.host,n.secure="https"===t.protocol||"wss"===t.protocol,n.port=t.port,t.query&&(n.query=t.query)):n.host&&(n.hostname=y(n.host).host),e.secure=null!=n.secure?n.secure:"undefined"!=typeof location&&"https:"===location.protocol,n.hostname&&!n.port&&(n.port=e.secure?"443":"80"),e.hostname=n.hostname||("undefined"!=typeof location?location.hostname:"localhost"),e.port=n.port||("undefined"!=typeof location&&location.port?location.port:e.secure?443:80),e.transports=n.transports||["polling","websocket"],e.readyState="",e.writeBuffer=[],e.prevBufferLen=0,e.opts=r({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,jsonp:!0,timestampParam:"t",rememberUpgrade:!1,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{}},n),e.opts.path=e.opts.path.replace(/\/$/,"")+"/","string"==typeof e.opts.query&&(e.opts.query=d.decode(e.opts.query)),e.id=null,e.upgrades=null,e.pingInterval=null,e.pingTimeout=null,e.pingTimeoutTimer=null,e.open(),e}return e=l,(n=[{key:"createTransport",value:function(t){var e=function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}(this.opts.query);e.EIO=h.protocol,e.transport=t,this.id&&(e.sid=this.id);var n=r({},this.opts.transportOptions[t],this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port});return new p[t](n)}},{key:"open",value:function(){var t;if(this.opts.rememberUpgrade&&l.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length){var e=this;return void setTimeout((function(){e.emit("error","No transports available")}),0)}t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}},{key:"setTransport",value:function(t){var e=this;this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",(function(){e.onDrain()})).on("packet",(function(t){e.onPacket(t)})).on("error",(function(t){e.onError(t)})).on("close",(function(){e.onClose("transport close")}))}},{key:"probe",value:function(t){var e=this.createTransport(t,{probe:1}),n=!1,r=this;function o(){if(r.onlyBinaryUpgrades){var t=!this.supportsBinary&&r.transport.supportsBinary;n=n||t}n||(e.send([{type:"ping",data:"probe"}]),e.once("packet",(function(t){if(!n)if("pong"===t.type&&"probe"===t.data){if(r.upgrading=!0,r.emit("upgrading",e),!e)return;l.priorWebsocketSuccess="websocket"===e.name,r.transport.pause((function(){n||"closed"!==r.readyState&&(f(),r.setTransport(e),e.send([{type:"upgrade"}]),r.emit("upgrade",e),e=null,r.upgrading=!1,r.flush())}))}else{var o=new Error("probe error");o.transport=e.name,r.emit("upgradeError",o)}})))}function i(){n||(n=!0,f(),e.close(),e=null)}function s(t){var n=new Error("probe error: "+t);n.transport=e.name,i(),r.emit("upgradeError",n)}function c(){s("transport closed")}function a(){s("socket closed")}function u(t){e&&t.name!==e.name&&i()}function f(){e.removeListener("open",o),e.removeListener("error",s),e.removeListener("close",c),r.removeListener("close",a),r.removeListener("upgrading",u)}l.priorWebsocketSuccess=!1,e.once("open",o),e.once("error",s),e.once("close",c),this.once("close",a),this.once("upgrading",u),e.open()}},{key:"onOpen",value:function(){if(this.readyState="open",l.priorWebsocketSuccess="websocket"===this.transport.name,this.emit("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade&&this.transport.pause)for(var t=0,e=this.upgrades.length;t0&&void 0!==arguments[0]?arguments[0]:{};return o(t,{xd:this.xd,xs:this.xs},this.opts),new w(this.uri(),t)}},{key:"doWrite",value:function(t,e){var n=this.request({method:"POST",data:t}),r=this;n.on("success",e),n.on("error",(function(t){r.onError("xhr post error",t)}))}},{key:"doPoll",value:function(){var t=this.request(),e=this;t.on("data",(function(t){e.onData(t)})),t.on("error",(function(t){e.onError("xhr poll error",t)})),this.pollXhr=t}}]),n}(y),w=function(t){a(n,t);var e=f(n);function n(t,r){var o;return i(this,n),(o=e.call(this)).opts=r,o.method=r.method||"GET",o.uri=t,o.async=!1!==r.async,o.data=void 0!==r.data?r.data:null,o.create(),o}return c(n,[{key:"create",value:function(){var t=v(this.opts,"agent","enablesXDR","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized");t.xdomain=!!this.opts.xd,t.xscheme=!!this.opts.xs;var e=this.xhr=new h(t),r=this;try{e.open(this.method,this.uri,this.async);try{if(this.opts.extraHeaders)for(var o in e.setDisableHeaderCheck&&e.setDisableHeaderCheck(!0),this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(o)&&e.setRequestHeader(o,this.opts.extraHeaders[o])}catch(t){}if("POST"===this.method)try{e.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{e.setRequestHeader("Accept","*/*")}catch(t){}"withCredentials"in e&&(e.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(e.timeout=this.opts.requestTimeout),this.hasXDR()?(e.onload=function(){r.onLoad()},e.onerror=function(){r.onError(e.responseText)}):e.onreadystatechange=function(){4===e.readyState&&(200===e.status||1223===e.status?r.onLoad():setTimeout((function(){r.onError("number"==typeof e.status?e.status:0)}),0))},e.send(this.data)}catch(t){return void setTimeout((function(){r.onError(t)}),0)}"undefined"!=typeof document&&(this.index=n.requestsCount++,n.requests[this.index]=this)}},{key:"onSuccess",value:function(){this.emit("success"),this.cleanup()}},{key:"onData",value:function(t){this.emit("data",t),this.onSuccess()}},{key:"onError",value:function(t){this.emit("error",t),this.cleanup(!0)}},{key:"cleanup",value:function(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.hasXDR()?this.xhr.onload=this.xhr.onerror=m:this.xhr.onreadystatechange=m,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete n.requests[this.index],this.xhr=null}}},{key:"onLoad",value:function(){var t=this.xhr.responseText;null!==t&&this.onData(t)}},{key:"hasXDR",value:function(){return"undefined"!=typeof XDomainRequest&&!this.xs&&this.enablesXDR}},{key:"abort",value:function(){this.cleanup()}}]),n}(d);if(w.requestsCount=0,w.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",_);else if("function"==typeof addEventListener){addEventListener("onpagehide"in b?"pagehide":"unload",_,!1)}function _(){for(var t in w.requests)w.requests.hasOwnProperty(t)&&w.requests[t].abort()}t.exports=k,t.exports.Request=w},function(t,e,n){var r=n(11).PACKET_TYPES,o="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),i="function"==typeof ArrayBuffer,s=function(t,e){var n=new FileReader;return n.onload=function(){var t=n.result.split(",")[1];e("b"+t)},n.readAsDataURL(t)};t.exports=function(t,e,n){var c,a=t.type,u=t.data;return o&&u instanceof Blob?e?n(u):s(u,n):i&&(u instanceof ArrayBuffer||(c=u,"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(c):c&&c.buffer instanceof ArrayBuffer))?e?n(u instanceof ArrayBuffer?u:u.buffer):s(new Blob([u]),n):n(r[a]+(u||""))}},function(t,e,n){var r,o=n(11),i=o.PACKET_TYPES_REVERSE,s=o.ERROR_PACKET;"function"==typeof ArrayBuffer&&(r=n(25));var c=function(t,e){if(r){var n=r.decode(t);return a(n,e)}return{base64:!0,data:t}},a=function(t,e){switch(e){case"blob":return t instanceof ArrayBuffer?new Blob([t]):t;case"arraybuffer":default:return t}};t.exports=function(t,e){if("string"!=typeof t)return{type:"message",data:a(t,e)};var n=t.charAt(0);return"b"===n?{type:"message",data:c(t.substring(1),e)}:i[n]?t.length>1?{type:i[n],data:t.substring(1)}:{type:i[n]}:s}},function(t,e){!function(t){"use strict";e.encode=function(e){var n,r=new Uint8Array(e),o=r.length,i="";for(n=0;n>2],i+=t[(3&r[n])<<4|r[n+1]>>4],i+=t[(15&r[n+1])<<2|r[n+2]>>6],i+=t[63&r[n+2]];return o%3==2?i=i.substring(0,i.length-1)+"=":o%3==1&&(i=i.substring(0,i.length-2)+"=="),i},e.decode=function(e){var n,r,o,i,s,c=.75*e.length,a=e.length,u=0;"="===e[e.length-1]&&(c--,"="===e[e.length-2]&&c--);var f=new ArrayBuffer(c),p=new Uint8Array(f);for(n=0;n>4,p[u++]=(15&o)<<4|i>>2,p[u++]=(3&i)<<6|63&s;return f}}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){for(var n=0;n';n=document.createElement(t)}catch(t){(n=document.createElement("iframe")).name=r.iframeId,n.src="javascript:0"}n.id=r.iframeId,r.form.appendChild(n),r.iframe=n}this.form.action=this.uri(),a(),t=t.replace(d,"\\\n"),this.area.value=t.replace(y,"\\n");try{this.form.submit()}catch(t){}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){"complete"===r.iframe.readyState&&c()}:this.iframe.onload=c}},{key:"supportsBinary",get:function(){return!1}}])&&o(e.prototype,n),r&&o(e,r),l}(l);t.exports=b},function(t,e,n){function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){for(var n=0;n0&&t.jitter<=1?t.jitter:0,this.attempts=0}t.exports=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}}])})); +//# sourceMappingURL=socket.io.min.js.map \ No newline at end of file diff --git a/public/iframe/socketio.html b/public/iframe/socketio.html new file mode 100644 index 0000000..cb6f554 --- /dev/null +++ b/public/iframe/socketio.html @@ -0,0 +1,55 @@ + + + + + + socket io frame + + + + + + + + + \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..0b6973b --- /dev/null +++ b/public/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + 麻城市防汛抗旱大数据监控平台 + + + + + + +
+ + + + \ No newline at end of file diff --git a/public/logo192.png b/public/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/public/logo512.png differ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/mapbox/Roboto Black/0-255.pbf b/public/mapbox/Roboto Black/0-255.pbf new file mode 100644 index 0000000..e05a202 Binary files /dev/null and b/public/mapbox/Roboto Black/0-255.pbf differ diff --git a/public/mapbox/Roboto Black/1024-1279.pbf b/public/mapbox/Roboto Black/1024-1279.pbf new file mode 100644 index 0000000..6b19451 Binary files /dev/null and b/public/mapbox/Roboto Black/1024-1279.pbf differ diff --git a/public/mapbox/Roboto Black/10240-10495.pbf b/public/mapbox/Roboto Black/10240-10495.pbf new file mode 100644 index 0000000..b8faff4 --- /dev/null +++ b/public/mapbox/Roboto Black/10240-10495.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 10240-10495 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/10496-10751.pbf b/public/mapbox/Roboto Black/10496-10751.pbf new file mode 100644 index 0000000..b1d23bb --- /dev/null +++ b/public/mapbox/Roboto Black/10496-10751.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 10496-10751 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/10752-11007.pbf b/public/mapbox/Roboto Black/10752-11007.pbf new file mode 100644 index 0000000..5d72e3c --- /dev/null +++ b/public/mapbox/Roboto Black/10752-11007.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 10752-11007 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/11008-11263.pbf b/public/mapbox/Roboto Black/11008-11263.pbf new file mode 100644 index 0000000..78a8271 Binary files /dev/null and b/public/mapbox/Roboto Black/11008-11263.pbf differ diff --git a/public/mapbox/Roboto Black/11264-11519.pbf b/public/mapbox/Roboto Black/11264-11519.pbf new file mode 100644 index 0000000..1d9a1e5 Binary files /dev/null and b/public/mapbox/Roboto Black/11264-11519.pbf differ diff --git a/public/mapbox/Roboto Black/11520-11775.pbf b/public/mapbox/Roboto Black/11520-11775.pbf new file mode 100644 index 0000000..ed3a019 Binary files /dev/null and b/public/mapbox/Roboto Black/11520-11775.pbf differ diff --git a/public/mapbox/Roboto Black/11776-12031.pbf b/public/mapbox/Roboto Black/11776-12031.pbf new file mode 100644 index 0000000..6870305 Binary files /dev/null and b/public/mapbox/Roboto Black/11776-12031.pbf differ diff --git a/public/mapbox/Roboto Black/12032-12287.pbf b/public/mapbox/Roboto Black/12032-12287.pbf new file mode 100644 index 0000000..eb8c77c --- /dev/null +++ b/public/mapbox/Roboto Black/12032-12287.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 12032-12287 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/12288-12543.pbf b/public/mapbox/Roboto Black/12288-12543.pbf new file mode 100644 index 0000000..775b429 --- /dev/null +++ b/public/mapbox/Roboto Black/12288-12543.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 12288-12543 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/12544-12799.pbf b/public/mapbox/Roboto Black/12544-12799.pbf new file mode 100644 index 0000000..1443867 --- /dev/null +++ b/public/mapbox/Roboto Black/12544-12799.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 12544-12799 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/1280-1535.pbf b/public/mapbox/Roboto Black/1280-1535.pbf new file mode 100644 index 0000000..c0ed149 Binary files /dev/null and b/public/mapbox/Roboto Black/1280-1535.pbf differ diff --git a/public/mapbox/Roboto Black/12800-13055.pbf b/public/mapbox/Roboto Black/12800-13055.pbf new file mode 100644 index 0000000..77aa90b --- /dev/null +++ b/public/mapbox/Roboto Black/12800-13055.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 12800-13055 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/13056-13311.pbf b/public/mapbox/Roboto Black/13056-13311.pbf new file mode 100644 index 0000000..1c661d1 --- /dev/null +++ b/public/mapbox/Roboto Black/13056-13311.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 13056-13311 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/13312-13567.pbf b/public/mapbox/Roboto Black/13312-13567.pbf new file mode 100644 index 0000000..eabd821 --- /dev/null +++ b/public/mapbox/Roboto Black/13312-13567.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 13312-13567 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/13568-13823.pbf b/public/mapbox/Roboto Black/13568-13823.pbf new file mode 100644 index 0000000..d7a11d0 --- /dev/null +++ b/public/mapbox/Roboto Black/13568-13823.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 13568-13823 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/13824-14079.pbf b/public/mapbox/Roboto Black/13824-14079.pbf new file mode 100644 index 0000000..7870420 --- /dev/null +++ b/public/mapbox/Roboto Black/13824-14079.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 13824-14079 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/14080-14335.pbf b/public/mapbox/Roboto Black/14080-14335.pbf new file mode 100644 index 0000000..9a650e4 --- /dev/null +++ b/public/mapbox/Roboto Black/14080-14335.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 14080-14335 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/14336-14591.pbf b/public/mapbox/Roboto Black/14336-14591.pbf new file mode 100644 index 0000000..828058e --- /dev/null +++ b/public/mapbox/Roboto Black/14336-14591.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 14336-14591 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/14592-14847.pbf b/public/mapbox/Roboto Black/14592-14847.pbf new file mode 100644 index 0000000..fcf9a1f --- /dev/null +++ b/public/mapbox/Roboto Black/14592-14847.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 14592-14847 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/14848-15103.pbf b/public/mapbox/Roboto Black/14848-15103.pbf new file mode 100644 index 0000000..d5625bd --- /dev/null +++ b/public/mapbox/Roboto Black/14848-15103.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 14848-15103 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/15104-15359.pbf b/public/mapbox/Roboto Black/15104-15359.pbf new file mode 100644 index 0000000..2bd12d4 --- /dev/null +++ b/public/mapbox/Roboto Black/15104-15359.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 15104-15359 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/1536-1791.pbf b/public/mapbox/Roboto Black/1536-1791.pbf new file mode 100644 index 0000000..13de56a --- /dev/null +++ b/public/mapbox/Roboto Black/1536-1791.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 1536-1791 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/15360-15615.pbf b/public/mapbox/Roboto Black/15360-15615.pbf new file mode 100644 index 0000000..ce5dd10 --- /dev/null +++ b/public/mapbox/Roboto Black/15360-15615.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 15360-15615 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/15616-15871.pbf b/public/mapbox/Roboto Black/15616-15871.pbf new file mode 100644 index 0000000..a2b39e9 --- /dev/null +++ b/public/mapbox/Roboto Black/15616-15871.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 15616-15871 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/15872-16127.pbf b/public/mapbox/Roboto Black/15872-16127.pbf new file mode 100644 index 0000000..72b7aef --- /dev/null +++ b/public/mapbox/Roboto Black/15872-16127.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 15872-16127 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/16128-16383.pbf b/public/mapbox/Roboto Black/16128-16383.pbf new file mode 100644 index 0000000..dd53cff --- /dev/null +++ b/public/mapbox/Roboto Black/16128-16383.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 16128-16383 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/16384-16639.pbf b/public/mapbox/Roboto Black/16384-16639.pbf new file mode 100644 index 0000000..42e96d7 --- /dev/null +++ b/public/mapbox/Roboto Black/16384-16639.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 16384-16639 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/16640-16895.pbf b/public/mapbox/Roboto Black/16640-16895.pbf new file mode 100644 index 0000000..880ab7f --- /dev/null +++ b/public/mapbox/Roboto Black/16640-16895.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 16640-16895 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/16896-17151.pbf b/public/mapbox/Roboto Black/16896-17151.pbf new file mode 100644 index 0000000..0607a98 --- /dev/null +++ b/public/mapbox/Roboto Black/16896-17151.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 16896-17151 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/17152-17407.pbf b/public/mapbox/Roboto Black/17152-17407.pbf new file mode 100644 index 0000000..2c28257 --- /dev/null +++ b/public/mapbox/Roboto Black/17152-17407.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 17152-17407 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/17408-17663.pbf b/public/mapbox/Roboto Black/17408-17663.pbf new file mode 100644 index 0000000..19a6618 --- /dev/null +++ b/public/mapbox/Roboto Black/17408-17663.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 17408-17663 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/17664-17919.pbf b/public/mapbox/Roboto Black/17664-17919.pbf new file mode 100644 index 0000000..60f0e8e --- /dev/null +++ b/public/mapbox/Roboto Black/17664-17919.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 17664-17919 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/1792-2047.pbf b/public/mapbox/Roboto Black/1792-2047.pbf new file mode 100644 index 0000000..532df04 --- /dev/null +++ b/public/mapbox/Roboto Black/1792-2047.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 1792-2047 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/17920-18175.pbf b/public/mapbox/Roboto Black/17920-18175.pbf new file mode 100644 index 0000000..950d1e3 --- /dev/null +++ b/public/mapbox/Roboto Black/17920-18175.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 17920-18175 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/18176-18431.pbf b/public/mapbox/Roboto Black/18176-18431.pbf new file mode 100644 index 0000000..ec0fe18 --- /dev/null +++ b/public/mapbox/Roboto Black/18176-18431.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 18176-18431 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/18432-18687.pbf b/public/mapbox/Roboto Black/18432-18687.pbf new file mode 100644 index 0000000..666c22e --- /dev/null +++ b/public/mapbox/Roboto Black/18432-18687.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 18432-18687 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/18688-18943.pbf b/public/mapbox/Roboto Black/18688-18943.pbf new file mode 100644 index 0000000..dab4a47 --- /dev/null +++ b/public/mapbox/Roboto Black/18688-18943.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 18688-18943 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/18944-19199.pbf b/public/mapbox/Roboto Black/18944-19199.pbf new file mode 100644 index 0000000..1285693 --- /dev/null +++ b/public/mapbox/Roboto Black/18944-19199.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 18944-19199 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/19200-19455.pbf b/public/mapbox/Roboto Black/19200-19455.pbf new file mode 100644 index 0000000..68dc4d0 --- /dev/null +++ b/public/mapbox/Roboto Black/19200-19455.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 19200-19455 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/19456-19711.pbf b/public/mapbox/Roboto Black/19456-19711.pbf new file mode 100644 index 0000000..d4d599a --- /dev/null +++ b/public/mapbox/Roboto Black/19456-19711.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 19456-19711 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/19712-19967.pbf b/public/mapbox/Roboto Black/19712-19967.pbf new file mode 100644 index 0000000..241dd2e --- /dev/null +++ b/public/mapbox/Roboto Black/19712-19967.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 19712-19967 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/19968-20223.pbf b/public/mapbox/Roboto Black/19968-20223.pbf new file mode 100644 index 0000000..2981bde --- /dev/null +++ b/public/mapbox/Roboto Black/19968-20223.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 19968-20223 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/20224-20479.pbf b/public/mapbox/Roboto Black/20224-20479.pbf new file mode 100644 index 0000000..a272198 --- /dev/null +++ b/public/mapbox/Roboto Black/20224-20479.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 20224-20479 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/2048-2303.pbf b/public/mapbox/Roboto Black/2048-2303.pbf new file mode 100644 index 0000000..58bbd6d --- /dev/null +++ b/public/mapbox/Roboto Black/2048-2303.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 2048-2303 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/20480-20735.pbf b/public/mapbox/Roboto Black/20480-20735.pbf new file mode 100644 index 0000000..c56d61b --- /dev/null +++ b/public/mapbox/Roboto Black/20480-20735.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 20480-20735 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/20736-20991.pbf b/public/mapbox/Roboto Black/20736-20991.pbf new file mode 100644 index 0000000..13b035b --- /dev/null +++ b/public/mapbox/Roboto Black/20736-20991.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 20736-20991 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/20992-21247.pbf b/public/mapbox/Roboto Black/20992-21247.pbf new file mode 100644 index 0000000..2732291 --- /dev/null +++ b/public/mapbox/Roboto Black/20992-21247.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 20992-21247 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/21248-21503.pbf b/public/mapbox/Roboto Black/21248-21503.pbf new file mode 100644 index 0000000..2c1ef58 --- /dev/null +++ b/public/mapbox/Roboto Black/21248-21503.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 21248-21503 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/21504-21759.pbf b/public/mapbox/Roboto Black/21504-21759.pbf new file mode 100644 index 0000000..95e590a --- /dev/null +++ b/public/mapbox/Roboto Black/21504-21759.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 21504-21759 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/21760-22015.pbf b/public/mapbox/Roboto Black/21760-22015.pbf new file mode 100644 index 0000000..f6cec9a --- /dev/null +++ b/public/mapbox/Roboto Black/21760-22015.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 21760-22015 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/22016-22271.pbf b/public/mapbox/Roboto Black/22016-22271.pbf new file mode 100644 index 0000000..d1b7441 --- /dev/null +++ b/public/mapbox/Roboto Black/22016-22271.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 22016-22271 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/22272-22527.pbf b/public/mapbox/Roboto Black/22272-22527.pbf new file mode 100644 index 0000000..8349a45 --- /dev/null +++ b/public/mapbox/Roboto Black/22272-22527.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 22272-22527 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/22528-22783.pbf b/public/mapbox/Roboto Black/22528-22783.pbf new file mode 100644 index 0000000..767c69d --- /dev/null +++ b/public/mapbox/Roboto Black/22528-22783.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 22528-22783 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/22784-23039.pbf b/public/mapbox/Roboto Black/22784-23039.pbf new file mode 100644 index 0000000..cadf944 --- /dev/null +++ b/public/mapbox/Roboto Black/22784-23039.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 22784-23039 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/2304-2559.pbf b/public/mapbox/Roboto Black/2304-2559.pbf new file mode 100644 index 0000000..b1d52ff --- /dev/null +++ b/public/mapbox/Roboto Black/2304-2559.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 2304-2559 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/23040-23295.pbf b/public/mapbox/Roboto Black/23040-23295.pbf new file mode 100644 index 0000000..7cbb7d1 --- /dev/null +++ b/public/mapbox/Roboto Black/23040-23295.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 23040-23295 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/23296-23551.pbf b/public/mapbox/Roboto Black/23296-23551.pbf new file mode 100644 index 0000000..a515a94 --- /dev/null +++ b/public/mapbox/Roboto Black/23296-23551.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 23296-23551 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/23552-23807.pbf b/public/mapbox/Roboto Black/23552-23807.pbf new file mode 100644 index 0000000..b7b37b0 --- /dev/null +++ b/public/mapbox/Roboto Black/23552-23807.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 23552-23807 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/23808-24063.pbf b/public/mapbox/Roboto Black/23808-24063.pbf new file mode 100644 index 0000000..56658cd --- /dev/null +++ b/public/mapbox/Roboto Black/23808-24063.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 23808-24063 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/24064-24319.pbf b/public/mapbox/Roboto Black/24064-24319.pbf new file mode 100644 index 0000000..745922d --- /dev/null +++ b/public/mapbox/Roboto Black/24064-24319.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 24064-24319 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/24320-24575.pbf b/public/mapbox/Roboto Black/24320-24575.pbf new file mode 100644 index 0000000..715fe6a --- /dev/null +++ b/public/mapbox/Roboto Black/24320-24575.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 24320-24575 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/24576-24831.pbf b/public/mapbox/Roboto Black/24576-24831.pbf new file mode 100644 index 0000000..291cdab --- /dev/null +++ b/public/mapbox/Roboto Black/24576-24831.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 24576-24831 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/24832-25087.pbf b/public/mapbox/Roboto Black/24832-25087.pbf new file mode 100644 index 0000000..378de30 --- /dev/null +++ b/public/mapbox/Roboto Black/24832-25087.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 24832-25087 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/25088-25343.pbf b/public/mapbox/Roboto Black/25088-25343.pbf new file mode 100644 index 0000000..da2a561 --- /dev/null +++ b/public/mapbox/Roboto Black/25088-25343.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 25088-25343 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/25344-25599.pbf b/public/mapbox/Roboto Black/25344-25599.pbf new file mode 100644 index 0000000..37e026a --- /dev/null +++ b/public/mapbox/Roboto Black/25344-25599.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 25344-25599 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/256-511.pbf b/public/mapbox/Roboto Black/256-511.pbf new file mode 100644 index 0000000..faaab12 Binary files /dev/null and b/public/mapbox/Roboto Black/256-511.pbf differ diff --git a/public/mapbox/Roboto Black/2560-2815.pbf b/public/mapbox/Roboto Black/2560-2815.pbf new file mode 100644 index 0000000..0222ab6 --- /dev/null +++ b/public/mapbox/Roboto Black/2560-2815.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 2560-2815 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/25600-25855.pbf b/public/mapbox/Roboto Black/25600-25855.pbf new file mode 100644 index 0000000..4862973 --- /dev/null +++ b/public/mapbox/Roboto Black/25600-25855.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 25600-25855 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/25856-26111.pbf b/public/mapbox/Roboto Black/25856-26111.pbf new file mode 100644 index 0000000..8e56d0f --- /dev/null +++ b/public/mapbox/Roboto Black/25856-26111.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 25856-26111 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/26112-26367.pbf b/public/mapbox/Roboto Black/26112-26367.pbf new file mode 100644 index 0000000..d404094 --- /dev/null +++ b/public/mapbox/Roboto Black/26112-26367.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 26112-26367 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/26368-26623.pbf b/public/mapbox/Roboto Black/26368-26623.pbf new file mode 100644 index 0000000..8b62b6e --- /dev/null +++ b/public/mapbox/Roboto Black/26368-26623.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 26368-26623 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/26624-26879.pbf b/public/mapbox/Roboto Black/26624-26879.pbf new file mode 100644 index 0000000..818c8c6 --- /dev/null +++ b/public/mapbox/Roboto Black/26624-26879.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 26624-26879 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/26880-27135.pbf b/public/mapbox/Roboto Black/26880-27135.pbf new file mode 100644 index 0000000..8354753 --- /dev/null +++ b/public/mapbox/Roboto Black/26880-27135.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 26880-27135 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/27136-27391.pbf b/public/mapbox/Roboto Black/27136-27391.pbf new file mode 100644 index 0000000..0401b39 --- /dev/null +++ b/public/mapbox/Roboto Black/27136-27391.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 27136-27391 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/27392-27647.pbf b/public/mapbox/Roboto Black/27392-27647.pbf new file mode 100644 index 0000000..54c38ea --- /dev/null +++ b/public/mapbox/Roboto Black/27392-27647.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 27392-27647 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/27648-27903.pbf b/public/mapbox/Roboto Black/27648-27903.pbf new file mode 100644 index 0000000..8909720 --- /dev/null +++ b/public/mapbox/Roboto Black/27648-27903.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 27648-27903 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/27904-28159.pbf b/public/mapbox/Roboto Black/27904-28159.pbf new file mode 100644 index 0000000..5123e05 --- /dev/null +++ b/public/mapbox/Roboto Black/27904-28159.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 27904-28159 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/2816-3071.pbf b/public/mapbox/Roboto Black/2816-3071.pbf new file mode 100644 index 0000000..0034f11 --- /dev/null +++ b/public/mapbox/Roboto Black/2816-3071.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 2816-3071 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/28160-28415.pbf b/public/mapbox/Roboto Black/28160-28415.pbf new file mode 100644 index 0000000..db1bb89 --- /dev/null +++ b/public/mapbox/Roboto Black/28160-28415.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 28160-28415 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/28416-28671.pbf b/public/mapbox/Roboto Black/28416-28671.pbf new file mode 100644 index 0000000..1aca58d --- /dev/null +++ b/public/mapbox/Roboto Black/28416-28671.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 28416-28671 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/28672-28927.pbf b/public/mapbox/Roboto Black/28672-28927.pbf new file mode 100644 index 0000000..8aa1fbf --- /dev/null +++ b/public/mapbox/Roboto Black/28672-28927.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 28672-28927 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/28928-29183.pbf b/public/mapbox/Roboto Black/28928-29183.pbf new file mode 100644 index 0000000..c438f67 --- /dev/null +++ b/public/mapbox/Roboto Black/28928-29183.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 28928-29183 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/29184-29439.pbf b/public/mapbox/Roboto Black/29184-29439.pbf new file mode 100644 index 0000000..778eacb --- /dev/null +++ b/public/mapbox/Roboto Black/29184-29439.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 29184-29439 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/29440-29695.pbf b/public/mapbox/Roboto Black/29440-29695.pbf new file mode 100644 index 0000000..665fe5a --- /dev/null +++ b/public/mapbox/Roboto Black/29440-29695.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 29440-29695 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/29696-29951.pbf b/public/mapbox/Roboto Black/29696-29951.pbf new file mode 100644 index 0000000..e793ab7 --- /dev/null +++ b/public/mapbox/Roboto Black/29696-29951.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 29696-29951 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/29952-30207.pbf b/public/mapbox/Roboto Black/29952-30207.pbf new file mode 100644 index 0000000..a2ae2bc --- /dev/null +++ b/public/mapbox/Roboto Black/29952-30207.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 29952-30207 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/30208-30463.pbf b/public/mapbox/Roboto Black/30208-30463.pbf new file mode 100644 index 0000000..7d4e7a2 --- /dev/null +++ b/public/mapbox/Roboto Black/30208-30463.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 30208-30463 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/30464-30719.pbf b/public/mapbox/Roboto Black/30464-30719.pbf new file mode 100644 index 0000000..6727fc4 --- /dev/null +++ b/public/mapbox/Roboto Black/30464-30719.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 30464-30719 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/3072-3327.pbf b/public/mapbox/Roboto Black/3072-3327.pbf new file mode 100644 index 0000000..8abef16 --- /dev/null +++ b/public/mapbox/Roboto Black/3072-3327.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 3072-3327 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/30720-30975.pbf b/public/mapbox/Roboto Black/30720-30975.pbf new file mode 100644 index 0000000..e94179d --- /dev/null +++ b/public/mapbox/Roboto Black/30720-30975.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 30720-30975 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/30976-31231.pbf b/public/mapbox/Roboto Black/30976-31231.pbf new file mode 100644 index 0000000..70eacc2 --- /dev/null +++ b/public/mapbox/Roboto Black/30976-31231.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 30976-31231 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/31232-31487.pbf b/public/mapbox/Roboto Black/31232-31487.pbf new file mode 100644 index 0000000..b1e3613 --- /dev/null +++ b/public/mapbox/Roboto Black/31232-31487.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 31232-31487 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/31488-31743.pbf b/public/mapbox/Roboto Black/31488-31743.pbf new file mode 100644 index 0000000..5f721b8 --- /dev/null +++ b/public/mapbox/Roboto Black/31488-31743.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 31488-31743 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/31744-31999.pbf b/public/mapbox/Roboto Black/31744-31999.pbf new file mode 100644 index 0000000..a0172d5 --- /dev/null +++ b/public/mapbox/Roboto Black/31744-31999.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 31744-31999 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/32000-32255.pbf b/public/mapbox/Roboto Black/32000-32255.pbf new file mode 100644 index 0000000..3b9799b --- /dev/null +++ b/public/mapbox/Roboto Black/32000-32255.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 32000-32255 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/32256-32511.pbf b/public/mapbox/Roboto Black/32256-32511.pbf new file mode 100644 index 0000000..dda6968 --- /dev/null +++ b/public/mapbox/Roboto Black/32256-32511.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 32256-32511 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/32512-32767.pbf b/public/mapbox/Roboto Black/32512-32767.pbf new file mode 100644 index 0000000..450ceaf --- /dev/null +++ b/public/mapbox/Roboto Black/32512-32767.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 32512-32767 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/32768-33023.pbf b/public/mapbox/Roboto Black/32768-33023.pbf new file mode 100644 index 0000000..fb8e628 --- /dev/null +++ b/public/mapbox/Roboto Black/32768-33023.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 32768-33023 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/33024-33279.pbf b/public/mapbox/Roboto Black/33024-33279.pbf new file mode 100644 index 0000000..7fda515 --- /dev/null +++ b/public/mapbox/Roboto Black/33024-33279.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 33024-33279 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/3328-3583.pbf b/public/mapbox/Roboto Black/3328-3583.pbf new file mode 100644 index 0000000..7047ea9 --- /dev/null +++ b/public/mapbox/Roboto Black/3328-3583.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 3328-3583 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/33280-33535.pbf b/public/mapbox/Roboto Black/33280-33535.pbf new file mode 100644 index 0000000..dde0e01 --- /dev/null +++ b/public/mapbox/Roboto Black/33280-33535.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 33280-33535 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/33536-33791.pbf b/public/mapbox/Roboto Black/33536-33791.pbf new file mode 100644 index 0000000..60e344a --- /dev/null +++ b/public/mapbox/Roboto Black/33536-33791.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 33536-33791 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/33792-34047.pbf b/public/mapbox/Roboto Black/33792-34047.pbf new file mode 100644 index 0000000..f810f3e --- /dev/null +++ b/public/mapbox/Roboto Black/33792-34047.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 33792-34047 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/34048-34303.pbf b/public/mapbox/Roboto Black/34048-34303.pbf new file mode 100644 index 0000000..99e177f --- /dev/null +++ b/public/mapbox/Roboto Black/34048-34303.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 34048-34303 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/34304-34559.pbf b/public/mapbox/Roboto Black/34304-34559.pbf new file mode 100644 index 0000000..61878aa --- /dev/null +++ b/public/mapbox/Roboto Black/34304-34559.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 34304-34559 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/34560-34815.pbf b/public/mapbox/Roboto Black/34560-34815.pbf new file mode 100644 index 0000000..1bdb5ab --- /dev/null +++ b/public/mapbox/Roboto Black/34560-34815.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 34560-34815 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/34816-35071.pbf b/public/mapbox/Roboto Black/34816-35071.pbf new file mode 100644 index 0000000..340dd0a --- /dev/null +++ b/public/mapbox/Roboto Black/34816-35071.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 34816-35071 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/35072-35327.pbf b/public/mapbox/Roboto Black/35072-35327.pbf new file mode 100644 index 0000000..48fb7f5 --- /dev/null +++ b/public/mapbox/Roboto Black/35072-35327.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 35072-35327 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/35328-35583.pbf b/public/mapbox/Roboto Black/35328-35583.pbf new file mode 100644 index 0000000..829cb61 --- /dev/null +++ b/public/mapbox/Roboto Black/35328-35583.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 35328-35583 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/35584-35839.pbf b/public/mapbox/Roboto Black/35584-35839.pbf new file mode 100644 index 0000000..8bdbeea --- /dev/null +++ b/public/mapbox/Roboto Black/35584-35839.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 35584-35839 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/3584-3839.pbf b/public/mapbox/Roboto Black/3584-3839.pbf new file mode 100644 index 0000000..2b14b89 --- /dev/null +++ b/public/mapbox/Roboto Black/3584-3839.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 3584-3839 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/35840-36095.pbf b/public/mapbox/Roboto Black/35840-36095.pbf new file mode 100644 index 0000000..258fdfd --- /dev/null +++ b/public/mapbox/Roboto Black/35840-36095.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 35840-36095 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/36096-36351.pbf b/public/mapbox/Roboto Black/36096-36351.pbf new file mode 100644 index 0000000..9e972e2 --- /dev/null +++ b/public/mapbox/Roboto Black/36096-36351.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 36096-36351 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/36352-36607.pbf b/public/mapbox/Roboto Black/36352-36607.pbf new file mode 100644 index 0000000..fd43c56 --- /dev/null +++ b/public/mapbox/Roboto Black/36352-36607.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 36352-36607 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/36608-36863.pbf b/public/mapbox/Roboto Black/36608-36863.pbf new file mode 100644 index 0000000..7db1a50 --- /dev/null +++ b/public/mapbox/Roboto Black/36608-36863.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 36608-36863 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/36864-37119.pbf b/public/mapbox/Roboto Black/36864-37119.pbf new file mode 100644 index 0000000..cf17076 --- /dev/null +++ b/public/mapbox/Roboto Black/36864-37119.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 36864-37119 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/37120-37375.pbf b/public/mapbox/Roboto Black/37120-37375.pbf new file mode 100644 index 0000000..3b2104c --- /dev/null +++ b/public/mapbox/Roboto Black/37120-37375.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 37120-37375 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/37376-37631.pbf b/public/mapbox/Roboto Black/37376-37631.pbf new file mode 100644 index 0000000..1bdd77a --- /dev/null +++ b/public/mapbox/Roboto Black/37376-37631.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 37376-37631 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/37632-37887.pbf b/public/mapbox/Roboto Black/37632-37887.pbf new file mode 100644 index 0000000..fe41e80 --- /dev/null +++ b/public/mapbox/Roboto Black/37632-37887.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 37632-37887 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/37888-38143.pbf b/public/mapbox/Roboto Black/37888-38143.pbf new file mode 100644 index 0000000..9838059 --- /dev/null +++ b/public/mapbox/Roboto Black/37888-38143.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 37888-38143 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/38144-38399.pbf b/public/mapbox/Roboto Black/38144-38399.pbf new file mode 100644 index 0000000..6bfa9b2 --- /dev/null +++ b/public/mapbox/Roboto Black/38144-38399.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 38144-38399 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/3840-4095.pbf b/public/mapbox/Roboto Black/3840-4095.pbf new file mode 100644 index 0000000..6f0f0c8 --- /dev/null +++ b/public/mapbox/Roboto Black/3840-4095.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 3840-4095 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/38400-38655.pbf b/public/mapbox/Roboto Black/38400-38655.pbf new file mode 100644 index 0000000..1afb86a --- /dev/null +++ b/public/mapbox/Roboto Black/38400-38655.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 38400-38655 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/38656-38911.pbf b/public/mapbox/Roboto Black/38656-38911.pbf new file mode 100644 index 0000000..9ccdbbe --- /dev/null +++ b/public/mapbox/Roboto Black/38656-38911.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 38656-38911 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/38912-39167.pbf b/public/mapbox/Roboto Black/38912-39167.pbf new file mode 100644 index 0000000..7371897 --- /dev/null +++ b/public/mapbox/Roboto Black/38912-39167.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 38912-39167 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/39168-39423.pbf b/public/mapbox/Roboto Black/39168-39423.pbf new file mode 100644 index 0000000..fda3208 --- /dev/null +++ b/public/mapbox/Roboto Black/39168-39423.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 39168-39423 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/39424-39679.pbf b/public/mapbox/Roboto Black/39424-39679.pbf new file mode 100644 index 0000000..1950a7f --- /dev/null +++ b/public/mapbox/Roboto Black/39424-39679.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 39424-39679 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/39680-39935.pbf b/public/mapbox/Roboto Black/39680-39935.pbf new file mode 100644 index 0000000..01c4c0e --- /dev/null +++ b/public/mapbox/Roboto Black/39680-39935.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 39680-39935 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/39936-40191.pbf b/public/mapbox/Roboto Black/39936-40191.pbf new file mode 100644 index 0000000..f1cd37b --- /dev/null +++ b/public/mapbox/Roboto Black/39936-40191.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 39936-40191 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/40192-40447.pbf b/public/mapbox/Roboto Black/40192-40447.pbf new file mode 100644 index 0000000..b09a003 --- /dev/null +++ b/public/mapbox/Roboto Black/40192-40447.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 40192-40447 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/40448-40703.pbf b/public/mapbox/Roboto Black/40448-40703.pbf new file mode 100644 index 0000000..ff16f90 --- /dev/null +++ b/public/mapbox/Roboto Black/40448-40703.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 40448-40703 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/40704-40959.pbf b/public/mapbox/Roboto Black/40704-40959.pbf new file mode 100644 index 0000000..f025c08 --- /dev/null +++ b/public/mapbox/Roboto Black/40704-40959.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 40704-40959 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/4096-4351.pbf b/public/mapbox/Roboto Black/4096-4351.pbf new file mode 100644 index 0000000..a474214 --- /dev/null +++ b/public/mapbox/Roboto Black/4096-4351.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 4096-4351 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/40960-41215.pbf b/public/mapbox/Roboto Black/40960-41215.pbf new file mode 100644 index 0000000..a5180db --- /dev/null +++ b/public/mapbox/Roboto Black/40960-41215.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 40960-41215 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/41216-41471.pbf b/public/mapbox/Roboto Black/41216-41471.pbf new file mode 100644 index 0000000..f1e7d0e --- /dev/null +++ b/public/mapbox/Roboto Black/41216-41471.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 41216-41471 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/41472-41727.pbf b/public/mapbox/Roboto Black/41472-41727.pbf new file mode 100644 index 0000000..0b0f18f --- /dev/null +++ b/public/mapbox/Roboto Black/41472-41727.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 41472-41727 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/41728-41983.pbf b/public/mapbox/Roboto Black/41728-41983.pbf new file mode 100644 index 0000000..cb041a2 --- /dev/null +++ b/public/mapbox/Roboto Black/41728-41983.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 41728-41983 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/41984-42239.pbf b/public/mapbox/Roboto Black/41984-42239.pbf new file mode 100644 index 0000000..8acf81d --- /dev/null +++ b/public/mapbox/Roboto Black/41984-42239.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 41984-42239 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/42240-42495.pbf b/public/mapbox/Roboto Black/42240-42495.pbf new file mode 100644 index 0000000..d84b98a --- /dev/null +++ b/public/mapbox/Roboto Black/42240-42495.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 42240-42495 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/42496-42751.pbf b/public/mapbox/Roboto Black/42496-42751.pbf new file mode 100644 index 0000000..302e780 Binary files /dev/null and b/public/mapbox/Roboto Black/42496-42751.pbf differ diff --git a/public/mapbox/Roboto Black/42752-43007.pbf b/public/mapbox/Roboto Black/42752-43007.pbf new file mode 100644 index 0000000..2cb4949 Binary files /dev/null and b/public/mapbox/Roboto Black/42752-43007.pbf differ diff --git a/public/mapbox/Roboto Black/43008-43263.pbf b/public/mapbox/Roboto Black/43008-43263.pbf new file mode 100644 index 0000000..ad5996d --- /dev/null +++ b/public/mapbox/Roboto Black/43008-43263.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 43008-43263 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/43264-43519.pbf b/public/mapbox/Roboto Black/43264-43519.pbf new file mode 100644 index 0000000..a5364f1 Binary files /dev/null and b/public/mapbox/Roboto Black/43264-43519.pbf differ diff --git a/public/mapbox/Roboto Black/4352-4607.pbf b/public/mapbox/Roboto Black/4352-4607.pbf new file mode 100644 index 0000000..a84c2e8 --- /dev/null +++ b/public/mapbox/Roboto Black/4352-4607.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 4352-4607 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/43520-43775.pbf b/public/mapbox/Roboto Black/43520-43775.pbf new file mode 100644 index 0000000..aa703f1 --- /dev/null +++ b/public/mapbox/Roboto Black/43520-43775.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 43520-43775 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/43776-44031.pbf b/public/mapbox/Roboto Black/43776-44031.pbf new file mode 100644 index 0000000..9371e75 Binary files /dev/null and b/public/mapbox/Roboto Black/43776-44031.pbf differ diff --git a/public/mapbox/Roboto Black/44032-44287.pbf b/public/mapbox/Roboto Black/44032-44287.pbf new file mode 100644 index 0000000..59bd19c --- /dev/null +++ b/public/mapbox/Roboto Black/44032-44287.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 44032-44287 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/44288-44543.pbf b/public/mapbox/Roboto Black/44288-44543.pbf new file mode 100644 index 0000000..e00289c --- /dev/null +++ b/public/mapbox/Roboto Black/44288-44543.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 44288-44543 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/44544-44799.pbf b/public/mapbox/Roboto Black/44544-44799.pbf new file mode 100644 index 0000000..7c75918 --- /dev/null +++ b/public/mapbox/Roboto Black/44544-44799.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 44544-44799 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/44800-45055.pbf b/public/mapbox/Roboto Black/44800-45055.pbf new file mode 100644 index 0000000..83c38d5 --- /dev/null +++ b/public/mapbox/Roboto Black/44800-45055.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 44800-45055 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/45056-45311.pbf b/public/mapbox/Roboto Black/45056-45311.pbf new file mode 100644 index 0000000..9aabe8e --- /dev/null +++ b/public/mapbox/Roboto Black/45056-45311.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 45056-45311 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/45312-45567.pbf b/public/mapbox/Roboto Black/45312-45567.pbf new file mode 100644 index 0000000..d65cfba --- /dev/null +++ b/public/mapbox/Roboto Black/45312-45567.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 45312-45567 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/45568-45823.pbf b/public/mapbox/Roboto Black/45568-45823.pbf new file mode 100644 index 0000000..e31abef --- /dev/null +++ b/public/mapbox/Roboto Black/45568-45823.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 45568-45823 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/45824-46079.pbf b/public/mapbox/Roboto Black/45824-46079.pbf new file mode 100644 index 0000000..dcf4cb4 --- /dev/null +++ b/public/mapbox/Roboto Black/45824-46079.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 45824-46079 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/4608-4863.pbf b/public/mapbox/Roboto Black/4608-4863.pbf new file mode 100644 index 0000000..f81e943 --- /dev/null +++ b/public/mapbox/Roboto Black/4608-4863.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 4608-4863 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/46080-46335.pbf b/public/mapbox/Roboto Black/46080-46335.pbf new file mode 100644 index 0000000..ac14ae5 --- /dev/null +++ b/public/mapbox/Roboto Black/46080-46335.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 46080-46335 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/46336-46591.pbf b/public/mapbox/Roboto Black/46336-46591.pbf new file mode 100644 index 0000000..debf1a1 --- /dev/null +++ b/public/mapbox/Roboto Black/46336-46591.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 46336-46591 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/46592-46847.pbf b/public/mapbox/Roboto Black/46592-46847.pbf new file mode 100644 index 0000000..38de94a --- /dev/null +++ b/public/mapbox/Roboto Black/46592-46847.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 46592-46847 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/46848-47103.pbf b/public/mapbox/Roboto Black/46848-47103.pbf new file mode 100644 index 0000000..56c4f54 --- /dev/null +++ b/public/mapbox/Roboto Black/46848-47103.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 46848-47103 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/47104-47359.pbf b/public/mapbox/Roboto Black/47104-47359.pbf new file mode 100644 index 0000000..9a7a10c --- /dev/null +++ b/public/mapbox/Roboto Black/47104-47359.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 47104-47359 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/47360-47615.pbf b/public/mapbox/Roboto Black/47360-47615.pbf new file mode 100644 index 0000000..62396b8 --- /dev/null +++ b/public/mapbox/Roboto Black/47360-47615.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 47360-47615 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/47616-47871.pbf b/public/mapbox/Roboto Black/47616-47871.pbf new file mode 100644 index 0000000..3ef7baf --- /dev/null +++ b/public/mapbox/Roboto Black/47616-47871.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 47616-47871 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/47872-48127.pbf b/public/mapbox/Roboto Black/47872-48127.pbf new file mode 100644 index 0000000..a11b26c --- /dev/null +++ b/public/mapbox/Roboto Black/47872-48127.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 47872-48127 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/48128-48383.pbf b/public/mapbox/Roboto Black/48128-48383.pbf new file mode 100644 index 0000000..98581df --- /dev/null +++ b/public/mapbox/Roboto Black/48128-48383.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 48128-48383 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/48384-48639.pbf b/public/mapbox/Roboto Black/48384-48639.pbf new file mode 100644 index 0000000..bc92a7b --- /dev/null +++ b/public/mapbox/Roboto Black/48384-48639.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 48384-48639 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/4864-5119.pbf b/public/mapbox/Roboto Black/4864-5119.pbf new file mode 100644 index 0000000..0eac448 --- /dev/null +++ b/public/mapbox/Roboto Black/4864-5119.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 4864-5119 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/48640-48895.pbf b/public/mapbox/Roboto Black/48640-48895.pbf new file mode 100644 index 0000000..e9ce8d2 --- /dev/null +++ b/public/mapbox/Roboto Black/48640-48895.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 48640-48895 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/48896-49151.pbf b/public/mapbox/Roboto Black/48896-49151.pbf new file mode 100644 index 0000000..784ba02 --- /dev/null +++ b/public/mapbox/Roboto Black/48896-49151.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 48896-49151 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/49152-49407.pbf b/public/mapbox/Roboto Black/49152-49407.pbf new file mode 100644 index 0000000..6b9f1c6 --- /dev/null +++ b/public/mapbox/Roboto Black/49152-49407.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 49152-49407 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/49408-49663.pbf b/public/mapbox/Roboto Black/49408-49663.pbf new file mode 100644 index 0000000..617d697 --- /dev/null +++ b/public/mapbox/Roboto Black/49408-49663.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 49408-49663 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/49664-49919.pbf b/public/mapbox/Roboto Black/49664-49919.pbf new file mode 100644 index 0000000..267e90f --- /dev/null +++ b/public/mapbox/Roboto Black/49664-49919.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 49664-49919 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/49920-50175.pbf b/public/mapbox/Roboto Black/49920-50175.pbf new file mode 100644 index 0000000..19a3249 --- /dev/null +++ b/public/mapbox/Roboto Black/49920-50175.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 49920-50175 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/50176-50431.pbf b/public/mapbox/Roboto Black/50176-50431.pbf new file mode 100644 index 0000000..0107054 --- /dev/null +++ b/public/mapbox/Roboto Black/50176-50431.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 50176-50431 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/50432-50687.pbf b/public/mapbox/Roboto Black/50432-50687.pbf new file mode 100644 index 0000000..b5a4ed5 --- /dev/null +++ b/public/mapbox/Roboto Black/50432-50687.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 50432-50687 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/50688-50943.pbf b/public/mapbox/Roboto Black/50688-50943.pbf new file mode 100644 index 0000000..cdb641c --- /dev/null +++ b/public/mapbox/Roboto Black/50688-50943.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 50688-50943 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/50944-51199.pbf b/public/mapbox/Roboto Black/50944-51199.pbf new file mode 100644 index 0000000..384072b --- /dev/null +++ b/public/mapbox/Roboto Black/50944-51199.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 50944-51199 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/512-767.pbf b/public/mapbox/Roboto Black/512-767.pbf new file mode 100644 index 0000000..30ca17c Binary files /dev/null and b/public/mapbox/Roboto Black/512-767.pbf differ diff --git a/public/mapbox/Roboto Black/5120-5375.pbf b/public/mapbox/Roboto Black/5120-5375.pbf new file mode 100644 index 0000000..61112c1 --- /dev/null +++ b/public/mapbox/Roboto Black/5120-5375.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 5120-5375 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/51200-51455.pbf b/public/mapbox/Roboto Black/51200-51455.pbf new file mode 100644 index 0000000..b2f5e8d --- /dev/null +++ b/public/mapbox/Roboto Black/51200-51455.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 51200-51455 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/51456-51711.pbf b/public/mapbox/Roboto Black/51456-51711.pbf new file mode 100644 index 0000000..15b46ff --- /dev/null +++ b/public/mapbox/Roboto Black/51456-51711.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 51456-51711 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/51712-51967.pbf b/public/mapbox/Roboto Black/51712-51967.pbf new file mode 100644 index 0000000..494bcd9 --- /dev/null +++ b/public/mapbox/Roboto Black/51712-51967.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 51712-51967 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/51968-52223.pbf b/public/mapbox/Roboto Black/51968-52223.pbf new file mode 100644 index 0000000..0f1eb20 --- /dev/null +++ b/public/mapbox/Roboto Black/51968-52223.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 51968-52223 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/52224-52479.pbf b/public/mapbox/Roboto Black/52224-52479.pbf new file mode 100644 index 0000000..631d48c --- /dev/null +++ b/public/mapbox/Roboto Black/52224-52479.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 52224-52479 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/52480-52735.pbf b/public/mapbox/Roboto Black/52480-52735.pbf new file mode 100644 index 0000000..2f00060 --- /dev/null +++ b/public/mapbox/Roboto Black/52480-52735.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 52480-52735 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/52736-52991.pbf b/public/mapbox/Roboto Black/52736-52991.pbf new file mode 100644 index 0000000..be94e23 --- /dev/null +++ b/public/mapbox/Roboto Black/52736-52991.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 52736-52991 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/52992-53247.pbf b/public/mapbox/Roboto Black/52992-53247.pbf new file mode 100644 index 0000000..f271476 --- /dev/null +++ b/public/mapbox/Roboto Black/52992-53247.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 52992-53247 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/53248-53503.pbf b/public/mapbox/Roboto Black/53248-53503.pbf new file mode 100644 index 0000000..2d5eac0 --- /dev/null +++ b/public/mapbox/Roboto Black/53248-53503.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 53248-53503 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/53504-53759.pbf b/public/mapbox/Roboto Black/53504-53759.pbf new file mode 100644 index 0000000..0f06f25 --- /dev/null +++ b/public/mapbox/Roboto Black/53504-53759.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 53504-53759 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/5376-5631.pbf b/public/mapbox/Roboto Black/5376-5631.pbf new file mode 100644 index 0000000..48d1779 --- /dev/null +++ b/public/mapbox/Roboto Black/5376-5631.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 5376-5631 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/53760-54015.pbf b/public/mapbox/Roboto Black/53760-54015.pbf new file mode 100644 index 0000000..622cc8a --- /dev/null +++ b/public/mapbox/Roboto Black/53760-54015.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 53760-54015 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/54016-54271.pbf b/public/mapbox/Roboto Black/54016-54271.pbf new file mode 100644 index 0000000..9054d82 --- /dev/null +++ b/public/mapbox/Roboto Black/54016-54271.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 54016-54271 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/54272-54527.pbf b/public/mapbox/Roboto Black/54272-54527.pbf new file mode 100644 index 0000000..2c47e72 --- /dev/null +++ b/public/mapbox/Roboto Black/54272-54527.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 54272-54527 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/54528-54783.pbf b/public/mapbox/Roboto Black/54528-54783.pbf new file mode 100644 index 0000000..3ddc107 --- /dev/null +++ b/public/mapbox/Roboto Black/54528-54783.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 54528-54783 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/54784-55039.pbf b/public/mapbox/Roboto Black/54784-55039.pbf new file mode 100644 index 0000000..83e0378 --- /dev/null +++ b/public/mapbox/Roboto Black/54784-55039.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 54784-55039 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/55040-55295.pbf b/public/mapbox/Roboto Black/55040-55295.pbf new file mode 100644 index 0000000..1048b3e --- /dev/null +++ b/public/mapbox/Roboto Black/55040-55295.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 55040-55295 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/55296-55551.pbf b/public/mapbox/Roboto Black/55296-55551.pbf new file mode 100644 index 0000000..0e8d7f9 --- /dev/null +++ b/public/mapbox/Roboto Black/55296-55551.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 55296-55551 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/55552-55807.pbf b/public/mapbox/Roboto Black/55552-55807.pbf new file mode 100644 index 0000000..5c80c6a --- /dev/null +++ b/public/mapbox/Roboto Black/55552-55807.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 55552-55807 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/55808-56063.pbf b/public/mapbox/Roboto Black/55808-56063.pbf new file mode 100644 index 0000000..db6a81f --- /dev/null +++ b/public/mapbox/Roboto Black/55808-56063.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 55808-56063 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/56064-56319.pbf b/public/mapbox/Roboto Black/56064-56319.pbf new file mode 100644 index 0000000..36dd8ed --- /dev/null +++ b/public/mapbox/Roboto Black/56064-56319.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 56064-56319 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/5632-5887.pbf b/public/mapbox/Roboto Black/5632-5887.pbf new file mode 100644 index 0000000..6bd2fbf --- /dev/null +++ b/public/mapbox/Roboto Black/5632-5887.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 5632-5887 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/56320-56575.pbf b/public/mapbox/Roboto Black/56320-56575.pbf new file mode 100644 index 0000000..db98e7a --- /dev/null +++ b/public/mapbox/Roboto Black/56320-56575.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 56320-56575 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/56576-56831.pbf b/public/mapbox/Roboto Black/56576-56831.pbf new file mode 100644 index 0000000..f153dee --- /dev/null +++ b/public/mapbox/Roboto Black/56576-56831.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 56576-56831 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/56832-57087.pbf b/public/mapbox/Roboto Black/56832-57087.pbf new file mode 100644 index 0000000..26db8c8 --- /dev/null +++ b/public/mapbox/Roboto Black/56832-57087.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 56832-57087 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/57088-57343.pbf b/public/mapbox/Roboto Black/57088-57343.pbf new file mode 100644 index 0000000..171dbc1 --- /dev/null +++ b/public/mapbox/Roboto Black/57088-57343.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 57088-57343 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/57344-57599.pbf b/public/mapbox/Roboto Black/57344-57599.pbf new file mode 100644 index 0000000..fccf2c1 --- /dev/null +++ b/public/mapbox/Roboto Black/57344-57599.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 57344-57599 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/57600-57855.pbf b/public/mapbox/Roboto Black/57600-57855.pbf new file mode 100644 index 0000000..e6722b7 --- /dev/null +++ b/public/mapbox/Roboto Black/57600-57855.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 57600-57855 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/57856-58111.pbf b/public/mapbox/Roboto Black/57856-58111.pbf new file mode 100644 index 0000000..2652804 --- /dev/null +++ b/public/mapbox/Roboto Black/57856-58111.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 57856-58111 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/58112-58367.pbf b/public/mapbox/Roboto Black/58112-58367.pbf new file mode 100644 index 0000000..6220d39 --- /dev/null +++ b/public/mapbox/Roboto Black/58112-58367.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 58112-58367 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/58368-58623.pbf b/public/mapbox/Roboto Black/58368-58623.pbf new file mode 100644 index 0000000..e68f1a4 --- /dev/null +++ b/public/mapbox/Roboto Black/58368-58623.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 58368-58623 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/58624-58879.pbf b/public/mapbox/Roboto Black/58624-58879.pbf new file mode 100644 index 0000000..d4da348 --- /dev/null +++ b/public/mapbox/Roboto Black/58624-58879.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 58624-58879 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/5888-6143.pbf b/public/mapbox/Roboto Black/5888-6143.pbf new file mode 100644 index 0000000..e926eb2 --- /dev/null +++ b/public/mapbox/Roboto Black/5888-6143.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 5888-6143 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/58880-59135.pbf b/public/mapbox/Roboto Black/58880-59135.pbf new file mode 100644 index 0000000..43290ba --- /dev/null +++ b/public/mapbox/Roboto Black/58880-59135.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 58880-59135 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/59136-59391.pbf b/public/mapbox/Roboto Black/59136-59391.pbf new file mode 100644 index 0000000..519bbd0 --- /dev/null +++ b/public/mapbox/Roboto Black/59136-59391.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 59136-59391 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/59392-59647.pbf b/public/mapbox/Roboto Black/59392-59647.pbf new file mode 100644 index 0000000..5de5ac4 --- /dev/null +++ b/public/mapbox/Roboto Black/59392-59647.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 59392-59647 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/59648-59903.pbf b/public/mapbox/Roboto Black/59648-59903.pbf new file mode 100644 index 0000000..4226981 --- /dev/null +++ b/public/mapbox/Roboto Black/59648-59903.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 59648-59903 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/59904-60159.pbf b/public/mapbox/Roboto Black/59904-60159.pbf new file mode 100644 index 0000000..713adcb --- /dev/null +++ b/public/mapbox/Roboto Black/59904-60159.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 59904-60159 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/60160-60415.pbf b/public/mapbox/Roboto Black/60160-60415.pbf new file mode 100644 index 0000000..d151dfe --- /dev/null +++ b/public/mapbox/Roboto Black/60160-60415.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 60160-60415 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/60416-60671.pbf b/public/mapbox/Roboto Black/60416-60671.pbf new file mode 100644 index 0000000..2ff4e18 --- /dev/null +++ b/public/mapbox/Roboto Black/60416-60671.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 60416-60671 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/60672-60927.pbf b/public/mapbox/Roboto Black/60672-60927.pbf new file mode 100644 index 0000000..2c008dc --- /dev/null +++ b/public/mapbox/Roboto Black/60672-60927.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 60672-60927 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/60928-61183.pbf b/public/mapbox/Roboto Black/60928-61183.pbf new file mode 100644 index 0000000..c78a6d9 --- /dev/null +++ b/public/mapbox/Roboto Black/60928-61183.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 60928-61183'=N^fjf_P?*;Ujz|kW>NhkQ[yñ|^aãecťf]|˷`RmpVA[qt]D.DVfosphXG0'=N^fjf_P?*;Ujz|kW>NhkQ[yñ|^aãecťf]|˷`RmpVA[qt]D.DVfosphXG0 (08HZdeeceee`R=^u~jQn|^rŭarͭarͭarͭarͭarahuYUjvwwuwwwq`I (08 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/61184-61439.pbf b/public/mapbox/Roboto Black/61184-61439.pbf new file mode 100644 index 0000000..4c0397e --- /dev/null +++ b/public/mapbox/Roboto Black/61184-61439.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 61184-61439 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/6144-6399.pbf b/public/mapbox/Roboto Black/6144-6399.pbf new file mode 100644 index 0000000..123676d --- /dev/null +++ b/public/mapbox/Roboto Black/6144-6399.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 6144-6399 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/61440-61695.pbf b/public/mapbox/Roboto Black/61440-61695.pbf new file mode 100644 index 0000000..e8f5a23 --- /dev/null +++ b/public/mapbox/Roboto Black/61440-61695.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 61440-61695 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/61696-61951.pbf b/public/mapbox/Roboto Black/61696-61951.pbf new file mode 100644 index 0000000..9226fb3 --- /dev/null +++ b/public/mapbox/Roboto Black/61696-61951.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 61696-61951 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/61952-62207.pbf b/public/mapbox/Roboto Black/61952-62207.pbf new file mode 100644 index 0000000..d456d7c --- /dev/null +++ b/public/mapbox/Roboto Black/61952-62207.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 61952-62207 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/62208-62463.pbf b/public/mapbox/Roboto Black/62208-62463.pbf new file mode 100644 index 0000000..34b3fce --- /dev/null +++ b/public/mapbox/Roboto Black/62208-62463.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 62208-62463 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/62464-62719.pbf b/public/mapbox/Roboto Black/62464-62719.pbf new file mode 100644 index 0000000..f48ddaf --- /dev/null +++ b/public/mapbox/Roboto Black/62464-62719.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 62464-62719 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/62720-62975.pbf b/public/mapbox/Roboto Black/62720-62975.pbf new file mode 100644 index 0000000..b6cb5ce --- /dev/null +++ b/public/mapbox/Roboto Black/62720-62975.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 62720-62975 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/62976-63231.pbf b/public/mapbox/Roboto Black/62976-63231.pbf new file mode 100644 index 0000000..2208c48 Binary files /dev/null and b/public/mapbox/Roboto Black/62976-63231.pbf differ diff --git a/public/mapbox/Roboto Black/63232-63487.pbf b/public/mapbox/Roboto Black/63232-63487.pbf new file mode 100644 index 0000000..1acf7cb --- /dev/null +++ b/public/mapbox/Roboto Black/63232-63487.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 63232-63487 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/63488-63743.pbf b/public/mapbox/Roboto Black/63488-63743.pbf new file mode 100644 index 0000000..68c4d38 --- /dev/null +++ b/public/mapbox/Roboto Black/63488-63743.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 63488-63743 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/63744-63999.pbf b/public/mapbox/Roboto Black/63744-63999.pbf new file mode 100644 index 0000000..810004a --- /dev/null +++ b/public/mapbox/Roboto Black/63744-63999.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 63744-63999 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/6400-6655.pbf b/public/mapbox/Roboto Black/6400-6655.pbf new file mode 100644 index 0000000..be8ed48 --- /dev/null +++ b/public/mapbox/Roboto Black/6400-6655.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 6400-6655 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/64000-64255.pbf b/public/mapbox/Roboto Black/64000-64255.pbf new file mode 100644 index 0000000..d8e103e --- /dev/null +++ b/public/mapbox/Roboto Black/64000-64255.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 64000-64255 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/64256-64511.pbf b/public/mapbox/Roboto Black/64256-64511.pbf new file mode 100644 index 0000000..3c6f0b0 Binary files /dev/null and b/public/mapbox/Roboto Black/64256-64511.pbf differ diff --git a/public/mapbox/Roboto Black/64512-64767.pbf b/public/mapbox/Roboto Black/64512-64767.pbf new file mode 100644 index 0000000..649c181 --- /dev/null +++ b/public/mapbox/Roboto Black/64512-64767.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 64512-64767 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/64768-65023.pbf b/public/mapbox/Roboto Black/64768-65023.pbf new file mode 100644 index 0000000..c9376b6 --- /dev/null +++ b/public/mapbox/Roboto Black/64768-65023.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 64768-65023 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/65024-65279.pbf b/public/mapbox/Roboto Black/65024-65279.pbf new file mode 100644 index 0000000..84fc07f Binary files /dev/null and b/public/mapbox/Roboto Black/65024-65279.pbf differ diff --git a/public/mapbox/Roboto Black/65280-65535.pbf b/public/mapbox/Roboto Black/65280-65535.pbf new file mode 100644 index 0000000..5410f3f Binary files /dev/null and b/public/mapbox/Roboto Black/65280-65535.pbf differ diff --git a/public/mapbox/Roboto Black/6656-6911.pbf b/public/mapbox/Roboto Black/6656-6911.pbf new file mode 100644 index 0000000..51b2f8e Binary files /dev/null and b/public/mapbox/Roboto Black/6656-6911.pbf differ diff --git a/public/mapbox/Roboto Black/6912-7167.pbf b/public/mapbox/Roboto Black/6912-7167.pbf new file mode 100644 index 0000000..b6065a5 --- /dev/null +++ b/public/mapbox/Roboto Black/6912-7167.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 6912-7167 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/7168-7423.pbf b/public/mapbox/Roboto Black/7168-7423.pbf new file mode 100644 index 0000000..da77465 --- /dev/null +++ b/public/mapbox/Roboto Black/7168-7423.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 7168-7423 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/7424-7679.pbf b/public/mapbox/Roboto Black/7424-7679.pbf new file mode 100644 index 0000000..6697c69 Binary files /dev/null and b/public/mapbox/Roboto Black/7424-7679.pbf differ diff --git a/public/mapbox/Roboto Black/768-1023.pbf b/public/mapbox/Roboto Black/768-1023.pbf new file mode 100644 index 0000000..720eee4 Binary files /dev/null and b/public/mapbox/Roboto Black/768-1023.pbf differ diff --git a/public/mapbox/Roboto Black/7680-7935.pbf b/public/mapbox/Roboto Black/7680-7935.pbf new file mode 100644 index 0000000..923f32b Binary files /dev/null and b/public/mapbox/Roboto Black/7680-7935.pbf differ diff --git a/public/mapbox/Roboto Black/7936-8191.pbf b/public/mapbox/Roboto Black/7936-8191.pbf new file mode 100644 index 0000000..3cd2a83 Binary files /dev/null and b/public/mapbox/Roboto Black/7936-8191.pbf differ diff --git a/public/mapbox/Roboto Black/8192-8447.pbf b/public/mapbox/Roboto Black/8192-8447.pbf new file mode 100644 index 0000000..4b7b1df Binary files /dev/null and b/public/mapbox/Roboto Black/8192-8447.pbf differ diff --git a/public/mapbox/Roboto Black/8448-8703.pbf b/public/mapbox/Roboto Black/8448-8703.pbf new file mode 100644 index 0000000..ee4fa57 Binary files /dev/null and b/public/mapbox/Roboto Black/8448-8703.pbf differ diff --git a/public/mapbox/Roboto Black/8704-8959.pbf b/public/mapbox/Roboto Black/8704-8959.pbf new file mode 100644 index 0000000..543889d Binary files /dev/null and b/public/mapbox/Roboto Black/8704-8959.pbf differ diff --git a/public/mapbox/Roboto Black/8960-9215.pbf b/public/mapbox/Roboto Black/8960-9215.pbf new file mode 100644 index 0000000..add7805 --- /dev/null +++ b/public/mapbox/Roboto Black/8960-9215.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 8960-9215 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/9216-9471.pbf b/public/mapbox/Roboto Black/9216-9471.pbf new file mode 100644 index 0000000..c156cb6 --- /dev/null +++ b/public/mapbox/Roboto Black/9216-9471.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 9216-9471HP^dddd`R>%'?S`dddd^Nh|~kR68Tlzfy}_IIawãiiiiļ|ãܼ|éܼ|ܼ|ܼ|Ѽ|}{pnZkqqqqqqqqqqqqqqqqjY (0-8 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/9472-9727.pbf b/public/mapbox/Roboto Black/9472-9727.pbf new file mode 100644 index 0000000..26fb9eb Binary files /dev/null and b/public/mapbox/Roboto Black/9472-9727.pbf differ diff --git a/public/mapbox/Roboto Black/9728-9983.pbf b/public/mapbox/Roboto Black/9728-9983.pbf new file mode 100644 index 0000000..3604b7c --- /dev/null +++ b/public/mapbox/Roboto Black/9728-9983.pbf @@ -0,0 +1,3 @@ + + + Roboto Black 9728-9983 \ No newline at end of file diff --git a/public/mapbox/Roboto Black/9984-10239.pbf b/public/mapbox/Roboto Black/9984-10239.pbf new file mode 100644 index 0000000..d32060a Binary files /dev/null and b/public/mapbox/Roboto Black/9984-10239.pbf differ diff --git a/public/mapbox/Roboto Black/LICENSE b/public/mapbox/Roboto Black/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/public/mapbox/Roboto Black/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/public/mapbox/geojson/RIVL.geojson b/public/mapbox/geojson/RIVL.geojson new file mode 100644 index 0000000..28ec4e0 --- /dev/null +++ b/public/mapbox/geojson/RIVL.geojson @@ -0,0 +1,305 @@ +{ +"type": "FeatureCollection", +"name": "RIVL", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "RVCD": "AFA980012J000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012I000000,AFA9800121M00000", "TRVCD": "AFA980012K000000", "INDCD": "QFA980012I000000", "ONDCD": "QFA980012J000000", "BWSCD": "WFA980012J000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 20.0, "RVLEN": 3553.0, "RVSLP": 0.0, "IELV": 50.0, "OELV": 50.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03951024, 31.21673755 ], [ 115.03942696, 31.21616167 ], [ 115.03915571, 31.21549035 ], [ 115.03840507, 31.2141983 ], [ 115.03832249, 31.21354981 ], [ 115.03828669, 31.21212962 ], [ 115.03845934, 31.21142041 ], [ 115.0384983, 31.21040441 ], [ 115.03865403, 31.20983629 ], [ 115.03868988, 31.20881912 ], [ 115.03906077, 31.20741251 ], [ 115.03912648, 31.20677616 ], [ 115.03927352, 31.20627819 ], [ 115.03935159, 31.20557421 ], [ 115.03949615, 31.20507422 ], [ 115.03955237, 31.20421284 ], [ 115.04037193, 31.20180017 ], [ 115.04083272, 31.1999156 ], [ 115.04086062, 31.19867304 ], [ 115.04103841, 31.19789289 ], [ 115.04105139, 31.19679361 ], [ 115.0412077, 31.19622477 ], [ 115.04126687, 31.19536559 ], [ 115.04162824, 31.19373399 ], [ 115.04163, 31.19240695 ], [ 115.04180264, 31.19169828 ], [ 115.04181355, 31.19096607 ], [ 115.04173008, 31.18932023 ], [ 115.04143906, 31.18827011 ], [ 115.04136753, 31.18669724 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121C00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122C00000", "INDCD": "-1", "ONDCD": "QFA9900121C00000", "BWSCD": "WFA9900121C00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6179.0, "RVSLP": 0.0079, "IELV": 240.79, "OELV": 143.96, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4466409, 31.26511436 ], [ 115.44645048, 31.26483037 ], [ 115.4460879, 31.26383887 ], [ 115.44598811, 31.26242994 ], [ 115.44590187, 31.26201215 ], [ 115.44554791, 31.26143606 ], [ 115.44497004, 31.26090772 ], [ 115.44468279, 31.26048352 ], [ 115.44459205, 31.26021055 ], [ 115.44446984, 31.25919571 ], [ 115.44415218, 31.25860023 ], [ 115.44379216, 31.25811006 ], [ 115.44345723, 31.25787647 ], [ 115.44313607, 31.25780278 ], [ 115.44227121, 31.25778355 ], [ 115.44188553, 31.25764054 ], [ 115.44148601, 31.25732788 ], [ 115.44095829, 31.2567502 ], [ 115.44034977, 31.2563681 ], [ 115.44017238, 31.25599367 ], [ 115.44009635, 31.25472794 ], [ 115.4400003, 31.25431555 ], [ 115.43910004, 31.25320682 ], [ 115.43878421, 31.25263842 ], [ 115.43793232, 31.25191976 ], [ 115.43548475, 31.25069015 ], [ 115.43485576, 31.250498 ], [ 115.43394352, 31.24986631 ], [ 115.43333769, 31.24960819 ], [ 115.43203318, 31.24936649 ], [ 115.43091248, 31.24935192 ], [ 115.43018402, 31.24920164 ], [ 115.4285543, 31.24915153 ], [ 115.42795776, 31.2488668 ], [ 115.42733215, 31.24866516 ], [ 115.42617837, 31.24798217 ], [ 115.42500919, 31.24708315 ], [ 115.42464519, 31.24687925 ], [ 115.42284913, 31.24630155 ], [ 115.42076833, 31.24579777 ], [ 115.41884898, 31.24507285 ], [ 115.41668967, 31.24454583 ], [ 115.41294237, 31.24307993 ], [ 115.41198376, 31.24235606 ], [ 115.41140075, 31.24170762 ], [ 115.41042449, 31.24087056 ], [ 115.40954192, 31.23993352 ], [ 115.4090334, 31.23919768 ], [ 115.40836166, 31.23842331 ], [ 115.40801821, 31.23819649 ], [ 115.40701432, 31.23781134 ], [ 115.40657616, 31.23715845 ], [ 115.40555006, 31.23635199 ], [ 115.40512612, 31.23566104 ], [ 115.40337183, 31.23378379 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122K00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121K00000", "TRVCD": "AFA9900123K00000", "INDCD": "QFA9900121K00000", "ONDCD": "QFA9900122K00000", "BWSCD": "WFA9900122K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2502.0, "RVSLP": 0.0211, "IELV": 210.06, "OELV": 152.87, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26262131, 31.04891841 ], [ 115.26302758, 31.04942838 ], [ 115.26343814, 31.04980323 ], [ 115.2639239, 31.05014588 ], [ 115.26437784, 31.05032602 ], [ 115.26485232, 31.05038193 ], [ 115.26539613, 31.05021285 ], [ 115.26581917, 31.05015584 ], [ 115.26622932, 31.05018593 ], [ 115.26642462, 31.0502865 ], [ 115.2665384, 31.05045174 ], [ 115.26655796, 31.05070395 ], [ 115.26620321, 31.05176157 ], [ 115.26619351, 31.05202454 ], [ 115.26636793, 31.05233567 ], [ 115.266782, 31.05257021 ], [ 115.26736155, 31.0525542 ], [ 115.26833969, 31.05214803 ], [ 115.2699339, 31.05176555 ], [ 115.27017019, 31.05159023 ], [ 115.27049256, 31.05096017 ], [ 115.27086874, 31.05072595 ], [ 115.27122802, 31.05082154 ], [ 115.27233025, 31.05164415 ], [ 115.2730982, 31.05191445 ], [ 115.27377013, 31.05188594 ], [ 115.275687, 31.05140795 ], [ 115.2760188, 31.05138837 ], [ 115.27633648, 31.05145695 ], [ 115.27675006, 31.0517362 ], [ 115.2770515, 31.05210367 ], [ 115.27731574, 31.05271169 ], [ 115.2774793, 31.05332 ], [ 115.27792363, 31.05433773 ], [ 115.27806544, 31.05487801 ], [ 115.27856802, 31.05601928 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122X00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9900121X00000", "TRVCD": "AFA9900123X00000", "INDCD": "QFA9900121X00000", "ONDCD": "QFA9900122X00000", "BWSCD": "WFA9900122X00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19680338, 30.91821331 ], [ 115.19679427, 30.91769923 ], [ 115.19703203, 30.91746092 ] ], [ [ 115.19680338, 30.91821331 ], [ 115.19596049, 30.9185896 ], [ 115.1955283, 30.91868457 ], [ 115.19519165, 30.91888533 ], [ 115.19485792, 30.91884648 ], [ 115.1944662, 30.91857185 ], [ 115.19414997, 30.91816813 ], [ 115.1940454, 30.91784681 ], [ 115.19417779, 30.91752049 ], [ 115.19413201, 30.91734977 ], [ 115.19375805, 30.91709909 ], [ 115.19346675, 30.91679758 ], [ 115.19295213, 30.91647522 ], [ 115.19269726, 30.91608448 ], [ 115.19254642, 30.91597587 ], [ 115.19237428, 30.91602775 ], [ 115.19226955, 30.91624168 ], [ 115.19236399, 30.91688206 ], [ 115.19231587, 30.9169844 ], [ 115.19220375, 30.91693412 ], [ 115.19199811, 30.91666232 ], [ 115.19184655, 30.91660006 ], [ 115.191726, 30.91666317 ], [ 115.19155154, 30.91696218 ], [ 115.19134826, 30.91706931 ], [ 115.19106046, 30.91705423 ], [ 115.19058231, 30.91689311 ], [ 115.19040292, 30.91691846 ], [ 115.19027574, 30.91713799 ], [ 115.19039007, 30.91739847 ], [ 115.19132199, 30.91772233 ], [ 115.19155778, 30.91792425 ], [ 115.19153026, 30.91811239 ], [ 115.19107787, 30.91887431 ], [ 115.19107879, 30.91905407 ], [ 115.19114847, 30.91917214 ], [ 115.19137994, 30.9191376 ], [ 115.19164724, 30.91894363 ], [ 115.1920332, 30.91852367 ], [ 115.19238417, 30.91838232 ], [ 115.19251834, 30.91845371 ], [ 115.19254983, 30.91856385 ], [ 115.19215832, 30.918988 ], [ 115.19212593, 30.91932757 ], [ 115.19200436, 30.91965602 ], [ 115.19206444, 30.91981811 ], [ 115.19222286, 30.91989026 ], [ 115.19239585, 30.91986634 ], [ 115.19298434, 30.91944574 ], [ 115.19334363, 30.91926851 ], [ 115.19353763, 30.91932013 ], [ 115.19368399, 30.91950778 ], [ 115.19367016, 30.91965023 ], [ 115.19312623, 30.9199884 ], [ 115.19283192, 30.92025701 ], [ 115.19214781, 30.92049392 ], [ 115.19202017, 30.92074953 ], [ 115.19207325, 30.92096372 ], [ 115.19218622, 30.92110361 ], [ 115.19270587, 30.92107075 ], [ 115.19288613, 30.92119553 ], [ 115.19287506, 30.9218861 ], [ 115.19262416, 30.92211009 ], [ 115.19257372, 30.92222921 ], [ 115.19273772, 30.92260241 ], [ 115.19271196, 30.92293154 ], [ 115.19331979, 30.92404327 ], [ 115.19356755, 30.92433613 ], [ 115.19358044, 30.9244925 ], [ 115.19330189, 30.92465085 ], [ 115.19277586, 30.92470783 ], [ 115.19245073, 30.92457601 ], [ 115.19150191, 30.92397994 ], [ 115.19051361, 30.92403865 ], [ 115.1903898, 30.92409011 ], [ 115.19006669, 30.9244361 ], [ 115.18913773, 30.92501183 ], [ 115.18887247, 30.92507107 ], [ 115.18855793, 30.92494587 ], [ 115.18646204, 30.92354174 ], [ 115.18635163, 30.92354388 ], [ 115.18614568, 30.92374249 ], [ 115.18617004, 30.92382384 ], [ 115.18628804, 30.92387576 ] ], [ [ 115.18628804, 30.92387576 ], [ 115.18741824, 30.92446673 ], [ 115.18843546, 30.92525016 ], [ 115.1889645, 30.92549617 ], [ 115.18933171, 30.9254745 ], [ 115.1897797, 30.92511809 ], [ 115.1901242, 30.92495367 ], [ 115.19073993, 30.92484422 ], [ 115.19110556, 30.92494598 ], [ 115.1915597, 30.92543587 ], [ 115.19256398, 30.9259441 ], [ 115.19275817, 30.92592968 ], [ 115.1936639, 30.92553212 ], [ 115.19384267, 30.92552405 ], [ 115.19400897, 30.92560786 ], [ 115.19417378, 30.92602671 ], [ 115.19404554, 30.92640042 ], [ 115.19422605, 30.9268438 ], [ 115.19454607, 30.92712602 ], [ 115.19459818, 30.92731609 ], [ 115.19439989, 30.92741803 ], [ 115.19341372, 30.92736357 ], [ 115.19320852, 30.92742949 ], [ 115.19316227, 30.92758953 ], [ 115.19326055, 30.92785382 ], [ 115.19364223, 30.92802053 ], [ 115.19374353, 30.9281498 ], [ 115.19366866, 30.92831821 ], [ 115.19332821, 30.92867467 ], [ 115.19333164, 30.92882396 ], [ 115.19358974, 30.92917409 ], [ 115.19380722, 30.92926659 ], [ 115.19445348, 30.92873049 ], [ 115.19467442, 30.92862352 ], [ 115.19483947, 30.92861975 ], [ 115.1957457, 30.92907113 ], [ 115.1959941, 30.92933167 ], [ 115.19636962, 30.929416 ], [ 115.19655406, 30.92971763 ], [ 115.19687883, 30.92992646 ], [ 115.19704395, 30.93036444 ], [ 115.19751369, 30.93083815 ], [ 115.19762023, 30.93143154 ], [ 115.19793756, 30.93197357 ], [ 115.19795376, 30.93240326 ], [ 115.19851595, 30.93328725 ], [ 115.19867923, 30.93392785 ], [ 115.19862389, 30.93434834 ], [ 115.19883491, 30.93476173 ], [ 115.1988049, 30.93491036 ], [ 115.19861365, 30.93507616 ], [ 115.19836795, 30.93516161 ], [ 115.19797554, 30.93518642 ], [ 115.19788748, 30.93525343 ], [ 115.19787513, 30.93535414 ], [ 115.19855613, 30.93593025 ], [ 115.19875795, 30.93620842 ], [ 115.1989616, 30.93691392 ], [ 115.1995658, 30.93842176 ], [ 115.20018596, 30.93910811 ], [ 115.20036247, 30.93914391 ], [ 115.20056602, 30.93907556 ], [ 115.20066876, 30.93898049 ], [ 115.20073378, 30.93873754 ], [ 115.20061925, 30.93781197 ], [ 115.2007684, 30.93617042 ], [ 115.20043603, 30.93507339 ], [ 115.20004718, 30.93446217 ], [ 115.19974027, 30.93378439 ], [ 115.19965355, 30.93303184 ], [ 115.19947641, 30.93237231 ], [ 115.19953566, 30.932293 ], [ 115.19967858, 30.93229175 ], [ 115.2003395, 30.9325525 ], [ 115.20058229, 30.93258196 ], [ 115.20087426, 30.93242253 ], [ 115.20096813, 30.93217846 ], [ 115.20035002, 30.9318576 ], [ 115.19983749, 30.93116016 ], [ 115.19866833, 30.93018425 ], [ 115.19848215, 30.92971401 ], [ 115.19818162, 30.92935004 ], [ 115.19778171, 30.92899811 ], [ 115.19708013, 30.92855803 ], [ 115.19696579, 30.9282178 ], [ 115.19628105, 30.92808721 ], [ 115.19576563, 30.92755607 ], [ 115.19565014, 30.92719213 ], [ 115.19593207, 30.92700919 ], [ 115.19598001, 30.92684673 ], [ 115.19571186, 30.92650597 ], [ 115.19566646, 30.92618762 ], [ 115.19544862, 30.92597039 ], [ 115.19542422, 30.92582627 ], [ 115.1956283, 30.92533635 ], [ 115.19611983, 30.9249355 ], [ 115.1960259, 30.92420131 ], [ 115.19584415, 30.92390577 ], [ 115.19502483, 30.92339367 ], [ 115.19485159, 30.92314043 ], [ 115.19487446, 30.92290398 ], [ 115.19496397, 30.92280468 ], [ 115.19563869, 30.922966 ], [ 115.19586811, 30.92289171 ], [ 115.19597409, 30.92272976 ], [ 115.19585039, 30.92237801 ], [ 115.19523389, 30.92172551 ], [ 115.19524354, 30.92154777 ], [ 115.1954983, 30.92116626 ], [ 115.19520089, 30.92075231 ], [ 115.19517434, 30.92045752 ], [ 115.19528731, 30.92038969 ], [ 115.19545931, 30.92039952 ], [ 115.19650244, 30.92067934 ], [ 115.19692444, 30.92059977 ], [ 115.19702091, 30.92047761 ], [ 115.19695985, 30.92017426 ], [ 115.19700199, 30.92002534 ], [ 115.19732988, 30.91973986 ], [ 115.1975423, 30.91940174 ], [ 115.19791019, 30.91906009 ], [ 115.19789716, 30.91876998 ], [ 115.1976757, 30.91833018 ], [ 115.19739575, 30.9182277 ], [ 115.19680338, 30.91821331 ] ], [ [ 115.18580027, 30.92389071 ], [ 115.18628804, 30.92387576 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900125J00000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA9900124JC0000,AFA9900124J00000", "TRVCD": "AFA9900126J00000", "INDCD": "QFA9900124J00000", "ONDCD": "QFA9900125J00000", "BWSCD": "WFA9900125J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 5731.0, "RVSLP": 0.0034, "IELV": 119.84, "OELV": 100.04, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4636447, 31.13481206 ], [ 115.46260318, 31.13456358 ], [ 115.4603862, 31.13369301 ], [ 115.45925757, 31.13299635 ], [ 115.45836151, 31.13208544 ], [ 115.45778776, 31.13120159 ], [ 115.45768405, 31.13085705 ], [ 115.45766222, 31.13005205 ], [ 115.45785695, 31.12919811 ], [ 115.45780031, 31.12839362 ], [ 115.45748857, 31.12780647 ], [ 115.4571297, 31.12745763 ], [ 115.45669628, 31.12720641 ], [ 115.45561345, 31.12706497 ], [ 115.45509348, 31.12681144 ], [ 115.45454194, 31.12664725 ], [ 115.45375017, 31.12617397 ], [ 115.45319239, 31.12603052 ], [ 115.45227166, 31.12567705 ], [ 115.45094566, 31.12474174 ], [ 115.44972355, 31.12425693 ], [ 115.44905894, 31.12417223 ], [ 115.44778446, 31.12384846 ], [ 115.44685669, 31.12377195 ], [ 115.44486596, 31.12325989 ], [ 115.44375752, 31.12320692 ], [ 115.44214219, 31.12289535 ], [ 115.44130014, 31.1230031 ], [ 115.44059005, 31.12259157 ], [ 115.44028494, 31.12249972 ], [ 115.43997224, 31.12254187 ], [ 115.43940818, 31.12285297 ], [ 115.43909235, 31.12290418 ], [ 115.43774003, 31.12257779 ], [ 115.4368938, 31.12250817 ], [ 115.43633203, 31.1223699 ], [ 115.43573765, 31.12237988 ], [ 115.435497, 31.12244138 ], [ 115.43522251, 31.12261724 ], [ 115.43461292, 31.12332752 ], [ 115.43435986, 31.12349262 ], [ 115.43377795, 31.12357158 ], [ 115.43282097, 31.12356827 ], [ 115.43204541, 31.12329426 ], [ 115.43106229, 31.12261925 ], [ 115.43024585, 31.12247249 ], [ 115.42962648, 31.1222581 ], [ 115.42902609, 31.12198643 ], [ 115.42804686, 31.1213015 ], [ 115.42750974, 31.12109905 ], [ 115.42717817, 31.12105813 ], [ 115.4240423, 31.12117623 ], [ 115.42259156, 31.12170587 ], [ 115.42126404, 31.12230611 ], [ 115.42048722, 31.12255237 ], [ 115.41879229, 31.12293423 ], [ 115.41755768, 31.12334154 ], [ 115.4160874, 31.12342503 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121AA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122A00000", "INDCD": "-1", "ONDCD": "QFA9800121A00000", "BWSCD": "WFA9800121AA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4224.0, "RVSLP": 0.0132, "IELV": 234.6, "OELV": 170.49, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1872347, 31.53808352 ], [ 115.18665369, 31.53849987 ], [ 115.18612413, 31.53854977 ], [ 115.18270963, 31.53759977 ], [ 115.18220313, 31.53756029 ], [ 115.1817017, 31.53763028 ], [ 115.18065561, 31.53810644 ], [ 115.18025234, 31.53848714 ], [ 115.18016036, 31.53890164 ], [ 115.1801904, 31.54039361 ], [ 115.1800258, 31.54072246 ], [ 115.17971595, 31.5409781 ], [ 115.17902662, 31.54125226 ], [ 115.17816248, 31.5412793 ], [ 115.17776625, 31.54115847 ], [ 115.17712182, 31.5407482 ], [ 115.17672965, 31.54069515 ], [ 115.17636399, 31.5408542 ], [ 115.17564303, 31.54145725 ], [ 115.17526414, 31.54158013 ], [ 115.17480026, 31.54144968 ], [ 115.17401941, 31.54088256 ], [ 115.17393014, 31.54065117 ], [ 115.17378361, 31.53965776 ], [ 115.17339183, 31.53923874 ], [ 115.17295008, 31.5390038 ], [ 115.17205986, 31.53879393 ], [ 115.17084053, 31.53881334 ], [ 115.17042927, 31.5388977 ], [ 115.16970164, 31.53926503 ], [ 115.16875442, 31.53937352 ], [ 115.16821831, 31.53950627 ], [ 115.16795398, 31.53942128 ], [ 115.16783086, 31.5392586 ], [ 115.16776586, 31.53899177 ], [ 115.16773188, 31.53786793 ], [ 115.1681237, 31.53602322 ], [ 115.16813824, 31.53514639 ], [ 115.16820928, 31.53479794 ], [ 115.16845365, 31.53433954 ], [ 115.16925904, 31.53335437 ], [ 115.17016175, 31.53246144 ], [ 115.17101839, 31.53141294 ], [ 115.1715644, 31.53065717 ], [ 115.17205237, 31.52967006 ], [ 115.17204675, 31.52925991 ], [ 115.17179983, 31.52849359 ], [ 115.17168638, 31.52685456 ], [ 115.1715263, 31.52652795 ], [ 115.17115432, 31.52618955 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121B00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122B00000", "INDCD": "-1", "ONDCD": "QFA9800121B00000", "BWSCD": "WFA9800121B00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4441.0, "RVSLP": 0.0064, "IELV": 197.23, "OELV": 167.16, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18439039, 31.50393594 ], [ 115.18330768, 31.50306218 ], [ 115.1827925, 31.50247204 ], [ 115.18145167, 31.50137363 ], [ 115.18067227, 31.50057996 ], [ 115.17963475, 31.50006985 ], [ 115.17797797, 31.50007548 ], [ 115.17757418, 31.49999416 ], [ 115.17720792, 31.49968654 ], [ 115.17697043, 31.49902408 ], [ 115.17670595, 31.49871405 ], [ 115.17629163, 31.49842128 ], [ 115.17534015, 31.49797839 ], [ 115.17519442, 31.49774205 ], [ 115.17506827, 31.49711833 ], [ 115.17477015, 31.496376 ], [ 115.17447734, 31.4957061 ], [ 115.1741518, 31.49519422 ], [ 115.17377842, 31.49485514 ], [ 115.17342066, 31.494634 ], [ 115.17287528, 31.49444037 ], [ 115.17212833, 31.49433018 ], [ 115.17171976, 31.49406553 ], [ 115.17137807, 31.49356771 ], [ 115.17091759, 31.49266242 ], [ 115.16942043, 31.49091783 ], [ 115.16854991, 31.48974046 ], [ 115.16845013, 31.48932847 ], [ 115.16845325, 31.4886688 ], [ 115.16854215, 31.48839622 ], [ 115.16883303, 31.48792839 ], [ 115.16884257, 31.48761259 ], [ 115.16824459, 31.48682195 ], [ 115.16764648, 31.4862337 ], [ 115.16737764, 31.48573223 ], [ 115.16703731, 31.48528208 ], [ 115.16693572, 31.48479832 ], [ 115.16685078, 31.48315394 ], [ 115.16677408, 31.48288562 ], [ 115.16663634, 31.48268834 ], [ 115.16562858, 31.48149502 ], [ 115.16502668, 31.48091235 ], [ 115.16423637, 31.47973044 ], [ 115.1635241, 31.47912374 ], [ 115.16314804, 31.47894777 ], [ 115.16149625, 31.47869108 ], [ 115.16095224, 31.47850596 ], [ 115.15982192, 31.4777485 ], [ 115.15868893, 31.47710236 ], [ 115.15842061, 31.47702018 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JA0000", "RVNM": null, "GB": "210501", "FRVCD": "-1", "TRVCD": "AFA9800122JA0000", "INDCD": "-1", "ONDCD": "QFA9800121JA0000", "BWSCD": "WFA9800121JA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9442472, 31.46411173 ], [ 114.94440747, 31.46409203 ], [ 114.94461865, 31.46390196 ], [ 114.94464172, 31.46364803 ] ], [ [ 114.9442472, 31.46411173 ], [ 114.94318229, 31.46369276 ], [ 114.94277586, 31.46365262 ], [ 114.94206281, 31.46369296 ], [ 114.94142069, 31.46343944 ], [ 114.94116641, 31.46344873 ], [ 114.94109085, 31.46356967 ], [ 114.94128072, 31.46400735 ], [ 114.94131359, 31.46426204 ], [ 114.94114615, 31.46457835 ], [ 114.9408219, 31.46486283 ], [ 114.94062379, 31.46492973 ], [ 114.94043385, 31.46490564 ], [ 114.93978982, 31.46427794 ], [ 114.93956599, 31.46424512 ], [ 114.93976579, 31.46519402 ], [ 114.93965513, 31.46558037 ], [ 114.93939417, 31.46608297 ], [ 114.93852565, 31.46724712 ], [ 114.9376546, 31.46785528 ], [ 114.93705269, 31.46839602 ], [ 114.93663631, 31.4685359 ], [ 114.93566347, 31.46836172 ], [ 114.93503312, 31.46832423 ], [ 114.93424918, 31.46844246 ], [ 114.93402246, 31.46853013 ], [ 114.93392787, 31.4687156 ], [ 114.93398387, 31.46948039 ], [ 114.9336747, 31.47069437 ], [ 114.93343048, 31.47128473 ], [ 114.93282938, 31.47226891 ], [ 114.93277769, 31.47347684 ], [ 114.93246551, 31.47381411 ], [ 114.93137211, 31.47429919 ], [ 114.9312827, 31.47445216 ], [ 114.93125377, 31.47469525 ], [ 114.93138625, 31.47507237 ], [ 114.93170975, 31.47529997 ], [ 114.93210958, 31.47525515 ], [ 114.93314774, 31.47456029 ], [ 114.93366877, 31.47403415 ], [ 114.93386594, 31.47372772 ], [ 114.93429506, 31.47265061 ], [ 114.93481406, 31.47205685 ], [ 114.9356381, 31.47083009 ], [ 114.93572411, 31.47039781 ], [ 114.93559759, 31.46968447 ], [ 114.93647872, 31.47000684 ], [ 114.93758643, 31.47010993 ], [ 114.93807995, 31.47061225 ], [ 114.93830819, 31.47067037 ], [ 114.93843242, 31.47052773 ], [ 114.93859385, 31.4699378 ], [ 114.93925223, 31.46921153 ], [ 114.93959399, 31.46863313 ], [ 114.93977029, 31.4685423 ], [ 114.94001652, 31.4687304 ], [ 114.94020046, 31.46905466 ], [ 114.94034559, 31.47004523 ], [ 114.94047442, 31.47040681 ], [ 114.94080765, 31.47081857 ], [ 114.94148251, 31.47136602 ], [ 114.94177574, 31.47208347 ], [ 114.94181082, 31.4724659 ], [ 114.94174238, 31.47282168 ], [ 114.94118383, 31.47377014 ], [ 114.9410428, 31.47418828 ], [ 114.94100704, 31.4745216 ], [ 114.94108515, 31.47476964 ], [ 114.94138384, 31.47513166 ], [ 114.94155217, 31.47550578 ], [ 114.94166239, 31.4760136 ], [ 114.94169589, 31.47671231 ], [ 114.94180978, 31.47710169 ], [ 114.94197359, 31.47729368 ], [ 114.94220197, 31.47726765 ], [ 114.94228097, 31.4770781 ], [ 114.94219639, 31.47612202 ], [ 114.94239047, 31.47478203 ], [ 114.94272355, 31.47414029 ], [ 114.94348306, 31.47306208 ], [ 114.94361184, 31.4726803 ], [ 114.94354432, 31.47243734 ], [ 114.94286893, 31.47129337 ], [ 114.94263906, 31.47108035 ], [ 114.94223563, 31.47092417 ], [ 114.94210212, 31.47071626 ], [ 114.942138, 31.47035963 ], [ 114.94262029, 31.46958017 ], [ 114.94278383, 31.46892572 ], [ 114.94276219, 31.46848361 ], [ 114.94254206, 31.46791212 ], [ 114.94243851, 31.46708195 ], [ 114.94250631, 31.46693647 ], [ 114.94305071, 31.46656005 ], [ 114.94339236, 31.46611383 ], [ 114.94389718, 31.46509919 ], [ 114.9442472, 31.46411173 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800124P00000", "INDCD": "-1", "ONDCD": "QFA9800121PB0000", "BWSCD": "WFA9800121PB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2489.0, "RVSLP": 0.0124, "IELV": 199.06, "OELV": 149.57, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2674997, 31.38517422 ], [ 115.26724557, 31.38505917 ], [ 115.26654357, 31.38494845 ], [ 115.26624375, 31.384812 ], [ 115.26530976, 31.38406192 ], [ 115.26491443, 31.38358962 ], [ 115.26416017, 31.38290645 ], [ 115.2636232, 31.38224788 ], [ 115.26289026, 31.38201571 ], [ 115.26209258, 31.38186853 ], [ 115.26160045, 31.38144681 ], [ 115.26096373, 31.38118378 ], [ 115.26051562, 31.38057002 ], [ 115.25944354, 31.37999382 ], [ 115.25925152, 31.37979606 ], [ 115.25924187, 31.37956 ], [ 115.25940718, 31.37902359 ], [ 115.25981914, 31.37806478 ], [ 115.25986754, 31.3772708 ], [ 115.2599862, 31.37679176 ], [ 115.25994846, 31.37605333 ], [ 115.25985039, 31.37587923 ], [ 115.25961002, 31.37568318 ], [ 115.25898152, 31.37548803 ], [ 115.25862825, 31.3752764 ], [ 115.25827398, 31.37480086 ], [ 115.25820497, 31.37454622 ], [ 115.25877628, 31.37327782 ], [ 115.25895413, 31.37260083 ], [ 115.25963183, 31.37186204 ], [ 115.25977223, 31.37160351 ], [ 115.25971022, 31.37122272 ], [ 115.2590739, 31.37049519 ], [ 115.25896761, 31.3699276 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QC0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122QC0000", "INDCD": "-1", "ONDCD": "QFA9800121QC0000", "BWSCD": "WFA9800121QC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5121.0, "RVSLP": 0.0271, "IELV": 271.77, "OELV": 146.86, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21335428, 31.05665249 ], [ 115.21314559, 31.0562805 ], [ 115.21296628, 31.05534421 ], [ 115.21201334, 31.05374554 ], [ 115.21213231, 31.0528577 ], [ 115.21203848, 31.05199394 ], [ 115.21173846, 31.05133027 ], [ 115.21132588, 31.05083012 ], [ 115.21079822, 31.05001484 ], [ 115.21048438, 31.04927993 ], [ 115.21045869, 31.04895417 ], [ 115.21061126, 31.04831951 ], [ 115.21059444, 31.04781159 ], [ 115.21036437, 31.04711223 ], [ 115.21024377, 31.0463295 ], [ 115.21010796, 31.04606715 ], [ 115.20923297, 31.04512827 ], [ 115.20843399, 31.04447432 ], [ 115.20646442, 31.04342157 ], [ 115.20606725, 31.04340971 ], [ 115.20527212, 31.04361072 ], [ 115.20459006, 31.04360937 ], [ 115.20420699, 31.04345911 ], [ 115.20344209, 31.04290836 ], [ 115.20313847, 31.04281636 ], [ 115.20275583, 31.04289553 ], [ 115.2021563, 31.04333447 ], [ 115.20186834, 31.04342546 ], [ 115.20100165, 31.04325486 ], [ 115.20006058, 31.04296577 ], [ 115.19981413, 31.04275972 ], [ 115.1996741, 31.04250435 ], [ 115.19955219, 31.04187246 ], [ 115.19936803, 31.04137955 ], [ 115.19925696, 31.04059168 ], [ 115.1990712, 31.04009888 ], [ 115.19891211, 31.0393297 ], [ 115.19859423, 31.03880725 ], [ 115.19827949, 31.03855645 ], [ 115.19806223, 31.03849125 ], [ 115.19784228, 31.03853446 ], [ 115.1972916, 31.03901888 ], [ 115.19697602, 31.039918 ], [ 115.19703725, 31.04048904 ], [ 115.19694618, 31.04062948 ], [ 115.19675762, 31.04071039 ], [ 115.19618635, 31.04070363 ], [ 115.19545159, 31.04051386 ], [ 115.19510014, 31.04031964 ], [ 115.19495626, 31.04015232 ], [ 115.19491408, 31.03997615 ], [ 115.19526309, 31.03925184 ], [ 115.19526844, 31.03897771 ], [ 115.1951763, 31.03871167 ], [ 115.19489143, 31.03840729 ], [ 115.19433382, 31.0380004 ], [ 115.19409974, 31.03790952 ], [ 115.19367605, 31.03787842 ], [ 115.19310557, 31.038 ], [ 115.19259971, 31.03842873 ], [ 115.19181438, 31.03978844 ], [ 115.19104107, 31.04044486 ], [ 115.19086175, 31.04132798 ], [ 115.19068236, 31.0415815 ], [ 115.1904229, 31.04176189 ], [ 115.18984096, 31.04185329 ], [ 115.18792625, 31.04186405 ], [ 115.18671411, 31.04161579 ], [ 115.18595447, 31.04106011 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121VC0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800127V00000", "INDCD": "-1", "ONDCD": "QFA9800126V00000", "BWSCD": "WFA9800121VC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1687.0, "RVSLP": 0.0015, "IELV": 27.35, "OELV": 24.97, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PK0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PK0000", "TRVCD": "AFA9800123PK0000", "INDCD": "QFA9800121PK0000", "ONDCD": "QFA9800122PK0000", "BWSCD": "WFA9800122PK0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 6173.0, "RVSLP": 0.0076, "IELV": 129.7, "OELV": 76.99, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17846947, 31.11543039 ], [ 115.17837599, 31.11564042 ], [ 115.17778403, 31.11639042 ], [ 115.17773446, 31.11666358 ], [ 115.17777433, 31.11708833 ], [ 115.1780925, 31.1176691 ], [ 115.17880132, 31.11837776 ], [ 115.17961124, 31.11963853 ], [ 115.17971192, 31.11998215 ], [ 115.17969994, 31.12047615 ], [ 115.1792117, 31.12191232 ], [ 115.17886332, 31.12266393 ], [ 115.17873814, 31.12327497 ], [ 115.17840325, 31.12403221 ], [ 115.17824215, 31.12493404 ], [ 115.17692836, 31.12677165 ], [ 115.17608714, 31.12832043 ], [ 115.17566946, 31.12889655 ], [ 115.17546354, 31.12929716 ], [ 115.17526037, 31.12990822 ], [ 115.17522015, 31.13039157 ], [ 115.17545631, 31.13108412 ], [ 115.17550152, 31.13196009 ], [ 115.1753323, 31.13259797 ], [ 115.17524807, 31.1332998 ], [ 115.17465047, 31.13480335 ], [ 115.17464497, 31.13621815 ], [ 115.17451048, 31.1365856 ], [ 115.17435029, 31.13666387 ], [ 115.17415026, 31.13658387 ], [ 115.17350972, 31.13596777 ], [ 115.17319385, 31.13539181 ], [ 115.17289268, 31.1351238 ], [ 115.17116809, 31.13458806 ], [ 115.17031026, 31.13462641 ], [ 115.16987246, 31.13484653 ], [ 115.16921623, 31.135498 ], [ 115.16823736, 31.13703555 ], [ 115.16793158, 31.13729007 ], [ 115.16762673, 31.13737155 ], [ 115.16658181, 31.1371556 ], [ 115.16597353, 31.13690639 ], [ 115.16564719, 31.13665407 ], [ 115.16448026, 31.13537364 ], [ 115.16383427, 31.13509845 ], [ 115.16264764, 31.13532766 ], [ 115.16071153, 31.13597165 ], [ 115.16038234, 31.13602962 ], [ 115.15978975, 31.13601372 ], [ 115.15869239, 31.13565473 ], [ 115.15808876, 31.13564042 ], [ 115.15766972, 31.13570161 ], [ 115.15732577, 31.13590645 ], [ 115.15708238, 31.13620673 ], [ 115.15667674, 31.13700403 ], [ 115.15650014, 31.13754434 ], [ 115.15601279, 31.13845898 ], [ 115.15450185, 31.13994197 ], [ 115.1537038, 31.14092966 ], [ 115.15186447, 31.14350418 ], [ 115.1513516, 31.14392821 ], [ 115.15067551, 31.14419394 ], [ 115.15029994, 31.14413955 ], [ 115.14978366, 31.14378997 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800125J00000,AFA9800121JD0000", "TRVCD": "AFA9800127J00000", "INDCD": "QFA9800125J00000", "ONDCD": "QFA9800126J00000", "BWSCD": "WFA9800126J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 11554.0, "RVSLP": 0.0022, "IELV": 80.0, "OELV": 60.05, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98789409, 31.3537797 ], [ 114.98908762, 31.35265012 ], [ 114.98950449, 31.35240838 ], [ 114.98997241, 31.35244977 ], [ 114.99075751, 31.3529239 ], [ 114.99149388, 31.35304138 ], [ 114.99319841, 31.35352612 ], [ 114.99354989, 31.35339624 ], [ 114.99433236, 31.352764 ], [ 114.99495165, 31.35254633 ], [ 114.99558779, 31.35219766 ], [ 114.99582777, 31.35188887 ], [ 114.99617029, 31.35065723 ], [ 114.996552, 31.34999205 ], [ 114.99666377, 31.34944729 ], [ 114.99702166, 31.34840022 ], [ 114.99699413, 31.34754194 ], [ 114.99659437, 31.34675629 ], [ 114.99655585, 31.3465683 ], [ 114.99688336, 31.34569731 ], [ 114.996895, 31.34535421 ], [ 114.99680687, 31.34489812 ], [ 114.99688227, 31.34471964 ], [ 114.99721655, 31.34439171 ], [ 114.99750391, 31.34424161 ], [ 114.99854601, 31.34398011 ], [ 114.99964455, 31.34386124 ], [ 115.00031006, 31.34356448 ], [ 115.00238959, 31.34165948 ], [ 115.00297222, 31.34091801 ], [ 115.00396446, 31.33989151 ], [ 115.00420632, 31.33935988 ], [ 115.00426201, 31.33820057 ], [ 115.0045855, 31.33716997 ], [ 115.00442162, 31.33650611 ], [ 115.00438782, 31.33592847 ], [ 115.00476792, 31.33415178 ], [ 115.00474798, 31.3338901 ], [ 115.00447393, 31.33352436 ], [ 115.00398157, 31.33321696 ], [ 115.00356233, 31.33316849 ], [ 115.00217151, 31.33320574 ], [ 115.00193629, 31.33315774 ], [ 115.00168669, 31.33298362 ], [ 115.00112969, 31.33233437 ], [ 115.00089813, 31.33195241 ], [ 115.000815, 31.33168135 ], [ 115.00083454, 31.33126824 ], [ 115.00104961, 31.33064576 ], [ 115.00132397, 31.33026224 ], [ 115.00170788, 31.32994177 ], [ 115.00254616, 31.32942289 ], [ 115.00373399, 31.32890424 ], [ 115.00640926, 31.32876609 ], [ 115.00672171, 31.3286689 ], [ 115.00721009, 31.32838179 ], [ 115.00770164, 31.32828764 ], [ 115.0089976, 31.32826004 ], [ 115.00963781, 31.32840198 ], [ 115.01094038, 31.32856384 ], [ 115.01116577, 31.32852823 ], [ 115.011602, 31.32833426 ], [ 115.01211152, 31.32791011 ], [ 115.0125217, 31.32734838 ], [ 115.01326694, 31.32655422 ], [ 115.01377229, 31.32578186 ], [ 115.01395198, 31.32510842 ], [ 115.014452, 31.32455446 ], [ 115.01629238, 31.32289061 ], [ 115.01695417, 31.3225841 ], [ 115.01830384, 31.32223437 ], [ 115.01865617, 31.32203442 ], [ 115.02009613, 31.32069245 ], [ 115.02056573, 31.32007335 ], [ 115.02135003, 31.31929831 ], [ 115.02158576, 31.31897237 ], [ 115.02164863, 31.31862803 ], [ 115.02163774, 31.31803091 ], [ 115.02158211, 31.31744165 ], [ 115.02149005, 31.31716821 ], [ 115.02092766, 31.31628685 ], [ 115.01977631, 31.31505271 ], [ 115.01864369, 31.31352619 ], [ 115.01834811, 31.31300492 ], [ 115.01818213, 31.31240113 ], [ 115.01790153, 31.31173194 ], [ 115.01762675, 31.31128715 ], [ 115.01658238, 31.31017616 ], [ 115.01480629, 31.30869508 ], [ 115.01393009, 31.30753379 ], [ 115.01319806, 31.30642215 ], [ 115.01171619, 31.30468523 ], [ 115.0112039, 31.30386807 ], [ 115.0111045, 31.30352416 ], [ 115.01101531, 31.30218567 ], [ 115.01083704, 31.30138027 ], [ 115.01139032, 31.3001762 ], [ 115.01151775, 31.29933614 ], [ 115.01164327, 31.2991405 ], [ 115.01188715, 31.29893641 ], [ 115.01245256, 31.2988094 ], [ 115.01321822, 31.29884822 ], [ 115.0150832, 31.29969048 ], [ 115.0158562, 31.30019367 ], [ 115.0163857, 31.30040827 ], [ 115.01679443, 31.30047359 ], [ 115.01766074, 31.30045582 ], [ 115.01816422, 31.3003861 ], [ 115.01851837, 31.30018625 ], [ 115.01977575, 31.29901468 ], [ 115.02014951, 31.29843568 ], [ 115.02024144, 31.29802119 ], [ 115.02013194, 31.29762079 ], [ 115.0195876, 31.29695594 ], [ 115.01893571, 31.29631418 ], [ 115.01808176, 31.29492216 ], [ 115.01744521, 31.29277759 ], [ 115.01732755, 31.29054002 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012AP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800129P00000,AFA9800125PH0000", "TRVCD": "AFA980012BP00000", "INDCD": "QFA9800129P00000", "ONDCD": "QFA980012AP00000", "BWSCD": "WFA980012AP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 12.0, "RVLEN": 2332.0, "RVSLP": 0.0018, "IELV": 67.63, "OELV": 64.96, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13828067, 31.21715367 ], [ 115.13764788, 31.2166012 ], [ 115.13732994, 31.21601863 ], [ 115.13690403, 31.21561357 ], [ 115.13641463, 31.21527209 ], [ 115.13508508, 31.21458794 ], [ 115.13402908, 31.21371773 ], [ 115.13214444, 31.21144255 ], [ 115.13154401, 31.2108593 ], [ 115.13076373, 31.20990751 ], [ 115.13021588, 31.20938589 ], [ 115.12966406, 31.20872648 ], [ 115.12927781, 31.20792967 ], [ 115.12907591, 31.20725204 ], [ 115.12851158, 31.20636796 ], [ 115.12769486, 31.20562821 ], [ 115.12723467, 31.20509889 ], [ 115.12544655, 31.20360913 ], [ 115.12452233, 31.20238605 ], [ 115.12425795, 31.20187388 ], [ 115.12420392, 31.20158024 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012P000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012N000000,AFA9800121R00000", "TRVCD": "AFA980012Q000000", "INDCD": "QFA980012N000000", "ONDCD": "QFA980012P000000", "BWSCD": "WFA980012P000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 25.0, "RVLEN": 7810.0, "RVSLP": 0.0001, "IELV": 40.0, "OELV": 39.38, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95405538, 31.09283426 ], [ 114.95321175, 31.09288857 ], [ 114.95137798, 31.09336575 ], [ 114.94896438, 31.09341514 ], [ 114.94743926, 31.09309985 ], [ 114.94668222, 31.09305087 ], [ 114.94554604, 31.09285503 ], [ 114.94467752, 31.09262931 ], [ 114.94389849, 31.09214373 ], [ 114.9426574, 31.09149651 ], [ 114.94176028, 31.09085432 ], [ 114.94088114, 31.0904046 ], [ 114.9400921, 31.09019594 ], [ 114.93854756, 31.0901942 ], [ 114.93750434, 31.09043367 ], [ 114.93612177, 31.09049457 ], [ 114.93570633, 31.09044796 ], [ 114.93478236, 31.09012813 ], [ 114.93427318, 31.09009686 ], [ 114.93342492, 31.09017762 ], [ 114.93227655, 31.09078411 ], [ 114.93056986, 31.09112247 ], [ 114.92804924, 31.09120045 ], [ 114.92715839, 31.09103924 ], [ 114.92673196, 31.0910236 ], [ 114.92107745, 31.09121488 ], [ 114.92069618, 31.09135556 ], [ 114.91992229, 31.09200543 ], [ 114.91934433, 31.0923025 ], [ 114.91783089, 31.09248107 ], [ 114.91642531, 31.09330837 ], [ 114.91506535, 31.09363863 ], [ 114.9145578, 31.09363596 ], [ 114.91383385, 31.09347909 ], [ 114.91323057, 31.09347438 ], [ 114.91087732, 31.09355822 ], [ 114.90984284, 31.09376811 ], [ 114.9080703, 31.09342668 ], [ 114.90538022, 31.09346501 ], [ 114.90368211, 31.09290024 ], [ 114.90336197, 31.09293394 ], [ 114.90074769, 31.09359612 ], [ 114.9000306, 31.09346152 ], [ 114.89927059, 31.09340282 ], [ 114.89862789, 31.09325871 ], [ 114.89723956, 31.09328523 ], [ 114.89682673, 31.09335765 ], [ 114.89584745, 31.09374611 ], [ 114.89430434, 31.09386239 ], [ 114.89314605, 31.09424215 ], [ 114.89240981, 31.09439028 ], [ 114.88900013, 31.09549188 ], [ 114.88807969, 31.09562234 ], [ 114.88696049, 31.09590557 ], [ 114.88668356, 31.09607738 ], [ 114.8863284, 31.09642514 ], [ 114.88534819, 31.09795802 ], [ 114.88474225, 31.09851994 ], [ 114.88363331, 31.09902951 ], [ 114.88263909, 31.09919399 ], [ 114.88199435, 31.09954155 ], [ 114.88105392, 31.09961565 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012Q000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012P000000,AFA9820900000000", "TRVCD": "AFA980012R000000", "INDCD": "QFA980012P000000", "ONDCD": "QFA980012Q000000", "BWSCD": "WFA980012Q000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 26.0, "RVLEN": 1367.0, "RVSLP": 0.0011, "IELV": 39.38, "OELV": 38.33, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88105392, 31.09961565 ], [ 114.88032388, 31.09957998 ], [ 114.87917956, 31.0992813 ], [ 114.8785135, 31.09920007 ], [ 114.87771809, 31.09899558 ], [ 114.87685722, 31.09847855 ], [ 114.87632783, 31.09825818 ], [ 114.87496617, 31.09792987 ], [ 114.8738928, 31.09751802 ], [ 114.87339199, 31.09710827 ], [ 114.87265368, 31.09575778 ], [ 114.8720174, 31.09519036 ], [ 114.87153245, 31.09483442 ], [ 114.87063542, 31.09437212 ], [ 114.87032214, 31.09430234 ], [ 114.86980728, 31.09430158 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201G0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98202G0000000", "INDCD": "-1", "ONDCD": "QFA98201G0000000", "BWSCD": "WFA98201G0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4290.0, "RVSLP": 0.0043, "IELV": 90.51, "OELV": 70.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92534595, 31.31510421 ], [ 114.92494574, 31.31555 ], [ 114.92430834, 31.316691 ], [ 114.92401621, 31.31694192 ], [ 114.92357844, 31.31714173 ], [ 114.92316757, 31.31719639 ], [ 114.92185644, 31.31697555 ], [ 114.92061786, 31.31629222 ], [ 114.92036187, 31.31609228 ], [ 114.92017165, 31.31577584 ], [ 114.92001617, 31.31508418 ], [ 114.91963995, 31.31467925 ], [ 114.91928119, 31.31447223 ], [ 114.91865249, 31.31427527 ], [ 114.91774364, 31.31363778 ], [ 114.91685402, 31.31318791 ], [ 114.91654379, 31.31317045 ], [ 114.91628302, 31.31329594 ], [ 114.91585399, 31.3141976 ], [ 114.9155924, 31.31445202 ], [ 114.91527756, 31.31453616 ], [ 114.9147582, 31.31456794 ], [ 114.91434188, 31.314548 ], [ 114.91413756, 31.31447762 ], [ 114.91386524, 31.31417635 ], [ 114.91338049, 31.3134276 ], [ 114.91314439, 31.31319162 ], [ 114.91192402, 31.312217 ], [ 114.91112434, 31.31176826 ], [ 114.91064131, 31.31140847 ], [ 114.91007479, 31.31089564 ], [ 114.90945566, 31.31004259 ], [ 114.90919221, 31.30984834 ], [ 114.90866584, 31.30961924 ], [ 114.90804884, 31.30939626 ], [ 114.90717026, 31.3091819 ], [ 114.90683074, 31.30915596 ], [ 114.90561952, 31.30922028 ], [ 114.90448124, 31.30964524 ], [ 114.90401523, 31.30955785 ], [ 114.90286437, 31.30886798 ], [ 114.90176843, 31.30801577 ], [ 114.9012605, 31.30756355 ], [ 114.90072395, 31.30689512 ], [ 114.9005981, 31.30648659 ], [ 114.90051044, 31.30492389 ], [ 114.90025125, 31.30408608 ], [ 114.90017021, 31.30259613 ], [ 114.9000864, 31.30217792 ], [ 114.89977365, 31.30166351 ], [ 114.89860637, 31.30028643 ], [ 114.89740661, 31.29929706 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201HB000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98205H0000000", "INDCD": "-1", "ONDCD": "QFA98204H0000000", "BWSCD": "WFA98201HB000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3531.0, "RVSLP": 0.0008, "IELV": 60.0, "OELV": 49.88, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98372005, 31.16686663 ], [ 114.98310382, 31.16684535 ], [ 114.98237618, 31.16653153 ], [ 114.98108347, 31.16629809 ], [ 114.9783117, 31.16638594 ], [ 114.97780673, 31.166354 ], [ 114.97639634, 31.16571227 ], [ 114.97569212, 31.16525886 ], [ 114.97538406, 31.1651558 ], [ 114.97305007, 31.16520973 ], [ 114.97254623, 31.16526978 ], [ 114.97200432, 31.1654384 ], [ 114.970994, 31.16555394 ], [ 114.97017777, 31.16589794 ], [ 114.96986593, 31.16596386 ], [ 114.9683945, 31.16577223 ], [ 114.96771003, 31.16555977 ], [ 114.96743598, 31.16554974 ], [ 114.96653784, 31.16621196 ], [ 114.9659057, 31.16629172 ], [ 114.9651039, 31.16677996 ], [ 114.96478773, 31.16679991 ], [ 114.96407877, 31.16669182 ], [ 114.96337626, 31.16686995 ], [ 114.96226642, 31.16696354 ], [ 114.96196777, 31.16708754 ], [ 114.96125551, 31.1676796 ], [ 114.96096996, 31.16783389 ], [ 114.95977563, 31.16812447 ], [ 114.95935988, 31.16811174 ], [ 114.95888953, 31.16799777 ], [ 114.9585819, 31.16802136 ], [ 114.95833227, 31.16817992 ], [ 114.95795953, 31.16864131 ], [ 114.95763257, 31.16881571 ], [ 114.95741383, 31.16879216 ], [ 114.95690353, 31.16855009 ], [ 114.95665927, 31.16850194 ], [ 114.95588394, 31.16850777 ], [ 114.95510952, 31.16861368 ], [ 114.9543902, 31.16837002 ], [ 114.95407194, 31.16839823 ], [ 114.95337995, 31.16862557 ], [ 114.95266322, 31.16898579 ], [ 114.95238019, 31.16892224 ], [ 114.9519719, 31.16863472 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98204H0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98203H0000000", "TRVCD": "AFA98205H0000000", "INDCD": "QFA98203H0000000", "ONDCD": "QFA98204H0000000", "BWSCD": "WFA98204H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 1338.0, "RVSLP": -0.0007, "IELV": 49.3, "OELV": 49.88, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95702852, 31.17725444 ], [ 114.95663328, 31.17674001 ], [ 114.95655442, 31.17638958 ], [ 114.95676562, 31.17593803 ], [ 114.95715838, 31.17542048 ], [ 114.95760847, 31.17456977 ], [ 114.95765006, 31.17430393 ], [ 114.95757246, 31.17404543 ], [ 114.95703662, 31.17338189 ], [ 114.95672045, 31.17312018 ], [ 114.95574846, 31.17269099 ], [ 114.95496988, 31.17219649 ], [ 114.95388084, 31.17185086 ], [ 114.95328019, 31.171404 ], [ 114.95265459, 31.17060451 ], [ 114.9524646, 31.16978232 ], [ 114.95206741, 31.16901669 ], [ 114.9519719, 31.16863472 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121EA0000", "RVNM": "观音寺河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122E00000", "INDCD": "-1", "ONDCD": "QFA9900121E00000", "BWSCD": "WFA9900121EA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1349.0, "RVSLP": 0.0261, "IELV": 194.59, "OELV": 159.07, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34816358, 31.21781606 ], [ 115.34760052, 31.2180194 ], [ 115.34715833, 31.2180094 ], [ 115.34692233, 31.21782564 ], [ 115.34639828, 31.21712993 ], [ 115.34524828, 31.21655205 ], [ 115.34466152, 31.21591987 ], [ 115.34386855, 31.2152553 ], [ 115.3436796, 31.21500589 ], [ 115.34367, 31.21462608 ], [ 115.34395844, 31.21415596 ], [ 115.34401458, 31.2139601 ], [ 115.34399602, 31.21377787 ], [ 115.34388596, 31.21361425 ], [ 115.34361307, 31.21349865 ], [ 115.34267005, 31.21346985 ], [ 115.34236235, 31.2133685 ], [ 115.34145198, 31.21248276 ], [ 115.34065982, 31.2120335 ], [ 115.34023329, 31.21171394 ], [ 115.33986512, 31.2113341 ], [ 115.33976239, 31.21112418 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121H00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122H00000", "INDCD": "-1", "ONDCD": "QFA9900121H00000", "BWSCD": "WFA9900121H00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5648.0, "RVSLP": 0.0393, "IELV": 414.91, "OELV": 116.35, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27277373, 31.10715241 ], [ 115.27352792, 31.10771037 ], [ 115.27489315, 31.10825587 ], [ 115.27581271, 31.10876224 ], [ 115.27607338, 31.10907338 ], [ 115.27614447, 31.10955613 ], [ 115.2764882, 31.10984842 ], [ 115.27688769, 31.10992952 ], [ 115.27835006, 31.10994215 ], [ 115.27893627, 31.11019203 ], [ 115.27948565, 31.11066459 ], [ 115.28064423, 31.11076174 ], [ 115.28131587, 31.11106235 ], [ 115.28172228, 31.11110442 ], [ 115.28204326, 31.11104695 ], [ 115.28309725, 31.11063406 ], [ 115.2858611, 31.11050836 ], [ 115.2866493, 31.11029842 ], [ 115.28739982, 31.11019573 ], [ 115.28824832, 31.10992192 ], [ 115.28905927, 31.10956806 ], [ 115.29004668, 31.10940218 ], [ 115.29136838, 31.10880662 ], [ 115.29227661, 31.10866219 ], [ 115.29281746, 31.10849374 ], [ 115.29626732, 31.108328 ], [ 115.29766634, 31.10789141 ], [ 115.29858351, 31.10774039 ], [ 115.29891752, 31.10745971 ], [ 115.29893045, 31.10722794 ], [ 115.29871028, 31.10688892 ], [ 115.29809988, 31.10651793 ], [ 115.29790799, 31.10625893 ], [ 115.29817378, 31.10562776 ], [ 115.29825016, 31.10476766 ], [ 115.29844663, 31.10443288 ], [ 115.29893028, 31.10395237 ], [ 115.29932378, 31.10363425 ], [ 115.29962413, 31.1035117 ], [ 115.3002124, 31.10348202 ], [ 115.30100947, 31.10362504 ], [ 115.3017904, 31.10343658 ], [ 115.30315816, 31.10333579 ], [ 115.30575634, 31.10263872 ], [ 115.30684801, 31.10251392 ], [ 115.30884567, 31.10185039 ], [ 115.30967607, 31.1017303 ], [ 115.31038394, 31.10153426 ], [ 115.31140934, 31.10151839 ], [ 115.31241756, 31.10185207 ], [ 115.31299162, 31.10186309 ], [ 115.31321826, 31.10178192 ], [ 115.31354368, 31.10152849 ], [ 115.3142441, 31.10066435 ], [ 115.31444587, 31.1005396 ], [ 115.31467733, 31.10049164 ], [ 115.31498629, 31.10054759 ], [ 115.31535839, 31.10084904 ], [ 115.31569738, 31.10158963 ], [ 115.31586132, 31.10219976 ], [ 115.31608531, 31.10259364 ], [ 115.31640726, 31.10294952 ], [ 115.31715438, 31.1035397 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122L00000", "RVNM": "巴河", "GB": "210101", "FRVCD": "AFA9900121L00000", "TRVCD": "AFA990012E000000", "INDCD": "QFA9900121L00000", "ONDCD": "QFA990012D000000", "BWSCD": "WFA9900122L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 5329.0, "RVSLP": 0.0032, "IELV": 109.93, "OELV": 80.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30253606, 30.98666429 ], [ 115.30304339, 30.98663097 ], [ 115.30334612, 30.98653789 ], [ 115.30458996, 30.98552998 ], [ 115.30543605, 30.98525089 ], [ 115.30608748, 30.98512592 ], [ 115.30686962, 30.98470375 ], [ 115.30827179, 30.98334596 ], [ 115.30855226, 30.98274449 ], [ 115.30859404, 30.9819443 ], [ 115.30867451, 30.98166581 ], [ 115.30899223, 30.98129268 ], [ 115.30932006, 30.98108962 ], [ 115.30965901, 30.98114962 ], [ 115.31026083, 30.98173417 ], [ 115.31112557, 30.98221493 ], [ 115.31158048, 30.98239639 ], [ 115.31198012, 30.98247977 ], [ 115.31291396, 30.98250247 ], [ 115.31385572, 30.98275212 ], [ 115.31630423, 30.98464639 ], [ 115.31668331, 30.98478961 ], [ 115.31709232, 30.98477241 ], [ 115.32139378, 30.98252005 ], [ 115.32297848, 30.98111761 ], [ 115.32353239, 30.98076843 ], [ 115.32430402, 30.98012417 ], [ 115.32589107, 30.97912553 ], [ 115.32870614, 30.97789175 ], [ 115.32945396, 30.97771413 ], [ 115.32971175, 30.97782482 ], [ 115.32991849, 30.97804941 ], [ 115.33094402, 30.98043919 ], [ 115.33237627, 30.9830872 ], [ 115.3330727, 30.98402271 ], [ 115.33496973, 30.98696589 ], [ 115.33610385, 30.98785917 ], [ 115.33777955, 30.98874235 ], [ 115.33876556, 30.98912966 ], [ 115.33899969, 30.98917444 ], [ 115.33927, 30.98913575 ], [ 115.33954996, 30.98898416 ], [ 115.33984247, 30.98871973 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JC0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122JC0000", "INDCD": "-1", "ONDCD": "QFA9800121JC0000", "BWSCD": "WFA9800121JC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4302.0, "RVSLP": 0.0109, "IELV": 168.06, "OELV": 94.75, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00254971, 31.42266119 ], [ 115.00150168, 31.42140807 ], [ 115.00069952, 31.42076415 ], [ 114.99989109, 31.42024165 ], [ 114.99962521, 31.41980473 ], [ 114.99943191, 31.4189837 ], [ 114.99884616, 31.41816819 ], [ 114.99838392, 31.41725818 ], [ 114.99812386, 31.41696244 ], [ 114.99771961, 31.41665993 ], [ 114.99706277, 31.41630824 ], [ 114.99590391, 31.41541138 ], [ 114.99553556, 31.41522801 ], [ 114.99500755, 31.41511154 ], [ 114.99412597, 31.41544873 ], [ 114.99376209, 31.41539644 ], [ 114.99346581, 31.4151425 ], [ 114.99320009, 31.41463715 ], [ 114.99258573, 31.41396829 ], [ 114.99230161, 31.41325561 ], [ 114.99250591, 31.4122346 ], [ 114.99283315, 31.41163908 ], [ 114.99382597, 31.41061039 ], [ 114.99411559, 31.40957176 ], [ 114.99410591, 31.40915969 ], [ 114.9938672, 31.40839431 ], [ 114.99378433, 31.40705116 ], [ 114.99361952, 31.40664972 ], [ 114.99303588, 31.40618157 ], [ 114.99225774, 31.40592034 ], [ 114.99113594, 31.40596241 ], [ 114.9902345, 31.40628408 ], [ 114.99000041, 31.40625563 ], [ 114.9898373, 31.40591826 ], [ 114.98977447, 31.40479175 ], [ 114.9896897, 31.4044464 ], [ 114.98936573, 31.40408045 ], [ 114.98893953, 31.40382599 ], [ 114.98852182, 31.40377386 ], [ 114.98782754, 31.40380627 ], [ 114.9869479, 31.40403925 ], [ 114.98634793, 31.40409388 ], [ 114.98592792, 31.404063 ], [ 114.98557397, 31.40387936 ], [ 114.98536178, 31.40364223 ], [ 114.98516414, 31.40319388 ], [ 114.98466338, 31.4023642 ], [ 114.98393783, 31.40136166 ], [ 114.98386422, 31.4009422 ], [ 114.98387806, 31.40051009 ], [ 114.98426035, 31.39939233 ], [ 114.98429703, 31.3990519 ], [ 114.98413569, 31.39865567 ], [ 114.98375981, 31.39831627 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121P00000", "RVNM": "汪家河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122P00000", "INDCD": "-1", "ONDCD": "QFA9800121P00000", "BWSCD": "WFA9800121P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6418.0, "RVSLP": 0.0199, "IELV": 364.39, "OELV": 245.25, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36771427, 31.31313424 ], [ 115.36701418, 31.31375189 ], [ 115.36634359, 31.31404946 ], [ 115.36548765, 31.3140966 ], [ 115.36469308, 31.31394987 ], [ 115.36443093, 31.31401704 ], [ 115.36420426, 31.31433357 ], [ 115.36396441, 31.31493215 ], [ 115.36350366, 31.31541806 ], [ 115.36309401, 31.31569515 ], [ 115.36244518, 31.31584175 ], [ 115.36209018, 31.316039 ], [ 115.35975825, 31.31817979 ], [ 115.35911405, 31.31852167 ], [ 115.35842785, 31.31877643 ], [ 115.35714988, 31.3198897 ], [ 115.35596442, 31.32061474 ], [ 115.35435158, 31.32177811 ], [ 115.35343903, 31.32207414 ], [ 115.35329237, 31.32223416 ], [ 115.35292992, 31.32307494 ], [ 115.35242289, 31.32372024 ], [ 115.35178595, 31.32417643 ], [ 115.35078016, 31.32471374 ], [ 115.34863612, 31.32667408 ], [ 115.34826846, 31.32684236 ], [ 115.34689253, 31.32693246 ], [ 115.34651156, 31.32706858 ], [ 115.34498618, 31.32842252 ], [ 115.34346892, 31.32940306 ], [ 115.34285588, 31.32999196 ], [ 115.34244968, 31.33055435 ], [ 115.34209746, 31.33090627 ], [ 115.34075843, 31.33169695 ], [ 115.34033362, 31.33218438 ], [ 115.34015173, 31.33258846 ], [ 115.34014401, 31.33284633 ], [ 115.34021919, 31.33303838 ], [ 115.3405862, 31.33347488 ], [ 115.34112043, 31.33429955 ], [ 115.34118628, 31.3345638 ], [ 115.34112784, 31.3348189 ], [ 115.34093042, 31.3350332 ], [ 115.34074025, 31.33511579 ], [ 115.33984468, 31.33505052 ], [ 115.33906153, 31.33510601 ], [ 115.3388566, 31.33519565 ], [ 115.33872833, 31.33540162 ], [ 115.33886165, 31.33568406 ], [ 115.33919769, 31.33590392 ], [ 115.340013, 31.3361082 ], [ 115.34069203, 31.33619638 ], [ 115.34098015, 31.33632801 ], [ 115.34116956, 31.33658363 ], [ 115.34110422, 31.33674753 ], [ 115.34094556, 31.33689742 ], [ 115.34039577, 31.33706172 ], [ 115.33917249, 31.33707885 ], [ 115.33762341, 31.33652815 ], [ 115.33676157, 31.336346 ], [ 115.33657229, 31.33640404 ], [ 115.33644828, 31.33660239 ], [ 115.33660523, 31.33719992 ], [ 115.33657209, 31.33760071 ], [ 115.33638432, 31.33782491 ], [ 115.33589049, 31.33804939 ], [ 115.33468436, 31.33789632 ], [ 115.33342893, 31.33759982 ], [ 115.33230771, 31.33779227 ], [ 115.33161419, 31.33778171 ], [ 115.33097229, 31.33764741 ], [ 115.33061962, 31.33773423 ], [ 115.33049782, 31.33798794 ], [ 115.33084001, 31.3386001 ], [ 115.33075782, 31.33934351 ], [ 115.33099433, 31.34010213 ], [ 115.33107295, 31.34121735 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PK0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PK0000", "INDCD": "-1", "ONDCD": "QFA9800121PK0000", "BWSCD": "WFA9800121PK0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4851.0, "RVSLP": 0.0253, "IELV": 283.04, "OELV": 129.7, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19136571, 31.08663983 ], [ 115.19097196, 31.08669004 ], [ 115.19048391, 31.08686557 ], [ 115.18990772, 31.08721704 ], [ 115.18965299, 31.08784728 ], [ 115.18954198, 31.08846589 ], [ 115.18927181, 31.08900017 ], [ 115.18843168, 31.08983853 ], [ 115.18783978, 31.09031189 ], [ 115.18725306, 31.09053356 ], [ 115.18637151, 31.09040535 ], [ 115.18542456, 31.09045625 ], [ 115.18506578, 31.09063427 ], [ 115.18463192, 31.09114422 ], [ 115.18445622, 31.09126224 ], [ 115.18424324, 31.09128242 ], [ 115.18348981, 31.0910401 ], [ 115.18319017, 31.09103803 ], [ 115.18244411, 31.09152757 ], [ 115.18190583, 31.09172837 ], [ 115.18164196, 31.09191007 ], [ 115.18139563, 31.09228298 ], [ 115.18120553, 31.09283915 ], [ 115.18118202, 31.09318382 ], [ 115.18127764, 31.09352384 ], [ 115.18190232, 31.09454997 ], [ 115.18192407, 31.09479371 ], [ 115.18159988, 31.09522596 ], [ 115.1805636, 31.09612783 ], [ 115.17997406, 31.0964033 ], [ 115.17948024, 31.09645683 ], [ 115.178837, 31.09631839 ], [ 115.17799601, 31.09623658 ], [ 115.1771598, 31.09589111 ], [ 115.17638978, 31.09588682 ], [ 115.17527842, 31.09620598 ], [ 115.17501609, 31.09639045 ], [ 115.17482229, 31.09663767 ], [ 115.17457962, 31.09744772 ], [ 115.17478161, 31.09813038 ], [ 115.17481942, 31.09855577 ], [ 115.17464415, 31.09933358 ], [ 115.17463433, 31.10073039 ], [ 115.17445984, 31.10143868 ], [ 115.17453193, 31.10291843 ], [ 115.17506143, 31.10443421 ], [ 115.17521112, 31.10573988 ], [ 115.17566337, 31.10660284 ], [ 115.17612379, 31.10841171 ], [ 115.17659363, 31.10903721 ], [ 115.17686673, 31.10955995 ], [ 115.17705486, 31.11199647 ], [ 115.17770249, 31.11369365 ], [ 115.17799371, 31.11413385 ], [ 115.17856986, 31.11472629 ], [ 115.17860269, 31.11504193 ], [ 115.17846947, 31.11543039 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TI0000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012BT00000", "INDCD": "-1", "ONDCD": "QFA980012AT00000", "BWSCD": "WFA9800121TI0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5018.0, "RVSLP": 0.0001, "IELV": 30.69, "OELV": 30.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74104633, 30.99541191 ], [ 114.74121914, 30.99535593 ], [ 114.74140811, 30.99517393 ], [ 114.74183492, 30.99427601 ], [ 114.74228632, 30.99379792 ], [ 114.74264091, 30.99359808 ], [ 114.74376019, 30.99331961 ], [ 114.74433192, 30.99334954 ], [ 114.7451924, 30.99385863 ], [ 114.74696399, 30.99447019 ], [ 114.74725039, 30.99446414 ], [ 114.74750605, 30.99423559 ], [ 114.7478759, 30.99337582 ], [ 114.74831433, 30.99273794 ], [ 114.74906148, 30.99194612 ], [ 114.74919997, 30.99168504 ], [ 114.74917981, 30.99136551 ], [ 114.74899423, 30.99103414 ], [ 114.74827546, 30.99020114 ], [ 114.74829736, 30.98963824 ], [ 114.74810614, 30.98934848 ], [ 114.74784266, 30.98917024 ], [ 114.74657437, 30.98858361 ], [ 114.74508093, 30.98816161 ], [ 114.74365348, 30.98705149 ], [ 114.74343324, 30.98680858 ], [ 114.74334559, 30.98661143 ], [ 114.74327737, 30.98603111 ], [ 114.74326414, 30.98476225 ], [ 114.74365218, 30.9838037 ], [ 114.74370763, 30.98338417 ], [ 114.7436101, 30.98105509 ], [ 114.74347596, 30.98023796 ], [ 114.74387365, 30.97957424 ], [ 114.7444905, 30.97881513 ], [ 114.74513354, 30.97656161 ], [ 114.74597388, 30.97596796 ], [ 114.74677764, 30.97557235 ], [ 114.74809257, 30.97474238 ], [ 114.74889186, 30.97434435 ], [ 114.7515957, 30.97264554 ], [ 114.75502555, 30.97078187 ], [ 114.75571006, 30.97034357 ], [ 114.75592609, 30.97012995 ], [ 114.75629823, 30.96929735 ], [ 114.75650644, 30.96909512 ], [ 114.75769384, 30.96891837 ], [ 114.7582773, 30.96851992 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122B00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121B00000", "TRVCD": "AFA9800123B00000", "INDCD": "QFA9800121B00000", "ONDCD": "QFA9800122B00000", "BWSCD": "WFA9800122B00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15806723, 31.47680561 ], [ 115.15720147, 31.47620017 ], [ 115.15515774, 31.47430569 ], [ 115.15351413, 31.4730298 ], [ 115.1529539, 31.47242781 ], [ 115.15285018, 31.47219043 ], [ 115.15286485, 31.47190244 ], [ 115.15338414, 31.47140062 ], [ 115.1534809, 31.4710469 ], [ 115.15343379, 31.47014185 ], [ 115.15312242, 31.4696146 ], [ 115.15188989, 31.46831027 ], [ 115.15015214, 31.46698036 ], [ 115.14853189, 31.46515412 ], [ 115.14826069, 31.4649658 ], [ 115.14749367, 31.46462402 ], [ 115.14706468, 31.46431574 ], [ 115.14694966, 31.46443792 ], [ 115.14664317, 31.46567625 ], [ 115.14657218, 31.46625835 ], [ 115.14554989, 31.46783715 ], [ 115.14560762, 31.46831584 ], [ 115.14541319, 31.46861771 ], [ 115.14509061, 31.46875231 ], [ 115.14401759, 31.468798 ], [ 115.14322197, 31.46903291 ], [ 115.1421462, 31.46941907 ], [ 115.14098367, 31.47011406 ], [ 115.14076603, 31.47008386 ], [ 115.14046349, 31.46973043 ], [ 115.14034767, 31.46971795 ], [ 115.14025636, 31.46978806 ], [ 115.14012204, 31.47014037 ], [ 115.14006407, 31.47093585 ], [ 115.13977818, 31.47126852 ], [ 115.13972436, 31.47201114 ], [ 115.13981288, 31.47220438 ], [ 115.14053576, 31.47257816 ], [ 115.14065408, 31.47268685 ], [ 115.14064522, 31.472784 ], [ 115.14033172, 31.47283397 ], [ 115.13999211, 31.47275432 ], [ 115.1397198, 31.47297246 ], [ 115.13958969, 31.47296796 ], [ 115.13930389, 31.47230762 ], [ 115.13899629, 31.47202159 ], [ 115.13872605, 31.47189136 ], [ 115.13845593, 31.47193003 ], [ 115.13823587, 31.47228682 ], [ 115.13811817, 31.47236595 ], [ 115.13687166, 31.47199436 ], [ 115.13669978, 31.47228048 ], [ 115.13642159, 31.47251038 ], [ 115.13686119, 31.47293566 ], [ 115.13695176, 31.47317028 ], [ 115.13691567, 31.47333594 ], [ 115.13679197, 31.47339801 ], [ 115.13636978, 31.47340935 ], [ 115.13616773, 31.47357198 ], [ 115.13562719, 31.47358218 ], [ 115.13545389, 31.47365305 ], [ 115.1355101, 31.47380662 ], [ 115.13627268, 31.47428697 ], [ 115.13634401, 31.47451042 ], [ 115.13655568, 31.47478041 ], [ 115.13659981, 31.47573762 ], [ 115.13654565, 31.47601986 ], [ 115.13643718, 31.47614422 ], [ 115.13618979, 31.47618761 ], [ 115.13564049, 31.47610173 ], [ 115.13535994, 31.47635428 ], [ 115.13532803, 31.47646293 ], [ 115.13558422, 31.47665225 ], [ 115.13606988, 31.47682242 ], [ 115.13663006, 31.47719991 ], [ 115.13661362, 31.47732211 ], [ 115.13634584, 31.47753038 ], [ 115.13630439, 31.47763924 ], [ 115.13665825, 31.47808382 ], [ 115.13691009, 31.4785465 ] ], [ [ 115.15842061, 31.47702018 ], [ 115.15816022, 31.47681539 ], [ 115.15806723, 31.47680561 ] ], [ [ 115.13691009, 31.4785465 ], [ 115.13663966, 31.47880023 ], [ 115.13663572, 31.47903111 ] ], [ [ 115.13691009, 31.4785465 ], [ 115.1371682, 31.4791683 ], [ 115.13734968, 31.47943889 ], [ 115.13769258, 31.47958597 ], [ 115.13832378, 31.47963808 ], [ 115.13897419, 31.4795644 ], [ 115.13969679, 31.47935246 ], [ 115.14013567, 31.47910972 ], [ 115.14050754, 31.47876628 ], [ 115.14084882, 31.47859209 ], [ 115.14088007, 31.47838429 ], [ 115.14062528, 31.47788576 ], [ 115.14077761, 31.47756645 ], [ 115.14076777, 31.47744246 ], [ 115.14051011, 31.47723154 ], [ 115.14005454, 31.47707192 ], [ 115.14018421, 31.47692971 ], [ 115.14068736, 31.47664167 ], [ 115.14077177, 31.47653359 ], [ 115.14076232, 31.47641991 ], [ 115.14052582, 31.47631207 ], [ 115.13962108, 31.47618994 ], [ 115.13927081, 31.4760209 ], [ 115.13918188, 31.47582408 ], [ 115.13938191, 31.47534436 ], [ 115.13933557, 31.47520563 ], [ 115.13913406, 31.47522071 ], [ 115.1383257, 31.47558375 ], [ 115.13817566, 31.47556161 ], [ 115.13815167, 31.47541187 ], [ 115.1383678, 31.47522244 ], [ 115.13908671, 31.47491233 ], [ 115.14005112, 31.47436556 ], [ 115.14087088, 31.47423903 ], [ 115.14120092, 31.47390151 ], [ 115.14186205, 31.47358027 ], [ 115.14233421, 31.47326079 ], [ 115.14240215, 31.47305465 ], [ 115.14232012, 31.47254177 ], [ 115.14262298, 31.47226055 ], [ 115.1426606, 31.47214815 ], [ 115.14240225, 31.47186136 ], [ 115.14180496, 31.47153578 ], [ 115.14180644, 31.47127537 ], [ 115.14201845, 31.47101671 ], [ 115.14225611, 31.47096439 ], [ 115.14272181, 31.47105069 ], [ 115.14290221, 31.47101605 ], [ 115.14318377, 31.47062576 ], [ 115.14364351, 31.4705704 ], [ 115.14362677, 31.47020365 ], [ 115.14374588, 31.47006631 ], [ 115.14404685, 31.47011955 ], [ 115.1449743, 31.47056983 ], [ 115.14537765, 31.47056156 ], [ 115.14577243, 31.47032182 ], [ 115.14660511, 31.46944999 ], [ 115.14748572, 31.46900417 ], [ 115.14804839, 31.4689925 ], [ 115.14884939, 31.46932794 ], [ 115.14882217, 31.46920003 ], [ 115.14817953, 31.46823152 ], [ 115.14798008, 31.46806496 ], [ 115.14742416, 31.46778571 ], [ 115.14723836, 31.46761571 ], [ 115.14721969, 31.46735555 ], [ 115.14745328, 31.46722517 ], [ 115.14787714, 31.46726177 ], [ 115.14822765, 31.46741324 ], [ 115.14948513, 31.4686021 ], [ 115.15067887, 31.46916833 ], [ 115.15097844, 31.46939393 ], [ 115.15124268, 31.46977593 ], [ 115.15153569, 31.47037965 ], [ 115.1518328, 31.47131615 ], [ 115.15195561, 31.47218793 ], [ 115.15221944, 31.47258376 ], [ 115.15359165, 31.47357424 ], [ 115.15755836, 31.47671843 ], [ 115.15798998, 31.47694159 ], [ 115.15814225, 31.47691249 ], [ 115.15806723, 31.47680561 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PC0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PC0000", "TRVCD": "AFA9800124P00000", "INDCD": "QFA9800121PC0000", "ONDCD": "QFA9800122PC0000", "BWSCD": "WFA9800122PC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 1559.0, "RVSLP": 0.0049, "IELV": 154.75, "OELV": 147.91, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22265591, 31.37205705 ], [ 115.22228452, 31.37172025 ], [ 115.22219956, 31.37142418 ], [ 115.22236429, 31.37117191 ], [ 115.22311035, 31.37045954 ], [ 115.2233545, 31.37014223 ], [ 115.22356186, 31.36960469 ], [ 115.22351412, 31.3693498 ], [ 115.22337416, 31.36916249 ], [ 115.22295231, 31.36892581 ], [ 115.22245026, 31.36893012 ], [ 115.22214649, 31.36905754 ], [ 115.22146207, 31.36955024 ], [ 115.22087482, 31.36964588 ], [ 115.22038019, 31.36956245 ], [ 115.22012248, 31.36938015 ], [ 115.22000188, 31.36920119 ], [ 115.22001703, 31.36896167 ], [ 115.22059991, 31.36804823 ], [ 115.22083148, 31.36745189 ], [ 115.22074618, 31.36713425 ], [ 115.21994593, 31.36638618 ], [ 115.21977158, 31.36598781 ], [ 115.21971845, 31.36443194 ], [ 115.22016782, 31.36335237 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201B0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820400000000", "INDCD": "-1", "ONDCD": "QFA9820300000000", "BWSCD": "WFA98201B0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4329.0, "RVSLP": 0.0083, "IELV": 116.13, "OELV": 77.53, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83586206, 31.39749557 ], [ 114.83610221, 31.39735807 ], [ 114.83652383, 31.39726705 ], [ 114.83865074, 31.39715964 ], [ 114.83925713, 31.39690615 ], [ 114.83973209, 31.39655029 ], [ 114.84013837, 31.39612594 ], [ 114.84023311, 31.39580012 ], [ 114.84010035, 31.39547944 ], [ 114.83930445, 31.39471959 ], [ 114.83929745, 31.39443807 ], [ 114.83951776, 31.39427805 ], [ 114.83983752, 31.39423652 ], [ 114.84017037, 31.39428737 ], [ 114.84089855, 31.39472823 ], [ 114.84127175, 31.39479036 ], [ 114.84268499, 31.3941942 ], [ 114.84458772, 31.39406143 ], [ 114.84563782, 31.39380435 ], [ 114.84604825, 31.39354416 ], [ 114.84623801, 31.39329868 ], [ 114.84642721, 31.3928938 ], [ 114.8464364, 31.39263238 ], [ 114.8463603, 31.39243952 ], [ 114.84579238, 31.39194794 ], [ 114.84485865, 31.39156003 ], [ 114.84449524, 31.39133815 ], [ 114.84414234, 31.39099368 ], [ 114.8440655, 31.39067397 ], [ 114.84416043, 31.39041174 ], [ 114.84470979, 31.38956647 ], [ 114.84515393, 31.38856971 ], [ 114.84563208, 31.38810754 ], [ 114.84621559, 31.38782739 ], [ 114.84652212, 31.3878012 ], [ 114.84697829, 31.38795763 ], [ 114.8479144, 31.38853989 ], [ 114.84894646, 31.38886197 ], [ 114.84921941, 31.38902604 ], [ 114.84936805, 31.38919399 ], [ 114.84941543, 31.38937168 ], [ 114.84911012, 31.39016428 ], [ 114.84920033, 31.39054845 ], [ 114.84939418, 31.39085274 ], [ 114.84976569, 31.39120352 ], [ 114.85038786, 31.39168502 ], [ 114.85076411, 31.39186307 ], [ 114.8517076, 31.39186596 ], [ 114.85291802, 31.3915677 ], [ 114.85399977, 31.39099417 ], [ 114.85529543, 31.39051009 ], [ 114.85552001, 31.3904813 ], [ 114.85595198, 31.39067868 ], [ 114.85753764, 31.39188798 ], [ 114.85861647, 31.39230987 ], [ 114.85938004, 31.39233553 ], [ 114.85961384, 31.39227104 ], [ 114.8597997, 31.39213823 ], [ 114.86008811, 31.39162839 ], [ 114.86013649, 31.39122774 ], [ 114.86009725, 31.39051374 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201D0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820600000000", "INDCD": "-1", "ONDCD": "QFA98201D0000000", "BWSCD": "WFA98201D0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 629.0, "RVSLP": 0.0021, "IELV": 70.0, "OELV": 69.33, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88214951, 31.20980404 ], [ 114.88204971, 31.20941793 ], [ 114.8817875, 31.2090982 ], [ 114.88084032, 31.2085956 ], [ 114.88061415, 31.20856601 ], [ 114.87999391, 31.20872241 ], [ 114.8794735, 31.2087617 ], [ 114.87905002, 31.20873153 ], [ 114.87882445, 31.20864076 ], [ 114.87851984, 31.20837779 ], [ 114.87820369, 31.2077915 ], [ 114.87757436, 31.20723062 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201HA000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98202H0000000", "INDCD": "-1", "ONDCD": "QFA98201H0000000", "BWSCD": "WFA98201HA000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5542.0, "RVSLP": 0.0035, "IELV": 92.3, "OELV": 67.84, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94896644, 31.25979593 ], [ 114.94892817, 31.25940022 ], [ 114.94882378, 31.25914821 ], [ 114.94825253, 31.25871364 ], [ 114.94768755, 31.25793432 ], [ 114.94730554, 31.25760723 ], [ 114.94664685, 31.25725487 ], [ 114.94609572, 31.25684959 ], [ 114.94530022, 31.25596013 ], [ 114.94520479, 31.25576608 ], [ 114.94520074, 31.25551011 ], [ 114.94550819, 31.2549797 ], [ 114.94556794, 31.25471848 ], [ 114.94553001, 31.25453177 ], [ 114.94533766, 31.25429104 ], [ 114.94499158, 31.25407708 ], [ 114.94390813, 31.25369548 ], [ 114.94350609, 31.25372849 ], [ 114.94252442, 31.25401975 ], [ 114.94225124, 31.25395973 ], [ 114.9411837, 31.25333807 ], [ 114.94043397, 31.2527562 ], [ 114.94012752, 31.25246762 ], [ 114.93954802, 31.2517305 ], [ 114.93942907, 31.25094575 ], [ 114.93953243, 31.2503824 ], [ 114.93992446, 31.24996005 ], [ 114.94056206, 31.24956583 ], [ 114.94100831, 31.24917376 ], [ 114.94128687, 31.24872793 ], [ 114.94135636, 31.24841509 ], [ 114.94125899, 31.24825811 ], [ 114.94106833, 31.24815995 ], [ 114.94022584, 31.24809184 ], [ 114.93907376, 31.24788401 ], [ 114.93828423, 31.24748182 ], [ 114.93814832, 31.24734833 ], [ 114.93812415, 31.24723775 ], [ 114.93826717, 31.24666012 ], [ 114.93851183, 31.24619633 ], [ 114.93983714, 31.24487168 ], [ 114.94003834, 31.24449626 ], [ 114.94007444, 31.24424664 ], [ 114.93973024, 31.24370823 ], [ 114.93749776, 31.24191196 ], [ 114.93707839, 31.2413636 ], [ 114.93693812, 31.24095006 ], [ 114.93691045, 31.24035983 ], [ 114.93694805, 31.24000118 ], [ 114.93710634, 31.23949922 ], [ 114.93711572, 31.23914387 ], [ 114.93703521, 31.23880498 ], [ 114.93683597, 31.2385501 ], [ 114.93622921, 31.23807389 ], [ 114.9358427, 31.23793189 ], [ 114.93489214, 31.2379481 ], [ 114.93410437, 31.23812401 ], [ 114.93380842, 31.23805908 ], [ 114.93274431, 31.2372157 ], [ 114.93208463, 31.23620123 ], [ 114.9317498, 31.23532848 ], [ 114.93167124, 31.23398844 ], [ 114.93158816, 31.23357197 ], [ 114.93127, 31.23305946 ], [ 114.93057223, 31.23235999 ], [ 114.93027766, 31.23192382 ], [ 114.93008219, 31.23148071 ], [ 114.93011624, 31.23129606 ], [ 114.93040231, 31.23083803 ], [ 114.93112205, 31.22931219 ], [ 114.93119224, 31.2290328 ], [ 114.93114239, 31.22831757 ], [ 114.93071212, 31.22766888 ], [ 114.93060795, 31.22726051 ], [ 114.93060814, 31.2263758 ], [ 114.93067305, 31.22611816 ], [ 114.93081392, 31.22590177 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98202G0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98201G0000000", "TRVCD": "AFA9820600000000", "INDCD": "QFA98201G0000000", "ONDCD": "QFA98202G0000000", "BWSCD": "WFA98202G0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 5134.0, "RVSLP": 0.0026, "IELV": 70.0, "OELV": 63.16, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89740661, 31.29929706 ], [ 114.89597607, 31.29817159 ], [ 114.89475568, 31.29743756 ], [ 114.8941461, 31.29719231 ], [ 114.89309921, 31.29695819 ], [ 114.89162041, 31.29699609 ], [ 114.89129016, 31.29705661 ], [ 114.88935049, 31.29770219 ], [ 114.88877187, 31.29771187 ], [ 114.88840009, 31.29753385 ], [ 114.88716409, 31.29658396 ], [ 114.88617984, 31.29615645 ], [ 114.88555581, 31.29570606 ], [ 114.88523006, 31.2953384 ], [ 114.88476188, 31.29406737 ], [ 114.88417835, 31.29333427 ], [ 114.88386397, 31.29306953 ], [ 114.88278246, 31.29243565 ], [ 114.88207676, 31.29220628 ], [ 114.88165944, 31.29192602 ], [ 114.88086735, 31.29103135 ], [ 114.88036578, 31.2902921 ], [ 114.87980776, 31.28963336 ], [ 114.87915245, 31.2889879 ], [ 114.87888086, 31.28853575 ], [ 114.87879637, 31.28804485 ], [ 114.87884389, 31.28754561 ], [ 114.87917358, 31.28695435 ], [ 114.87916816, 31.28678169 ], [ 114.8790534, 31.28659839 ], [ 114.87749609, 31.28536373 ], [ 114.87688291, 31.28511003 ], [ 114.8762432, 31.28493813 ], [ 114.87589297, 31.28463828 ], [ 114.8758372, 31.28445805 ], [ 114.87592179, 31.28398779 ], [ 114.87586214, 31.2835355 ], [ 114.87590765, 31.28336199 ], [ 114.876245, 31.28308092 ], [ 114.8768653, 31.28284863 ], [ 114.87745779, 31.28235819 ], [ 114.87771778, 31.28196793 ], [ 114.87769861, 31.28149592 ], [ 114.8771422, 31.2807545 ], [ 114.87677965, 31.28040206 ], [ 114.87582092, 31.27965236 ], [ 114.87487985, 31.279104 ], [ 114.87349595, 31.27794191 ], [ 114.87313403, 31.27714449 ], [ 114.87301267, 31.27551994 ], [ 114.87284704, 31.27511845 ], [ 114.8717201, 31.27417013 ], [ 114.87119189, 31.27392837 ], [ 114.87077554, 31.27394212 ], [ 114.87047261, 31.27406419 ], [ 114.870034, 31.27445832 ], [ 114.8695681, 31.27507998 ], [ 114.86926064, 31.27525179 ], [ 114.86905252, 31.2751777 ], [ 114.86824148, 31.27444802 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501IA000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98502I0000000", "INDCD": "-1", "ONDCD": "QFA98501I0000000", "BWSCD": "WFA98501IA000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5472.0, "RVSLP": 0.002, "IELV": 59.15, "OELV": 45.67, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9429359, 31.01927833 ], [ 114.94285922, 31.01879216 ], [ 114.94264503, 31.01821203 ], [ 114.94265974, 31.01780455 ], [ 114.94287036, 31.01749312 ], [ 114.94362662, 31.01699386 ], [ 114.9440198, 31.01657188 ], [ 114.94412395, 31.01608187 ], [ 114.94405326, 31.01535226 ], [ 114.94396223, 31.01515601 ], [ 114.94373627, 31.01491628 ], [ 114.94286743, 31.01432823 ], [ 114.94262124, 31.01368776 ], [ 114.94235356, 31.01339952 ], [ 114.94189797, 31.01325108 ], [ 114.94113799, 31.01333976 ], [ 114.94093764, 31.01320254 ], [ 114.94073622, 31.0119503 ], [ 114.94000581, 31.01041694 ], [ 114.93999237, 31.01007358 ], [ 114.9400865, 31.00947477 ], [ 114.93927247, 31.00816418 ], [ 114.93904502, 31.00798394 ], [ 114.9387444, 31.00795151 ], [ 114.93812237, 31.00812423 ], [ 114.93710396, 31.00826014 ], [ 114.9363838, 31.00860216 ], [ 114.93616577, 31.00857389 ], [ 114.93597399, 31.00845772 ], [ 114.93583227, 31.00829402 ], [ 114.93579179, 31.00811629 ], [ 114.93604866, 31.00760355 ], [ 114.93607661, 31.00735774 ], [ 114.93585024, 31.00691958 ], [ 114.93545201, 31.00641112 ], [ 114.9352571, 31.00558792 ], [ 114.93487807, 31.0047884 ], [ 114.93433168, 31.00412592 ], [ 114.93393369, 31.00383921 ], [ 114.93331764, 31.00363848 ], [ 114.93255019, 31.00376641 ], [ 114.93223139, 31.00363891 ], [ 114.93164699, 31.00270798 ], [ 114.931605, 31.00244857 ], [ 114.93169309, 31.0019802 ], [ 114.93160075, 31.00174152 ], [ 114.93129949, 31.00150166 ], [ 114.93067229, 31.00131411 ], [ 114.92929258, 31.0006362 ], [ 114.92916811, 31.0004622 ], [ 114.92895996, 30.99987311 ], [ 114.92806837, 30.99853415 ], [ 114.92788874, 30.99777801 ], [ 114.92772191, 30.99735776 ], [ 114.92769348, 30.99701691 ], [ 114.92776963, 30.99675033 ], [ 114.92812978, 30.99623124 ], [ 114.92835352, 30.99569499 ], [ 114.9283382, 30.99535244 ], [ 114.92814834, 30.99467383 ], [ 114.92852423, 30.99343432 ], [ 114.92854786, 30.99226005 ], [ 114.92874034, 30.99140501 ], [ 114.92870564, 30.99089962 ], [ 114.92860027, 30.99063393 ], [ 114.92831408, 30.9903335 ], [ 114.92763262, 30.98980108 ], [ 114.92681542, 30.98940934 ], [ 114.92627747, 30.98921642 ], [ 114.92549169, 30.98904595 ], [ 114.92480951, 30.98917248 ], [ 114.92449373, 30.9891443 ], [ 114.92336644, 30.98842903 ], [ 114.92305003, 30.98839753 ], [ 114.92252215, 30.98852807 ], [ 114.92228477, 30.98848754 ], [ 114.92196809, 30.98824114 ], [ 114.92180558, 30.98795407 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121HA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122H00000", "INDCD": "-1", "ONDCD": "QFA9900121H00000", "BWSCD": "WFA9900121HA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1703.0, "RVSLP": 0.0024, "IELV": 118.18, "OELV": 116.35, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30956013, 31.09682495 ], [ 115.31028403, 31.09686331 ], [ 115.31124296, 31.0971882 ], [ 115.3117361, 31.09717551 ], [ 115.31203188, 31.09705073 ], [ 115.3126231, 31.0965837 ], [ 115.3133156, 31.09614421 ], [ 115.31376976, 31.09603226 ], [ 115.31407141, 31.09612406 ], [ 115.31485968, 31.09659038 ], [ 115.31565011, 31.09679189 ], [ 115.31728793, 31.09703848 ], [ 115.31764186, 31.09722171 ], [ 115.31787366, 31.09752405 ], [ 115.31802227, 31.09822033 ], [ 115.31843995, 31.09935208 ], [ 115.31837214, 31.09954157 ], [ 115.31760696, 31.10069414 ], [ 115.31751957, 31.10139644 ], [ 115.31737637, 31.10189437 ], [ 115.3173403, 31.10269195 ], [ 115.31715438, 31.1035397 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122XB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121XBA000,AFA9900121XB0000", "TRVCD": "AFA9900125X00000", "INDCD": "QFA9900121XB0000", "ONDCD": "QFA9900124X00000", "BWSCD": "WFA9900122XB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3565.0, "RVSLP": 0.0022, "IELV": 139.25, "OELV": 127.23, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21282245, 30.93769276 ], [ 115.21162486, 30.93670791 ], [ 115.21103482, 30.93598047 ], [ 115.21077977, 30.9354723 ], [ 115.21024153, 30.93480657 ], [ 115.20900547, 30.93375243 ], [ 115.2087976, 30.93350372 ], [ 115.20852777, 30.93300298 ], [ 115.20741476, 30.93206121 ], [ 115.20711999, 30.9316908 ], [ 115.20678555, 30.93059978 ], [ 115.20696977, 30.92953989 ], [ 115.20686432, 30.9280657 ], [ 115.20532433, 30.9255781 ], [ 115.20501412, 30.92478978 ], [ 115.2051857, 30.92390443 ], [ 115.20531192, 30.9236369 ], [ 115.20573, 30.9232304 ], [ 115.20635027, 30.92283926 ], [ 115.20651564, 30.92257379 ], [ 115.20633371, 30.92229928 ], [ 115.2054139, 30.92151952 ], [ 115.20508076, 30.92094811 ], [ 115.20511044, 30.92055044 ], [ 115.20569724, 30.91934402 ], [ 115.20573153, 30.91884032 ], [ 115.20567105, 30.9182585 ], [ 115.20532792, 30.91746163 ], [ 115.20467577, 30.91658808 ], [ 115.20438401, 30.91592179 ], [ 115.20418837, 30.91485858 ], [ 115.20375163, 30.91383504 ], [ 115.20356641, 30.91323838 ], [ 115.20261741, 30.91230384 ], [ 115.20235023, 30.91182547 ], [ 115.20226037, 30.91143964 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121Q00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122Q00000", "INDCD": "-1", "ONDCD": "QFA9800121Q00000", "BWSCD": "WFA9800121Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 8297.0, "RVSLP": 0.0124, "IELV": 252.55, "OELV": 139.76, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23468207, 31.01291555 ], [ 115.23463128, 31.01221928 ], [ 115.2345078, 31.01190593 ], [ 115.23419448, 31.01150425 ], [ 115.23361719, 31.01111245 ], [ 115.23305838, 31.01046878 ], [ 115.23279588, 31.01001717 ], [ 115.23262661, 31.00902919 ], [ 115.23213779, 31.00764981 ], [ 115.23198406, 31.0061177 ], [ 115.23169345, 31.00560422 ], [ 115.23128398, 31.00510421 ], [ 115.23082727, 31.0040624 ], [ 115.2304072, 31.0033377 ], [ 115.23010361, 31.00260173 ], [ 115.22993815, 31.00161216 ], [ 115.22967399, 31.00116225 ], [ 115.22878024, 31.00038013 ], [ 115.22791421, 30.99988021 ], [ 115.22695235, 30.9991623 ], [ 115.22665497, 30.99902403 ], [ 115.22545974, 30.99874352 ], [ 115.22485288, 30.9985041 ], [ 115.22355021, 30.99752205 ], [ 115.22288864, 30.99716991 ], [ 115.2223384, 30.99676351 ], [ 115.22206076, 30.99646612 ], [ 115.22198992, 30.99627474 ], [ 115.22210644, 30.99559629 ], [ 115.22204396, 30.99526407 ], [ 115.22125795, 30.99399039 ], [ 115.22081935, 30.99362799 ], [ 115.22033584, 30.99355432 ], [ 115.21986798, 30.99369886 ], [ 115.21939634, 30.9941618 ], [ 115.21919379, 30.99483802 ], [ 115.21908262, 30.99501302 ], [ 115.21882094, 30.99515193 ], [ 115.21801613, 30.99529845 ], [ 115.21743049, 30.99582126 ], [ 115.21620076, 30.99602004 ], [ 115.21527764, 30.99673391 ], [ 115.21497999, 30.99685858 ], [ 115.21316003, 30.99694227 ], [ 115.21282484, 30.99690246 ], [ 115.21228303, 30.99670352 ], [ 115.21201109, 30.99652199 ], [ 115.21181775, 30.9962809 ], [ 115.21179625, 30.99589656 ], [ 115.21215779, 30.99500833 ], [ 115.2121145, 30.99475631 ], [ 115.21192045, 30.99451648 ], [ 115.2116479, 30.99433795 ], [ 115.20946737, 30.99335971 ], [ 115.20841711, 30.99263365 ], [ 115.20735623, 30.99223672 ], [ 115.20714592, 30.99226007 ], [ 115.20694009, 30.99244193 ], [ 115.2062553, 30.9939762 ], [ 115.20605786, 30.99473765 ], [ 115.20585055, 30.9949744 ], [ 115.20557561, 30.99512173 ], [ 115.20525887, 30.99513172 ], [ 115.20495972, 30.99500587 ], [ 115.20325053, 30.99365444 ], [ 115.20279754, 30.99346142 ], [ 115.20211211, 30.99344942 ], [ 115.20151808, 30.99351831 ], [ 115.20062135, 30.99389311 ], [ 115.19996956, 30.9940267 ], [ 115.19865526, 30.99443838 ], [ 115.19828188, 30.99437174 ], [ 115.19773183, 30.99387863 ], [ 115.19714378, 30.99368034 ], [ 115.19678962, 30.99381051 ], [ 115.19596046, 30.99454646 ], [ 115.19552759, 30.99476963 ], [ 115.19396224, 30.99483818 ], [ 115.19306129, 30.99472234 ], [ 115.19285278, 30.99474776 ], [ 115.1926507, 30.99498849 ], [ 115.19265128, 30.99524212 ], [ 115.19277002, 30.995689 ], [ 115.19273597, 30.99578819 ], [ 115.19260481, 30.99587157 ], [ 115.1916386, 30.99550977 ], [ 115.19081782, 30.99498406 ], [ 115.19050824, 30.99463444 ], [ 115.19024026, 30.99403016 ], [ 115.19016758, 30.99368264 ], [ 115.19000202, 30.99044903 ], [ 115.18989461, 30.99018604 ], [ 115.18961034, 30.98994995 ], [ 115.18941948, 30.98993551 ], [ 115.1891819, 30.99008947 ], [ 115.18858359, 30.99105147 ], [ 115.18811045, 30.99153602 ], [ 115.18778244, 30.99179417 ], [ 115.18726869, 30.99204123 ], [ 115.18678035, 30.99213844 ], [ 115.18529759, 30.99217967 ], [ 115.18490018, 30.9921421 ], [ 115.18432756, 30.99198603 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122QB0000", "INDCD": "-1", "ONDCD": "QFA9800121QB0000", "BWSCD": "WFA9800121QB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2190.0, "RVSLP": 0.0021, "IELV": 95.16, "OELV": 92.47, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16205403, 30.94398649 ], [ 115.16165353, 30.94460685 ], [ 115.16136, 30.94522581 ], [ 115.16114221, 30.94591575 ], [ 115.16106621, 30.94662056 ], [ 115.16069564, 30.94773153 ], [ 115.16037645, 30.9491881 ], [ 115.16014791, 30.94987221 ], [ 115.15976791, 30.95068404 ], [ 115.15874383, 30.95374586 ], [ 115.15814422, 30.95495025 ], [ 115.15752045, 30.95655647 ], [ 115.15695408, 30.9574694 ], [ 115.15647407, 30.95860805 ], [ 115.15637358, 30.95915605 ], [ 115.15613155, 30.95990972 ], [ 115.15554388, 30.96092781 ], [ 115.15546923, 30.96130994 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TD0000", "RVNM": "尾斗山水库干渠", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800126T00000", "INDCD": "-1", "ONDCD": "QFA9800125T00000", "BWSCD": "WFA9800121TD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6025.0, "RVSLP": 0.0009, "IELV": 47.9, "OELV": 40.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.72757178, 31.10515808 ], [ 114.7279878, 31.10509706 ], [ 114.72820729, 31.10499399 ], [ 114.72929256, 31.10423476 ], [ 114.73044091, 31.10320767 ], [ 114.73065007, 31.10308983 ], [ 114.73096226, 31.10304756 ], [ 114.73119383, 31.10310151 ], [ 114.73170241, 31.10338017 ], [ 114.73268799, 31.10377785 ], [ 114.73332436, 31.10393437 ], [ 114.73461794, 31.10442355 ], [ 114.73628277, 31.10483981 ], [ 114.73730175, 31.10488243 ], [ 114.737942, 31.10502497 ], [ 114.73887663, 31.10506006 ], [ 114.73960009, 31.10521351 ], [ 114.74020176, 31.10521825 ], [ 114.74115164, 31.10516772 ], [ 114.74281305, 31.10471637 ], [ 114.74339159, 31.10469764 ], [ 114.74400512, 31.10491553 ], [ 114.74487855, 31.10538619 ], [ 114.74619369, 31.10631977 ], [ 114.74658408, 31.10637437 ], [ 114.74721734, 31.10635164 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122E00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800121E00000", "TRVCD": "AFA9800129000000", "INDCD": "QFA9800121E00000", "ONDCD": "QFA9800128000000", "BWSCD": "WFA9800122E00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 10295.0, "RVSLP": 0.0043, "IELV": 197.45, "OELV": 88.05, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15486818, 31.44446258 ], [ 115.154484, 31.44527287 ], [ 115.15399635, 31.44575554 ], [ 115.15360628, 31.44595829 ], [ 115.15329168, 31.44580512 ], [ 115.15309922, 31.44549282 ], [ 115.15304659, 31.44460351 ], [ 115.15321928, 31.44395022 ], [ 115.15323157, 31.44367216 ], [ 115.15311815, 31.44335968 ], [ 115.15286287, 31.44320099 ], [ 115.15228602, 31.44321382 ], [ 115.15188604, 31.44348207 ], [ 115.1517202, 31.44381542 ], [ 115.15168136, 31.44455222 ], [ 115.15160124, 31.44483083 ], [ 115.15128382, 31.44519646 ], [ 115.15096, 31.44536647 ], [ 115.15052176, 31.44526622 ], [ 115.15023594, 31.44510591 ], [ 115.14945701, 31.44428163 ], [ 115.14883552, 31.44384924 ], [ 115.14853152, 31.44382063 ], [ 115.14725322, 31.44415844 ], [ 115.14693571, 31.44433775 ], [ 115.14687282, 31.44453244 ], [ 115.14771765, 31.44539187 ], [ 115.14781828, 31.44587237 ], [ 115.1477483, 31.44629309 ], [ 115.14744748, 31.4468167 ], [ 115.14653813, 31.44771187 ], [ 115.14601241, 31.44839812 ], [ 115.1453203, 31.44903771 ], [ 115.1449724, 31.4492046 ], [ 115.14460401, 31.4491076 ], [ 115.14387368, 31.44851195 ], [ 115.14280066, 31.44687856 ], [ 115.1425124, 31.44657759 ], [ 115.14161908, 31.44589597 ], [ 115.14105203, 31.44577646 ], [ 115.14054363, 31.44582675 ], [ 115.13935171, 31.44615997 ], [ 115.1374078, 31.44720086 ], [ 115.13698966, 31.44760491 ], [ 115.13657961, 31.44817017 ], [ 115.13594954, 31.44873215 ], [ 115.13502834, 31.44907125 ], [ 115.13454841, 31.44907025 ], [ 115.13411397, 31.44881968 ], [ 115.1331539, 31.44804577 ], [ 115.13292449, 31.44780214 ], [ 115.13271203, 31.44743342 ], [ 115.13268503, 31.4472555 ], [ 115.13276784, 31.44708731 ], [ 115.13355441, 31.44650955 ], [ 115.13376577, 31.4462544 ], [ 115.13384566, 31.44598435 ], [ 115.13380599, 31.44564483 ], [ 115.13357248, 31.44533983 ], [ 115.13328821, 31.44517556 ], [ 115.13286638, 31.44512003 ], [ 115.13208635, 31.44518352 ], [ 115.1310391, 31.44544938 ], [ 115.13082272, 31.44555646 ], [ 115.13048759, 31.44589576 ], [ 115.12989585, 31.4469956 ], [ 115.12935962, 31.44775821 ], [ 115.12883112, 31.44829936 ], [ 115.12850006, 31.44855989 ], [ 115.12790809, 31.44883816 ], [ 115.12749073, 31.44890757 ], [ 115.12706504, 31.44889332 ], [ 115.12667996, 31.44874572 ], [ 115.12571008, 31.44801751 ], [ 115.12519429, 31.44774983 ], [ 115.1248685, 31.44749858 ], [ 115.12430428, 31.4467063 ], [ 115.1225861, 31.44466611 ], [ 115.11985114, 31.44241033 ], [ 115.11926807, 31.44163335 ], [ 115.11900451, 31.44117419 ], [ 115.11722314, 31.43908197 ], [ 115.1169417, 31.43892215 ], [ 115.11661231, 31.43886965 ], [ 115.11381072, 31.43894595 ], [ 115.11348423, 31.4388856 ], [ 115.11295177, 31.43867129 ], [ 115.11023047, 31.43652584 ], [ 115.10938156, 31.43528719 ], [ 115.10915751, 31.43504747 ], [ 115.10732004, 31.43385443 ], [ 115.10616035, 31.4336972 ], [ 115.10569875, 31.43352379 ], [ 115.10511765, 31.43320038 ], [ 115.10351029, 31.43257003 ], [ 115.10291985, 31.43253178 ], [ 115.10251207, 31.43261369 ], [ 115.10151367, 31.43337395 ], [ 115.1008314, 31.43364646 ], [ 115.10012951, 31.43407089 ], [ 115.09946288, 31.43457568 ], [ 115.09865476, 31.43497621 ], [ 115.09840003, 31.43516964 ], [ 115.09817974, 31.43555412 ], [ 115.09815214, 31.43657758 ], [ 115.09789164, 31.43761547 ], [ 115.09769316, 31.43783627 ], [ 115.09726613, 31.43805059 ], [ 115.09668648, 31.43814792 ], [ 115.0962607, 31.43812388 ], [ 115.09511648, 31.43790791 ], [ 115.09339169, 31.43739011 ], [ 115.09201846, 31.43735402 ], [ 115.09139977, 31.43713813 ], [ 115.09090622, 31.43681136 ], [ 115.08921626, 31.43544866 ], [ 115.08819968, 31.43425724 ], [ 115.0878284, 31.43392025 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122QD0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121QD0000", "TRVCD": "AFA9800123QD0000", "INDCD": "QFA9800121QD0000", "ONDCD": "QFA9800122QD0000", "BWSCD": "WFA9800122QD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08123135, 31.06161801 ], [ 115.08096609, 31.06164181 ], [ 115.08071158, 31.0618678 ] ], [ [ 115.08123135, 31.06161801 ], [ 115.08210445, 31.06250771 ], [ 115.08223235, 31.06250441 ], [ 115.08258961, 31.0623339 ], [ 115.08310223, 31.06255648 ], [ 115.08376005, 31.06299214 ], [ 115.08450828, 31.06297768 ], [ 115.08508118, 31.06309431 ], [ 115.08540545, 31.06344894 ], [ 115.08574634, 31.06404927 ], [ 115.08592374, 31.06414996 ], [ 115.08614812, 31.06406992 ], [ 115.08636607, 31.06383504 ], [ 115.08650765, 31.06348817 ], [ 115.0866199, 31.06270244 ], [ 115.08668609, 31.06260163 ], [ 115.08677401, 31.06262848 ], [ 115.08688753, 31.06304717 ], [ 115.08677632, 31.06382117 ], [ 115.08691009, 31.06416821 ], [ 115.08744507, 31.06457353 ], [ 115.08805227, 31.06515625 ], [ 115.08898611, 31.0654761 ], [ 115.09004253, 31.06619242 ], [ 115.09066815, 31.06675398 ], [ 115.09107869, 31.06724023 ], [ 115.0911259, 31.06739204 ], [ 115.09103748, 31.06763778 ], [ 115.09105754, 31.06775212 ], [ 115.09147658, 31.06795397 ], [ 115.09163285, 31.06811195 ], [ 115.09170978, 31.06841781 ], [ 115.09157784, 31.06888197 ], [ 115.09172849, 31.06936382 ], [ 115.0917677, 31.07010448 ], [ 115.09166293, 31.07036631 ], [ 115.09136556, 31.07068357 ], [ 115.091886, 31.07092386 ], [ 115.09229456, 31.07133822 ], [ 115.09246844, 31.07163065 ], [ 115.09287823, 31.07268712 ], [ 115.09344218, 31.07351178 ], [ 115.09376021, 31.07374757 ], [ 115.09417165, 31.07388677 ], [ 115.09433606, 31.07404146 ], [ 115.09449011, 31.07469492 ], [ 115.09472569, 31.07528114 ], [ 115.0945996, 31.07570235 ], [ 115.09469116, 31.07584317 ], [ 115.09561067, 31.07592787 ], [ 115.09573216, 31.0758884 ], [ 115.09577365, 31.07578751 ], [ 115.0957121, 31.07565964 ], [ 115.09524916, 31.07522423 ], [ 115.09509904, 31.07478238 ], [ 115.0945601, 31.07376194 ], [ 115.09376202, 31.07304088 ], [ 115.09333382, 31.0724335 ], [ 115.09272013, 31.0709883 ], [ 115.09267566, 31.07012963 ], [ 115.09247849, 31.06956992 ], [ 115.09262801, 31.06878216 ], [ 115.09286254, 31.06835552 ], [ 115.09296047, 31.06787433 ], [ 115.09317162, 31.06755244 ], [ 115.09336619, 31.0674532 ], [ 115.09370993, 31.06749491 ], [ 115.0942218, 31.06776356 ], [ 115.0949999, 31.06780449 ], [ 115.09561561, 31.06816439 ], [ 115.09587902, 31.06839597 ], [ 115.09701725, 31.06869088 ], [ 115.09726563, 31.06872792 ], [ 115.09784309, 31.0686766 ], [ 115.09886203, 31.06898783 ], [ 115.09943659, 31.06896012 ], [ 115.09955402, 31.06903521 ], [ 115.0997259, 31.06935168 ], [ 115.10018156, 31.06957639 ], [ 115.10047168, 31.06956629 ], [ 115.10091397, 31.06936421 ], [ 115.10135446, 31.06967271 ], [ 115.10161306, 31.06974039 ], [ 115.10171377, 31.06967137 ], [ 115.10172839, 31.06931568 ], [ 115.10195633, 31.06927357 ], [ 115.1029423, 31.06959027 ], [ 115.10320283, 31.06985203 ], [ 115.10364512, 31.07004257 ], [ 115.10396604, 31.07037152 ], [ 115.10416214, 31.07037809 ], [ 115.10444067, 31.0701659 ], [ 115.10457237, 31.07018976 ], [ 115.10525695, 31.07092558 ], [ 115.10598357, 31.0715884 ], [ 115.10630168, 31.07207439 ], [ 115.10629104, 31.07228382 ], [ 115.10596199, 31.07287932 ], [ 115.10585439, 31.07325624 ], [ 115.1058365, 31.07381573 ], [ 115.10598203, 31.07408553 ], [ 115.10616972, 31.07395805 ], [ 115.1064995, 31.073366 ], [ 115.1066449, 31.07294621 ], [ 115.10678835, 31.07275557 ], [ 115.10697403, 31.07269379 ], [ 115.10740648, 31.07280878 ], [ 115.10761431, 31.07277965 ], [ 115.10773213, 31.07263304 ], [ 115.10776214, 31.07224664 ], [ 115.10792003, 31.07203034 ], [ 115.10911231, 31.07132572 ], [ 115.11022552, 31.070408 ], [ 115.11053202, 31.07033976 ], [ 115.11093178, 31.07053979 ], [ 115.11149433, 31.07132362 ], [ 115.11216198, 31.07182775 ], [ 115.1128983, 31.07286293 ], [ 115.11310553, 31.07305147 ], [ 115.1132684, 31.07304864 ], [ 115.11365735, 31.07274973 ], [ 115.11389254, 31.07266976 ], [ 115.11448275, 31.07302298 ], [ 115.11482977, 31.07312809 ], [ 115.11583531, 31.0731163 ], [ 115.1175717, 31.07333647 ], [ 115.11796184, 31.07329376 ], [ 115.11861981, 31.07300928 ], [ 115.11896397, 31.07301982 ], [ 115.11932832, 31.0732219 ], [ 115.12001796, 31.07380796 ], [ 115.1211039, 31.07410379 ], [ 115.12151611, 31.07429257 ], [ 115.12338597, 31.07579015 ], [ 115.12420467, 31.07623947 ], [ 115.12535556, 31.0767322 ], [ 115.12623671, 31.07734989 ], [ 115.12641836, 31.07743754 ], [ 115.12652626, 31.07742272 ] ], [ [ 115.12652626, 31.07742272 ], [ 115.12540271, 31.07647567 ], [ 115.12415008, 31.07605357 ], [ 115.12362153, 31.07573151 ], [ 115.12293631, 31.07518006 ], [ 115.12041947, 31.07242299 ], [ 115.12022643, 31.07206862 ], [ 115.12020886, 31.07156649 ], [ 115.11994016, 31.07135154 ], [ 115.11903204, 31.07124939 ], [ 115.11790443, 31.07089487 ], [ 115.11718784, 31.07094018 ], [ 115.11675622, 31.07111568 ], [ 115.11649661, 31.07133385 ], [ 115.11640272, 31.071564 ], [ 115.11645872, 31.07201011 ], [ 115.11639204, 31.07217369 ], [ 115.11577793, 31.07247218 ], [ 115.11527425, 31.07247861 ], [ 115.1150074, 31.07227719 ], [ 115.11495446, 31.0720363 ], [ 115.11498399, 31.07172184 ], [ 115.11516223, 31.07124554 ], [ 115.11558637, 31.07089593 ], [ 115.11559207, 31.07080237 ], [ 115.1149863, 31.07068873 ], [ 115.11407317, 31.07088723 ], [ 115.11363337, 31.07090974 ], [ 115.11337954, 31.07085033 ], [ 115.1130655, 31.07055841 ], [ 115.11238992, 31.06945149 ], [ 115.11228878, 31.06937039 ], [ 115.11218203, 31.06947947 ], [ 115.11209098, 31.07019951 ], [ 115.11203746, 31.07026939 ], [ 115.11186752, 31.07019982 ], [ 115.11124748, 31.06953983 ], [ 115.1109725, 31.06941818 ], [ 115.11064524, 31.06940967 ], [ 115.10955962, 31.0696009 ], [ 115.10899237, 31.0698847 ], [ 115.10831432, 31.07038356 ], [ 115.10812225, 31.0704004 ], [ 115.10785408, 31.07032038 ], [ 115.10773639, 31.07092033 ], [ 115.10759152, 31.07109001 ], [ 115.10741177, 31.07109854 ], [ 115.10713221, 31.07095993 ], [ 115.10638411, 31.07034369 ], [ 115.10631757, 31.0701644 ], [ 115.10745761, 31.06897551 ], [ 115.10753634, 31.06881316 ], [ 115.1073959, 31.0687935 ], [ 115.10635189, 31.06915386 ], [ 115.10610779, 31.06916418 ], [ 115.10579792, 31.06898241 ], [ 115.10534232, 31.06829591 ], [ 115.10541813, 31.06816246 ], [ 115.10582204, 31.06788371 ], [ 115.10599392, 31.0676843 ], [ 115.10609021, 31.06750239 ], [ 115.10615025, 31.0670987 ], [ 115.10628114, 31.06689241 ], [ 115.10719382, 31.06640893 ], [ 115.10744381, 31.06615826 ], [ 115.10758616, 31.06565291 ], [ 115.10753413, 31.06485321 ], [ 115.10745629, 31.06473771 ], [ 115.10728212, 31.06473208 ], [ 115.10710819, 31.06485613 ], [ 115.10688293, 31.06545429 ], [ 115.10669119, 31.06567516 ], [ 115.10639049, 31.06584092 ], [ 115.10574433, 31.06602964 ], [ 115.10555555, 31.06615954 ], [ 115.105326, 31.06648189 ], [ 115.10499821, 31.06718388 ], [ 115.10483089, 31.06734797 ], [ 115.10397974, 31.06757589 ], [ 115.10295044, 31.06807016 ], [ 115.10279647, 31.06804916 ], [ 115.1026212, 31.06780302 ], [ 115.10248999, 31.06775643 ], [ 115.10192229, 31.06825071 ], [ 115.10159782, 31.06832994 ], [ 115.10086939, 31.06811973 ], [ 115.10081096, 31.06755025 ], [ 115.10060033, 31.067036 ], [ 115.1008507, 31.06668959 ], [ 115.10173164, 31.06618959 ], [ 115.10181885, 31.06606624 ], [ 115.10177753, 31.06597415 ], [ 115.10121943, 31.06611026 ], [ 115.10055999, 31.06608022 ], [ 115.10016194, 31.06684475 ], [ 115.10005518, 31.06745051 ], [ 115.09992796, 31.06758245 ], [ 115.09968389, 31.06765508 ], [ 115.09935044, 31.0675601 ], [ 115.09900713, 31.06725326 ], [ 115.0981779, 31.06698181 ], [ 115.09816972, 31.06688415 ], [ 115.09851426, 31.06655192 ], [ 115.09852559, 31.0664455 ], [ 115.09747472, 31.06651045 ], [ 115.09717235, 31.06642621 ], [ 115.09662885, 31.06605546 ], [ 115.09595771, 31.06523716 ], [ 115.09585829, 31.06528743 ], [ 115.09569328, 31.06564518 ], [ 115.09558359, 31.06574245 ], [ 115.09515814, 31.06565573 ], [ 115.09506991, 31.06568966 ], [ 115.09461487, 31.06634768 ], [ 115.0943559, 31.06651043 ], [ 115.09391388, 31.0665397 ], [ 115.0934864, 31.0664516 ], [ 115.09345997, 31.06629652 ], [ 115.09363152, 31.06594613 ], [ 115.09357611, 31.06582566 ], [ 115.09331019, 31.06587812 ], [ 115.09261567, 31.06620897 ], [ 115.09245293, 31.06617568 ], [ 115.09240028, 31.06583114 ], [ 115.09264999, 31.06529672 ], [ 115.09254164, 31.06491358 ], [ 115.09258801, 31.06466237 ], [ 115.09281245, 31.06435849 ], [ 115.09326353, 31.06424991 ], [ 115.09339151, 31.06407434 ], [ 115.09333199, 31.06382105 ], [ 115.09290628, 31.06350225 ], [ 115.0928948, 31.06327144 ], [ 115.09309936, 31.06296185 ], [ 115.09354238, 31.06269563 ], [ 115.09403226, 31.0626492 ], [ 115.09570757, 31.06290759 ], [ 115.09714387, 31.06327024 ], [ 115.09885623, 31.06320034 ], [ 115.10063491, 31.06332427 ], [ 115.10079038, 31.06323154 ], [ 115.10062448, 31.06309142 ], [ 115.09970814, 31.06277165 ], [ 115.09815244, 31.06255429 ], [ 115.0974438, 31.06225024 ], [ 115.09697205, 31.06230954 ], [ 115.09626779, 31.06198211 ], [ 115.09567425, 31.0619856 ], [ 115.09349344, 31.06162482 ], [ 115.09324726, 31.06147086 ], [ 115.09309456, 31.0612442 ], [ 115.09296986, 31.06019427 ], [ 115.09286894, 31.05999175 ], [ 115.09273032, 31.06002239 ], [ 115.09262203, 31.06015826 ], [ 115.09223444, 31.06113638 ], [ 115.09184191, 31.06137833 ], [ 115.09168755, 31.06157396 ], [ 115.09166002, 31.06173839 ], [ 115.09171832, 31.06184364 ], [ 115.09216567, 31.06213193 ], [ 115.09222371, 31.06247182 ], [ 115.09212832, 31.06265619 ], [ 115.09183139, 31.06288029 ], [ 115.09155602, 31.06336374 ], [ 115.09139248, 31.06346356 ], [ 115.09116794, 31.06340248 ], [ 115.09092357, 31.06317579 ], [ 115.09037396, 31.06232953 ], [ 115.0902307, 31.06233199 ], [ 115.08990234, 31.06254447 ], [ 115.08917399, 31.06255381 ], [ 115.08879432, 31.06233753 ], [ 115.08853015, 31.06199198 ], [ 115.08798768, 31.06155798 ], [ 115.08715013, 31.06140987 ], [ 115.08674805, 31.06107193 ], [ 115.08659801, 31.0608158 ], [ 115.08665345, 31.05974049 ], [ 115.08681498, 31.05949367 ], [ 115.08686117, 31.05928161 ], [ 115.08755615, 31.05924913 ], [ 115.08771446, 31.05919049 ], [ 115.08766693, 31.05907033 ], [ 115.08747635, 31.0589621 ], [ 115.08694762, 31.05882885 ], [ 115.08647469, 31.05889768 ], [ 115.08615223, 31.0591095 ], [ 115.08576024, 31.05959224 ], [ 115.0855645, 31.05968375 ], [ 115.08539843, 31.05964948 ], [ 115.08492555, 31.05935152 ], [ 115.08468999, 31.05933799 ], [ 115.08465135, 31.05957791 ], [ 115.08500479, 31.06053369 ], [ 115.08482838, 31.06066702 ], [ 115.08458837, 31.0606152 ], [ 115.08445813, 31.0603999 ], [ 115.0842071, 31.05939792 ], [ 115.08410397, 31.05841893 ], [ 115.0839441, 31.05812025 ], [ 115.08380712, 31.05803267 ], [ 115.0836279, 31.05805368 ], [ 115.08285767, 31.05840387 ], [ 115.08237958, 31.05893046 ], [ 115.08239977, 31.05917637 ], [ 115.08274003, 31.05947613 ], [ 115.08290233, 31.05979365 ], [ 115.08304491, 31.05993607 ], [ 115.08276192, 31.0602263 ], [ 115.08252366, 31.06026688 ], [ 115.0819478, 31.06009393 ], [ 115.08124289, 31.06020947 ], [ 115.08026271, 31.06016234 ], [ 115.08006637, 31.06020192 ], [ 115.08015209, 31.06037355 ], [ 115.08096761, 31.06102413 ], [ 115.08115591, 31.06131963 ], [ 115.08123135, 31.06161801 ] ], [ [ 115.12668932, 31.07755382 ], [ 115.12652626, 31.07742272 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123PD0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122PD0000", "TRVCD": "AFA9800124PD0000", "INDCD": "QFA9800122PD0000", "ONDCD": "QFA9800123PD0000", "BWSCD": "WFA9800123PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 2545.0, "RVSLP": 0.003, "IELV": 145.05, "OELV": 129.68, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27172186, 31.28160493 ], [ 115.2713317, 31.28165666 ], [ 115.27038213, 31.28197444 ], [ 115.27008047, 31.28223925 ], [ 115.26955796, 31.28292217 ], [ 115.2689081, 31.28344218 ], [ 115.26844346, 31.28360475 ], [ 115.26780245, 31.28393643 ], [ 115.26748188, 31.2839523 ], [ 115.26702144, 31.28386957 ], [ 115.26673999, 31.28395785 ], [ 115.26644221, 31.28430644 ], [ 115.26627194, 31.28522116 ], [ 115.26595605, 31.28550391 ], [ 115.26570249, 31.28545739 ], [ 115.26546495, 31.28526092 ], [ 115.26517777, 31.28481446 ], [ 115.26497615, 31.28435419 ], [ 115.26470757, 31.28403572 ], [ 115.26417374, 31.28363556 ], [ 115.26397396, 31.28358235 ], [ 115.26384682, 31.28361854 ], [ 115.26356782, 31.28386436 ], [ 115.26327215, 31.28439227 ], [ 115.26306584, 31.28487714 ], [ 115.26295352, 31.28541762 ], [ 115.26284033, 31.28559197 ], [ 115.26249796, 31.28573826 ], [ 115.26171775, 31.28569873 ], [ 115.26153393, 31.28577977 ], [ 115.26132239, 31.28604717 ], [ 115.26133575, 31.2864705 ], [ 115.26116558, 31.28676838 ], [ 115.2607281, 31.28713032 ], [ 115.26013984, 31.28735795 ], [ 115.25951159, 31.28726024 ], [ 115.25848727, 31.28721294 ], [ 115.25807008, 31.286978 ], [ 115.25791825, 31.28679606 ], [ 115.25737753, 31.28575585 ], [ 115.25689356, 31.28463766 ], [ 115.25614203, 31.28372797 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800123JB0000,AFA9800123J00000", "TRVCD": "AFA9800125J00000", "INDCD": "QFA9800123J00000", "ONDCD": "QFA9800124J00000", "BWSCD": "WFA9800124J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 3772.0, "RVSLP": 0.0014, "IELV": 89.62, "OELV": 85.85, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95379395, 31.36938368 ], [ 114.95430361, 31.3693404 ], [ 114.95492377, 31.36919419 ], [ 114.95560191, 31.36924129 ], [ 114.95718568, 31.36864311 ], [ 114.95776185, 31.36859241 ], [ 114.95845789, 31.36882146 ], [ 114.95938231, 31.36939774 ], [ 114.95983819, 31.36957239 ], [ 114.96110951, 31.36988396 ], [ 114.9616998, 31.37016834 ], [ 114.96321876, 31.37025728 ], [ 114.9641717, 31.37074414 ], [ 114.96507439, 31.37137246 ], [ 114.96606454, 31.37150363 ], [ 114.96681172, 31.37181187 ], [ 114.96713034, 31.37180763 ], [ 114.96791773, 31.3716289 ], [ 114.96872197, 31.37177445 ], [ 114.969138, 31.37176022 ], [ 114.97055213, 31.3711483 ], [ 114.97090848, 31.37115825 ], [ 114.97111964, 31.37134385 ], [ 114.97137583, 31.37179589 ], [ 114.97146124, 31.37252998 ], [ 114.97143587, 31.37311567 ], [ 114.97131795, 31.37338619 ], [ 114.97054607, 31.37425327 ], [ 114.97006507, 31.37562036 ], [ 114.9700731, 31.37594591 ], [ 114.97028847, 31.37625404 ], [ 114.97076761, 31.37659027 ], [ 114.97132565, 31.3767458 ], [ 114.97191199, 31.37704923 ], [ 114.97297624, 31.37745211 ], [ 114.97329637, 31.37746523 ], [ 114.97391646, 31.37728667 ], [ 114.9744259, 31.37723882 ], [ 114.97493368, 31.37726216 ], [ 114.97557572, 31.37740647 ], [ 114.97634246, 31.37738375 ], [ 114.97851223, 31.37668567 ], [ 114.97960801, 31.3765622 ], [ 114.98006879, 31.37640817 ], [ 114.98096184, 31.37627432 ], [ 114.98152044, 31.37608737 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800129T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800128T00000,AFA9800122TG0000", "TRVCD": "AFA980012AT00000", "INDCD": "QFA9800128T00000", "ONDCD": "QFA9800129T00000", "BWSCD": "WFA9800129T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 11.0, "RVLEN": 10809.0, "RVSLP": 0.0001, "IELV": 36.38, "OELV": 29.89, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7827804, 31.06562376 ], [ 114.78274761, 31.06482333 ], [ 114.78264149, 31.06445648 ], [ 114.78229947, 31.0639577 ], [ 114.78115588, 31.06294018 ], [ 114.78063945, 31.06212247 ], [ 114.78031846, 31.0613818 ], [ 114.77997404, 31.06021763 ], [ 114.78015969, 31.05930184 ], [ 114.7801121, 31.05865668 ], [ 114.77991963, 31.05833578 ], [ 114.77917424, 31.05764614 ], [ 114.77886149, 31.05699025 ], [ 114.77876182, 31.05656972 ], [ 114.77869572, 31.05545428 ], [ 114.77859587, 31.05510992 ], [ 114.77831822, 31.05466682 ], [ 114.77742869, 31.05364644 ], [ 114.77719245, 31.05327044 ], [ 114.77708002, 31.0529981 ], [ 114.77697847, 31.05243636 ], [ 114.7768419, 31.05217566 ], [ 114.77479226, 31.0504641 ], [ 114.77460883, 31.05021338 ], [ 114.77430191, 31.04947383 ], [ 114.77428213, 31.04890641 ], [ 114.77451001, 31.04836562 ], [ 114.77514611, 31.04748685 ], [ 114.7758973, 31.04670242 ], [ 114.77664416, 31.04555634 ], [ 114.77692758, 31.04502836 ], [ 114.77718761, 31.04420589 ], [ 114.77717375, 31.04355564 ], [ 114.77695788, 31.04292801 ], [ 114.77692227, 31.04258563 ], [ 114.77731767, 31.04134008 ], [ 114.77733824, 31.04091593 ], [ 114.77726969, 31.04057217 ], [ 114.77681308, 31.03932582 ], [ 114.77667303, 31.03824461 ], [ 114.77645562, 31.03761901 ], [ 114.77644759, 31.0371242 ], [ 114.77662691, 31.03641609 ], [ 114.77660322, 31.03522187 ], [ 114.77651844, 31.03472649 ], [ 114.77617797, 31.03399638 ], [ 114.77580996, 31.03368011 ], [ 114.77493178, 31.03321337 ], [ 114.77394417, 31.0328366 ], [ 114.77363946, 31.03282511 ], [ 114.77209771, 31.03331973 ], [ 114.77154195, 31.03366161 ], [ 114.77043632, 31.03416978 ], [ 114.7695765, 31.03442362 ], [ 114.76855841, 31.0345243 ], [ 114.76700778, 31.03502039 ], [ 114.76637771, 31.03539394 ], [ 114.76534785, 31.03586883 ], [ 114.76425218, 31.03599789 ], [ 114.7637082, 31.0361658 ], [ 114.76320451, 31.03621327 ], [ 114.76231186, 31.03605534 ], [ 114.76147091, 31.03598783 ], [ 114.76067375, 31.03579218 ], [ 114.7601538, 31.03557989 ], [ 114.75991032, 31.03538561 ], [ 114.7593556, 31.03473409 ], [ 114.7588139, 31.03383784 ], [ 114.75879832, 31.03344833 ], [ 114.75911617, 31.03285667 ], [ 114.76080568, 31.03127258 ], [ 114.76119962, 31.0309579 ], [ 114.76196993, 31.03049704 ], [ 114.76258816, 31.03028986 ], [ 114.76316985, 31.02999986 ], [ 114.76430809, 31.02897232 ], [ 114.76498976, 31.02801356 ], [ 114.76504261, 31.02737786 ], [ 114.7649243, 31.02688749 ], [ 114.76413647, 31.02561713 ], [ 114.76379802, 31.025116 ], [ 114.76300991, 31.02422276 ], [ 114.76152633, 31.02303189 ], [ 114.76080214, 31.02262712 ], [ 114.76025195, 31.02222119 ], [ 114.75974155, 31.02177202 ], [ 114.75922613, 31.0211817 ], [ 114.75727565, 31.01960299 ], [ 114.75692242, 31.01937824 ], [ 114.75629742, 31.01919023 ], [ 114.75541966, 31.01873558 ], [ 114.75381193, 31.01744394 ], [ 114.75342501, 31.01680255 ], [ 114.75323001, 31.01574213 ], [ 114.75173621, 31.01331154 ], [ 114.7516544, 31.01253218 ], [ 114.75183711, 31.01182098 ], [ 114.75184048, 31.01139608 ], [ 114.75178024, 31.01112418 ], [ 114.751352, 31.0101675 ], [ 114.75127611, 31.00975165 ], [ 114.75129824, 31.00940024 ], [ 114.7515482, 31.00864534 ], [ 114.75227074, 31.00726129 ], [ 114.75259397, 31.00689238 ], [ 114.75299991, 31.0066163 ], [ 114.7538299, 31.0064868 ], [ 114.75413193, 31.00636783 ], [ 114.7550345, 31.00559005 ], [ 114.7556888, 31.0049301 ], [ 114.75599402, 31.00426371 ], [ 114.75600768, 31.00301175 ], [ 114.75620042, 31.00216605 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012AT00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800129T00000,AFA9800121TH0000", "TRVCD": "AFA980012BT00000", "INDCD": "QFA9800129T00000", "ONDCD": "QFA980012AT00000", "BWSCD": "WFA980012AT00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 12.0, "RVLEN": 5814.0, "RVSLP": 0.0, "IELV": 29.89, "OELV": 30.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75620042, 31.00216605 ], [ 114.7571361, 31.00106541 ], [ 114.75796763, 31.00032365 ], [ 114.7586546, 30.9998786 ], [ 114.75889684, 30.99957204 ], [ 114.75896155, 30.99908348 ], [ 114.75886932, 30.99660624 ], [ 114.7590545, 30.99582449 ], [ 114.75907607, 30.99531582 ], [ 114.75900434, 30.99474049 ], [ 114.75871587, 30.9942251 ], [ 114.75708596, 30.99283665 ], [ 114.75669571, 30.99227369 ], [ 114.75648126, 30.99137554 ], [ 114.75576635, 30.99012968 ], [ 114.75571246, 30.98963747 ], [ 114.75584345, 30.98922794 ], [ 114.7566476, 30.98848963 ], [ 114.75767829, 30.98800286 ], [ 114.7580819, 30.98791436 ], [ 114.7590365, 30.98787308 ], [ 114.75972032, 30.98789824 ], [ 114.76138208, 30.98832996 ], [ 114.76284831, 30.98907827 ], [ 114.76352999, 30.98911604 ], [ 114.76439235, 30.98905468 ], [ 114.76476206, 30.98888552 ], [ 114.76518769, 30.98848731 ], [ 114.76572038, 30.98771817 ], [ 114.7658152, 30.98729986 ], [ 114.76579236, 30.9865559 ], [ 114.76569228, 30.98614199 ], [ 114.76444578, 30.98488162 ], [ 114.76385631, 30.98463065 ], [ 114.76326903, 30.98459757 ], [ 114.76285632, 30.98467107 ], [ 114.76195614, 30.98505572 ], [ 114.76162497, 30.98509397 ], [ 114.76129916, 30.98505057 ], [ 114.760872, 30.98479425 ], [ 114.76051959, 30.98444079 ], [ 114.76024639, 30.98399039 ], [ 114.75996552, 30.98331611 ], [ 114.75987936, 30.98282203 ], [ 114.75984642, 30.98170225 ], [ 114.76011606, 30.98021862 ], [ 114.76070553, 30.97900754 ], [ 114.76104559, 30.97755609 ], [ 114.7613923, 30.9769516 ], [ 114.76152566, 30.97589863 ], [ 114.7617616, 30.97557356 ], [ 114.76275363, 30.9746314 ], [ 114.76287155, 30.97443512 ], [ 114.76289228, 30.97418369 ], [ 114.76246625, 30.97347593 ], [ 114.76228725, 30.97248863 ], [ 114.76190238, 30.97169103 ], [ 114.76118835, 30.97109533 ], [ 114.76059994, 30.97078812 ], [ 114.75884843, 30.96962954 ], [ 114.75845309, 30.96909702 ], [ 114.7582773, 30.96851992 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012EP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA980012DP00000", "TRVCD": "AFA980012FP00000", "INDCD": "QFA980012DP00000", "ONDCD": "QFA980012EP00000", "BWSCD": "WFA980012EP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 16.0, "RVLEN": 1644.0, "RVSLP": 0.001, "IELV": 56.83, "OELV": 50.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07234994, 31.13538758 ], [ 115.07217387, 31.13513553 ], [ 115.07165009, 31.13475825 ], [ 115.07096563, 31.1338715 ], [ 115.07011237, 31.1333698 ], [ 115.06794441, 31.13164374 ], [ 115.06745198, 31.13131953 ], [ 115.06380813, 31.12989744 ], [ 115.06293847, 31.12967499 ], [ 115.06163923, 31.12945089 ], [ 115.05938583, 31.12950386 ], [ 115.05850638, 31.12931597 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201F0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98202F0000000", "INDCD": "-1", "ONDCD": "QFA98201F0000000", "BWSCD": "WFA98201F0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5572.0, "RVSLP": 0.0073, "IELV": 122.49, "OELV": 70.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82287321, 31.36337803 ], [ 114.82284121, 31.36297029 ], [ 114.82269064, 31.36260531 ], [ 114.82237374, 31.36230401 ], [ 114.82201154, 31.3621079 ], [ 114.82160912, 31.36209727 ], [ 114.82009818, 31.36251822 ], [ 114.8195964, 31.36254636 ], [ 114.81874159, 31.36224256 ], [ 114.81813596, 31.36185817 ], [ 114.8179417, 31.36159821 ], [ 114.81786495, 31.36135235 ], [ 114.81792589, 31.36089765 ], [ 114.81773219, 31.3601336 ], [ 114.81773825, 31.35940293 ], [ 114.81796807, 31.35902429 ], [ 114.81864828, 31.35866386 ], [ 114.81888509, 31.35834217 ], [ 114.81897014, 31.35792598 ], [ 114.81893374, 31.35726201 ], [ 114.81876627, 31.35685735 ], [ 114.81826534, 31.35625534 ], [ 114.81765616, 31.35567435 ], [ 114.81733832, 31.35516205 ], [ 114.81717565, 31.35378821 ], [ 114.81667998, 31.35262889 ], [ 114.81648964, 31.35183376 ], [ 114.81661386, 31.35159385 ], [ 114.81696577, 31.35123796 ], [ 114.81735584, 31.35091585 ], [ 114.81761504, 31.3508083 ], [ 114.81793433, 31.35095574 ], [ 114.81838952, 31.35148377 ], [ 114.8187841, 31.35181347 ], [ 114.81981823, 31.35235955 ], [ 114.82048301, 31.35237584 ], [ 114.82126449, 31.35212241 ], [ 114.82151992, 31.35194981 ], [ 114.82177581, 31.35151212 ], [ 114.82183049, 31.35109682 ], [ 114.82132773, 31.34964005 ], [ 114.821328, 31.34925549 ], [ 114.82155794, 31.34893607 ], [ 114.82244553, 31.3481202 ], [ 114.82274621, 31.34774799 ], [ 114.82294976, 31.34734628 ], [ 114.82330434, 31.34626951 ], [ 114.82366185, 31.34551772 ], [ 114.82387221, 31.3446218 ], [ 114.82386166, 31.34443891 ], [ 114.82345807, 31.34381648 ], [ 114.82203343, 31.34266512 ], [ 114.82154421, 31.3423222 ], [ 114.82021066, 31.34163539 ], [ 114.81949543, 31.34103459 ], [ 114.8193599, 31.34077198 ], [ 114.8191817, 31.34000606 ], [ 114.81795807, 31.33801714 ], [ 114.81749634, 31.33674601 ], [ 114.81686492, 31.33594803 ], [ 114.81504432, 31.33447982 ], [ 114.8143657, 31.3341796 ], [ 114.81365269, 31.33397172 ], [ 114.81278979, 31.33327942 ], [ 114.81246881, 31.33276593 ], [ 114.81240825, 31.33249694 ], [ 114.8124226, 31.33220595 ], [ 114.81262189, 31.33143565 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98203H0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98202H0000000", "TRVCD": "AFA98204H0000000", "INDCD": "QFA98202H0000000", "ONDCD": "QFA98203H0000000", "BWSCD": "WFA98203H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 7626.0, "RVSLP": 0.0009, "IELV": 57.17, "OELV": 49.3, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9513236, 31.21598761 ], [ 114.95062071, 31.21522167 ], [ 114.95023415, 31.21489828 ], [ 114.9499461, 31.2147417 ], [ 114.94915353, 31.21453584 ], [ 114.94735155, 31.21452249 ], [ 114.946374, 31.21435605 ], [ 114.94568909, 31.21440826 ], [ 114.94506673, 31.21458828 ], [ 114.94469262, 31.21452794 ], [ 114.94452041, 31.21438624 ], [ 114.94428008, 31.21402133 ], [ 114.94405728, 31.21349215 ], [ 114.94339382, 31.21238961 ], [ 114.94307745, 31.21165131 ], [ 114.94303175, 31.2110856 ], [ 114.94315647, 31.21074387 ], [ 114.943497, 31.21037212 ], [ 114.9438895, 31.21006392 ], [ 114.94418182, 31.2099784 ], [ 114.94472782, 31.2100782 ], [ 114.94608993, 31.21014587 ], [ 114.94714243, 31.21084621 ], [ 114.94796992, 31.21120674 ], [ 114.94883241, 31.21172993 ], [ 114.94915183, 31.21175365 ], [ 114.9493779, 31.21168118 ], [ 114.94962555, 31.21148119 ], [ 114.94975425, 31.21128455 ], [ 114.9497998, 31.21101531 ], [ 114.94976424, 31.21074049 ], [ 114.94948419, 31.21021295 ], [ 114.94889823, 31.20933564 ], [ 114.94824667, 31.20869249 ], [ 114.94792808, 31.20818191 ], [ 114.94782699, 31.2076144 ], [ 114.94781555, 31.20664712 ], [ 114.9479005, 31.20637569 ], [ 114.9482211, 31.20600007 ], [ 114.94867589, 31.20561963 ], [ 114.94930781, 31.20522594 ], [ 114.94991432, 31.20464329 ], [ 114.9506559, 31.20357818 ], [ 114.95120441, 31.20296042 ], [ 114.95173808, 31.20212561 ], [ 114.95182537, 31.20142337 ], [ 114.95196986, 31.20092424 ], [ 114.95200802, 31.19990564 ], [ 114.95214626, 31.19934809 ], [ 114.95193806, 31.19860009 ], [ 114.95188694, 31.19808691 ], [ 114.95188293, 31.19734169 ], [ 114.95200039, 31.19666364 ], [ 114.95175024, 31.19630803 ], [ 114.95030186, 31.19509405 ], [ 114.9499938, 31.19443899 ], [ 114.94994168, 31.19410991 ], [ 114.94999804, 31.19391177 ], [ 114.95028534, 31.1934402 ], [ 114.9504401, 31.19283412 ], [ 114.95062083, 31.19257205 ], [ 114.95106671, 31.19220916 ], [ 114.95186861, 31.19200337 ], [ 114.95228015, 31.19172845 ], [ 114.95306305, 31.1909541 ], [ 114.95351163, 31.19011046 ], [ 114.95356, 31.1899137 ], [ 114.95352163, 31.18972577 ], [ 114.95285925, 31.18863183 ], [ 114.95257246, 31.18796223 ], [ 114.9525439, 31.1877001 ], [ 114.95264238, 31.18743626 ], [ 114.95312028, 31.1869859 ], [ 114.9535898, 31.18684697 ], [ 114.95438772, 31.18695552 ], [ 114.95508173, 31.18680318 ], [ 114.95584941, 31.18677644 ], [ 114.95728233, 31.18713153 ], [ 114.95770242, 31.18715444 ], [ 114.9581158, 31.18709551 ], [ 114.95840266, 31.18694429 ], [ 114.95943503, 31.18606885 ], [ 114.96049579, 31.18586311 ], [ 114.96160492, 31.1853536 ], [ 114.96199209, 31.18503349 ], [ 114.96222832, 31.18470781 ], [ 114.96228996, 31.18421544 ], [ 114.96219442, 31.18365024 ], [ 114.96192575, 31.18319845 ], [ 114.96156172, 31.18276012 ], [ 114.9613442, 31.18232165 ], [ 114.96113181, 31.1820817 ], [ 114.96086172, 31.18190226 ], [ 114.96024584, 31.18168983 ], [ 114.95878955, 31.18163687 ], [ 114.95842541, 31.1814359 ], [ 114.95813214, 31.18115979 ], [ 114.95804709, 31.18097429 ], [ 114.9580639, 31.18078632 ], [ 114.95863587, 31.17964775 ], [ 114.95882917, 31.17904334 ], [ 114.95882627, 31.17879769 ], [ 114.95853217, 31.17844123 ], [ 114.95702852, 31.17725444 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98205H0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98204H0000000,AFA98201HB000000", "TRVCD": "AFA98206H0000000", "INDCD": "QFA98204H0000000", "ONDCD": "QFA98205H0000000", "BWSCD": "WFA98205H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 3659.0, "RVSLP": 0.0014, "IELV": 49.88, "OELV": 45.78, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9519719, 31.16863472 ], [ 114.95108554, 31.16795034 ], [ 114.95035961, 31.16755608 ], [ 114.94991838, 31.16717013 ], [ 114.94932181, 31.1663699 ], [ 114.94918237, 31.16505851 ], [ 114.94891768, 31.16453014 ], [ 114.94851985, 31.16414228 ], [ 114.94791834, 31.16388441 ], [ 114.94726061, 31.16385424 ], [ 114.94612404, 31.16429064 ], [ 114.94466811, 31.16440319 ], [ 114.94443864, 31.16448684 ], [ 114.94370391, 31.16498217 ], [ 114.94295555, 31.16496415 ], [ 114.94138019, 31.16536764 ], [ 114.94081304, 31.16530608 ], [ 114.9397241, 31.16470381 ], [ 114.93908671, 31.16414446 ], [ 114.93835241, 31.16302925 ], [ 114.93798847, 31.1625936 ], [ 114.93738172, 31.16120689 ], [ 114.93739224, 31.16095396 ], [ 114.93756995, 31.16042052 ], [ 114.93798232, 31.15968569 ], [ 114.9380012, 31.15903038 ], [ 114.93789805, 31.15854407 ], [ 114.93720513, 31.15768679 ], [ 114.93611957, 31.15686216 ], [ 114.93556954, 31.15670239 ], [ 114.93460448, 31.15624518 ], [ 114.93420652, 31.1561619 ], [ 114.93379442, 31.15619793 ], [ 114.93316596, 31.15637975 ], [ 114.93223427, 31.15647878 ], [ 114.92989547, 31.15738182 ], [ 114.92957649, 31.15736609 ], [ 114.92873194, 31.15706782 ], [ 114.92743645, 31.15681526 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121I00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122I00000", "INDCD": "-1", "ONDCD": "QFA9900121I00000", "BWSCD": "WFA9900121I00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6000.0, "RVSLP": 0.0068, "IELV": 132.02, "OELV": 105.23, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40147378, 31.15903497 ], [ 115.40142781, 31.15790785 ], [ 115.40130431, 31.15742077 ], [ 115.40078235, 31.15660359 ], [ 115.39984, 31.15552174 ], [ 115.39949699, 31.15502098 ], [ 115.39923447, 31.15457007 ], [ 115.39879605, 31.15351566 ], [ 115.39852214, 31.15306975 ], [ 115.39816807, 31.15271594 ], [ 115.39721066, 31.15197008 ], [ 115.39647982, 31.15157003 ], [ 115.39550425, 31.15085846 ], [ 115.39485472, 31.15053193 ], [ 115.39476354, 31.14994832 ], [ 115.39495818, 31.14909187 ], [ 115.39491028, 31.14853022 ], [ 115.39446862, 31.14773423 ], [ 115.39401753, 31.14668647 ], [ 115.39359579, 31.14596209 ], [ 115.39298762, 31.14456211 ], [ 115.39236435, 31.1427118 ], [ 115.39222095, 31.14086478 ], [ 115.39184227, 31.13955211 ], [ 115.3915804, 31.13924111 ], [ 115.38984743, 31.13781529 ], [ 115.38924484, 31.13709309 ], [ 115.38851003, 31.13597827 ], [ 115.3878956, 31.13526168 ], [ 115.38734953, 31.13474207 ], [ 115.38704583, 31.13431152 ], [ 115.38674977, 31.13378831 ], [ 115.38656571, 31.13296005 ], [ 115.38583182, 31.1312711 ], [ 115.38568591, 31.13034764 ], [ 115.38539798, 31.12983285 ], [ 115.38393373, 31.12853845 ], [ 115.38340256, 31.1273557 ], [ 115.38277957, 31.12641308 ], [ 115.38174381, 31.12552231 ], [ 115.3807963, 31.12439038 ], [ 115.3792187, 31.12306534 ], [ 115.37861585, 31.122344 ], [ 115.37804546, 31.12146452 ], [ 115.37762196, 31.12063419 ], [ 115.37735355, 31.12032818 ], [ 115.37653835, 31.11969415 ], [ 115.37574034, 31.11924742 ], [ 115.37341523, 31.11745093 ], [ 115.372849, 31.11737825 ], [ 115.37180496, 31.11763871 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121L00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122L00000", "INDCD": "-1", "ONDCD": "QFA9900121L00000", "BWSCD": "WFA9900121L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5234.0, "RVSLP": 0.024, "IELV": 233.53, "OELV": 109.93, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26528478, 30.99159189 ], [ 115.26533203, 30.99295176 ], [ 115.26539024, 30.99320767 ], [ 115.2654989, 30.9933523 ], [ 115.26590436, 30.99354993 ], [ 115.26678166, 30.99375381 ], [ 115.26807549, 30.99374585 ], [ 115.26847487, 30.99380309 ], [ 115.26875618, 30.99403382 ], [ 115.26929663, 30.99499797 ], [ 115.26968212, 30.99531556 ], [ 115.26997763, 30.99543579 ], [ 115.27029671, 30.99542936 ], [ 115.27083711, 30.99526129 ], [ 115.27134207, 30.99522142 ], [ 115.27328075, 30.99557811 ], [ 115.27465446, 30.99552212 ], [ 115.27495364, 30.9953976 ], [ 115.27532182, 30.99506441 ], [ 115.27549626, 30.99479402 ], [ 115.27564511, 30.99419394 ], [ 115.27577997, 30.99404041 ], [ 115.27597168, 30.99398789 ], [ 115.27625081, 30.99408488 ], [ 115.27736019, 30.99488868 ], [ 115.27842723, 30.99503173 ], [ 115.27938194, 30.99550786 ], [ 115.27989915, 30.99593239 ], [ 115.28045548, 30.99673219 ], [ 115.28076564, 30.99698803 ], [ 115.28106963, 30.99709143 ], [ 115.28190436, 30.99717384 ], [ 115.28248848, 30.99747407 ], [ 115.28285361, 30.99759017 ], [ 115.28318442, 30.9975199 ], [ 115.28394977, 30.99688374 ], [ 115.28460618, 30.99658557 ], [ 115.28492615, 30.9965724 ], [ 115.28653397, 30.99690584 ], [ 115.28709829, 30.99684104 ], [ 115.28747339, 30.99654573 ], [ 115.28821261, 30.99548359 ], [ 115.2885279, 30.99533567 ], [ 115.28904777, 30.99548328 ], [ 115.28933958, 30.99564259 ], [ 115.28973218, 30.99596771 ], [ 115.29012383, 30.996451 ], [ 115.29056764, 30.99685078 ], [ 115.29091182, 30.99708308 ], [ 115.29120576, 30.99714975 ], [ 115.29171807, 30.99697008 ], [ 115.29236775, 30.99662866 ], [ 115.29352611, 30.99565463 ], [ 115.29439789, 30.99542752 ], [ 115.2955458, 30.9948431 ], [ 115.29579239, 30.99453803 ], [ 115.29614968, 30.99346094 ], [ 115.29646046, 30.99277779 ], [ 115.29658386, 30.99163856 ], [ 115.29694847, 30.99097408 ], [ 115.297434, 30.99050645 ], [ 115.29777761, 30.99028381 ], [ 115.29886515, 30.99014558 ], [ 115.29929812, 30.98992835 ], [ 115.30173158, 30.98764887 ], [ 115.30253606, 30.98666429 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9700121Z00000", "RVNM": "倒水", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA970012U000000", "INDCD": "-1", "ONDCD": "QFA970012T000000", "BWSCD": "WFA9700121Z00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6893.0, "RVSLP": 0.0004, "IELV": 36.68, "OELV": 30.01, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.69522588, 31.01801693 ], [ 114.6942806, 31.01807836 ], [ 114.69385984, 31.01833795 ], [ 114.69329762, 31.01894643 ], [ 114.6930408, 31.01976568 ], [ 114.69256765, 31.0202145 ], [ 114.69092227, 31.02070178 ], [ 114.68985148, 31.02128351 ], [ 114.68910359, 31.02135196 ], [ 114.68846219, 31.02120879 ], [ 114.68762648, 31.02113222 ], [ 114.68696582, 31.02080453 ], [ 114.68627164, 31.02057043 ], [ 114.68455181, 31.02062122 ], [ 114.68425112, 31.02074431 ], [ 114.68393204, 31.02100831 ], [ 114.68272189, 31.02256591 ], [ 114.68234162, 31.02286053 ], [ 114.68135361, 31.02304197 ], [ 114.68067934, 31.02257171 ], [ 114.68027125, 31.02253019 ], [ 114.67985376, 31.02257641 ], [ 114.67918846, 31.02288138 ], [ 114.67819824, 31.02364933 ], [ 114.67721614, 31.02383321 ], [ 114.67665853, 31.02416807 ], [ 114.67606196, 31.02442199 ], [ 114.67495012, 31.02450442 ], [ 114.67464164, 31.02458177 ], [ 114.67440094, 31.02483693 ], [ 114.67357176, 31.02677354 ], [ 114.67338206, 31.02701849 ], [ 114.67319448, 31.02714959 ], [ 114.67297783, 31.02719635 ], [ 114.67214614, 31.02693962 ], [ 114.67185897, 31.02694397 ], [ 114.67168269, 31.02706051 ], [ 114.67113394, 31.02771237 ], [ 114.67071961, 31.02797015 ], [ 114.67014393, 31.0279984 ], [ 114.66952412, 31.0277884 ], [ 114.66892625, 31.02751961 ], [ 114.66787685, 31.02680555 ], [ 114.66729639, 31.02675757 ], [ 114.66680913, 31.02686143 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121I00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012E000000", "INDCD": "-1", "ONDCD": "QFA980012D000000", "BWSCD": "WFA9800121I00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 10439.0, "RVSLP": 0.0041, "IELV": 132.32, "OELV": 67.32, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03367341, 31.41727748 ], [ 115.03405515, 31.41696176 ], [ 115.03489305, 31.4164255 ], [ 115.03628796, 31.41574588 ], [ 115.0366146, 31.41540937 ], [ 115.0366698, 31.41508667 ], [ 115.03647826, 31.41453766 ], [ 115.03644052, 31.41404103 ], [ 115.03660067, 31.41340187 ], [ 115.03664548, 31.41231403 ], [ 115.03687533, 31.41162774 ], [ 115.03755358, 31.4107463 ], [ 115.03801542, 31.40989322 ], [ 115.03840606, 31.40896989 ], [ 115.03918773, 31.40811004 ], [ 115.03991001, 31.40695207 ], [ 115.04029128, 31.40557361 ], [ 115.04053197, 31.40512237 ], [ 115.04069268, 31.40496607 ], [ 115.04090799, 31.40487634 ], [ 115.04132819, 31.40482588 ], [ 115.04202355, 31.40482295 ], [ 115.04234984, 31.40488451 ], [ 115.04295375, 31.40514394 ], [ 115.04378245, 31.40574409 ], [ 115.04492633, 31.406428 ], [ 115.04580053, 31.40689133 ], [ 115.04686872, 31.40730197 ], [ 115.04745976, 31.40734411 ], [ 115.04805815, 31.4072826 ], [ 115.04892239, 31.40699756 ], [ 115.04924936, 31.40671434 ], [ 115.04928051, 31.40660333 ], [ 115.04920355, 31.40643597 ], [ 115.04820542, 31.40539221 ], [ 115.04765068, 31.4049944 ], [ 115.04679768, 31.40469384 ], [ 115.04646333, 31.40444031 ], [ 115.04626177, 31.40419036 ], [ 115.04616442, 31.4037777 ], [ 115.04613803, 31.40287819 ], [ 115.04631954, 31.40202345 ], [ 115.04630553, 31.40168079 ], [ 115.04582851, 31.40075554 ], [ 115.04554566, 31.39992802 ], [ 115.04551791, 31.39966566 ], [ 115.04571583, 31.39927701 ], [ 115.04616166, 31.39893019 ], [ 115.04638759, 31.39888308 ], [ 115.04701606, 31.39897646 ], [ 115.04725016, 31.39893176 ], [ 115.04744989, 31.39881128 ], [ 115.04769148, 31.39850766 ], [ 115.04783826, 31.39789903 ], [ 115.04801567, 31.39763306 ], [ 115.0484556, 31.39725416 ], [ 115.04932194, 31.3968022 ], [ 115.04955352, 31.39652235 ], [ 115.04971975, 31.39612375 ], [ 115.04966776, 31.39581587 ], [ 115.04951764, 31.39565082 ], [ 115.04890187, 31.39526202 ], [ 115.04878004, 31.39508966 ], [ 115.04877624, 31.394932 ], [ 115.04902501, 31.39471838 ], [ 115.04977994, 31.39460341 ], [ 115.04999356, 31.39451567 ], [ 115.05013206, 31.39435629 ], [ 115.05016391, 31.39411415 ], [ 115.04992013, 31.39359438 ], [ 115.04922565, 31.39251043 ], [ 115.04916215, 31.39219578 ], [ 115.04942055, 31.39170386 ], [ 115.05027472, 31.39127125 ], [ 115.05048253, 31.39104013 ], [ 115.05054639, 31.3907856 ], [ 115.05044636, 31.39045458 ], [ 115.04981208, 31.38942235 ], [ 115.04865318, 31.38675563 ], [ 115.04848643, 31.38576821 ], [ 115.04789387, 31.38398376 ], [ 115.0473643, 31.38308456 ], [ 115.04697174, 31.38267466 ], [ 115.04594987, 31.38188509 ], [ 115.04564636, 31.38175971 ], [ 115.04464451, 31.38164521 ], [ 115.04422653, 31.38137157 ], [ 115.04396395, 31.38106153 ], [ 115.04386744, 31.38035602 ], [ 115.04400151, 31.37959625 ], [ 115.04372596, 31.37865518 ], [ 115.04343626, 31.37798804 ], [ 115.0425957, 31.37643395 ], [ 115.04217812, 31.37602727 ], [ 115.04081893, 31.37495026 ], [ 115.04055839, 31.37464091 ], [ 115.04045551, 31.37415762 ], [ 115.04039374, 31.37257574 ], [ 115.04033201, 31.37230152 ], [ 115.0402151, 31.37211155 ], [ 115.03989739, 31.37186884 ], [ 115.03926918, 31.37168366 ], [ 115.03758246, 31.37081411 ], [ 115.03594813, 31.36954584 ], [ 115.03532989, 31.36897552 ], [ 115.03426719, 31.36735777 ], [ 115.03300216, 31.36633614 ], [ 115.03270448, 31.3661981 ], [ 115.03190846, 31.36600594 ], [ 115.03054381, 31.36597225 ], [ 115.03034615, 31.36587058 ], [ 115.03022093, 31.36570226 ], [ 115.03013769, 31.36521442 ], [ 115.03005447, 31.36280409 ], [ 115.03038585, 31.36140762 ], [ 115.03057037, 31.36113006 ], [ 115.03132152, 31.36052994 ], [ 115.03204379, 31.36015768 ], [ 115.03254387, 31.36008178 ], [ 115.03455368, 31.36001538 ], [ 115.03487772, 31.35994352 ], [ 115.03508173, 31.35981749 ], [ 115.03529307, 31.35958226 ], [ 115.03536999, 31.3593819 ], [ 115.03536967, 31.35872805 ], [ 115.03525304, 31.35835997 ], [ 115.03479648, 31.35775364 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121L00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122L00000", "INDCD": "-1", "ONDCD": "QFA9800121L00000", "BWSCD": "WFA9800121L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5634.0, "RVSLP": 0.0539, "IELV": 477.08, "OELV": 112.33, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1367058, 31.35511595 ], [ 115.13665437, 31.35441853 ], [ 115.13650592, 31.35411208 ], [ 115.13571012, 31.35346328 ], [ 115.13509999, 31.35321006 ], [ 115.13486227, 31.35317211 ], [ 115.13454623, 31.35322036 ], [ 115.13398169, 31.35354551 ], [ 115.13304233, 31.35385823 ], [ 115.13236443, 31.35387654 ], [ 115.13197829, 31.35373029 ], [ 115.13116201, 31.35308878 ], [ 115.13058224, 31.35243654 ], [ 115.12935413, 31.35137823 ], [ 115.12838955, 31.3510348 ], [ 115.12783462, 31.35065275 ], [ 115.12756987, 31.35035616 ], [ 115.12664301, 31.34891376 ], [ 115.12615648, 31.34844881 ], [ 115.1244444, 31.34711019 ], [ 115.12346419, 31.3466763 ], [ 115.12310634, 31.3464559 ], [ 115.12264149, 31.34607491 ], [ 115.12218426, 31.34554568 ], [ 115.12192795, 31.34534001 ], [ 115.12094962, 31.3449123 ], [ 115.12066469, 31.34472963 ], [ 115.11992793, 31.34413048 ], [ 115.1194704, 31.34359637 ], [ 115.11901695, 31.34321893 ], [ 115.11799235, 31.34266771 ], [ 115.11746008, 31.34244978 ], [ 115.11691789, 31.34226561 ], [ 115.11609964, 31.34212003 ], [ 115.11511767, 31.34145059 ], [ 115.11386568, 31.34080133 ], [ 115.11302698, 31.34021368 ], [ 115.11206605, 31.33998762 ], [ 115.11142094, 31.33948829 ], [ 115.1107018, 31.33914962 ], [ 115.11043876, 31.33895419 ], [ 115.1102647, 31.33870423 ], [ 115.11019041, 31.33828109 ], [ 115.11020721, 31.33761919 ], [ 115.11035809, 31.33705843 ], [ 115.11032184, 31.33680024 ], [ 115.11001056, 31.33629228 ], [ 115.1092437, 31.3356115 ], [ 115.10905679, 31.33529268 ], [ 115.1090385, 31.33495163 ], [ 115.10921572, 31.33424328 ], [ 115.1091464, 31.33368593 ], [ 115.10882486, 31.3331736 ], [ 115.10795754, 31.33236968 ], [ 115.10738198, 31.33112201 ], [ 115.10713206, 31.33075215 ], [ 115.10655156, 31.33015994 ], [ 115.10616223, 31.32891619 ], [ 115.10600502, 31.32738394 ], [ 115.10554644, 31.32651633 ], [ 115.10546632, 31.32610432 ], [ 115.10556016, 31.32562312 ], [ 115.10624738, 31.32488746 ], [ 115.10639627, 31.32456816 ], [ 115.1063564, 31.32431776 ], [ 115.10598426, 31.32380145 ], [ 115.10589819, 31.32353569 ], [ 115.10581265, 31.32203988 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121N00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122N00000", "INDCD": "-1", "ONDCD": "QFA9800121N00000", "BWSCD": "WFA9800121N00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6839.0, "RVSLP": 0.0025, "IELV": 70.0, "OELV": 50.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99519965, 31.19215583 ], [ 114.99615648, 31.19131962 ], [ 114.99713564, 31.19112583 ], [ 114.99770228, 31.19081494 ], [ 114.99800565, 31.19074244 ], [ 114.99831617, 31.19079763 ], [ 114.99882899, 31.19105048 ], [ 114.99924011, 31.1911038 ], [ 114.99974245, 31.19104808 ], [ 115.00047619, 31.19076212 ], [ 115.00067834, 31.19075166 ], [ 115.00114616, 31.19103849 ], [ 115.00180439, 31.19171402 ], [ 115.00199025, 31.19182071 ], [ 115.00306905, 31.19168714 ], [ 115.00362483, 31.19181098 ], [ 115.00464131, 31.19185356 ], [ 115.00553206, 31.19200949 ], [ 115.01359579, 31.19172759 ], [ 115.0139219, 31.19166428 ], [ 115.01443751, 31.19142927 ], [ 115.01494646, 31.19100679 ], [ 115.01638606, 31.18912789 ], [ 115.01685835, 31.1882005 ], [ 115.01704208, 31.1873763 ], [ 115.01704332, 31.18712372 ], [ 115.01664229, 31.18633961 ], [ 115.01649785, 31.18564386 ], [ 115.01631169, 31.18515596 ], [ 115.01620339, 31.18421357 ], [ 115.0159858, 31.18358763 ], [ 115.0158607, 31.18257777 ], [ 115.01563741, 31.18195175 ], [ 115.01560524, 31.18100637 ], [ 115.01589499, 31.18011159 ], [ 115.01706805, 31.17788519 ], [ 115.01794952, 31.17698244 ], [ 115.01818404, 31.17665566 ], [ 115.0182456, 31.17631224 ], [ 115.0182249, 31.17571643 ], [ 115.01801657, 31.17469012 ], [ 115.01834645, 31.17388229 ], [ 115.01867961, 31.17242044 ], [ 115.0188637, 31.1721696 ], [ 115.01920072, 31.1719659 ], [ 115.02029796, 31.17183776 ], [ 115.02170591, 31.17122454 ], [ 115.02271759, 31.17111031 ], [ 115.02309558, 31.17097214 ], [ 115.02338401, 31.17069558 ], [ 115.02363047, 31.17023775 ], [ 115.02398368, 31.16892177 ], [ 115.02413561, 31.1686635 ], [ 115.02444228, 31.16841022 ], [ 115.02538363, 31.16791636 ], [ 115.02630381, 31.16703972 ], [ 115.02642689, 31.16670218 ], [ 115.02639954, 31.16620591 ], [ 115.02604694, 31.16518021 ], [ 115.02562788, 31.16445293 ], [ 115.02533357, 31.16378204 ], [ 115.02524981, 31.16336181 ], [ 115.02526683, 31.16286379 ], [ 115.02544641, 31.1625659 ], [ 115.02610849, 31.16217044 ], [ 115.02663955, 31.16166525 ], [ 115.02718187, 31.1613143 ], [ 115.02738825, 31.16107379 ], [ 115.02755817, 31.16039801 ], [ 115.02834784, 31.15801487 ], [ 115.02840492, 31.15762547 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121T00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122T00000", "INDCD": "-1", "ONDCD": "QFA9800121T00000", "BWSCD": "WFA9800121T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2670.0, "RVSLP": 0.0006, "IELV": 74.04, "OELV": 71.86, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77206655, 31.25754445 ], [ 114.77245315, 31.25748631 ], [ 114.77346366, 31.25709532 ], [ 114.77472408, 31.25693416 ], [ 114.77537765, 31.25659626 ], [ 114.77604024, 31.25595352 ], [ 114.77661791, 31.25467657 ], [ 114.7768652, 31.25392364 ], [ 114.7768047, 31.25338802 ], [ 114.77635825, 31.25282236 ], [ 114.77615223, 31.25238575 ], [ 114.77622654, 31.25214003 ], [ 114.77673218, 31.25150572 ], [ 114.77679843, 31.25116216 ], [ 114.77676002, 31.25081134 ], [ 114.77667072, 31.25061619 ], [ 114.77644167, 31.25038804 ], [ 114.7752145, 31.24966493 ], [ 114.77481994, 31.24961363 ], [ 114.77411957, 31.24978156 ], [ 114.77372584, 31.24971769 ], [ 114.77227701, 31.24914594 ], [ 114.7716961, 31.2488238 ], [ 114.77093247, 31.24851194 ], [ 114.77010388, 31.24790984 ], [ 114.76991183, 31.24765804 ], [ 114.7698814, 31.24734222 ], [ 114.77052615, 31.24630175 ], [ 114.77075039, 31.24582958 ], [ 114.77080079, 31.24533565 ], [ 114.77073368, 31.24483637 ], [ 114.76997243, 31.24345801 ], [ 114.76912224, 31.24277424 ], [ 114.76857197, 31.24253591 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800121000000", "TRVCD": "AFA9800123000000", "INDCD": "QFA9800121000000", "ONDCD": "QFA9800122000000", "BWSCD": "WFA9800122000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3231.0, "RVSLP": 0.0055, "IELV": 178.7, "OELV": 157.62, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15691187, 31.57346925 ], [ 115.15739195, 31.57310016 ], [ 115.15832392, 31.57261981 ], [ 115.15891026, 31.57203676 ], [ 115.15938162, 31.57105126 ], [ 115.15936965, 31.57078995 ], [ 115.15920196, 31.5703738 ], [ 115.15914163, 31.56995247 ], [ 115.15917642, 31.56960371 ], [ 115.1594029, 31.5689165 ], [ 115.15979382, 31.56826458 ], [ 115.16096223, 31.56713439 ], [ 115.1610796, 31.56686423 ], [ 115.16108484, 31.56643968 ], [ 115.16096441, 31.5661079 ], [ 115.1606631, 31.56583217 ], [ 115.16004986, 31.56557812 ], [ 115.15940335, 31.56540952 ], [ 115.1585878, 31.56479996 ], [ 115.15800066, 31.56378183 ], [ 115.15707331, 31.56268709 ], [ 115.15644468, 31.56151358 ], [ 115.15635016, 31.56102302 ], [ 115.15633979, 31.56021087 ], [ 115.15696977, 31.55805372 ], [ 115.15699577, 31.55747605 ], [ 115.15693809, 31.55696995 ], [ 115.15632593, 31.55533841 ], [ 115.15587097, 31.55455218 ], [ 115.15557953, 31.55388335 ], [ 115.15525811, 31.55292407 ], [ 115.15509955, 31.55216212 ], [ 115.15481228, 31.55149119 ], [ 115.15435574, 31.55070584 ], [ 115.15406088, 31.54997637 ], [ 115.15400496, 31.54968377 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122G00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121G00000", "TRVCD": "AFA980012B000000", "INDCD": "QFA9800121G00000", "ONDCD": "QFA980012A000000", "BWSCD": "WFA9800122G00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6946.0, "RVSLP": 0.0046, "IELV": 139.01, "OELV": 77.31, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13755035, 31.39226666 ], [ 115.13698177, 31.39246596 ], [ 115.13661048, 31.39247327 ], [ 115.13636392, 31.39231042 ], [ 115.13613816, 31.39187945 ], [ 115.13592173, 31.39164067 ], [ 115.13564774, 31.39149586 ], [ 115.13535235, 31.39152803 ], [ 115.13496248, 31.39182293 ], [ 115.13471172, 31.39221869 ], [ 115.13471439, 31.39263754 ], [ 115.13490614, 31.39319415 ], [ 115.13487885, 31.39344039 ], [ 115.13468799, 31.39363427 ], [ 115.13430848, 31.39368245 ], [ 115.13169362, 31.39316592 ], [ 115.13084451, 31.39310828 ], [ 115.12996751, 31.39288473 ], [ 115.12956428, 31.3926114 ], [ 115.1289136, 31.39191187 ], [ 115.12788436, 31.39111211 ], [ 115.12699781, 31.39064713 ], [ 115.12652229, 31.39061346 ], [ 115.12623576, 31.390756 ], [ 115.12586834, 31.39109603 ], [ 115.12532563, 31.39200401 ], [ 115.12504982, 31.39231247 ], [ 115.12472649, 31.39257249 ], [ 115.12420977, 31.39281838 ], [ 115.1223198, 31.39305405 ], [ 115.12187007, 31.39300463 ], [ 115.12155184, 31.39304251 ], [ 115.12077432, 31.39328478 ], [ 115.11944035, 31.39388615 ], [ 115.11784914, 31.39432162 ], [ 115.11760067, 31.39451995 ], [ 115.11743772, 31.39477201 ], [ 115.11723238, 31.39539847 ], [ 115.11708127, 31.39631963 ], [ 115.11676399, 31.39668203 ], [ 115.11644486, 31.39683825 ], [ 115.11624204, 31.39678423 ], [ 115.115235, 31.39619569 ], [ 115.11412421, 31.39537969 ], [ 115.1132371, 31.39518002 ], [ 115.11256605, 31.39488754 ], [ 115.11224469, 31.39489058 ], [ 115.11144851, 31.3950836 ], [ 115.10953235, 31.39517421 ], [ 115.10865385, 31.39539817 ], [ 115.10743432, 31.39544829 ], [ 115.10693022, 31.3954024 ], [ 115.10551807, 31.39497166 ], [ 115.10444917, 31.39454753 ], [ 115.10389529, 31.39415013 ], [ 115.10333415, 31.39362806 ], [ 115.10205534, 31.39269463 ], [ 115.10068383, 31.39189467 ], [ 115.10018422, 31.39183851 ], [ 115.09711991, 31.39194427 ], [ 115.0965298, 31.39190175 ], [ 115.09522524, 31.39141492 ], [ 115.09466783, 31.39127171 ], [ 115.09407602, 31.39098365 ], [ 115.09351833, 31.39084049 ], [ 115.09176001, 31.39017161 ], [ 115.09040096, 31.38984141 ], [ 115.08955614, 31.38953609 ], [ 115.08867667, 31.3893158 ], [ 115.08783468, 31.38934429 ], [ 115.08697751, 31.38961888 ], [ 115.08616374, 31.38997968 ], [ 115.08460924, 31.39048308 ], [ 115.08349182, 31.39076588 ], [ 115.08317243, 31.39076789 ], [ 115.08266404, 31.39050169 ], [ 115.0803556, 31.38865133 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PHA000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PHA000,AFA9800121PHAA00", "TRVCD": "AFA9800124PH0000", "INDCD": "QFA9800121PHA000", "ONDCD": "QFA9800123PH0000", "BWSCD": "WFA9800122PHA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4107.0, "RVSLP": 0.0072, "IELV": 148.87, "OELV": 117.81, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24415755, 31.18521238 ], [ 115.2436113, 31.18497382 ], [ 115.24267592, 31.18424718 ], [ 115.24239151, 31.18394774 ], [ 115.24191235, 31.1830608 ], [ 115.24167045, 31.18288744 ], [ 115.24144372, 31.18285228 ], [ 115.23990835, 31.18316157 ], [ 115.23887924, 31.18364346 ], [ 115.23789108, 31.18422287 ], [ 115.23713181, 31.18442857 ], [ 115.23685947, 31.18436378 ], [ 115.23648233, 31.18405883 ], [ 115.23631238, 31.18379638 ], [ 115.23613774, 31.18326867 ], [ 115.23597976, 31.18311035 ], [ 115.23560247, 31.18301829 ], [ 115.23519844, 31.1830878 ], [ 115.23477604, 31.18345331 ], [ 115.23458563, 31.18404577 ], [ 115.2345821, 31.18424054 ], [ 115.23494226, 31.1851161 ], [ 115.23500074, 31.18545641 ], [ 115.23497573, 31.18565358 ], [ 115.23486889, 31.1858301 ], [ 115.23452587, 31.18598234 ], [ 115.23402845, 31.1859622 ], [ 115.23356214, 31.1857877 ], [ 115.2324355, 31.18501726 ], [ 115.23175157, 31.18477156 ], [ 115.23142905, 31.18478412 ], [ 115.23096969, 31.18493185 ], [ 115.23055172, 31.1849842 ], [ 115.22931837, 31.18481436 ], [ 115.22863556, 31.18486365 ], [ 115.22784115, 31.18507488 ], [ 115.22751013, 31.18505747 ], [ 115.22727899, 31.18497359 ], [ 115.22681571, 31.18461396 ], [ 115.22662492, 31.18428834 ], [ 115.2265037, 31.18219762 ], [ 115.22641811, 31.1817805 ], [ 115.22609866, 31.18126876 ], [ 115.22527309, 31.18053758 ], [ 115.22493392, 31.18003577 ], [ 115.22483433, 31.17969082 ], [ 115.22476202, 31.17873008 ], [ 115.2246477, 31.1783921 ], [ 115.22414164, 31.17784587 ], [ 115.22367886, 31.17754782 ], [ 115.2233083, 31.17721538 ], [ 115.22316567, 31.17695841 ], [ 115.22303102, 31.1764882 ], [ 115.22280491, 31.17609466 ], [ 115.22171172, 31.17469546 ], [ 115.21987228, 31.17326912 ], [ 115.21948046, 31.17323464 ], [ 115.21904426, 31.17342665 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123PH0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122PH0000", "TRVCD": "AFA9800124PH0000", "INDCD": "QFA9800122PH0000", "ONDCD": "QFA9800123PH0000", "BWSCD": "WFA9800123PH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 2849.0, "RVSLP": 0.0088, "IELV": 139.93, "OELV": 117.81, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22375635, 31.14983643 ], [ 115.22385921, 31.1523095 ], [ 115.22382713, 31.15266519 ], [ 115.22367731, 31.15316401 ], [ 115.22366277, 31.15367064 ], [ 115.22372412, 31.15417649 ], [ 115.22397616, 31.15494432 ], [ 115.22398838, 31.15604161 ], [ 115.22374355, 31.15679594 ], [ 115.22327667, 31.1577204 ], [ 115.22297848, 31.15823887 ], [ 115.22218619, 31.15931379 ], [ 115.22190838, 31.15984102 ], [ 115.22143326, 31.16127683 ], [ 115.22121666, 31.16218845 ], [ 115.22114214, 31.16289325 ], [ 115.22070416, 31.16449119 ], [ 115.21960487, 31.16668146 ], [ 115.21950762, 31.16767209 ], [ 115.21912773, 31.16841101 ], [ 115.21910405, 31.16957956 ], [ 115.21893178, 31.17028706 ], [ 115.21904426, 31.17342665 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800122A00000,AFA9800124000000", "TRVCD": "AFA9800126000000", "INDCD": "QFA9800124000000", "ONDCD": "QFA9800125000000", "BWSCD": "WFA9800125000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 1894.0, "RVSLP": 0.0028, "IELV": 118.38, "OELV": 115.4, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12597613, 31.5061624 ], [ 115.12547568, 31.50611424 ], [ 115.1248511, 31.50588707 ], [ 115.12414974, 31.50538409 ], [ 115.12371213, 31.5049815 ], [ 115.12356033, 31.50465012 ], [ 115.12347594, 31.50361912 ], [ 115.1233777, 31.50327395 ], [ 115.12285891, 31.50245478 ], [ 115.12192775, 31.5013656 ], [ 115.12179207, 31.50088506 ], [ 115.12168587, 31.49855978 ], [ 115.12172966, 31.49798766 ], [ 115.12202633, 31.49716205 ], [ 115.12293978, 31.49569509 ], [ 115.1239796, 31.49424754 ], [ 115.12481109, 31.49332395 ], [ 115.12484766, 31.49289303 ], [ 115.12457225, 31.49223933 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800127P00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800126P00000,AFA9800121PE0000", "TRVCD": "AFA9800128P00000", "INDCD": "QFA9800126P00000", "ONDCD": "QFA9800127P00000", "BWSCD": "WFA9800127P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 2063.0, "RVSLP": 0.0005, "IELV": 82.29, "OELV": 80.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18843117, 31.29338215 ], [ 115.18788218, 31.29312024 ], [ 115.18749841, 31.29284037 ], [ 115.1871621, 31.29233956 ], [ 115.18707145, 31.29206352 ], [ 115.18702754, 31.29066038 ], [ 115.18731213, 31.289843 ], [ 115.18764515, 31.28930994 ], [ 115.18762995, 31.28893377 ], [ 115.18737623, 31.28862796 ], [ 115.18617761, 31.28763156 ], [ 115.18564219, 31.28696205 ], [ 115.18531792, 31.28616402 ], [ 115.18453034, 31.28551959 ], [ 115.18421682, 31.28541669 ], [ 115.18370615, 31.28541422 ], [ 115.18204942, 31.28589905 ], [ 115.18004866, 31.28598984 ], [ 115.17917174, 31.28621037 ], [ 115.17690846, 31.28630982 ], [ 115.17603073, 31.28653246 ], [ 115.17498807, 31.28658378 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012CP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA980012BP00000,AFA9800121PJ0000", "TRVCD": "AFA980012DP00000", "INDCD": "QFA980012BP00000", "ONDCD": "QFA980012CP00000", "BWSCD": "WFA980012CP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 14.0, "RVLEN": 4253.0, "RVSLP": 0.0, "IELV": 60.0, "OELV": 60.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11060868, 31.19073042 ], [ 115.10974824, 31.19044378 ], [ 115.10933566, 31.19015383 ], [ 115.10907924, 31.1898409 ], [ 115.10890441, 31.18908437 ], [ 115.10867735, 31.18876814 ], [ 115.10713241, 31.18751186 ], [ 115.10655447, 31.18686514 ], [ 115.10603067, 31.18642098 ], [ 115.10310772, 31.18409447 ], [ 115.10231036, 31.18364008 ], [ 115.10190819, 31.18333619 ], [ 115.10144896, 31.18280672 ], [ 115.10075152, 31.18218432 ], [ 115.0998679, 31.18125012 ], [ 115.09892236, 31.18011817 ], [ 115.09806973, 31.17939809 ], [ 115.09754976, 31.17881159 ], [ 115.09663944, 31.17803267 ], [ 115.09644882, 31.17771001 ], [ 115.09631953, 31.17685387 ], [ 115.09615568, 31.17642642 ], [ 115.09603248, 31.17580184 ], [ 115.09588397, 31.17557247 ], [ 115.09560797, 31.17545388 ], [ 115.09476562, 31.17539033 ], [ 115.09422242, 31.17519788 ], [ 115.09380035, 31.1749238 ], [ 115.09343788, 31.17457626 ], [ 115.0929542, 31.17396798 ], [ 115.09287441, 31.17377039 ], [ 115.09285758, 31.17342834 ], [ 115.09300073, 31.17293391 ], [ 115.09301658, 31.17265829 ], [ 115.09280558, 31.17196592 ], [ 115.0926308, 31.17082449 ], [ 115.09224051, 31.17040205 ], [ 115.09006916, 31.16866922 ], [ 115.08949062, 31.1680243 ], [ 115.08842784, 31.16714754 ], [ 115.08809858, 31.16679414 ], [ 115.08757006, 31.16589391 ], [ 115.08742491, 31.16497218 ], [ 115.08725433, 31.16455007 ], [ 115.08711839, 31.16385265 ], [ 115.0869236, 31.16336761 ], [ 115.08684748, 31.16240937 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012H000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012G000000,AFA9800122K00000", "TRVCD": "AFA980012I000000", "INDCD": "QFA980012G000000", "ONDCD": "QFA980012H000000", "BWSCD": "WFA980012H000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 18.0, "RVLEN": 7488.0, "RVSLP": 0.0015, "IELV": 60.09, "OELV": 54.09, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02017629, 31.27150785 ], [ 115.02182753, 31.27063926 ], [ 115.02373978, 31.26895432 ], [ 115.02425198, 31.26871407 ], [ 115.02619603, 31.26810422 ], [ 115.02648001, 31.26794771 ], [ 115.02714994, 31.26731166 ], [ 115.02804198, 31.26604775 ], [ 115.02899049, 31.26520887 ], [ 115.02999171, 31.26487327 ], [ 115.03293238, 31.26473603 ], [ 115.03394449, 31.26442491 ], [ 115.03428408, 31.26419386 ], [ 115.03497624, 31.26355375 ], [ 115.03578614, 31.26256392 ], [ 115.03667101, 31.26177809 ], [ 115.0385419, 31.26100695 ], [ 115.0397904, 31.26062292 ], [ 115.04050794, 31.26024668 ], [ 115.04283925, 31.25810365 ], [ 115.04346102, 31.25770595 ], [ 115.0444221, 31.25687408 ], [ 115.04517592, 31.25637155 ], [ 115.04736577, 31.25432595 ], [ 115.04870782, 31.25244352 ], [ 115.04925217, 31.25182405 ], [ 115.05043736, 31.25013019 ], [ 115.0517279, 31.24858555 ], [ 115.05270963, 31.24719593 ], [ 115.05301584, 31.24630955 ], [ 115.05300352, 31.24550646 ], [ 115.05275766, 31.24473605 ], [ 115.05261202, 31.24365366 ], [ 115.05213787, 31.24234393 ], [ 115.05199973, 31.24164863 ], [ 115.0518087, 31.24116203 ], [ 115.0516989, 31.23937987 ], [ 115.0517304, 31.23894964 ], [ 115.05187407, 31.23845046 ], [ 115.05197822, 31.23745078 ], [ 115.05221952, 31.2369916 ], [ 115.05296393, 31.23597981 ], [ 115.05309199, 31.23557007 ], [ 115.05301676, 31.23378031 ], [ 115.05272791, 31.23273039 ], [ 115.05257212, 31.22997358 ], [ 115.05219567, 31.22887997 ], [ 115.05155579, 31.22800204 ], [ 115.05113173, 31.22717635 ], [ 115.05027936, 31.22585784 ], [ 115.04965196, 31.22520409 ], [ 115.04943239, 31.22476809 ], [ 115.04922554, 31.22452046 ], [ 115.04734591, 31.22300105 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98202F0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98201F0000000", "TRVCD": "AFA98203F0000000", "INDCD": "QFA98201F0000000", "ONDCD": "QFA98202F0000000", "BWSCD": "WFA98202F0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 870.0, "RVSLP": 0.0, "IELV": 70.17, "OELV": 70.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81262189, 31.33143565 ], [ 114.81309042, 31.33064362 ], [ 114.81310636, 31.33021783 ], [ 114.81301781, 31.32988267 ], [ 114.81274965, 31.32957428 ], [ 114.81140459, 31.32847358 ], [ 114.81081426, 31.32745989 ], [ 114.81022648, 31.32686532 ], [ 114.81008311, 31.32660445 ], [ 114.81002206, 31.32603118 ], [ 114.81009434, 31.32568706 ], [ 114.8104003, 31.32545826 ], [ 114.81079811, 31.32540168 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121X00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122X00000", "INDCD": "-1", "ONDCD": "QFA9900121X00000", "BWSCD": "WFA9900121X00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2837.0, "RVSLP": 0.0016, "IELV": 168.39, "OELV": 156.18, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16045653, 30.92533238 ], [ 115.16079216, 30.92515786 ], [ 115.16130953, 30.92510775 ], [ 115.16161681, 30.92521962 ], [ 115.16225523, 30.92562999 ], [ 115.1627461, 30.92571832 ], [ 115.16360673, 30.92567381 ], [ 115.16423481, 30.92548891 ], [ 115.16465536, 30.92543449 ], [ 115.16560874, 30.92541643 ], [ 115.16622949, 30.92548908 ], [ 115.16690626, 30.9253336 ], [ 115.1684551, 30.92482662 ], [ 115.16935045, 30.92444472 ], [ 115.16975769, 30.92438982 ], [ 115.17008138, 30.92443564 ], [ 115.17075631, 30.92474389 ], [ 115.1717784, 30.9248138 ], [ 115.17248593, 30.92505053 ], [ 115.17264892, 30.92497005 ], [ 115.17306425, 30.92445643 ], [ 115.17363533, 30.9239557 ], [ 115.17393846, 30.92383427 ], [ 115.17484088, 30.92366398 ], [ 115.17522962, 30.92335791 ], [ 115.17570771, 30.92277771 ], [ 115.17596991, 30.92268042 ], [ 115.17775438, 30.92319244 ], [ 115.17938184, 30.92323157 ], [ 115.18057577, 30.92378208 ], [ 115.18180966, 30.92421764 ], [ 115.18274755, 30.92418767 ], [ 115.18398361, 30.92378005 ], [ 115.18448176, 30.92370244 ], [ 115.18534369, 30.9237202 ], [ 115.18580027, 30.92389071 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121G00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122G00000", "INDCD": "-1", "ONDCD": "QFA9800121G00000", "BWSCD": "WFA9800121G00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5993.0, "RVSLP": 0.0341, "IELV": 395.08, "OELV": 139.01, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17484687, 31.39023637 ], [ 115.17426445, 31.39063465 ], [ 115.17324462, 31.39083746 ], [ 115.17152615, 31.39180526 ], [ 115.17100056, 31.39200313 ], [ 115.17085341, 31.39213966 ], [ 115.17086094, 31.39241496 ], [ 115.17141683, 31.39300912 ], [ 115.17156796, 31.39348924 ], [ 115.17162353, 31.39498447 ], [ 115.1713798, 31.39633245 ], [ 115.17122735, 31.39659013 ], [ 115.17090756, 31.39682002 ], [ 115.17007483, 31.39695593 ], [ 115.16986376, 31.39704512 ], [ 115.16971564, 31.39720636 ], [ 115.16947938, 31.39770966 ], [ 115.16918847, 31.39795992 ], [ 115.16889449, 31.39801046 ], [ 115.16809926, 31.3978265 ], [ 115.16757237, 31.39760492 ], [ 115.1671123, 31.39728611 ], [ 115.16664239, 31.39723829 ], [ 115.16632226, 31.39729313 ], [ 115.16612423, 31.39740783 ], [ 115.16556649, 31.39828332 ], [ 115.16533004, 31.39849961 ], [ 115.16511646, 31.39859782 ], [ 115.16471617, 31.39859978 ], [ 115.16361488, 31.398261 ], [ 115.16319823, 31.39829463 ], [ 115.16256648, 31.39848028 ], [ 115.16187999, 31.39848465 ], [ 115.16117757, 31.39822686 ], [ 115.160926, 31.39803039 ], [ 115.16080918, 31.39785026 ], [ 115.16086915, 31.39754641 ], [ 115.16131996, 31.39698245 ], [ 115.1613065, 31.3966998 ], [ 115.16099982, 31.39653575 ], [ 115.16049585, 31.39655378 ], [ 115.15955815, 31.39681655 ], [ 115.15941825, 31.39693153 ], [ 115.15935836, 31.39730824 ], [ 115.15942293, 31.3993338 ], [ 115.1592604, 31.39966913 ], [ 115.15882808, 31.4000565 ], [ 115.15826649, 31.40021402 ], [ 115.15740601, 31.40017818 ], [ 115.15681206, 31.39991754 ], [ 115.15614586, 31.39928034 ], [ 115.1558572, 31.39921595 ], [ 115.1555136, 31.39938223 ], [ 115.15454164, 31.40022363 ], [ 115.15369764, 31.40075419 ], [ 115.15320038, 31.40091394 ], [ 115.15294217, 31.40080313 ], [ 115.15273958, 31.40057244 ], [ 115.15236014, 31.39924381 ], [ 115.15233574, 31.39859363 ], [ 115.15253023, 31.39780964 ], [ 115.15247353, 31.39693626 ], [ 115.15227998, 31.39661131 ], [ 115.15174218, 31.39620418 ], [ 115.15001975, 31.39562679 ], [ 115.14954431, 31.39527281 ], [ 115.14913399, 31.39481969 ], [ 115.14886409, 31.39467109 ], [ 115.14811573, 31.39468242 ], [ 115.1475437, 31.39494828 ], [ 115.14734591, 31.39497362 ], [ 115.14700865, 31.39479823 ], [ 115.14625332, 31.39422159 ], [ 115.14595376, 31.39408005 ], [ 115.1422311, 31.3932927 ], [ 115.14076205, 31.39327782 ], [ 115.14003154, 31.39312956 ], [ 115.1392697, 31.39307237 ], [ 115.13896771, 31.39294553 ], [ 115.13814366, 31.39238 ], [ 115.13755035, 31.39226666 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122JB0000", "INDCD": "-1", "ONDCD": "QFA9800121JB0000", "BWSCD": "WFA9800121JB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5380.0, "RVSLP": 0.0057, "IELV": 145.24, "OELV": 107.85, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91357428, 31.42319786 ], [ 114.91121644, 31.42082973 ], [ 114.91047353, 31.41971809 ], [ 114.91011027, 31.41927966 ], [ 114.90973161, 31.41819958 ], [ 114.9097459, 31.41793757 ], [ 114.90994622, 31.41732021 ], [ 114.91074161, 31.41580848 ], [ 114.91128742, 31.41504797 ], [ 114.91189777, 31.41446091 ], [ 114.91217808, 31.41429145 ], [ 114.91258584, 31.4142305 ], [ 114.91355015, 31.41448745 ], [ 114.91393647, 31.41424282 ], [ 114.91433995, 31.41381844 ], [ 114.91446192, 31.41354781 ], [ 114.91463477, 31.41272176 ], [ 114.91414164, 31.41122058 ], [ 114.91410605, 31.41063793 ], [ 114.91419839, 31.41029587 ], [ 114.91453619, 31.40995554 ], [ 114.91497585, 31.40975366 ], [ 114.91527952, 31.40969587 ], [ 114.91574754, 31.40979036 ], [ 114.91606842, 31.40977397 ], [ 114.91635631, 31.40963629 ], [ 114.91672577, 31.40930166 ], [ 114.91757436, 31.40824066 ], [ 114.91801908, 31.4074751 ], [ 114.91881333, 31.40639995 ], [ 114.91944294, 31.40501555 ], [ 114.92076844, 31.40317368 ], [ 114.92117362, 31.40247293 ], [ 114.92156438, 31.40195414 ], [ 114.92178025, 31.40150046 ], [ 114.92177995, 31.40126721 ], [ 114.9211584, 31.4006735 ], [ 114.92107788, 31.40048599 ], [ 114.92108, 31.40022765 ], [ 114.92133441, 31.39947212 ], [ 114.92217778, 31.3978853 ], [ 114.9225715, 31.39696221 ], [ 114.92287734, 31.39649743 ], [ 114.92337433, 31.39536155 ], [ 114.92363997, 31.39453762 ], [ 114.92360378, 31.39374607 ], [ 114.92335243, 31.39336581 ], [ 114.92294814, 31.39305801 ], [ 114.92147023, 31.3922886 ], [ 114.92051358, 31.39154246 ], [ 114.92018775, 31.39117554 ], [ 114.92010045, 31.39083563 ], [ 114.920024, 31.38987849 ], [ 114.91977376, 31.3889777 ], [ 114.91964669, 31.38605494 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122A00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121A00000,AFA9800121AA0000", "TRVCD": "AFA9800125000000", "INDCD": "QFA9800121A00000", "ONDCD": "QFA9800124000000", "BWSCD": "WFA9800122A00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 8871.0, "RVSLP": 0.0054, "IELV": 170.49, "OELV": 118.38, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17115432, 31.52618955 ], [ 115.16879223, 31.5262796 ], [ 115.16807901, 31.52647696 ], [ 115.16687478, 31.52657604 ], [ 115.16632611, 31.52674587 ], [ 115.16495002, 31.52698824 ], [ 115.16473401, 31.52691797 ], [ 115.16449118, 31.52671818 ], [ 115.16420327, 31.52598823 ], [ 115.1639358, 31.5257025 ], [ 115.16365437, 31.52559405 ], [ 115.16313409, 31.52567577 ], [ 115.16290752, 31.52563874 ], [ 115.16206239, 31.52506684 ], [ 115.16176357, 31.52494167 ], [ 115.16145397, 31.52495439 ], [ 115.16125676, 31.52505895 ], [ 115.16071352, 31.52572247 ], [ 115.16019985, 31.52616249 ], [ 115.15998439, 31.52624323 ], [ 115.15968893, 31.52620324 ], [ 115.15931611, 31.52599019 ], [ 115.15865203, 31.52501587 ], [ 115.15835804, 31.52472793 ], [ 115.15768048, 31.52441361 ], [ 115.15727518, 31.52436011 ], [ 115.15691578, 31.52445046 ], [ 115.1564935, 31.52494841 ], [ 115.15610971, 31.52627166 ], [ 115.15592825, 31.52660396 ], [ 115.15542829, 31.5270202 ], [ 115.15520728, 31.52706302 ], [ 115.15498612, 31.52700013 ], [ 115.15390572, 31.52614387 ], [ 115.15356627, 31.52563419 ], [ 115.15332448, 31.52511388 ], [ 115.1528265, 31.52466991 ], [ 115.1525239, 31.52454045 ], [ 115.15218364, 31.52450975 ], [ 115.15157592, 31.5245496 ], [ 115.15094774, 31.52471151 ], [ 115.15063905, 31.52466973 ], [ 115.15027021, 31.52452356 ], [ 115.15008915, 31.52437803 ], [ 115.14976597, 31.52367058 ], [ 115.14975839, 31.52348492 ], [ 115.14996598, 31.52280915 ], [ 115.15094032, 31.52097186 ], [ 115.15126329, 31.52060022 ], [ 115.15234424, 31.51960655 ], [ 115.15258572, 31.51927872 ], [ 115.15264841, 31.51893175 ], [ 115.15260897, 31.5184199 ], [ 115.15249768, 31.51815354 ], [ 115.15226261, 31.51792551 ], [ 115.15188191, 31.51777553 ], [ 115.15138244, 31.51781217 ], [ 115.15103581, 31.5180223 ], [ 115.15054777, 31.51860545 ], [ 115.15012613, 31.51883794 ], [ 115.14964348, 31.51896593 ], [ 115.1490456, 31.51894583 ], [ 115.1487519, 31.51880794 ], [ 115.14852432, 31.5185824 ], [ 115.14827726, 31.51768957 ], [ 115.1477559, 31.51714807 ], [ 115.146976, 31.51661753 ], [ 115.14593374, 31.51639168 ], [ 115.14569617, 31.5164383 ], [ 115.14541863, 31.51660642 ], [ 115.14377001, 31.51812626 ], [ 115.14337025, 31.51842772 ], [ 115.14268512, 31.51870649 ], [ 115.14190778, 31.5187484 ], [ 115.14150173, 31.51866161 ], [ 115.14116596, 31.51842354 ], [ 115.14049582, 31.51763694 ], [ 115.14026285, 31.51725586 ], [ 115.14017352, 31.51691795 ], [ 115.14020168, 31.51657635 ], [ 115.14101959, 31.51423126 ], [ 115.14140249, 31.51264032 ], [ 115.14166226, 31.51232612 ], [ 115.1421764, 31.51188386 ], [ 115.14309098, 31.51132621 ], [ 115.14441783, 31.51069111 ], [ 115.14532413, 31.50991184 ], [ 115.14559033, 31.50959575 ], [ 115.14583882, 31.50906031 ], [ 115.14582659, 31.50865589 ], [ 115.14562564, 31.50836814 ], [ 115.14467676, 31.5078598 ], [ 115.14332796, 31.50747364 ], [ 115.14054957, 31.50746548 ], [ 115.13975423, 31.50725414 ], [ 115.1391658, 31.50694581 ], [ 115.13778418, 31.50639249 ], [ 115.13736963, 31.5060996 ], [ 115.13710608, 31.50578965 ], [ 115.13702024, 31.50544841 ], [ 115.13696037, 31.50455562 ], [ 115.13684343, 31.50421641 ], [ 115.13621855, 31.50364672 ], [ 115.13568768, 31.50340959 ], [ 115.13270992, 31.50348148 ], [ 115.13165787, 31.5037161 ], [ 115.13000017, 31.5037864 ], [ 115.12958394, 31.50385425 ], [ 115.1289261, 31.50417556 ], [ 115.12770829, 31.5052481 ], [ 115.12665188, 31.50596416 ], [ 115.12636424, 31.50610238 ], [ 115.12597613, 31.5061624 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122JC0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121JC0000", "TRVCD": "AFA9800125J00000", "INDCD": "QFA9800121JC0000", "ONDCD": "QFA9800124J00000", "BWSCD": "WFA9800122JC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2937.0, "RVSLP": 0.0026, "IELV": 94.75, "OELV": 85.85, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98375981, 31.39831627 ], [ 114.98369756, 31.39630177 ], [ 114.98408386, 31.39534229 ], [ 114.98413552, 31.39499564 ], [ 114.98405087, 31.39223187 ], [ 114.98418208, 31.39189372 ], [ 114.9847578, 31.39120513 ], [ 114.98490993, 31.3908819 ], [ 114.98492781, 31.39069567 ], [ 114.9847923, 31.39045387 ], [ 114.984407, 31.39014001 ], [ 114.9833422, 31.38967567 ], [ 114.98264651, 31.38917434 ], [ 114.9823161, 31.38881834 ], [ 114.98214154, 31.38850432 ], [ 114.98211048, 31.3883182 ], [ 114.98222719, 31.3880665 ], [ 114.98251823, 31.38777786 ], [ 114.98367823, 31.38714415 ], [ 114.98436364, 31.38651775 ], [ 114.98454155, 31.38611181 ], [ 114.98452643, 31.3852229 ], [ 114.98445226, 31.38487433 ], [ 114.98433364, 31.38467964 ], [ 114.98342412, 31.38390397 ], [ 114.98322183, 31.38365207 ], [ 114.98312447, 31.38324238 ], [ 114.98299995, 31.38131577 ], [ 114.98270799, 31.38080357 ], [ 114.98202258, 31.38009048 ], [ 114.98169784, 31.37936412 ], [ 114.981629, 31.37842233 ], [ 114.98181114, 31.37771213 ], [ 114.98182576, 31.37705616 ], [ 114.98173426, 31.37655994 ], [ 114.98152044, 31.37608737 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PD0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PD0000", "TRVCD": "AFA9800123PD0000", "INDCD": "QFA9800121PD0000", "ONDCD": "QFA9800122PD0000", "BWSCD": "WFA9800122PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 7562.0, "RVSLP": 0.013, "IELV": 264.88, "OELV": 145.05, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31867018, 31.2810503 ], [ 115.31850825, 31.28084585 ], [ 115.31814965, 31.28007065 ], [ 115.31802241, 31.27827952 ], [ 115.31795818, 31.278012 ], [ 115.31783603, 31.2778495 ], [ 115.31764646, 31.27776995 ], [ 115.31736045, 31.27782653 ], [ 115.31699411, 31.27800246 ], [ 115.31620307, 31.27853359 ], [ 115.31536551, 31.27837844 ], [ 115.31447855, 31.27791389 ], [ 115.31415789, 31.27757601 ], [ 115.31414649, 31.27719757 ], [ 115.31443963, 31.27672214 ], [ 115.31451842, 31.27644921 ], [ 115.31448105, 31.27611775 ], [ 115.31430606, 31.27589229 ], [ 115.31379773, 31.27566611 ], [ 115.31347042, 31.27561518 ], [ 115.31305303, 31.27565697 ], [ 115.3122528, 31.27587321 ], [ 115.31141133, 31.27584039 ], [ 115.31101982, 31.27556638 ], [ 115.31075244, 31.27506311 ], [ 115.31054619, 31.27481094 ], [ 115.31021768, 31.27455023 ], [ 115.30992201, 31.27440924 ], [ 115.30896759, 31.27421846 ], [ 115.30800211, 31.27453005 ], [ 115.30731553, 31.27448205 ], [ 115.30693167, 31.27456048 ], [ 115.3067097, 31.2748247 ], [ 115.30663186, 31.27545673 ], [ 115.30652033, 31.27572833 ], [ 115.3062294, 31.27599572 ], [ 115.30583686, 31.27611043 ], [ 115.30523345, 31.27612952 ], [ 115.30490432, 31.27607137 ], [ 115.30391644, 31.27540373 ], [ 115.30368981, 31.27532013 ], [ 115.30337563, 31.27533046 ], [ 115.30316407, 31.27542939 ], [ 115.30292846, 31.27564729 ], [ 115.30244057, 31.27649398 ], [ 115.30208925, 31.27681316 ], [ 115.3017081, 31.2768947 ], [ 115.30091611, 31.27678367 ], [ 115.30013953, 31.27694609 ], [ 115.29893161, 31.27673379 ], [ 115.29759204, 31.27612374 ], [ 115.2951965, 31.27431826 ], [ 115.29430604, 31.27387149 ], [ 115.29380008, 31.27381513 ], [ 115.29338388, 31.27384684 ], [ 115.29313173, 31.27395555 ], [ 115.29305379, 31.27417043 ], [ 115.29308998, 31.27457621 ], [ 115.29323089, 31.27483918 ], [ 115.29375985, 31.27537975 ], [ 115.29403298, 31.27588138 ], [ 115.2944038, 31.27631576 ], [ 115.2946316, 31.27669118 ], [ 115.29469858, 31.27695398 ], [ 115.29465424, 31.27721923 ], [ 115.29434625, 31.27790387 ], [ 115.29422488, 31.27851985 ], [ 115.29395178, 31.27927574 ], [ 115.29343291, 31.27980591 ], [ 115.29277781, 31.28012443 ], [ 115.29237973, 31.28014201 ], [ 115.29170984, 31.27983855 ], [ 115.29124172, 31.27981075 ], [ 115.29104273, 31.27988089 ], [ 115.29066889, 31.28016601 ], [ 115.2899519, 31.28033798 ], [ 115.28916597, 31.28071588 ], [ 115.28901847, 31.28084652 ], [ 115.28897788, 31.28100363 ], [ 115.28919813, 31.28174036 ], [ 115.28920945, 31.2820977 ], [ 115.2891322, 31.2823725 ], [ 115.2884323, 31.28309304 ], [ 115.28778808, 31.28342606 ], [ 115.2874101, 31.28343829 ], [ 115.28642145, 31.28307241 ], [ 115.28448677, 31.28218443 ], [ 115.28318183, 31.2814768 ], [ 115.2812809, 31.28072818 ], [ 115.2809363, 31.28049016 ], [ 115.28065403, 31.28019424 ], [ 115.28043591, 31.27936807 ], [ 115.28026957, 31.27910642 ], [ 115.27968217, 31.27861092 ], [ 115.2792304, 31.27843341 ], [ 115.27891016, 31.27846647 ], [ 115.27846409, 31.27866214 ], [ 115.27799763, 31.27900834 ], [ 115.27771003, 31.27939645 ], [ 115.27758998, 31.28023606 ], [ 115.27722662, 31.28090011 ], [ 115.27654422, 31.28152629 ], [ 115.2760516, 31.28182446 ], [ 115.27545898, 31.28229162 ], [ 115.27495, 31.28254379 ], [ 115.27463913, 31.28260422 ], [ 115.27432789, 31.28254425 ], [ 115.27349293, 31.28195845 ], [ 115.27319586, 31.28182156 ], [ 115.2721777, 31.28176168 ], [ 115.27172186, 31.28160493 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PH0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PH0000", "TRVCD": "AFA9800123PH0000", "INDCD": "QFA9800121PH0000", "ONDCD": "QFA9800122PH0000", "BWSCD": "WFA9800122PH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2505.0, "RVSLP": 0.0173, "IELV": 194.75, "OELV": 139.93, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22835448, 31.12962905 ], [ 115.22800634, 31.13016562 ], [ 115.22794358, 31.13046067 ], [ 115.22817246, 31.13089812 ], [ 115.22864752, 31.13152553 ], [ 115.22872807, 31.13194807 ], [ 115.22873208, 31.13253441 ], [ 115.22849138, 31.13314604 ], [ 115.2280687, 31.13372009 ], [ 115.22782177, 31.1342503 ], [ 115.22784998, 31.13632391 ], [ 115.22768167, 31.13703341 ], [ 115.22761457, 31.13766864 ], [ 115.22737172, 31.13819984 ], [ 115.22698808, 31.13871626 ], [ 115.22605474, 31.1404796 ], [ 115.22578448, 31.14130608 ], [ 115.22572408, 31.14223721 ], [ 115.22548433, 31.14299244 ], [ 115.22520536, 31.14351977 ], [ 115.22442107, 31.14459634 ], [ 115.22414578, 31.14534571 ], [ 115.22410231, 31.14576971 ], [ 115.22414385, 31.14733425 ], [ 115.22397778, 31.14797004 ], [ 115.22393428, 31.14876365 ], [ 115.22377832, 31.14935046 ], [ 115.22375635, 31.14983643 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123QD0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122QD0000", "TRVCD": "AFA9800124QD0000", "INDCD": "QFA9800122QD0000", "ONDCD": "QFA9800123QD0000", "BWSCD": "WFA9800123QD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 6021.0, "RVSLP": 0.0118, "IELV": 189.86, "OELV": 59.08, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08071158, 31.0618678 ], [ 115.0804537, 31.06196618 ], [ 115.07932031, 31.06272827 ], [ 115.07734425, 31.06427982 ], [ 115.07690169, 31.06444631 ], [ 115.0766621, 31.06442708 ], [ 115.07620466, 31.06425954 ], [ 115.07554997, 31.06389554 ], [ 115.0750167, 31.06368634 ], [ 115.0742313, 31.06351443 ], [ 115.07348832, 31.06359012 ], [ 115.07138994, 31.06269888 ], [ 115.07092384, 31.06268469 ], [ 115.07062346, 31.06289763 ], [ 115.06997379, 31.06383094 ], [ 115.06943544, 31.0644555 ], [ 115.06889098, 31.06535177 ], [ 115.06796019, 31.0662175 ], [ 115.06738011, 31.06651381 ], [ 115.06698012, 31.06659378 ], [ 115.06657043, 31.06654436 ], [ 115.06589525, 31.06623008 ], [ 115.06533404, 31.06624816 ], [ 115.06503728, 31.06647107 ], [ 115.06452025, 31.06726151 ], [ 115.06377358, 31.06774643 ], [ 115.06346124, 31.06783503 ], [ 115.06296778, 31.06781132 ], [ 115.06150971, 31.06727703 ], [ 115.06083166, 31.06728323 ], [ 115.06020875, 31.06743816 ], [ 115.05985347, 31.06733353 ], [ 115.05964605, 31.06712445 ], [ 115.05959575, 31.06694422 ], [ 115.05992985, 31.06584427 ], [ 115.05987345, 31.06544587 ], [ 115.05936612, 31.064617 ], [ 115.05913959, 31.06437369 ], [ 115.05866352, 31.06404984 ], [ 115.05829147, 31.06404564 ], [ 115.05758387, 31.06443505 ], [ 115.05438377, 31.06742613 ], [ 115.05386013, 31.06784304 ], [ 115.05280668, 31.06826335 ], [ 115.05225896, 31.06861885 ], [ 115.05146279, 31.06902247 ], [ 115.05029392, 31.06977561 ], [ 115.04942872, 31.07022209 ], [ 115.04837828, 31.07104607 ], [ 115.04793783, 31.07124421 ], [ 115.04728501, 31.07137167 ], [ 115.04566123, 31.07189254 ], [ 115.04340874, 31.07278757 ], [ 115.04211774, 31.07286384 ], [ 115.04153154, 31.07282045 ], [ 115.04099784, 31.07262048 ], [ 115.04042275, 31.07229584 ], [ 115.03890994, 31.07170174 ], [ 115.03717169, 31.07126676 ], [ 115.03641654, 31.07121772 ], [ 115.03561244, 31.07106295 ], [ 115.03362142, 31.07112424 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124PH0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122PHA000,AFA9800123PH0000", "TRVCD": "AFA9800125PH0000", "INDCD": "QFA9800123PH0000", "ONDCD": "QFA9800124PH0000", "BWSCD": "WFA9800124PH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 9049.0, "RVSLP": 0.0039, "IELV": 117.81, "OELV": 80.1, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21904426, 31.17342665 ], [ 115.21864672, 31.17404908 ], [ 115.21816184, 31.17498965 ], [ 115.21786689, 31.17595415 ], [ 115.21793202, 31.17774183 ], [ 115.21822358, 31.1787921 ], [ 115.21831956, 31.18058758 ], [ 115.21830648, 31.18117175 ], [ 115.21816047, 31.18166964 ], [ 115.21808117, 31.18237392 ], [ 115.21760382, 31.18380883 ], [ 115.21724624, 31.18455753 ], [ 115.21702038, 31.18524243 ], [ 115.21693583, 31.18653383 ], [ 115.21516362, 31.18996172 ], [ 115.21467055, 31.19140116 ], [ 115.21462607, 31.19197201 ], [ 115.21477361, 31.1959357 ], [ 115.21453156, 31.19668832 ], [ 115.21416239, 31.19728524 ], [ 115.21370832, 31.19850161 ], [ 115.21315554, 31.19899801 ], [ 115.2129282, 31.19906691 ], [ 115.21262048, 31.19903844 ], [ 115.21237413, 31.19886301 ], [ 115.21207556, 31.19843282 ], [ 115.21182588, 31.19796755 ], [ 115.21160165, 31.19729508 ], [ 115.21091239, 31.19667358 ], [ 115.21054834, 31.19646917 ], [ 115.21000272, 31.19628323 ], [ 115.20940536, 31.19626281 ], [ 115.20881774, 31.19634376 ], [ 115.20675404, 31.1970923 ], [ 115.20491028, 31.19792782 ], [ 115.20418212, 31.19809117 ], [ 115.20318372, 31.19863453 ], [ 115.19997625, 31.19982502 ], [ 115.1993278, 31.20036195 ], [ 115.19910978, 31.20073393 ], [ 115.19917421, 31.20098585 ], [ 115.19984783, 31.20215425 ], [ 115.19984651, 31.20256245 ], [ 115.19964486, 31.20288034 ], [ 115.19875182, 31.20346329 ], [ 115.19844531, 31.20357995 ], [ 115.19600479, 31.20368588 ], [ 115.19549809, 31.20364429 ], [ 115.1948874, 31.20340661 ], [ 115.19450599, 31.2030971 ], [ 115.19420263, 31.20266481 ], [ 115.19386741, 31.20200491 ], [ 115.1937565, 31.20121727 ], [ 115.19355249, 31.20065844 ], [ 115.19339784, 31.19950975 ], [ 115.19305618, 31.1987759 ], [ 115.19249681, 31.19825301 ], [ 115.19193781, 31.19785223 ], [ 115.19146786, 31.19776412 ], [ 115.19078561, 31.19801376 ], [ 115.18960686, 31.19860322 ], [ 115.18908741, 31.19912754 ], [ 115.18903069, 31.1993222 ], [ 115.1890735, 31.19957569 ], [ 115.18933241, 31.1998832 ], [ 115.19075842, 31.20103717 ], [ 115.19110384, 31.20159823 ], [ 115.19094424, 31.2027677 ], [ 115.19076379, 31.20354998 ], [ 115.19081722, 31.20412578 ], [ 115.19104829, 31.20475214 ], [ 115.19106489, 31.20524913 ], [ 115.19080897, 31.20585117 ], [ 115.19035609, 31.20633193 ], [ 115.19008427, 31.20652027 ], [ 115.18817575, 31.20743856 ], [ 115.18721104, 31.20828505 ], [ 115.1868571, 31.20873193 ], [ 115.18679578, 31.20929645 ], [ 115.1868824, 31.21048588 ], [ 115.18710784, 31.21111395 ], [ 115.18725872, 31.21219174 ], [ 115.18763713, 31.21291041 ], [ 115.18766874, 31.21309446 ], [ 115.18707781, 31.21419632 ], [ 115.18699842, 31.21490221 ], [ 115.18684763, 31.21544351 ], [ 115.18684643, 31.21613382 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124Q00000", "TRVCD": "AFA9800126Q00000", "INDCD": "QFA9800124Q00000", "ONDCD": "QFA9800125Q00000", "BWSCD": "WFA9800125Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 1990.0, "RVSLP": 0.0038, "IELV": 85.97, "OELV": 60.23, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06937153, 31.02866117 ], [ 115.06843441, 31.02954589 ], [ 115.06791417, 31.03018985 ], [ 115.06653786, 31.03128413 ], [ 115.06618243, 31.03140856 ], [ 115.06589424, 31.03131035 ], [ 115.06550992, 31.03099353 ], [ 115.06533962, 31.03073351 ], [ 115.06515393, 31.03011622 ], [ 115.06487753, 31.02966445 ], [ 115.06444082, 31.02927383 ], [ 115.06406993, 31.02909692 ], [ 115.06365089, 31.02906938 ], [ 115.06323276, 31.0291238 ], [ 115.06233837, 31.02951435 ], [ 115.06142041, 31.02976595 ], [ 115.06048312, 31.02955412 ], [ 115.05751829, 31.02842081 ], [ 115.0551044, 31.02845413 ], [ 115.05421755, 31.02828733 ], [ 115.05318247, 31.02830409 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800129Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800128Q00000,AFA9800121QF0000", "TRVCD": "AFA980012N000000", "INDCD": "QFA9800128Q00000", "ONDCD": "QFA980012M000000", "BWSCD": "WFA9800129Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 12.0, "RVLEN": 466.0, "RVSLP": 0.0015, "IELV": 41.58, "OELV": 40.97, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96989981, 31.09770354 ], [ 114.96843701, 31.09771977 ], [ 114.96756837, 31.09750197 ], [ 114.96672988, 31.0971964 ], [ 114.96602174, 31.09710638 ], [ 114.96543829, 31.09695642 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012B000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012A000000,AFA9800122G00000", "TRVCD": "AFA980012C000000", "INDCD": "QFA980012A000000", "ONDCD": "QFA980012B000000", "BWSCD": "WFA980012B000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 12.0, "RVLEN": 156.0, "RVSLP": 0.0, "IELV": 77.31, "OELV": 77.31, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0803556, 31.38865133 ], [ 115.08010611, 31.38842361 ], [ 115.08001288, 31.3879521 ], [ 115.07952228, 31.38755209 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012FP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA980012EP00000,AFA9800121PL0000", "TRVCD": "AFA980012M000000", "INDCD": "QFA980012EP00000", "ONDCD": "QFA980012L000000", "BWSCD": "WFA980012FP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 17.0, "RVLEN": 4992.0, "RVSLP": 0.0003, "IELV": 50.0, "OELV": 49.15, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05850638, 31.12931597 ], [ 115.05774228, 31.12954984 ], [ 115.05565605, 31.12965541 ], [ 115.05495005, 31.12985384 ], [ 115.0539399, 31.12996588 ], [ 115.0533963, 31.13013399 ], [ 115.05246608, 31.13022733 ], [ 115.05192357, 31.13039555 ], [ 115.04979833, 31.13078609 ], [ 115.04875157, 31.13118763 ], [ 115.04770613, 31.13104581 ], [ 115.04528095, 31.13110159 ], [ 115.04275241, 31.13071582 ], [ 115.04029998, 31.13010616 ], [ 115.03628892, 31.12878607 ], [ 115.03391762, 31.12819408 ], [ 115.03157185, 31.12777966 ], [ 115.02993999, 31.1278444 ], [ 115.02925999, 31.12810833 ], [ 115.02817612, 31.12865273 ], [ 115.02709608, 31.12941288 ], [ 115.02632173, 31.1300608 ], [ 115.02576808, 31.13040889 ], [ 115.0246898, 31.13137606 ], [ 115.02407009, 31.1317758 ], [ 115.02329595, 31.13242416 ], [ 115.0203638, 31.13418967 ], [ 115.01861602, 31.13503734 ], [ 115.01763603, 31.13561556 ], [ 115.01551562, 31.13661141 ], [ 115.01502061, 31.13669145 ], [ 115.01345814, 31.13674162 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121XA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900124X00000", "INDCD": "-1", "ONDCD": "QFA9900123X00000", "BWSCD": "WFA9900121XA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3366.0, "RVSLP": 0.0092, "IELV": 159.66, "OELV": 126.46, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17808809, 30.90317218 ], [ 115.17846239, 30.9035058 ], [ 115.17867906, 30.90380461 ], [ 115.1790637, 30.90475024 ], [ 115.17964782, 30.90533989 ], [ 115.18018217, 30.90601067 ], [ 115.18047608, 30.90694206 ], [ 115.18072414, 30.9071045 ], [ 115.18164096, 30.90740579 ], [ 115.18213045, 30.90784842 ], [ 115.18259017, 30.90813955 ], [ 115.18345997, 30.90906078 ], [ 115.18398806, 30.91002771 ], [ 115.18428909, 30.91031842 ], [ 115.18463512, 30.91053215 ], [ 115.18485889, 30.91056449 ], [ 115.18507857, 30.91050635 ], [ 115.18616227, 30.9099382 ], [ 115.18702567, 30.90986872 ], [ 115.18752831, 30.90992645 ], [ 115.18786615, 30.91014399 ], [ 115.18803615, 30.91039755 ], [ 115.18815405, 30.91158186 ], [ 115.18823516, 30.91184036 ], [ 115.18845543, 30.91203349 ], [ 115.18876637, 30.91208579 ], [ 115.1892436, 30.91197818 ], [ 115.19016837, 30.91122581 ], [ 115.19074627, 30.91096978 ], [ 115.19104481, 30.91099247 ], [ 115.19201751, 30.91138621 ], [ 115.19247939, 30.91168693 ], [ 115.19294435, 30.91173378 ], [ 115.19341946, 30.9116172 ], [ 115.19420387, 30.91097818 ], [ 115.19457045, 30.91080556 ], [ 115.19804275, 30.91066409 ], [ 115.19846317, 30.91060666 ], [ 115.19900874, 30.91043486 ], [ 115.1995081, 30.91043516 ], [ 115.19995048, 30.91065787 ], [ 115.20034557, 30.91107587 ], [ 115.20043357, 30.9116317 ], [ 115.20026606, 30.91227395 ], [ 115.20025244, 30.91262379 ], [ 115.2004018, 30.9129495 ], [ 115.20077245, 30.9132887 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900124000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121B00000,AFA9900123000000", "TRVCD": "AFA9900125000000", "INDCD": "QFA9900123000000", "ONDCD": "QFA9900124000000", "BWSCD": "WFA9900124000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 2680.0, "RVSLP": 0.01, "IELV": 155.4, "OELV": 144.37, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40437808, 31.25538228 ], [ 115.40422034, 31.2551119 ], [ 115.40430966, 31.25479002 ], [ 115.40535591, 31.25377192 ], [ 115.4055516, 31.25338571 ], [ 115.40552228, 31.25312626 ], [ 115.40444327, 31.25009754 ], [ 115.40411958, 31.24885493 ], [ 115.40415826, 31.24858764 ], [ 115.40472018, 31.24693616 ], [ 115.40476048, 31.24591994 ], [ 115.40491208, 31.24535218 ], [ 115.4049162, 31.24500819 ], [ 115.40413046, 31.24334951 ], [ 115.40398048, 31.2424265 ], [ 115.40349295, 31.24088891 ], [ 115.40335368, 31.24019357 ], [ 115.40317839, 31.23977231 ], [ 115.40303832, 31.23907587 ], [ 115.40286428, 31.23865549 ], [ 115.40272432, 31.23796001 ], [ 115.40224487, 31.23664772 ], [ 115.40211363, 31.23579427 ], [ 115.40162518, 31.23441369 ], [ 115.401536, 31.23384105 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900129000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900128000000,AFA9900121G00000", "TRVCD": "AFA990012A000000", "INDCD": "QFA9900128000000", "ONDCD": "QFA9900129000000", "BWSCD": "WFA9900129000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 10.0, "RVLEN": 3820.0, "RVSLP": 0.0002, "IELV": 110.1, "OELV": 108.81, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33774975, 31.14967829 ], [ 115.33769004, 31.14862347 ], [ 115.33774243, 31.1481303 ], [ 115.33801914, 31.14760145 ], [ 115.33865794, 31.14693803 ], [ 115.33883585, 31.14667283 ], [ 115.33908351, 31.14497419 ], [ 115.33902679, 31.14470834 ], [ 115.33875987, 31.14426087 ], [ 115.33779795, 31.14333191 ], [ 115.33749941, 31.14266941 ], [ 115.33733763, 31.14206077 ], [ 115.337074, 31.14145674 ], [ 115.33689076, 31.14121346 ], [ 115.3358284, 31.14059379 ], [ 115.33522514, 31.14034162 ], [ 115.33468687, 31.1401558 ], [ 115.33355593, 31.13995032 ], [ 115.32888381, 31.14007103 ], [ 115.32799237, 31.13991772 ], [ 115.32681395, 31.13984426 ], [ 115.32613826, 31.13954996 ], [ 115.32565108, 31.13910208 ], [ 115.32517211, 31.13782678 ], [ 115.32473015, 31.13703659 ], [ 115.32462606, 31.13640028 ], [ 115.32455029, 31.13422928 ], [ 115.3247259, 31.13344917 ], [ 115.32474007, 31.1322766 ], [ 115.32481088, 31.13207383 ], [ 115.32500796, 31.13181717 ], [ 115.32576238, 31.13113176 ], [ 115.32697963, 31.13027944 ], [ 115.32749335, 31.13004124 ], [ 115.32860264, 31.12975955 ], [ 115.32900257, 31.12975994 ], [ 115.32945943, 31.12992031 ], [ 115.33036001, 31.13046631 ], [ 115.33062311, 31.13055171 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012B000000", "RVNM": "巴河", "GB": "210101", "FRVCD": "AFA990012A000000,AFA9900122I00000", "TRVCD": "AFA990012C000000", "INDCD": "QFA990012A000000", "ONDCD": "QFA990012B000000", "BWSCD": "WFA990012B000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 12.0, "RVLEN": 6859.0, "RVSLP": 0.0002, "IELV": 89.64, "OELV": 87.47, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35783625, 31.10932365 ], [ 115.35780024, 31.1089255 ], [ 115.35764393, 31.10857384 ], [ 115.35660188, 31.10766651 ], [ 115.35620482, 31.10702851 ], [ 115.35613019, 31.10615959 ], [ 115.35632418, 31.1053059 ], [ 115.35630969, 31.10457429 ], [ 115.35623109, 31.10422827 ], [ 115.35579774, 31.10327429 ], [ 115.35571397, 31.10285747 ], [ 115.35573038, 31.10228286 ], [ 115.35595617, 31.10137218 ], [ 115.35653785, 31.10016775 ], [ 115.3565783, 31.09983524 ], [ 115.35625241, 31.09904768 ], [ 115.35555021, 31.09810221 ], [ 115.35535235, 31.09747065 ], [ 115.35547202, 31.09723418 ], [ 115.35654827, 31.09594242 ], [ 115.35663793, 31.09574623 ], [ 115.35663599, 31.09548727 ], [ 115.3563063, 31.09491642 ], [ 115.35516834, 31.09389562 ], [ 115.3548786, 31.09317617 ], [ 115.35427865, 31.09250648 ], [ 115.35416579, 31.09195009 ], [ 115.3540818, 31.09021401 ], [ 115.35412646, 31.08972551 ], [ 115.35435406, 31.0894609 ], [ 115.35524884, 31.08910972 ], [ 115.35551848, 31.08885271 ], [ 115.35576009, 31.08795992 ], [ 115.35577778, 31.08761699 ], [ 115.35570622, 31.08735414 ], [ 115.3552955, 31.08676959 ], [ 115.35524278, 31.0861458 ], [ 115.35540718, 31.08581327 ], [ 115.35630196, 31.08491189 ], [ 115.35643948, 31.08450153 ], [ 115.35641791, 31.08383983 ], [ 115.35630234, 31.08342284 ], [ 115.35577604, 31.08260511 ], [ 115.35534193, 31.08211642 ], [ 115.35509399, 31.08162019 ], [ 115.35520567, 31.08072814 ], [ 115.35493985, 31.07981941 ], [ 115.35489045, 31.07856618 ], [ 115.35501906, 31.07822788 ], [ 115.35554232, 31.07752584 ], [ 115.35579604, 31.07611168 ], [ 115.35571832, 31.07546925 ], [ 115.35533177, 31.07475011 ], [ 115.35529769, 31.07450409 ], [ 115.35549648, 31.07405358 ], [ 115.35588507, 31.07353809 ], [ 115.35611636, 31.07307088 ], [ 115.35614577, 31.07227825 ], [ 115.3559404, 31.07132599 ], [ 115.35677404, 31.06953554 ], [ 115.3567259, 31.06797448 ], [ 115.35652209, 31.0671464 ], [ 115.3565937, 31.06689777 ], [ 115.35697755, 31.06647774 ], [ 115.35806444, 31.06551003 ], [ 115.35864225, 31.06521652 ], [ 115.35925797, 31.06500667 ], [ 115.36015804, 31.06444557 ], [ 115.36261658, 31.06220624 ], [ 115.36353028, 31.06187312 ], [ 115.36426037, 31.06171631 ], [ 115.36460006, 31.06149204 ], [ 115.36498446, 31.06106715 ], [ 115.36566171, 31.05975202 ], [ 115.36573169, 31.0594055 ], [ 115.36571577, 31.05880678 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121C00000", "RVNM": "九里冲", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122C00000", "INDCD": "-1", "ONDCD": "QFA9800121C00000", "BWSCD": "WFA9800121C00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 7491.0, "RVSLP": 0.0156, "IELV": 308.45, "OELV": 132.97, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07438371, 31.55960849 ], [ 115.07476763, 31.55954238 ], [ 115.07543798, 31.55918805 ], [ 115.07621405, 31.55893373 ], [ 115.07720834, 31.55876577 ], [ 115.07821044, 31.55822308 ], [ 115.07902436, 31.55804356 ], [ 115.07946944, 31.55784515 ], [ 115.0798494, 31.55754778 ], [ 115.08017438, 31.5569205 ], [ 115.08040401, 31.55677417 ], [ 115.08069304, 31.55680514 ], [ 115.08114628, 31.55698805 ], [ 115.08219405, 31.55777766 ], [ 115.08249024, 31.55793614 ], [ 115.08281939, 31.55798442 ], [ 115.08313966, 31.55793773 ], [ 115.08333009, 31.55782156 ], [ 115.08343938, 31.55764342 ], [ 115.08348221, 31.557148 ], [ 115.08331833, 31.55331435 ], [ 115.08335961, 31.55303726 ], [ 115.08395422, 31.55131201 ], [ 115.08400038, 31.55022705 ], [ 115.08416771, 31.54958989 ], [ 115.08409314, 31.54632002 ], [ 115.08443476, 31.54543897 ], [ 115.08579351, 31.54413999 ], [ 115.08594001, 31.54394597 ], [ 115.08602154, 31.5436751 ], [ 115.08597575, 31.54311442 ], [ 115.08563841, 31.54215423 ], [ 115.08518173, 31.54113405 ], [ 115.08512778, 31.54078633 ], [ 115.08515387, 31.54043487 ], [ 115.08552597, 31.53961585 ], [ 115.08577957, 31.53886621 ], [ 115.08600919, 31.53788679 ], [ 115.08605031, 31.53680029 ], [ 115.08629193, 31.53604589 ], [ 115.08677573, 31.53512795 ], [ 115.08738239, 31.53422916 ], [ 115.08765149, 31.53362338 ], [ 115.08771233, 31.53276412 ], [ 115.08785822, 31.53226368 ], [ 115.08788377, 31.53183617 ], [ 115.0878328, 31.53140741 ], [ 115.08760341, 31.5307817 ], [ 115.08754164, 31.52990001 ], [ 115.08757356, 31.5295435 ], [ 115.08771992, 31.52904452 ], [ 115.0878177, 31.5280426 ], [ 115.08804881, 31.52735845 ], [ 115.08854366, 31.52644507 ], [ 115.08995587, 31.52508482 ], [ 115.09013632, 31.52482035 ], [ 115.09018607, 31.52461912 ], [ 115.09019361, 31.52403013 ], [ 115.09010644, 31.52337977 ], [ 115.08956841, 31.52247705 ], [ 115.08903059, 31.521974 ], [ 115.0880819, 31.52142956 ], [ 115.08772183, 31.52100597 ], [ 115.08767508, 31.52037818 ], [ 115.08807293, 31.51941648 ], [ 115.08812968, 31.51825795 ], [ 115.08841485, 31.51765502 ], [ 115.08902795, 31.51710619 ], [ 115.09022306, 31.51678561 ], [ 115.0912454, 31.51668126 ], [ 115.09179372, 31.51651783 ], [ 115.09271977, 31.5163841 ], [ 115.09335567, 31.5160526 ], [ 115.09352392, 31.51582302 ], [ 115.09369077, 31.51542228 ], [ 115.09367977, 31.51515953 ], [ 115.09349794, 31.51467203 ], [ 115.09337789, 31.5138839 ], [ 115.09318821, 31.51339363 ], [ 115.09298797, 31.51256363 ], [ 115.09235377, 31.5116787 ], [ 115.09216792, 31.51108362 ], [ 115.09185483, 31.51057011 ], [ 115.09059442, 31.50952444 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PF0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PF0000", "INDCD": "-1", "ONDCD": "QFA9800121PF0000", "BWSCD": "WFA9800121PF0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3757.0, "RVSLP": 0.0182, "IELV": 234.78, "OELV": 152.29, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16574186, 31.35108312 ], [ 115.16580643, 31.35068418 ], [ 115.16611235, 31.35030019 ], [ 115.16648921, 31.35019417 ], [ 115.16729641, 31.35034391 ], [ 115.16779021, 31.35028133 ], [ 115.16851011, 31.34980226 ], [ 115.16939247, 31.34883585 ], [ 115.16943009, 31.34865542 ], [ 115.16933428, 31.3482597 ], [ 115.16930172, 31.34768202 ], [ 115.16945036, 31.34691757 ], [ 115.16921872, 31.34609151 ], [ 115.16913779, 31.34430188 ], [ 115.16921435, 31.34395236 ], [ 115.16974636, 31.34310388 ], [ 115.16982079, 31.34276961 ], [ 115.16975007, 31.34244054 ], [ 115.16934218, 31.34185615 ], [ 115.16931432, 31.34131405 ], [ 115.16952764, 31.34069344 ], [ 115.1696925, 31.34043864 ], [ 115.16994003, 31.34022883 ], [ 115.17038436, 31.34001896 ], [ 115.17119558, 31.33982784 ], [ 115.17139766, 31.33971756 ], [ 115.17171445, 31.33922952 ], [ 115.17177419, 31.33888395 ], [ 115.17169878, 31.33854966 ], [ 115.17143256, 31.33823694 ], [ 115.17087739, 31.33781879 ], [ 115.17013373, 31.33742358 ], [ 115.16970845, 31.33702794 ], [ 115.16958028, 31.33661936 ], [ 115.16950601, 31.33526997 ], [ 115.16937954, 31.33495756 ], [ 115.16904706, 31.33478819 ], [ 115.16802407, 31.33474234 ], [ 115.16771772, 31.33453553 ], [ 115.16741284, 31.33388298 ], [ 115.16727163, 31.33333785 ], [ 115.1669864, 31.33266024 ], [ 115.16635797, 31.33158179 ], [ 115.16635555, 31.3314213 ], [ 115.16648474, 31.33130171 ], [ 115.16747037, 31.3311401 ], [ 115.16799607, 31.33090201 ], [ 115.16825187, 31.33063806 ], [ 115.16835449, 31.33040279 ], [ 115.16834786, 31.33023716 ], [ 115.16821014, 31.33010644 ], [ 115.16777564, 31.32992609 ], [ 115.16693395, 31.32980602 ], [ 115.16598193, 31.32953378 ], [ 115.16512776, 31.3288772 ], [ 115.16483964, 31.32856634 ], [ 115.16473762, 31.32835563 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PHA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PHA000", "INDCD": "-1", "ONDCD": "QFA9800121PHA000", "BWSCD": "WFA9800121PHA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3175.0, "RVSLP": 0.035, "IELV": 272.75, "OELV": 148.87, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26473417, 31.17233372 ], [ 115.26462479, 31.17248017 ], [ 115.26456989, 31.17278781 ], [ 115.26477404, 31.17353965 ], [ 115.26488052, 31.17556043 ], [ 115.26486812, 31.17622044 ], [ 115.2647064, 31.17700431 ], [ 115.26488791, 31.17788221 ], [ 115.26475778, 31.17808412 ], [ 115.26448436, 31.17816769 ], [ 115.26371356, 31.17810044 ], [ 115.26271552, 31.17861889 ], [ 115.2620326, 31.17885672 ], [ 115.26174178, 31.17906236 ], [ 115.2614456, 31.17959409 ], [ 115.26090771, 31.18012215 ], [ 115.26055578, 31.18032973 ], [ 115.25898959, 31.18078956 ], [ 115.25672576, 31.18280783 ], [ 115.25648782, 31.18280228 ], [ 115.25614159, 31.18248397 ], [ 115.2559336, 31.18238243 ], [ 115.25527505, 31.1823638 ], [ 115.25492217, 31.18251615 ], [ 115.25455036, 31.18297781 ], [ 115.25422974, 31.183214 ], [ 115.2528072, 31.18360077 ], [ 115.24857555, 31.18498846 ], [ 115.24834632, 31.18499597 ], [ 115.24708607, 31.18468908 ], [ 115.2457902, 31.18470158 ], [ 115.24520342, 31.18478012 ], [ 115.24439365, 31.18507128 ], [ 115.24415755, 31.18521238 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PHAA00", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PHA000", "INDCD": "-1", "ONDCD": "QFA9800121PHA000", "BWSCD": "WFA9800121PHAA00", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 8308.0, "RVSLP": 0.0414, "IELV": 623.69, "OELV": 148.87, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27871016, 31.21645857 ], [ 115.27816835, 31.21540783 ], [ 115.27813158, 31.21482734 ], [ 115.27829121, 31.21412032 ], [ 115.27824555, 31.21381138 ], [ 115.27804052, 31.21360578 ], [ 115.27739427, 31.21325562 ], [ 115.27602559, 31.21270602 ], [ 115.27574356, 31.2124639 ], [ 115.27566145, 31.2122071 ], [ 115.27555398, 31.21126459 ], [ 115.2752567, 31.21037024 ], [ 115.27478989, 31.20951818 ], [ 115.27450628, 31.20884777 ], [ 115.27436185, 31.20830833 ], [ 115.27378604, 31.20697394 ], [ 115.27255796, 31.20499837 ], [ 115.27233219, 31.20447722 ], [ 115.27170588, 31.2034516 ], [ 115.27113601, 31.20234375 ], [ 115.271035, 31.20200006 ], [ 115.27092568, 31.20105926 ], [ 115.27057219, 31.20002793 ], [ 115.27000923, 31.19914003 ], [ 115.26955026, 31.19881427 ], [ 115.26889537, 31.19880789 ], [ 115.26585728, 31.19974619 ], [ 115.26474444, 31.2000226 ], [ 115.26320611, 31.20014406 ], [ 115.26217004, 31.20040565 ], [ 115.26181602, 31.20060655 ], [ 115.26139628, 31.20109743 ], [ 115.26114024, 31.2021436 ], [ 115.26114185, 31.2035438 ], [ 115.26097777, 31.20418247 ], [ 115.26097172, 31.20557797 ], [ 115.26078757, 31.20642958 ], [ 115.26085073, 31.20784756 ], [ 115.26099759, 31.20852751 ], [ 115.26087903, 31.20926921 ], [ 115.26075951, 31.20953768 ], [ 115.26048306, 31.20982966 ], [ 115.26022753, 31.20998445 ], [ 115.25903388, 31.20997211 ], [ 115.25746754, 31.21036978 ], [ 115.25666638, 31.21011207 ], [ 115.25605759, 31.21024519 ], [ 115.25564202, 31.21025869 ], [ 115.2554076, 31.21019793 ], [ 115.25513589, 31.21001877 ], [ 115.25493179, 31.20978599 ], [ 115.2546627, 31.20925674 ], [ 115.25455426, 31.20739174 ], [ 115.25446892, 31.20697364 ], [ 115.25415015, 31.20646312 ], [ 115.25321877, 31.20560656 ], [ 115.25293767, 31.20516436 ], [ 115.25273356, 31.20458812 ], [ 115.25290578, 31.20387845 ], [ 115.25349607, 31.20310767 ], [ 115.25348308, 31.20273243 ], [ 115.25328969, 31.20248466 ], [ 115.25233228, 31.20163807 ], [ 115.25204816, 31.20091435 ], [ 115.25144213, 31.20010845 ], [ 115.25094587, 31.19913957 ], [ 115.25030819, 31.19825975 ], [ 115.25022033, 31.19792223 ], [ 115.25010392, 31.19659999 ], [ 115.24979767, 31.19586485 ], [ 115.24953582, 31.19541402 ], [ 115.2488525, 31.19441943 ], [ 115.24859587, 31.19421537 ], [ 115.24808746, 31.19395203 ], [ 115.24777415, 31.19368965 ], [ 115.24692359, 31.19237006 ], [ 115.24686498, 31.19217232 ], [ 115.24689101, 31.19191566 ], [ 115.24750591, 31.19093811 ], [ 115.24765165, 31.19050369 ], [ 115.24750235, 31.19013833 ], [ 115.24700911, 31.18929819 ], [ 115.24650647, 31.18734589 ], [ 115.24605236, 31.18672626 ], [ 115.24415755, 31.18521238 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122TB0000", "INDCD": "-1", "ONDCD": "QFA9800121TB0000", "BWSCD": "WFA9800121TB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1667.0, "RVSLP": 0.0009, "IELV": 70.0, "OELV": 69.24, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77558227, 31.18800557 ], [ 114.77379981, 31.18740331 ], [ 114.77276381, 31.18742693 ], [ 114.77188645, 31.18763564 ], [ 114.77164933, 31.18760524 ], [ 114.77137214, 31.18744941 ], [ 114.77109728, 31.18708899 ], [ 114.77085981, 31.18654012 ], [ 114.77079446, 31.18619412 ], [ 114.77081746, 31.18576754 ], [ 114.77123007, 31.18451432 ], [ 114.77122194, 31.18362282 ], [ 114.77108366, 31.18313968 ], [ 114.77079617, 31.18284305 ], [ 114.77036987, 31.18257006 ], [ 114.7698331, 31.18239788 ], [ 114.76940633, 31.18241813 ], [ 114.76923471, 31.18236604 ], [ 114.76910024, 31.18216023 ], [ 114.76890802, 31.18140868 ], [ 114.76842321, 31.1809601 ], [ 114.76803997, 31.18081327 ], [ 114.7671962, 31.1807415 ], [ 114.7660962, 31.18017024 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TG0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122TG0000", "INDCD": "-1", "ONDCD": "QFA9800121TG0000", "BWSCD": "WFA9800121TG0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6543.0, "RVSLP": 0.0006, "IELV": 46.49, "OELV": 38.45, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8767276, 31.13512819 ], [ 114.87664574, 31.13394205 ], [ 114.87616365, 31.13301419 ], [ 114.87587054, 31.13206032 ], [ 114.87594185, 31.13140451 ], [ 114.87557846, 31.13078032 ], [ 114.87556, 31.13052172 ], [ 114.8756795, 31.13010023 ], [ 114.87568881, 31.12975559 ], [ 114.87539365, 31.12909936 ], [ 114.87504899, 31.12859841 ], [ 114.87431757, 31.12776019 ], [ 114.87370973, 31.12728372 ], [ 114.8729076, 31.12683404 ], [ 114.87184011, 31.1259604 ], [ 114.87097579, 31.12450989 ], [ 114.87011841, 31.12391983 ], [ 114.86974218, 31.12335178 ], [ 114.86964138, 31.12271008 ], [ 114.86961525, 31.12106798 ], [ 114.86984529, 31.12053015 ], [ 114.87027133, 31.11995841 ], [ 114.87050417, 31.119494 ], [ 114.87055967, 31.11899798 ], [ 114.87052014, 31.11817572 ], [ 114.87043686, 31.11775571 ], [ 114.87015031, 31.11708495 ], [ 114.86932583, 31.11574752 ], [ 114.86886923, 31.11512377 ], [ 114.86813997, 31.11451835 ], [ 114.86770641, 31.11426147 ], [ 114.86668397, 31.11395447 ], [ 114.8650427, 31.11318616 ], [ 114.86404609, 31.11280746 ], [ 114.86294441, 31.11248162 ], [ 114.86081188, 31.11162708 ], [ 114.86030236, 31.1113502 ], [ 114.85920536, 31.11100704 ], [ 114.85439772, 31.1091142 ], [ 114.85320921, 31.10853563 ], [ 114.85219211, 31.10821514 ], [ 114.85138229, 31.10779803 ], [ 114.85000634, 31.10676035 ], [ 114.84799962, 31.10554231 ], [ 114.84656352, 31.10442605 ], [ 114.8458345, 31.10402212 ], [ 114.84460049, 31.10307833 ], [ 114.84387135, 31.10267481 ], [ 114.84169042, 31.10095359 ], [ 114.84082248, 31.10045297 ], [ 114.83742815, 31.09773353 ], [ 114.83680419, 31.09701987 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PG0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PG0000", "TRVCD": "AFA9800129P00000", "INDCD": "QFA9800121PG0000", "ONDCD": "QFA9800128P00000", "BWSCD": "WFA9800122PG0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 9512.0, "RVSLP": 0.0056, "IELV": 144.47, "OELV": 68.27, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20681126, 31.25201836 ], [ 115.20662743, 31.25259204 ], [ 115.20658574, 31.25366131 ], [ 115.20621347, 31.25536247 ], [ 115.20615843, 31.25652632 ], [ 115.20587764, 31.25728527 ], [ 115.20566685, 31.25749995 ], [ 115.20541633, 31.25756596 ], [ 115.20511444, 31.25736808 ], [ 115.20495761, 31.25704141 ], [ 115.20491598, 31.25629285 ], [ 115.20504514, 31.25564879 ], [ 115.20502651, 31.25546946 ], [ 115.20484771, 31.25523737 ], [ 115.2045744, 31.25507687 ], [ 115.2038131, 31.255049 ], [ 115.20240211, 31.25550192 ], [ 115.2016439, 31.25554171 ], [ 115.19983614, 31.25500072 ], [ 115.19835842, 31.25472167 ], [ 115.19800222, 31.2545384 ], [ 115.19782783, 31.25431 ], [ 115.19784956, 31.25407162 ], [ 115.19849436, 31.25335405 ], [ 115.19854634, 31.25314381 ], [ 115.19786134, 31.25268836 ], [ 115.19752426, 31.25235225 ], [ 115.19748631, 31.25211589 ], [ 115.19767026, 31.25174823 ], [ 115.19768428, 31.25157773 ], [ 115.1968658, 31.25057449 ], [ 115.19656757, 31.25004301 ], [ 115.19638231, 31.24943953 ], [ 115.19605774, 31.24914006 ], [ 115.19580085, 31.2491479 ], [ 115.19451617, 31.25001439 ], [ 115.19425841, 31.25007362 ], [ 115.19374759, 31.24960664 ], [ 115.19343859, 31.24902182 ], [ 115.1932052, 31.24879553 ], [ 115.19283263, 31.24864307 ], [ 115.19233401, 31.24866624 ], [ 115.19172992, 31.24892633 ], [ 115.19127481, 31.249291 ], [ 115.1910155, 31.24960726 ], [ 115.19061911, 31.25031561 ], [ 115.19021819, 31.25073412 ], [ 115.18995012, 31.25092634 ], [ 115.18906596, 31.25133216 ], [ 115.18869469, 31.25137353 ], [ 115.18810807, 31.25110415 ], [ 115.1876061, 31.25104321 ], [ 115.18700756, 31.25108742 ], [ 115.18621096, 31.25130358 ], [ 115.18509284, 31.25131166 ], [ 115.18440074, 31.25105376 ], [ 115.18318048, 31.25031603 ], [ 115.18241683, 31.24976379 ], [ 115.18126729, 31.24907296 ], [ 115.18038186, 31.24862676 ], [ 115.17996563, 31.24857364 ], [ 115.1783117, 31.2486035 ], [ 115.17741508, 31.2484381 ], [ 115.17567411, 31.24846504 ], [ 115.17470838, 31.24824791 ], [ 115.17354639, 31.24762773 ], [ 115.1733421, 31.24738227 ], [ 115.17310354, 31.24672172 ], [ 115.17287827, 31.24648963 ], [ 115.17259598, 31.24632621 ], [ 115.17197437, 31.24614849 ], [ 115.17118811, 31.24632229 ], [ 115.17086529, 31.2463096 ], [ 115.17025617, 31.24607525 ], [ 115.16954642, 31.24561722 ], [ 115.16791423, 31.24506361 ], [ 115.16679558, 31.24453971 ], [ 115.16550751, 31.24449203 ], [ 115.16518993, 31.24441582 ], [ 115.16481521, 31.244112 ], [ 115.16444416, 31.2434813 ], [ 115.16343271, 31.24256966 ], [ 115.1628165, 31.24139225 ], [ 115.16263042, 31.24079576 ], [ 115.16242856, 31.24054241 ], [ 115.16120537, 31.23958353 ], [ 115.16031802, 31.23913212 ], [ 115.15960856, 31.23890844 ], [ 115.15909233, 31.23848846 ], [ 115.15895576, 31.23822654 ], [ 115.15880708, 31.23753169 ], [ 115.15841179, 31.23679014 ], [ 115.1582249, 31.23618955 ], [ 115.15789607, 31.23582551 ], [ 115.15746764, 31.23556785 ], [ 115.15615351, 31.23532829 ], [ 115.15574026, 31.23536974 ], [ 115.15544859, 31.23551567 ], [ 115.15500014, 31.23590636 ], [ 115.15468116, 31.23628529 ], [ 115.15429999, 31.23721678 ], [ 115.15363116, 31.23853381 ], [ 115.15333243, 31.23905512 ], [ 115.15293379, 31.23948301 ], [ 115.15239623, 31.23987276 ], [ 115.15121492, 31.24002826 ], [ 115.15024393, 31.24039243 ], [ 115.14963439, 31.24024825 ], [ 115.14887972, 31.23991609 ], [ 115.14696756, 31.23840591 ], [ 115.14653358, 31.23815047 ], [ 115.14586416, 31.23811192 ], [ 115.14498441, 31.23834241 ], [ 115.14412551, 31.23836832 ], [ 115.14311155, 31.23809612 ], [ 115.14260015, 31.23775629 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123T00000", "RVNM": "尾斗山水库干渠", "GB": "210101", "FRVCD": "AFA9800122T00000", "TRVCD": "AFA9800124T00000", "INDCD": "QFA9800122T00000", "ONDCD": "QFA9800123T00000", "BWSCD": "WFA9800123T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 4520.0, "RVSLP": 0.0013, "IELV": 76.7, "OELV": 41.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.73034835, 31.16953373 ], [ 114.73016042, 31.16924934 ], [ 114.73017369, 31.16883618 ], [ 114.73043675, 31.16851781 ], [ 114.73187895, 31.16716973 ], [ 114.73236795, 31.16648061 ], [ 114.73247365, 31.16622743 ], [ 114.7324113, 31.16566735 ], [ 114.732926, 31.16497622 ], [ 114.73300848, 31.16457204 ], [ 114.73295754, 31.16430355 ], [ 114.73232562, 31.16277404 ], [ 114.73240679, 31.16187612 ], [ 114.73229954, 31.16116793 ], [ 114.73196628, 31.16082789 ], [ 114.73091012, 31.16036408 ], [ 114.73032555, 31.15988596 ], [ 114.72996355, 31.1592359 ], [ 114.72991636, 31.15873029 ], [ 114.72998197, 31.15831433 ], [ 114.73105759, 31.15692831 ], [ 114.73328614, 31.15378799 ], [ 114.73496433, 31.15220423 ], [ 114.7359798, 31.15148931 ], [ 114.7376234, 31.14997969 ], [ 114.737898, 31.14959562 ], [ 114.7380922, 31.14892847 ], [ 114.73783305, 31.1479857 ], [ 114.73754356, 31.14731444 ], [ 114.73710974, 31.14684169 ], [ 114.73567439, 31.14599594 ], [ 114.73449415, 31.14591831 ], [ 114.73335364, 31.14571793 ], [ 114.73248155, 31.14547846 ], [ 114.73221719, 31.14529033 ], [ 114.73204265, 31.14503976 ], [ 114.73196839, 31.14461613 ], [ 114.73199231, 31.1441823 ], [ 114.73206686, 31.14397782 ], [ 114.73227009, 31.1437184 ], [ 114.73310234, 31.14298211 ], [ 114.73368538, 31.14269146 ], [ 114.73431195, 31.14250186 ], [ 114.73502428, 31.14210965 ], [ 114.73603146, 31.14117614 ], [ 114.73653018, 31.14048977 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124Q00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800122QC0000,AFA9800123Q00000", "TRVCD": "AFA9800125Q00000", "INDCD": "QFA9800122QC0000,QFA9800123Q00000", "ONDCD": "QFA9800124Q00000", "BWSCD": "WFA9800124Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13972397, 30.99716022 ], [ 115.13977575, 30.99719982 ] ], [ [ 115.13977575, 30.99719982 ], [ 115.13980918, 30.99839639 ], [ 115.14039366, 31.00061392 ], [ 115.14050416, 31.00145071 ], [ 115.14038607, 31.00226483 ], [ 115.14024718, 31.00251576 ], [ 115.13972968, 31.00300833 ], [ 115.13920555, 31.00449828 ], [ 115.13910004, 31.00496002 ], [ 115.13915773, 31.00708731 ], [ 115.13909682, 31.00744441 ], [ 115.13883134, 31.00815369 ], [ 115.13893798, 31.00837751 ], [ 115.13942461, 31.00884734 ], [ 115.13950437, 31.00906678 ], [ 115.13932647, 31.00933173 ], [ 115.13841588, 31.00978974 ], [ 115.1383238, 31.0099659 ], [ 115.13823192, 31.01053209 ], [ 115.13789337, 31.011156 ], [ 115.13795781, 31.01131644 ], [ 115.13832228, 31.01150792 ], [ 115.13854377, 31.01175634 ], [ 115.1387058, 31.01209133 ], [ 115.13894236, 31.01291601 ], [ 115.13968523, 31.01403088 ], [ 115.13969197, 31.01443734 ], [ 115.13940217, 31.01503398 ], [ 115.13941495, 31.01520483 ], [ 115.1395237, 31.01526963 ], [ 115.14012027, 31.01534421 ], [ 115.14021713, 31.01545768 ], [ 115.14021813, 31.0156001 ], [ 115.14007517, 31.01587584 ], [ 115.13982969, 31.01608329 ], [ 115.13897, 31.01619594 ], [ 115.13861521, 31.01638371 ], [ 115.13808479, 31.01733412 ], [ 115.13786946, 31.0181445 ], [ 115.13770244, 31.01833169 ], [ 115.1375299, 31.01839049 ], [ 115.13735402, 31.01835044 ], [ 115.1371675, 31.01814397 ], [ 115.13678829, 31.01710188 ], [ 115.13659602, 31.01678025 ], [ 115.13616567, 31.01636557 ], [ 115.13589745, 31.01598826 ], [ 115.13577573, 31.01592561 ], [ 115.13563346, 31.01596838 ], [ 115.13545844, 31.01623372 ], [ 115.13544179, 31.01659621 ], [ 115.13596982, 31.0172967 ], [ 115.13608822, 31.01765763 ], [ 115.13588237, 31.0193662 ], [ 115.13574247, 31.01965213 ], [ 115.13549816, 31.01988355 ], [ 115.13457174, 31.02038045 ], [ 115.13384593, 31.02064994 ], [ 115.13218595, 31.02098965 ], [ 115.13190424, 31.02099981 ], [ 115.13169326, 31.02091838 ], [ 115.13155975, 31.02068578 ], [ 115.13144605, 31.02005247 ], [ 115.13113008, 31.01944391 ], [ 115.13084765, 31.01863987 ], [ 115.13071645, 31.01748223 ], [ 115.13058968, 31.0172903 ], [ 115.13043218, 31.01725341 ], [ 115.13031418, 31.01738399 ], [ 115.13026529, 31.01758595 ], [ 115.13027498, 31.01858435 ], [ 115.13038023, 31.0190183 ], [ 115.13073649, 31.01973018 ], [ 115.13078841, 31.02016203 ], [ 115.13062903, 31.02063914 ], [ 115.13025589, 31.02107221 ], [ 115.1302339, 31.02149217 ], [ 115.13013638, 31.02168232 ], [ 115.1297104, 31.0219318 ], [ 115.1291458, 31.02209293 ], [ 115.12882881, 31.02202236 ], [ 115.12848808, 31.02173763 ], [ 115.12829418, 31.02142513 ], [ 115.1282602, 31.02116006 ], [ 115.12836382, 31.02086733 ], [ 115.12882043, 31.0201839 ], [ 115.12884777, 31.019992 ], [ 115.12871029, 31.01991013 ], [ 115.12853777, 31.02005169 ], [ 115.12788111, 31.02112173 ], [ 115.12787855, 31.02148222 ], [ 115.12809068, 31.02221887 ], [ 115.1280105, 31.02242614 ], [ 115.1277803, 31.02241244 ], [ 115.12723692, 31.02201578 ], [ 115.12706074, 31.02196197 ], [ 115.12694808, 31.02203193 ], [ 115.12674388, 31.02244926 ], [ 115.12643916, 31.02259387 ], [ 115.125401, 31.0225698 ], [ 115.1249264, 31.0223918 ], [ 115.12474846, 31.02205585 ], [ 115.12479637, 31.02163781 ], [ 115.1250087, 31.0210903 ], [ 115.12543145, 31.0204873 ], [ 115.12558805, 31.01991772 ], [ 115.12568897, 31.0197616 ], [ 115.12600203, 31.01965413 ], [ 115.12669291, 31.01976626 ], [ 115.12709282, 31.01973992 ], [ 115.12746648, 31.01953393 ], [ 115.12763433, 31.01922093 ], [ 115.1275779, 31.0190553 ], [ 115.12740532, 31.0190023 ], [ 115.12690352, 31.01935817 ], [ 115.12660601, 31.01940565 ], [ 115.12620737, 31.01927858 ], [ 115.12580811, 31.01903308 ], [ 115.12569789, 31.01879986 ], [ 115.1257599, 31.01791424 ], [ 115.12558764, 31.01718807 ], [ 115.12554048, 31.01649537 ], [ 115.12532389, 31.016334 ], [ 115.12447034, 31.01616572 ], [ 115.12424149, 31.01603553 ], [ 115.12407566, 31.01585075 ], [ 115.12405656, 31.01568918 ], [ 115.12414626, 31.01554221 ], [ 115.12533965, 31.01479049 ], [ 115.1255481, 31.01454992 ], [ 115.12555009, 31.01438987 ], [ 115.12533415, 31.01437994 ], [ 115.12460636, 31.01474973 ], [ 115.1235082, 31.01517027 ], [ 115.12205827, 31.01532009 ], [ 115.1198386, 31.01595993 ], [ 115.11899978, 31.01609069 ], [ 115.11848079, 31.01599847 ], [ 115.1181717, 31.01579369 ], [ 115.11813783, 31.01561566 ], [ 115.11830167, 31.01514602 ], [ 115.11824059, 31.01497836 ], [ 115.11807399, 31.01497214 ], [ 115.11756398, 31.01529878 ], [ 115.1173216, 31.01535029 ], [ 115.11720894, 31.01527422 ], [ 115.11709557, 31.01495822 ], [ 115.11648164, 31.01500215 ], [ 115.11624926, 31.01460808 ], [ 115.11615441, 31.01454581 ], [ 115.11574604, 31.01472974 ], [ 115.11547875, 31.0146397 ], [ 115.11515034, 31.01435618 ], [ 115.11500267, 31.01406881 ], [ 115.11503882, 31.01396832 ], [ 115.11518014, 31.01387407 ], [ 115.11727152, 31.0131221 ], [ 115.11821198, 31.01233412 ], [ 115.11840757, 31.01228763 ], [ 115.11892023, 31.0123279 ], [ 115.11887767, 31.01181146 ], [ 115.11903188, 31.01160609 ], [ 115.11924518, 31.01149754 ], [ 115.11962318, 31.01145707 ], [ 115.12042202, 31.01165758 ], [ 115.12102803, 31.01170434 ], [ 115.12168526, 31.0116862 ], [ 115.12210997, 31.01156796 ], [ 115.12233181, 31.01136048 ], [ 115.12263389, 31.01086161 ], [ 115.12344726, 31.01045691 ], [ 115.1237596, 31.00966278 ], [ 115.12403869, 31.00924799 ], [ 115.12520427, 31.00850237 ], [ 115.12555036, 31.00796979 ], [ 115.12575643, 31.00788935 ], [ 115.1266062, 31.0078855 ], [ 115.12708756, 31.00780244 ], [ 115.12753044, 31.00751411 ], [ 115.12762167, 31.00735013 ], [ 115.12758805, 31.00722577 ], [ 115.12729816, 31.00718819 ], [ 115.12645106, 31.00745027 ], [ 115.12580725, 31.00733768 ], [ 115.12516393, 31.00699215 ], [ 115.12379034, 31.00581265 ], [ 115.12354367, 31.00572202 ], [ 115.1234608, 31.00585162 ], [ 115.12353358, 31.00607158 ], [ 115.12419643, 31.00680868 ], [ 115.12449526, 31.00727304 ], [ 115.12455797, 31.00758618 ], [ 115.1245021, 31.00790833 ], [ 115.12437003, 31.0081561 ], [ 115.12417206, 31.00835766 ], [ 115.12331382, 31.00880814 ], [ 115.12302316, 31.00903672 ], [ 115.12169859, 31.01072227 ], [ 115.1213217, 31.01089642 ], [ 115.12085848, 31.01091433 ], [ 115.11997434, 31.01082261 ], [ 115.11886249, 31.01057036 ], [ 115.11844898, 31.01059756 ], [ 115.11771753, 31.01096992 ], [ 115.11741756, 31.01120044 ], [ 115.11716358, 31.01160386 ], [ 115.1169542, 31.01230624 ], [ 115.11674622, 31.01253164 ], [ 115.1163999, 31.01264544 ], [ 115.11608432, 31.01265483 ], [ 115.11524467, 31.01228379 ], [ 115.114776, 31.01286818 ], [ 115.11457798, 31.01296226 ], [ 115.11433395, 31.01294623 ], [ 115.11419966, 31.0127259 ], [ 115.11425989, 31.01220465 ], [ 115.11435427, 31.01202208 ], [ 115.11469329, 31.01167525 ], [ 115.11473208, 31.0115218 ], [ 115.11456783, 31.01147408 ], [ 115.11387098, 31.01151401 ], [ 115.11348843, 31.01126161 ], [ 115.11307535, 31.01113806 ], [ 115.11290646, 31.0108765 ], [ 115.11271026, 31.00992031 ], [ 115.11300192, 31.00978364 ], [ 115.11355754, 31.00979421 ], [ 115.11436352, 31.00991764 ], [ 115.1153781, 31.01019551 ], [ 115.11563404, 31.01019383 ], [ 115.11572372, 31.01009758 ], [ 115.1156963, 31.00996439 ], [ 115.11519244, 31.0095319 ], [ 115.11512167, 31.00930592 ], [ 115.11541536, 31.00892406 ], [ 115.11603415, 31.00853629 ], [ 115.11607011, 31.00839046 ], [ 115.11591553, 31.00831778 ], [ 115.11568127, 31.00833235 ], [ 115.11461923, 31.00864584 ], [ 115.11434632, 31.00860018 ], [ 115.1141822, 31.00846677 ], [ 115.11399242, 31.00781024 ], [ 115.11412221, 31.00721054 ], [ 115.11434433, 31.00671782 ], [ 115.11472192, 31.00639998 ], [ 115.11481174, 31.00623536 ], [ 115.11475162, 31.00607852 ], [ 115.11453449, 31.00601882 ], [ 115.11423301, 31.00609936 ], [ 115.11390432, 31.00635645 ], [ 115.11326912, 31.00737425 ], [ 115.1128696, 31.00780906 ], [ 115.11242662, 31.00816192 ], [ 115.11181898, 31.00851439 ], [ 115.11152362, 31.00861002 ], [ 115.11130837, 31.0085905 ], [ 115.11115778, 31.00850412 ], [ 115.11090642, 31.00819395 ], [ 115.11049604, 31.00821145 ], [ 115.11023087, 31.0080886 ], [ 115.10999625, 31.0075856 ], [ 115.11004277, 31.00710557 ], [ 115.11044528, 31.00655416 ], [ 115.1109881, 31.0061804 ], [ 115.11105599, 31.00593172 ], [ 115.11064739, 31.00530627 ], [ 115.11012956, 31.00426359 ], [ 115.10971383, 31.00359775 ], [ 115.10926362, 31.00302833 ], [ 115.10912219, 31.00272363 ], [ 115.1090137, 31.0021898 ], [ 115.10913175, 31.00073816 ], [ 115.10902335, 30.99997595 ], [ 115.10882251, 30.99961994 ], [ 115.10853559, 30.99940177 ], [ 115.10684558, 30.99887197 ], [ 115.10679445, 30.99896177 ], [ 115.10686353, 30.9991297 ], [ 115.1075418, 30.9998217 ], [ 115.10788717, 31.0004439 ], [ 115.10807832, 31.00096173 ], [ 115.10825097, 31.00196046 ], [ 115.10850818, 31.00260784 ], [ 115.10849226, 31.00274961 ], [ 115.10834801, 31.00290568 ], [ 115.10783711, 31.00309372 ], [ 115.10763033, 31.00326815 ], [ 115.10736423, 31.0043918 ], [ 115.10741606, 31.00478433 ], [ 115.1077778, 31.0056879 ], [ 115.10772412, 31.00593767 ], [ 115.10748118, 31.00638217 ], [ 115.10748051, 31.00653032 ], [ 115.10811996, 31.00757207 ], [ 115.10819754, 31.00782937 ], [ 115.10816985, 31.00809099 ], [ 115.10799426, 31.00825648 ], [ 115.10770557, 31.00820976 ], [ 115.10687505, 31.00767822 ], [ 115.10592185, 31.0072126 ], [ 115.10468298, 31.00648811 ], [ 115.10328391, 31.00615175 ], [ 115.10311833, 31.00618415 ], [ 115.10307497, 31.00627174 ], [ 115.10328944, 31.00659621 ], [ 115.10426484, 31.00729307 ], [ 115.10456649, 31.00760687 ], [ 115.10508743, 31.0087116 ], [ 115.10503639, 31.00927687 ], [ 115.10514621, 31.00949513 ], [ 115.10537975, 31.00956357 ], [ 115.10587539, 31.00957415 ], [ 115.10644938, 31.0092981 ], [ 115.10695241, 31.00958242 ], [ 115.10727163, 31.00960868 ], [ 115.10735782, 31.00968847 ], [ 115.10718214, 31.01139959 ], [ 115.10738957, 31.0121758 ], [ 115.1073858, 31.01235996 ], [ 115.1072329, 31.01251959 ], [ 115.10671155, 31.01266203 ], [ 115.1066017, 31.01282109 ], [ 115.1065761, 31.01304382 ], [ 115.10668661, 31.01317235 ], [ 115.10720298, 31.01317829 ], [ 115.10748875, 31.01333048 ], [ 115.10849763, 31.0149982 ], [ 115.10855438, 31.0151564 ], [ 115.10850569, 31.01528701 ], [ 115.10786098, 31.01525767 ], [ 115.10749385, 31.0155218 ], [ 115.10732767, 31.01556196 ], [ 115.10678163, 31.01531774 ], [ 115.10668594, 31.01520795 ], [ 115.10667639, 31.01500003 ], [ 115.10691808, 31.01440699 ], [ 115.10688231, 31.01431362 ], [ 115.10678578, 31.01427489 ], [ 115.10628071, 31.01425011 ], [ 115.10595038, 31.01475164 ], [ 115.10582085, 31.014776 ], [ 115.10569749, 31.01468847 ], [ 115.10536018, 31.0139375 ], [ 115.10533445, 31.01333575 ], [ 115.10513432, 31.0126319 ], [ 115.10505031, 31.01252994 ], [ 115.10469433, 31.01236366 ], [ 115.10456003, 31.01215621 ], [ 115.10468474, 31.01104854 ], [ 115.10458643, 31.01080022 ], [ 115.10442975, 31.01072045 ], [ 115.10418983, 31.01078553 ], [ 115.10348817, 31.01133755 ], [ 115.10266956, 31.01148442 ], [ 115.10209111, 31.0116793 ], [ 115.10168985, 31.01169326 ], [ 115.10068043, 31.01154002 ], [ 115.10030194, 31.01159222 ], [ 115.09891167, 31.01253797 ], [ 115.09824082, 31.01261291 ], [ 115.09800278, 31.01272212 ], [ 115.09647855, 31.01391186 ], [ 115.09619963, 31.01406161 ], [ 115.09543252, 31.01417379 ], [ 115.09488615, 31.01438024 ], [ 115.09443892, 31.01446982 ], [ 115.09383521, 31.01473759 ], [ 115.09327848, 31.01479825 ], [ 115.0923381, 31.0147695 ], [ 115.09210603, 31.01484438 ], [ 115.0921141, 31.01495649 ], [ 115.09221335, 31.01503535 ], [ 115.09303754, 31.01540666 ], [ 115.093285, 31.01558598 ], [ 115.09334369, 31.01575153 ], [ 115.09311824, 31.01585135 ], [ 115.09277813, 31.01584629 ], [ 115.09209188, 31.01569248 ], [ 115.09152989, 31.01578987 ], [ 115.09124588, 31.01570441 ], [ 115.09111769, 31.01547363 ], [ 115.09142233, 31.01496224 ], [ 115.09133791, 31.01466935 ], [ 115.09114837, 31.01450624 ], [ 115.09093604, 31.0144921 ], [ 115.09039411, 31.01481352 ], [ 115.09026241, 31.01481185 ], [ 115.0901961, 31.01462984 ], [ 115.0904686, 31.0143083 ], [ 115.09049522, 31.0141496 ], [ 115.09033974, 31.01391752 ], [ 115.09012006, 31.01375152 ], [ 115.08980127, 31.013704 ], [ 115.08901346, 31.013812 ], [ 115.08793393, 31.01364919 ], [ 115.08786289, 31.01347772 ], [ 115.08791403, 31.01324844 ], [ 115.08860039, 31.01232047 ], [ 115.08857428, 31.01214588 ], [ 115.08828737, 31.01167778 ], [ 115.08856427, 31.01135365 ], [ 115.08856232, 31.0112429 ], [ 115.08809195, 31.01133402 ], [ 115.08774592, 31.01153156 ], [ 115.08765928, 31.01174446 ], [ 115.08774378, 31.01212958 ], [ 115.08770633, 31.01230441 ], [ 115.08749916, 31.01248393 ], [ 115.08703697, 31.0125942 ], [ 115.08688787, 31.0129218 ], [ 115.08665912, 31.01313374 ], [ 115.08625975, 31.01325707 ], [ 115.08569966, 31.01321282 ], [ 115.08566509, 31.01312828 ], [ 115.08588635, 31.0129978 ], [ 115.08594773, 31.0128855 ], [ 115.08590563, 31.01230994 ], [ 115.08598229, 31.01206615 ], [ 115.08618188, 31.01193233 ], [ 115.08681944, 31.01183254 ], [ 115.08697981, 31.01166161 ], [ 115.08703419, 31.01146329 ], [ 115.08694449, 31.01128447 ], [ 115.08649689, 31.01101806 ], [ 115.08624467, 31.01077372 ], [ 115.08563381, 31.00962027 ], [ 115.0856419, 31.00946792 ], [ 115.08571637, 31.00939581 ], [ 115.08632164, 31.0092731 ], [ 115.08658429, 31.0091598 ], [ 115.08675238, 31.00902019 ], [ 115.08684476, 31.00881535 ], [ 115.08680014, 31.00848583 ], [ 115.08652407, 31.00768139 ], [ 115.08636764, 31.00742239 ], [ 115.08592578, 31.00695048 ], [ 115.08586406, 31.00670445 ], [ 115.08595161, 31.00658759 ], [ 115.08609079, 31.00653776 ], [ 115.08682432, 31.00662513 ], [ 115.08697639, 31.0065903 ], [ 115.08701906, 31.00651846 ], [ 115.08693406, 31.00636811 ], [ 115.08626927, 31.00604072 ], [ 115.08601358, 31.00577381 ], [ 115.08581148, 31.00485793 ], [ 115.08552434, 31.00412012 ], [ 115.08556588, 31.00397045 ], [ 115.08580343, 31.003706 ], [ 115.08584322, 31.00348172 ], [ 115.08572957, 31.00331408 ], [ 115.085546, 31.0033178 ], [ 115.08489867, 31.00369077 ], [ 115.08465589, 31.0038968 ], [ 115.08454618, 31.0041297 ], [ 115.08452962, 31.00453586 ], [ 115.08462388, 31.00478993 ], [ 115.0850861, 31.00521982 ], [ 115.08520948, 31.00548882 ], [ 115.08513581, 31.00667234 ], [ 115.08494201, 31.00715242 ], [ 115.0849579, 31.00734591 ], [ 115.08596199, 31.008479 ], [ 115.08603945, 31.00867166 ], [ 115.08595787, 31.00875243 ], [ 115.08569855, 31.00875844 ], [ 115.0852445, 31.00857825 ], [ 115.0850755, 31.00856951 ], [ 115.08472567, 31.00876154 ], [ 115.084461, 31.00907711 ], [ 115.08438825, 31.00927962 ], [ 115.08440403, 31.00948647 ], [ 115.084844, 31.01014839 ], [ 115.08493789, 31.01046238 ], [ 115.08487223, 31.01078599 ], [ 115.08446213, 31.01156187 ], [ 115.08420263, 31.01170381 ], [ 115.0839481, 31.01196248 ], [ 115.08362797, 31.01199357 ], [ 115.08346355, 31.01190581 ], [ 115.08341323, 31.01164016 ], [ 115.08359363, 31.01095603 ], [ 115.08355361, 31.01037049 ], [ 115.0831165, 31.00946403 ], [ 115.08294417, 31.00936017 ], [ 115.08275386, 31.00947936 ], [ 115.08257042, 31.00977993 ], [ 115.08241676, 31.01059434 ], [ 115.08234396, 31.01069401 ], [ 115.08225328, 31.01062848 ], [ 115.08217421, 31.01042759 ], [ 115.08225179, 31.00985989 ], [ 115.08217797, 31.00974811 ], [ 115.08197153, 31.00976793 ], [ 115.08145497, 31.0099984 ], [ 115.08058009, 31.00980039 ], [ 115.08028431, 31.0098226 ], [ 115.08015772, 31.00992616 ], [ 115.08027207, 31.01026896 ], [ 115.08107163, 31.01123674 ], [ 115.08123377, 31.01151373 ], [ 115.08135985, 31.01189499 ], [ 115.0813376, 31.01262232 ], [ 115.08116609, 31.01257796 ], [ 115.08094962, 31.01236824 ], [ 115.08022554, 31.01125703 ], [ 115.07986373, 31.01106784 ], [ 115.07928429, 31.01094828 ], [ 115.07917838, 31.01100199 ], [ 115.07917813, 31.01110794 ], [ 115.0795241, 31.01162294 ], [ 115.07962368, 31.01213357 ], [ 115.07945757, 31.01249855 ], [ 115.0790257, 31.01277611 ], [ 115.07886514, 31.01280873 ], [ 115.07875212, 31.01276222 ], [ 115.0784913, 31.01230028 ], [ 115.07817225, 31.01208594 ], [ 115.07795395, 31.0121099 ], [ 115.07748737, 31.0123796 ], [ 115.07724787, 31.0124339 ], [ 115.07696964, 31.01236771 ], [ 115.07639953, 31.012042 ], [ 115.07583031, 31.01198247 ], [ 115.07529455, 31.01209025 ], [ 115.0750391, 31.01224069 ], [ 115.0749555, 31.01240883 ], [ 115.07494419, 31.012831 ], [ 115.07488059, 31.0129495 ], [ 115.07477387, 31.01296042 ], [ 115.0743015, 31.01277751 ], [ 115.07414959, 31.01281439 ], [ 115.07406071, 31.01291218 ], [ 115.07367147, 31.01365592 ], [ 115.07366979, 31.01421039 ], [ 115.07384127, 31.01486018 ], [ 115.07411358, 31.01503788 ], [ 115.07488363, 31.01500652 ], [ 115.07539618, 31.01513386 ], [ 115.07562468, 31.01551166 ], [ 115.07608297, 31.01557412 ], [ 115.07622773, 31.01568096 ], [ 115.07637767, 31.01604882 ], [ 115.07638596, 31.01634184 ], [ 115.07627441, 31.01655973 ], [ 115.07567787, 31.0172602 ], [ 115.07555775, 31.01729046 ], [ 115.07518361, 31.01720039 ], [ 115.075032, 31.0172526 ], [ 115.07491012, 31.01750026 ], [ 115.07485121, 31.01800974 ], [ 115.07475572, 31.0181536 ], [ 115.07453385, 31.01817028 ], [ 115.0739421, 31.01786205 ], [ 115.0734942, 31.01811807 ], [ 115.07245172, 31.01832383 ], [ 115.07214954, 31.01850238 ], [ 115.07219399, 31.01870809 ], [ 115.07242762, 31.01890242 ], [ 115.07341544, 31.01911633 ], [ 115.07380619, 31.0192954 ], [ 115.07383958, 31.0194644 ], [ 115.07322383, 31.01973369 ], [ 115.073102, 31.01990357 ], [ 115.07324508, 31.02004994 ], [ 115.07407721, 31.02035237 ], [ 115.07418186, 31.02046292 ], [ 115.07416552, 31.02055794 ], [ 115.07373206, 31.02054422 ], [ 115.07295827, 31.02079356 ], [ 115.07280108, 31.02092248 ], [ 115.07260603, 31.02131203 ], [ 115.07236351, 31.02150211 ], [ 115.07158569, 31.02160042 ], [ 115.07105565, 31.02190965 ], [ 115.07058194, 31.02203543 ], [ 115.06980626, 31.0224518 ], [ 115.06910636, 31.02311423 ], [ 115.06813197, 31.02340572 ], [ 115.06788711, 31.02357767 ], [ 115.06786765, 31.02370805 ], [ 115.06794766, 31.02389181 ], [ 115.06902987, 31.02564356 ], [ 115.06920191, 31.02629859 ], [ 115.06923682, 31.026934 ], [ 115.069836, 31.02799404 ] ], [ [ 115.069836, 31.02799404 ], [ 115.06938981, 31.02841429 ], [ 115.06937153, 31.02866117 ] ], [ [ 115.069836, 31.02799404 ], [ 115.07055181, 31.02797582 ], [ 115.07096173, 31.02781371 ], [ 115.07104697, 31.02765837 ], [ 115.07097991, 31.02732837 ], [ 115.07103564, 31.02714586 ], [ 115.07127575, 31.02698009 ], [ 115.07185816, 31.02688563 ], [ 115.07193029, 31.02674817 ], [ 115.07196635, 31.02631431 ], [ 115.07208036, 31.02618618 ], [ 115.0722966, 31.02609743 ], [ 115.07444061, 31.02617986 ], [ 115.07592566, 31.02607254 ], [ 115.07738421, 31.02611596 ], [ 115.07810596, 31.02601326 ], [ 115.07936367, 31.02639755 ], [ 115.08135568, 31.02662037 ], [ 115.08150233, 31.02652373 ], [ 115.08155775, 31.0259855 ], [ 115.08175448, 31.02582882 ], [ 115.08196759, 31.02588991 ], [ 115.08234571, 31.02627313 ], [ 115.08289564, 31.02633249 ], [ 115.08302075, 31.02627783 ], [ 115.0830625, 31.02604611 ], [ 115.08274974, 31.02527254 ], [ 115.082758, 31.02512189 ], [ 115.08284309, 31.02503573 ], [ 115.08301333, 31.02504857 ], [ 115.0832001, 31.02519752 ], [ 115.08333246, 31.02544045 ], [ 115.08352973, 31.02612999 ], [ 115.08371823, 31.02621951 ], [ 115.08392563, 31.02610585 ], [ 115.08426327, 31.02576832 ], [ 115.08484006, 31.02560572 ], [ 115.08492571, 31.02542715 ], [ 115.08498174, 31.02486421 ], [ 115.08510389, 31.02473802 ], [ 115.08524686, 31.0247063 ], [ 115.08591359, 31.02494953 ], [ 115.08610835, 31.02511991 ], [ 115.08622281, 31.0253499 ], [ 115.08620769, 31.02584303 ], [ 115.08601559, 31.02618209 ], [ 115.08633806, 31.02654225 ], [ 115.08638627, 31.02705348 ], [ 115.08623905, 31.02733235 ], [ 115.08575798, 31.027602 ], [ 115.08565668, 31.02782395 ], [ 115.08579434, 31.02853624 ], [ 115.08598595, 31.02885324 ], [ 115.08609123, 31.02886277 ], [ 115.0862092, 31.0287641 ], [ 115.08663317, 31.02804226 ], [ 115.08727627, 31.02760239 ], [ 115.0875598, 31.0269944 ], [ 115.08770422, 31.02681409 ], [ 115.08797015, 31.02679757 ], [ 115.08866391, 31.02709538 ], [ 115.08926628, 31.02705581 ], [ 115.08946575, 31.02696647 ], [ 115.08947872, 31.0267524 ], [ 115.08925674, 31.02640732 ], [ 115.08781572, 31.02517382 ], [ 115.08753247, 31.02483103 ], [ 115.08734587, 31.02443899 ], [ 115.0872613, 31.02389711 ], [ 115.08738188, 31.02350179 ], [ 115.08756964, 31.02346849 ], [ 115.08810046, 31.02361584 ], [ 115.088258, 31.02350209 ], [ 115.08811557, 31.02297591 ], [ 115.08810185, 31.02252568 ], [ 115.08800252, 31.02235638 ], [ 115.08772155, 31.02232169 ], [ 115.08708564, 31.0225337 ], [ 115.08631226, 31.02236981 ], [ 115.08622503, 31.02248074 ], [ 115.08620547, 31.02279361 ], [ 115.08613608, 31.02293832 ], [ 115.08579357, 31.02307342 ], [ 115.08473017, 31.02307933 ], [ 115.08402827, 31.02285143 ], [ 115.08357012, 31.02302476 ], [ 115.08336019, 31.02303796 ], [ 115.0831998, 31.02289195 ], [ 115.08325061, 31.02239841 ], [ 115.08305419, 31.02208664 ], [ 115.08237596, 31.02160782 ], [ 115.08166788, 31.0214856 ], [ 115.08107075, 31.02069795 ], [ 115.08051799, 31.02043071 ], [ 115.08044594, 31.0201802 ], [ 115.08054166, 31.01996391 ], [ 115.08075178, 31.01980336 ], [ 115.08119214, 31.0196656 ], [ 115.0815564, 31.01940897 ], [ 115.08184051, 31.01911609 ], [ 115.08187091, 31.01891156 ], [ 115.08140337, 31.01840559 ], [ 115.08123178, 31.01783927 ], [ 115.08106989, 31.01766421 ], [ 115.08027631, 31.0173643 ], [ 115.07964913, 31.01760022 ], [ 115.0795278, 31.01755819 ], [ 115.07938221, 31.01704462 ], [ 115.07940831, 31.01685514 ], [ 115.07965228, 31.01665677 ], [ 115.08004084, 31.01656842 ], [ 115.08063309, 31.01664992 ], [ 115.08126482, 31.01722035 ], [ 115.08146243, 31.01732032 ], [ 115.08261655, 31.01730564 ], [ 115.08293634, 31.01766929 ], [ 115.08326146, 31.01778197 ], [ 115.0836679, 31.01773586 ], [ 115.08376429, 31.01759585 ], [ 115.08382852, 31.01727703 ], [ 115.08396755, 31.01716976 ], [ 115.0844269, 31.01731757 ], [ 115.08500251, 31.01729886 ], [ 115.08554616, 31.017629 ], [ 115.08610574, 31.01751012 ], [ 115.08635377, 31.01757013 ], [ 115.08646286, 31.01774834 ], [ 115.08633839, 31.01803955 ], [ 115.08617233, 31.01817767 ], [ 115.08577162, 31.0182937 ], [ 115.0856837, 31.01838188 ], [ 115.085798, 31.01871641 ], [ 115.08578986, 31.01889214 ], [ 115.08542633, 31.01958837 ], [ 115.08546364, 31.01982597 ], [ 115.08560047, 31.01991778 ], [ 115.08587108, 31.01984714 ], [ 115.08619153, 31.01962665 ], [ 115.08676183, 31.0189043 ], [ 115.08730353, 31.01873806 ], [ 115.08768021, 31.01790985 ], [ 115.08782678, 31.01778846 ], [ 115.08807024, 31.01779192 ], [ 115.0884277, 31.01806839 ], [ 115.08874039, 31.01844156 ], [ 115.08885382, 31.01873577 ], [ 115.089022, 31.01959015 ], [ 115.08913399, 31.01972974 ], [ 115.08932843, 31.01979001 ], [ 115.08952005, 31.01969904 ], [ 115.08959765, 31.01951159 ], [ 115.08939214, 31.01855954 ], [ 115.08938951, 31.01797768 ], [ 115.08952177, 31.01779758 ], [ 115.09111608, 31.01774806 ], [ 115.09224463, 31.01778972 ], [ 115.09286247, 31.01752953 ], [ 115.09407105, 31.01732956 ], [ 115.09457009, 31.0169276 ], [ 115.09517827, 31.01687945 ], [ 115.09557752, 31.01652395 ], [ 115.09569828, 31.01661906 ], [ 115.09585481, 31.01704683 ], [ 115.09605188, 31.01710449 ], [ 115.09633811, 31.01691357 ], [ 115.09660158, 31.01658422 ], [ 115.09651632, 31.01609211 ], [ 115.09658753, 31.01588666 ], [ 115.09686306, 31.01572787 ], [ 115.09715372, 31.01575151 ], [ 115.09768329, 31.01623138 ], [ 115.09812976, 31.01643384 ], [ 115.0982001, 31.01660872 ], [ 115.09821257, 31.0170849 ], [ 115.09830221, 31.01725469 ], [ 115.09843957, 31.01728592 ], [ 115.09886941, 31.01718216 ], [ 115.09913981, 31.01735956 ], [ 115.0992758, 31.01760833 ], [ 115.0993363, 31.01819389 ], [ 115.09929346, 31.01841507 ], [ 115.09911362, 31.01858845 ], [ 115.09822658, 31.01878166 ], [ 115.09804677, 31.01888381 ], [ 115.09809101, 31.01903391 ], [ 115.09848189, 31.01929688 ], [ 115.09853622, 31.0195039 ], [ 115.09797814, 31.02042131 ], [ 115.09777371, 31.02097229 ], [ 115.09745163, 31.02136601 ], [ 115.09740764, 31.02153407 ], [ 115.09748138, 31.02162309 ], [ 115.09783285, 31.02177208 ], [ 115.0980938, 31.0221782 ], [ 115.09845033, 31.0225218 ], [ 115.0986718, 31.02255759 ], [ 115.09955024, 31.02247703 ], [ 115.10002012, 31.02261844 ], [ 115.10008693, 31.02277595 ], [ 115.09975836, 31.02300321 ], [ 115.09967656, 31.02317447 ], [ 115.09974204, 31.02357571 ], [ 115.0998936, 31.02370402 ], [ 115.10079765, 31.02337984 ], [ 115.10095169, 31.0232073 ], [ 115.10115951, 31.0226154 ], [ 115.10185515, 31.02232581 ], [ 115.10098849, 31.0221904 ], [ 115.09979602, 31.02172999 ], [ 115.09933439, 31.02163852 ], [ 115.09918229, 31.02145674 ], [ 115.09919373, 31.0212059 ], [ 115.09936837, 31.02097952 ], [ 115.09970216, 31.02084601 ], [ 115.10008888, 31.02081458 ], [ 115.10088904, 31.02100423 ], [ 115.10108761, 31.0209302 ], [ 115.10143202, 31.02064707 ], [ 115.10149249, 31.02053034 ], [ 115.10146616, 31.02043058 ], [ 115.10107177, 31.02014634 ], [ 115.10096569, 31.01999763 ], [ 115.10078808, 31.01936635 ], [ 115.10087224, 31.01916619 ], [ 115.10114975, 31.01922672 ], [ 115.10170984, 31.01961012 ], [ 115.10199603, 31.01965899 ], [ 115.10219952, 31.01958 ], [ 115.10223445, 31.01944059 ], [ 115.10197399, 31.01875174 ], [ 115.10149909, 31.01844681 ], [ 115.10143557, 31.0183395 ], [ 115.10162645, 31.01792768 ], [ 115.10164236, 31.01739389 ], [ 115.10177575, 31.01699814 ], [ 115.10200492, 31.01670366 ], [ 115.1023296, 31.01659952 ], [ 115.10248513, 31.01672017 ], [ 115.10252979, 31.01721472 ], [ 115.10261475, 31.01739222 ], [ 115.10353229, 31.01784545 ], [ 115.10376643, 31.01808618 ], [ 115.10392207, 31.0183799 ], [ 115.10388999, 31.01873034 ], [ 115.1033981, 31.01936189 ], [ 115.10328959, 31.01962699 ], [ 115.1033197, 31.02007119 ], [ 115.10356168, 31.02041634 ], [ 115.1037716, 31.02042026 ], [ 115.10395602, 31.01992598 ], [ 115.10424035, 31.01971608 ], [ 115.10442802, 31.01973774 ], [ 115.10473805, 31.02003367 ], [ 115.10497602, 31.02017042 ], [ 115.10520097, 31.02021618 ], [ 115.10535213, 31.0201438 ], [ 115.10544362, 31.0199557 ], [ 115.10544672, 31.01978022 ], [ 115.10513246, 31.0191437 ], [ 115.10516038, 31.01899352 ], [ 115.10526444, 31.01891595 ], [ 115.1055777, 31.01892239 ], [ 115.10649427, 31.01921364 ], [ 115.10664651, 31.01940062 ], [ 115.10666959, 31.01971975 ], [ 115.10677613, 31.01978607 ], [ 115.10778017, 31.01950223 ], [ 115.10918177, 31.01895031 ], [ 115.10957372, 31.01888824 ], [ 115.11003867, 31.01891369 ], [ 115.11012759, 31.01905271 ], [ 115.10972953, 31.01954222 ], [ 115.10963826, 31.01984398 ], [ 115.10960419, 31.02129773 ], [ 115.10969794, 31.02164917 ], [ 115.10984939, 31.02184813 ], [ 115.11002923, 31.02188843 ], [ 115.11015614, 31.02176375 ], [ 115.1102267, 31.02090649 ], [ 115.11044316, 31.01997242 ], [ 115.1106492, 31.0198199 ], [ 115.11097602, 31.0198614 ], [ 115.11114575, 31.01996192 ], [ 115.11120433, 31.02007426 ], [ 115.11110027, 31.02067289 ], [ 115.11126837, 31.02107981 ], [ 115.11144718, 31.02131215 ], [ 115.11159632, 31.02132752 ], [ 115.11192158, 31.02115622 ], [ 115.11305603, 31.02078795 ], [ 115.11337807, 31.02082741 ], [ 115.1135762, 31.02103902 ], [ 115.11382138, 31.02171215 ], [ 115.11472633, 31.02239413 ], [ 115.11502515, 31.02306751 ], [ 115.11517364, 31.0232613 ], [ 115.11675965, 31.02441659 ], [ 115.11695027, 31.02446677 ], [ 115.11703035, 31.02432046 ], [ 115.1169682, 31.02406645 ], [ 115.11641513, 31.02338848 ], [ 115.11614976, 31.02281125 ], [ 115.11576353, 31.02220733 ], [ 115.1153645, 31.02177007 ], [ 115.11450415, 31.02126209 ], [ 115.11433618, 31.02099046 ], [ 115.11421391, 31.02053179 ], [ 115.11427043, 31.02029102 ], [ 115.11440216, 31.02009662 ], [ 115.11474233, 31.01990194 ], [ 115.11533975, 31.0199157 ], [ 115.11672172, 31.02023679 ], [ 115.11692017, 31.02018558 ], [ 115.11696565, 31.0201141 ], [ 115.11692596, 31.02001018 ], [ 115.11583902, 31.01954639 ], [ 115.11455784, 31.0193598 ], [ 115.11430421, 31.01945104 ], [ 115.11370015, 31.01999956 ], [ 115.1125342, 31.01997633 ], [ 115.1123197, 31.01984012 ], [ 115.1120581, 31.01928852 ], [ 115.11161236, 31.01886993 ], [ 115.11156618, 31.01869362 ], [ 115.11162377, 31.01854996 ], [ 115.11179411, 31.01851422 ], [ 115.1123083, 31.01856775 ], [ 115.11245847, 31.01849647 ], [ 115.11249681, 31.01841072 ], [ 115.11234357, 31.01818212 ], [ 115.11177796, 31.01782081 ], [ 115.11172167, 31.01770359 ], [ 115.11240175, 31.01754589 ], [ 115.11275217, 31.01734808 ], [ 115.11284256, 31.0172157 ], [ 115.11274648, 31.01705334 ], [ 115.11234212, 31.01695778 ], [ 115.11226549, 31.01679 ], [ 115.11233596, 31.01652201 ], [ 115.1127343, 31.01605791 ], [ 115.11270805, 31.01589071 ], [ 115.11234039, 31.01586215 ], [ 115.11194978, 31.01599967 ], [ 115.1117459, 31.01621374 ], [ 115.11151178, 31.01666616 ], [ 115.11140394, 31.01673035 ], [ 115.11131385, 31.01645173 ], [ 115.11100608, 31.01612753 ], [ 115.11086602, 31.01577171 ], [ 115.11087672, 31.015265 ], [ 115.11079044, 31.01490024 ], [ 115.1108843, 31.01473596 ], [ 115.11107911, 31.0147621 ], [ 115.1112717, 31.01489416 ], [ 115.11181542, 31.01552981 ], [ 115.11191752, 31.01553645 ], [ 115.11201042, 31.01543285 ], [ 115.11205176, 31.01522853 ], [ 115.11201086, 31.0149644 ], [ 115.11164444, 31.0142697 ], [ 115.11158159, 31.01402288 ], [ 115.11166803, 31.0136638 ], [ 115.11188443, 31.01352802 ], [ 115.11208078, 31.01364314 ], [ 115.11238158, 31.01433022 ], [ 115.11253986, 31.01451228 ], [ 115.1127405, 31.01455373 ], [ 115.11278635, 31.01435752 ], [ 115.11287238, 31.01433374 ], [ 115.11368179, 31.01477023 ], [ 115.11442248, 31.0154033 ], [ 115.11556827, 31.01618827 ], [ 115.11663239, 31.01739757 ], [ 115.11711572, 31.01760215 ], [ 115.1182668, 31.01772806 ], [ 115.11858772, 31.01781572 ], [ 115.1189684, 31.01813628 ], [ 115.119286, 31.01871646 ], [ 115.11936568, 31.01871384 ], [ 115.11945644, 31.01859833 ], [ 115.11961143, 31.01785535 ], [ 115.11974429, 31.01758837 ], [ 115.12000239, 31.01748349 ], [ 115.12039238, 31.01759644 ], [ 115.12055392, 31.01758568 ], [ 115.12068229, 31.01706606 ], [ 115.12095956, 31.01685139 ], [ 115.1218592, 31.01655591 ], [ 115.122328, 31.01652174 ], [ 115.12294413, 31.01665442 ], [ 115.12342176, 31.01697385 ], [ 115.12378602, 31.01754958 ], [ 115.12394786, 31.01797622 ], [ 115.12392424, 31.01833783 ], [ 115.12370352, 31.01879842 ], [ 115.12337837, 31.01917984 ], [ 115.12270837, 31.01964824 ], [ 115.12219427, 31.02019371 ], [ 115.12169817, 31.02047461 ], [ 115.12145547, 31.02047112 ], [ 115.12121728, 31.02030972 ], [ 115.12089988, 31.01957564 ], [ 115.12082959, 31.01949065 ], [ 115.12075033, 31.01950387 ], [ 115.12058825, 31.02044563 ], [ 115.12045206, 31.02085136 ], [ 115.12013786, 31.02158553 ], [ 115.11936156, 31.02272771 ], [ 115.11927093, 31.02300019 ], [ 115.11929887, 31.0231939 ], [ 115.11949367, 31.0234252 ], [ 115.12030413, 31.02398762 ], [ 115.12053573, 31.02422366 ], [ 115.12061182, 31.02448063 ], [ 115.12044665, 31.02493619 ], [ 115.12051043, 31.02504997 ], [ 115.12109004, 31.02518771 ], [ 115.12233767, 31.02566007 ], [ 115.12396812, 31.02605635 ], [ 115.1244339, 31.02609315 ], [ 115.12517842, 31.02600712 ], [ 115.12546987, 31.0260314 ], [ 115.12565337, 31.02613228 ], [ 115.12577417, 31.02629175 ], [ 115.12593608, 31.02691416 ], [ 115.12609764, 31.02717424 ], [ 115.12634817, 31.02728207 ], [ 115.12684499, 31.02719639 ], [ 115.12702777, 31.02726839 ], [ 115.12720517, 31.02760412 ], [ 115.12749442, 31.02903734 ], [ 115.12805405, 31.02975155 ], [ 115.12805095, 31.03025227 ], [ 115.12819811, 31.03063004 ], [ 115.1286193, 31.03133552 ], [ 115.12900686, 31.0318351 ], [ 115.12950244, 31.03234195 ], [ 115.12995357, 31.032653 ], [ 115.13008635, 31.03266278 ], [ 115.13016385, 31.03257838 ], [ 115.13008527, 31.03222715 ], [ 115.12953439, 31.03133586 ], [ 115.12898399, 31.03078167 ], [ 115.12894152, 31.03062264 ], [ 115.12904292, 31.03021451 ], [ 115.12901237, 31.02994763 ], [ 115.12772204, 31.0280328 ], [ 115.12746667, 31.02682243 ], [ 115.12728829, 31.02666233 ], [ 115.12669714, 31.02650612 ], [ 115.12648805, 31.02626798 ], [ 115.12643836, 31.02596646 ], [ 115.12646987, 31.02532192 ], [ 115.12667708, 31.02479211 ], [ 115.12693576, 31.02456236 ], [ 115.12745746, 31.0242982 ], [ 115.12780807, 31.02419019 ], [ 115.12808481, 31.02420613 ], [ 115.12845542, 31.02453205 ], [ 115.12882289, 31.0253839 ], [ 115.12898801, 31.02544876 ], [ 115.12928139, 31.02510381 ], [ 115.12931434, 31.02485082 ], [ 115.12871206, 31.0241898 ], [ 115.12861071, 31.02393802 ], [ 115.12860491, 31.0237263 ], [ 115.12882316, 31.02344401 ], [ 115.12931998, 31.02332767 ], [ 115.13030207, 31.02338596 ], [ 115.13057811, 31.02347801 ], [ 115.13074633, 31.02371757 ], [ 115.13104744, 31.0248006 ], [ 115.13120191, 31.02498764 ], [ 115.13141115, 31.02500248 ], [ 115.1315244, 31.02487933 ], [ 115.13154622, 31.02471579 ], [ 115.1312314, 31.02397755 ], [ 115.13118023, 31.02354556 ], [ 115.13126332, 31.02316421 ], [ 115.13144396, 31.02305633 ], [ 115.13180142, 31.02324266 ], [ 115.13263667, 31.02398168 ], [ 115.13309247, 31.02410439 ], [ 115.13409918, 31.02416588 ], [ 115.13454638, 31.02436821 ], [ 115.13501701, 31.02492596 ], [ 115.13566518, 31.02615188 ], [ 115.13589035, 31.02641911 ], [ 115.13604454, 31.02641396 ], [ 115.13626063, 31.02607652 ], [ 115.13646214, 31.0259964 ], [ 115.1367476, 31.02603115 ], [ 115.13735644, 31.02624422 ], [ 115.13759846, 31.0262359 ], [ 115.13768193, 31.02613834 ], [ 115.13760279, 31.02603999 ], [ 115.13657644, 31.02557427 ], [ 115.13552961, 31.02473967 ], [ 115.13445688, 31.02351415 ], [ 115.13416596, 31.0233663 ], [ 115.13356985, 31.02326541 ], [ 115.13311182, 31.0230855 ], [ 115.13247836, 31.02274247 ], [ 115.13237159, 31.02251559 ], [ 115.13254192, 31.02232827 ], [ 115.1329117, 31.0221498 ], [ 115.13437789, 31.02186186 ], [ 115.13510789, 31.0214785 ], [ 115.1359722, 31.02119043 ], [ 115.13640335, 31.0211436 ], [ 115.13693003, 31.0212952 ], [ 115.13761844, 31.021869 ], [ 115.13819999, 31.02202628 ], [ 115.13835151, 31.02218832 ], [ 115.13858158, 31.02265858 ], [ 115.13870772, 31.02268226 ], [ 115.13877043, 31.02238354 ], [ 115.13862787, 31.02204802 ], [ 115.13837226, 31.02178965 ], [ 115.13769093, 31.02138379 ], [ 115.13756636, 31.02123045 ], [ 115.13753048, 31.02103185 ], [ 115.13767541, 31.02077751 ], [ 115.13842554, 31.02011612 ], [ 115.13920419, 31.0199357 ], [ 115.13966758, 31.01994986 ], [ 115.14076649, 31.02023492 ], [ 115.14109242, 31.02038401 ], [ 115.14136801, 31.02063394 ], [ 115.14163552, 31.02114009 ], [ 115.14172789, 31.02187856 ], [ 115.14168148, 31.02264757 ], [ 115.1414233, 31.02392036 ], [ 115.14144252, 31.02425697 ], [ 115.14153184, 31.0245195 ], [ 115.14173401, 31.02483454 ], [ 115.14202942, 31.02512974 ], [ 115.14316953, 31.02582604 ], [ 115.14432042, 31.02688752 ], [ 115.1446436, 31.02727874 ], [ 115.14496638, 31.02785184 ], [ 115.14590426, 31.02822065 ], [ 115.14648731, 31.02857189 ], [ 115.14677601, 31.02861639 ], [ 115.14711552, 31.02847956 ], [ 115.14823536, 31.02769126 ], [ 115.14885224, 31.02737429 ], [ 115.14944493, 31.02720448 ], [ 115.14994226, 31.0272346 ], [ 115.15029059, 31.0274726 ], [ 115.15060701, 31.02802851 ], [ 115.15077763, 31.02860841 ], [ 115.1508947, 31.02960727 ], [ 115.15117376, 31.0302132 ], [ 115.15141847, 31.03046761 ], [ 115.15166655, 31.03056553 ], [ 115.15202854, 31.0305802 ], [ 115.15230559, 31.03048307 ] ], [ [ 115.15244364, 31.03035564 ], [ 115.15230559, 31.03048307 ] ], [ [ 115.15230559, 31.03048307 ], [ 115.1516275, 31.02999039 ], [ 115.15141868, 31.02963108 ], [ 115.15133561, 31.02922207 ], [ 115.15128365, 31.02769881 ], [ 115.15117237, 31.0268229 ], [ 115.15095017, 31.02621389 ], [ 115.15061879, 31.02583946 ], [ 115.15026121, 31.02567916 ], [ 115.14988169, 31.02571628 ], [ 115.14962074, 31.02585988 ], [ 115.14891006, 31.02647471 ], [ 115.14706761, 31.02764267 ], [ 115.14653633, 31.02780041 ], [ 115.1459498, 31.0277584 ], [ 115.14546422, 31.02754242 ], [ 115.14515954, 31.02720229 ], [ 115.14495986, 31.02676618 ], [ 115.14464298, 31.02566956 ], [ 115.14395163, 31.02476786 ], [ 115.14369322, 31.02429703 ], [ 115.14357398, 31.02378617 ], [ 115.14333996, 31.02162486 ], [ 115.14320104, 31.01950803 ], [ 115.14320985, 31.01881996 ], [ 115.1433378, 31.01840383 ], [ 115.1435919, 31.01807111 ], [ 115.14387035, 31.01785394 ], [ 115.14456625, 31.01757419 ], [ 115.14511392, 31.01725941 ], [ 115.14546122, 31.017174 ], [ 115.14591953, 31.01734245 ], [ 115.14689, 31.01812794 ], [ 115.14716406, 31.01817163 ], [ 115.14724691, 31.01806515 ], [ 115.14724755, 31.01792983 ], [ 115.14670606, 31.01710584 ], [ 115.14666454, 31.01691351 ], [ 115.14672592, 31.01672571 ], [ 115.14707327, 31.01639586 ], [ 115.14855958, 31.01552001 ], [ 115.14880996, 31.01526078 ], [ 115.14887168, 31.01503182 ], [ 115.14877974, 31.01488441 ], [ 115.1485323, 31.01476401 ], [ 115.14737445, 31.01453795 ], [ 115.14703983, 31.0146508 ], [ 115.14673224, 31.01515374 ], [ 115.14650396, 31.01536008 ], [ 115.14591169, 31.01559825 ], [ 115.14545908, 31.01559814 ], [ 115.14517204, 31.01549446 ], [ 115.14492206, 31.01529312 ], [ 115.14459637, 31.01485521 ], [ 115.14442725, 31.01476573 ], [ 115.14423465, 31.01480075 ], [ 115.14388507, 31.01519446 ], [ 115.14358395, 31.01532952 ], [ 115.14313355, 31.01532025 ], [ 115.14247853, 31.01519045 ], [ 115.14190567, 31.01486802 ], [ 115.14123266, 31.01408303 ], [ 115.14090827, 31.01362149 ], [ 115.14061396, 31.0129316 ], [ 115.14017995, 31.01226461 ], [ 115.1400274, 31.01178756 ], [ 115.14006611, 31.01137171 ], [ 115.14026804, 31.0109938 ], [ 115.14107736, 31.0101096 ], [ 115.14134766, 31.0096699 ], [ 115.14146747, 31.00911369 ], [ 115.14145706, 31.00818015 ], [ 115.1416825, 31.00754191 ], [ 115.14156969, 31.00725164 ], [ 115.1409539, 31.00650586 ], [ 115.14055588, 31.00584122 ], [ 115.14036389, 31.00535207 ], [ 115.14033767, 31.0048987 ], [ 115.14079184, 31.00345561 ], [ 115.14101407, 31.00308066 ], [ 115.1415355, 31.00242911 ], [ 115.14165455, 31.00192783 ], [ 115.14151374, 31.00116847 ], [ 115.14083829, 30.9990375 ], [ 115.14055437, 30.9975978 ], [ 115.14045191, 30.99743389 ], [ 115.14021868, 30.99726212 ], [ 115.13977575, 30.99719982 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124V00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800123V00000", "TRVCD": "AFA9800125V00000", "INDCD": "QFA9800123V00000", "ONDCD": "QFA9800124V00000", "BWSCD": "WFA9800124V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 5622.0, "RVSLP": 0.0013, "IELV": 35.77, "OELV": 28.07, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84295223, 31.01503104 ], [ 114.84165268, 31.01477353 ], [ 114.84131202, 31.01455393 ], [ 114.84083598, 31.01408286 ], [ 114.84003928, 31.01391439 ], [ 114.83976184, 31.01375417 ], [ 114.83950998, 31.0133841 ], [ 114.83934617, 31.01223386 ], [ 114.83894598, 31.01184444 ], [ 114.83833422, 31.01159954 ], [ 114.83754049, 31.01142784 ], [ 114.83668808, 31.01156196 ], [ 114.83606533, 31.01138184 ], [ 114.83570369, 31.01117421 ], [ 114.8353897, 31.01089414 ], [ 114.83521914, 31.01063431 ], [ 114.8350112, 31.01003517 ], [ 114.8346476, 31.00972617 ], [ 114.83402223, 31.00952448 ], [ 114.83323433, 31.00908584 ], [ 114.83301081, 31.00909342 ], [ 114.83247401, 31.00931578 ], [ 114.83222215, 31.00921741 ], [ 114.83199437, 31.00893244 ], [ 114.83184461, 31.00839193 ], [ 114.83155179, 31.0077198 ], [ 114.8304328, 31.00645405 ], [ 114.83015432, 31.00572558 ], [ 114.83001068, 31.00553049 ], [ 114.82947701, 31.00513238 ], [ 114.82820096, 31.00480336 ], [ 114.82795232, 31.00464068 ], [ 114.82754834, 31.00334437 ], [ 114.82743084, 31.00194807 ], [ 114.82721273, 31.00131973 ], [ 114.82710026, 31.00053388 ], [ 114.8265918, 30.99908626 ], [ 114.82645165, 30.99647068 ], [ 114.82636416, 30.99613179 ], [ 114.82615821, 30.99588808 ], [ 114.82580278, 30.99569236 ], [ 114.82509144, 30.99553402 ], [ 114.82486351, 30.99555646 ], [ 114.82429876, 30.99585861 ], [ 114.82388582, 30.99594641 ], [ 114.82300874, 30.99596574 ], [ 114.82254981, 30.99580308 ], [ 114.82234249, 30.99558807 ], [ 114.82229983, 30.99540922 ], [ 114.82264527, 30.99475218 ], [ 114.82279841, 30.99400944 ], [ 114.82274618, 30.99383007 ], [ 114.82253591, 30.993612 ], [ 114.82210979, 30.99336388 ], [ 114.82126472, 30.99327893 ], [ 114.82104663, 30.99320222 ], [ 114.82088473, 30.99304959 ], [ 114.82048353, 30.99230179 ], [ 114.82027516, 30.992116 ], [ 114.82006693, 30.99207037 ], [ 114.81947797, 30.99214214 ], [ 114.81845446, 30.99163419 ], [ 114.81654992, 30.99012648 ], [ 114.81547605, 30.98947257 ], [ 114.81174781, 30.98648034 ], [ 114.8108125, 30.98593034 ], [ 114.80972608, 30.98506911 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820900000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820800000000,AFA98201I0000000", "TRVCD": "AFA980012Q000000", "INDCD": "QFA9820800000000", "ONDCD": "QFA980012P000000", "BWSCD": "WFA9820900000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 17.0, "RVLEN": 2812.0, "RVSLP": 0.0001, "IELV": 39.77, "OELV": 39.38, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90045667, 31.11212188 ], [ 114.89946911, 31.11105771 ], [ 114.8991116, 31.11025944 ], [ 114.89909942, 31.10984941 ], [ 114.89946359, 31.10918019 ], [ 114.89945337, 31.10880221 ], [ 114.89932226, 31.10861146 ], [ 114.89893641, 31.10827676 ], [ 114.89790962, 31.10767979 ], [ 114.89727727, 31.10713577 ], [ 114.89718837, 31.1068904 ], [ 114.89731015, 31.10633989 ], [ 114.897296, 31.10590996 ], [ 114.89719592, 31.10564643 ], [ 114.89690015, 31.10537758 ], [ 114.89595354, 31.10510387 ], [ 114.89528719, 31.10501648 ], [ 114.89498579, 31.1048865 ], [ 114.89405514, 31.10413004 ], [ 114.89352781, 31.10330793 ], [ 114.89297845, 31.10293623 ], [ 114.89264811, 31.10288466 ], [ 114.89213761, 31.10292006 ], [ 114.89097383, 31.10329346 ], [ 114.89067375, 31.10330956 ], [ 114.88956803, 31.10279601 ], [ 114.88857181, 31.10241851 ], [ 114.88741383, 31.10225895 ], [ 114.88617558, 31.101588 ], [ 114.88564179, 31.10137594 ], [ 114.88482036, 31.10124525 ], [ 114.8835163, 31.10076164 ], [ 114.88249511, 31.1004584 ], [ 114.88146486, 31.09991004 ], [ 114.88105392, 31.09961565 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501B0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98502B0000000", "INDCD": "-1", "ONDCD": "QFA98501B0000000", "BWSCD": "WFA98501B0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 8624.0, "RVSLP": 0.0066, "IELV": 136.68, "OELV": 60.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09039004, 30.97637042 ], [ 115.0900116, 30.97753001 ], [ 115.09016214, 30.97812356 ], [ 115.09016409, 30.97846409 ], [ 115.08981006, 30.97913155 ], [ 115.08978986, 30.97938626 ], [ 115.08990844, 30.97963758 ], [ 115.0904504, 30.98016415 ], [ 115.09087464, 30.98068925 ], [ 115.0909379, 30.98091578 ], [ 115.09042465, 30.98157834 ], [ 115.08981359, 30.98267034 ], [ 115.08949027, 30.98312822 ], [ 115.08875754, 30.98486129 ], [ 115.08815248, 30.98544355 ], [ 115.08746668, 30.98585854 ], [ 115.08743231, 30.98608661 ], [ 115.08750009, 30.9863359 ], [ 115.08798414, 30.98686926 ], [ 115.08805893, 30.98709304 ], [ 115.08791354, 30.98732188 ], [ 115.08733586, 30.98792048 ], [ 115.08689458, 30.98855411 ], [ 115.08669016, 30.9893063 ], [ 115.08649949, 30.98971399 ], [ 115.08607242, 30.99017193 ], [ 115.08532613, 30.99048382 ], [ 115.08370403, 30.99061695 ], [ 115.08185572, 30.99122953 ], [ 115.08112613, 30.99138154 ], [ 115.08031174, 30.99173597 ], [ 115.07945945, 30.99200655 ], [ 115.07784044, 30.99214038 ], [ 115.07698822, 30.99241499 ], [ 115.07609571, 30.9927961 ], [ 115.07552237, 30.99280156 ], [ 115.07468232, 30.99245051 ], [ 115.07420138, 30.99248171 ], [ 115.07401502, 30.99259756 ], [ 115.07389047, 30.99283887 ], [ 115.07386854, 30.99379766 ], [ 115.07377628, 30.99415432 ], [ 115.07351783, 30.99460957 ], [ 115.07327747, 30.99482364 ], [ 115.07306303, 30.99492242 ], [ 115.07266458, 30.99492569 ], [ 115.07212429, 30.99473576 ], [ 115.07101689, 30.99417611 ], [ 115.07010829, 30.99381636 ], [ 115.06988435, 30.99377572 ], [ 115.06966559, 30.9938244 ], [ 115.06920865, 30.99417232 ], [ 115.06786414, 30.995485 ], [ 115.0677436, 30.99582521 ], [ 115.06768137, 30.99690968 ], [ 115.06745046, 30.99723347 ], [ 115.06699776, 30.99759238 ], [ 115.06501485, 30.99852248 ], [ 115.06365651, 30.99904356 ], [ 115.0631599, 30.99912033 ], [ 115.06168669, 30.99917604 ], [ 115.06128529, 30.99926698 ], [ 115.06084558, 30.99947268 ], [ 115.0596106, 31.00027548 ], [ 115.05910249, 31.00052419 ], [ 115.05719844, 31.0012121 ], [ 115.05135781, 31.00398396 ], [ 115.04947759, 31.00472956 ], [ 115.04907713, 31.00473012 ], [ 115.04847182, 31.00449745 ], [ 115.04809313, 31.00418616 ], [ 115.04781366, 31.00374408 ], [ 115.04760794, 31.00306685 ], [ 115.04718375, 31.00226831 ], [ 115.04644428, 30.99994615 ], [ 115.04544633, 30.99766139 ], [ 115.04527894, 30.99705741 ], [ 115.04486067, 30.99610366 ], [ 115.04471625, 30.99556556 ], [ 115.0442752, 30.99454586 ], [ 115.04410388, 30.99394443 ], [ 115.04367558, 30.9931496 ], [ 115.04323166, 30.99172018 ], [ 115.04229845, 30.99017954 ], [ 115.04184372, 30.98927856 ], [ 115.04145448, 30.98895423 ], [ 115.04109832, 30.98882996 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850300000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850200000000", "TRVCD": "AFA9850400000000", "INDCD": "QFA9850200000000", "ONDCD": "QFA9850300000000", "BWSCD": "WFA9850300000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 5862.0, "RVSLP": 0.0028, "IELV": 79.18, "OELV": 59.21, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06602959, 30.91902708 ], [ 115.06483491, 30.91931996 ], [ 115.0643177, 30.91954807 ], [ 115.06384665, 30.91988522 ], [ 115.06323216, 30.9204738 ], [ 115.06209114, 30.92204912 ], [ 115.06145537, 30.92320897 ], [ 115.06112002, 30.9236605 ], [ 115.06068018, 30.92442716 ], [ 115.05969605, 30.92581211 ], [ 115.05890561, 30.92680262 ], [ 115.05723612, 30.9283904 ], [ 115.05645435, 30.92896441 ], [ 115.05585151, 30.92989339 ], [ 115.05440289, 30.93132042 ], [ 115.05386447, 30.93207816 ], [ 115.05364193, 30.93254566 ], [ 115.05356789, 30.93347206 ], [ 115.05340587, 30.93411233 ], [ 115.05339638, 30.93558444 ], [ 115.05311219, 30.93619 ], [ 115.05270645, 30.93660762 ], [ 115.05227114, 30.93682643 ], [ 115.05169972, 30.93680203 ], [ 115.05084339, 30.93627654 ], [ 115.04948878, 30.93571596 ], [ 115.04817977, 30.93477021 ], [ 115.0476481, 30.93457408 ], [ 115.04724983, 30.93457171 ], [ 115.04498419, 30.93564565 ], [ 115.04446778, 30.93617159 ], [ 115.04406571, 30.93731838 ], [ 115.04387791, 30.93757001 ], [ 115.04325633, 30.93793435 ], [ 115.04246185, 30.93812963 ], [ 115.04220552, 30.93829126 ], [ 115.04146572, 30.93920584 ], [ 115.04138958, 30.93947483 ], [ 115.04143996, 30.93988224 ], [ 115.04172794, 30.94055353 ], [ 115.04210432, 30.94112598 ], [ 115.04271957, 30.94183717 ], [ 115.04384814, 30.94276623 ], [ 115.04411416, 30.94306374 ], [ 115.04438841, 30.94359041 ], [ 115.04438775, 30.94422084 ], [ 115.04417763, 30.94453764 ], [ 115.04342516, 30.94504076 ], [ 115.04300252, 30.94553046 ], [ 115.04294174, 30.94594995 ], [ 115.04298776, 30.9472276 ], [ 115.04293195, 30.94750027 ], [ 115.04280533, 30.94769496 ], [ 115.0424124, 30.94795629 ], [ 115.04121571, 30.94805465 ], [ 115.04076566, 30.94823576 ], [ 115.03825535, 30.95057566 ], [ 115.03802907, 30.95092032 ], [ 115.03796237, 30.95130567 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850600000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850500000000,AFA98501C0000000", "TRVCD": "AFA9850700000000", "INDCD": "QFA9850500000000", "ONDCD": "QFA9850600000000", "BWSCD": "WFA9850600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 4692.0, "RVSLP": 0.0001, "IELV": 49.36, "OELV": 48.67, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0059757, 30.97000482 ], [ 115.00513364, 30.96971976 ], [ 115.00389541, 30.96882623 ], [ 115.00247868, 30.96846361 ], [ 115.00137556, 30.96793574 ], [ 115.00092173, 30.9677636 ], [ 114.99965423, 30.96745857 ], [ 114.99922681, 30.96720368 ], [ 114.99844733, 30.96654387 ], [ 114.99751244, 30.96541067 ], [ 114.99628767, 30.96435818 ], [ 114.9959844, 30.96356044 ], [ 114.99547993, 30.96273988 ], [ 114.99434447, 30.96172959 ], [ 114.99397606, 30.96115801 ], [ 114.99378964, 30.95949123 ], [ 114.99332236, 30.95818213 ], [ 114.99317437, 30.95726119 ], [ 114.99273199, 30.95639793 ], [ 114.99257377, 30.95548275 ], [ 114.99190973, 30.95468477 ], [ 114.99144409, 30.95342072 ], [ 114.99047518, 30.95181297 ], [ 114.99031614, 30.95105241 ], [ 114.99013232, 30.95056405 ], [ 114.9899998, 30.94971203 ], [ 114.98957352, 30.9489138 ], [ 114.98949305, 30.94857152 ], [ 114.98946852, 30.94761219 ], [ 114.98971153, 30.94656194 ], [ 114.98996016, 30.9458097 ], [ 114.99055446, 30.94460009 ], [ 114.99101948, 30.94241972 ], [ 114.99100491, 30.94192449 ], [ 114.99080533, 30.9413684 ], [ 114.99077644, 30.94102818 ], [ 114.99085094, 30.94075986 ], [ 114.99114231, 30.94028981 ], [ 114.9911822, 30.93995768 ], [ 114.99111846, 30.93969577 ], [ 114.99074582, 30.93917791 ], [ 114.99066938, 30.93877977 ], [ 114.99106032, 30.9375078 ], [ 114.99107873, 30.93672775 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900127J00000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA9900126J00000", "TRVCD": "AFA9900128J00000", "INDCD": "QFA9900126J00000", "ONDCD": "QFA9900127J00000", "BWSCD": "WFA9900127J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 4046.0, "RVSLP": 0.0003, "IELV": 89.52, "OELV": 88.37, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39780616, 31.09110391 ], [ 115.39739572, 31.09080909 ], [ 115.39651567, 31.09032574 ], [ 115.39598219, 31.0901182 ], [ 115.39557232, 31.09005638 ], [ 115.39427487, 31.09006394 ], [ 115.39382132, 31.0898749 ], [ 115.39117222, 31.08776644 ], [ 115.39088609, 31.08739157 ], [ 115.39075447, 31.08676789 ], [ 115.39061751, 31.08650563 ], [ 115.39018608, 31.08610157 ], [ 115.38921676, 31.08538155 ], [ 115.38852447, 31.08513041 ], [ 115.38740698, 31.08512156 ], [ 115.38700258, 31.08504133 ], [ 115.38562449, 31.08401827 ], [ 115.38474848, 31.08355017 ], [ 115.38325169, 31.08313368 ], [ 115.38192992, 31.08220447 ], [ 115.38085715, 31.08180325 ], [ 115.38011383, 31.08169284 ], [ 115.37954984, 31.08133359 ], [ 115.37928329, 31.08103459 ], [ 115.37903974, 31.08051752 ], [ 115.37906809, 31.0802589 ], [ 115.37939198, 31.07972001 ], [ 115.37945134, 31.07937796 ], [ 115.37940375, 31.07895578 ], [ 115.37904118, 31.07792581 ], [ 115.37880623, 31.07754817 ], [ 115.37851752, 31.07725003 ], [ 115.37677188, 31.07596819 ], [ 115.37593833, 31.07444192 ], [ 115.37603086, 31.07384356 ], [ 115.37601961, 31.07349836 ], [ 115.37559807, 31.07256965 ], [ 115.37480075, 31.07194048 ], [ 115.37417042, 31.07174961 ], [ 115.37387368, 31.07159416 ], [ 115.37317564, 31.07098557 ], [ 115.37308645, 31.07078845 ], [ 115.37304561, 31.07043636 ], [ 115.37320411, 31.06972824 ], [ 115.37317623, 31.06940548 ], [ 115.37294025, 31.06911443 ], [ 115.3724396, 31.06872215 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012E000000", "RVNM": "新昌河(巴水)", "GB": "210101", "FRVCD": "AFA990012D000000,AFA9900122L00000", "TRVCD": "AFA990012F000000", "INDCD": "QFA990012D000000", "ONDCD": "QFA990012E000000", "BWSCD": "WFA990012E000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 15.0, "RVLEN": 1776.0, "RVSLP": 0.0, "IELV": 80.0, "OELV": 80.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33984247, 30.98871973 ], [ 115.33982495, 30.98821787 ], [ 115.33988218, 30.98786154 ], [ 115.3405256, 30.98681235 ], [ 115.34070775, 30.9864038 ], [ 115.34080593, 30.98585515 ], [ 115.34104625, 30.98510199 ], [ 115.34149031, 30.98424308 ], [ 115.3418745, 30.98365394 ], [ 115.34196424, 30.98273241 ], [ 115.34212047, 30.98216363 ], [ 115.34210809, 30.98151552 ], [ 115.34185837, 30.98075008 ], [ 115.34173797, 30.97958428 ], [ 115.34121603, 30.97829574 ], [ 115.34113373, 30.97703369 ], [ 115.34118393, 30.9765385 ], [ 115.34177192, 30.9753278 ], [ 115.34205266, 30.97422256 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121A00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122A00000", "INDCD": "-1", "ONDCD": "QFA9800121A00000", "BWSCD": "WFA9800121A00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4637.0, "RVSLP": 0.0115, "IELV": 257.12, "OELV": 170.49, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20609567, 31.51834581 ], [ 115.20583988, 31.51822373 ], [ 115.2051344, 31.51808795 ], [ 115.20449106, 31.51785113 ], [ 115.20366704, 31.5182773 ], [ 115.20312648, 31.51878995 ], [ 115.2028139, 31.51944311 ], [ 115.20214228, 31.52017961 ], [ 115.20187402, 31.52076577 ], [ 115.20136777, 31.52131771 ], [ 115.20052644, 31.52203317 ], [ 115.19965171, 31.52247782 ], [ 115.19866609, 31.52326543 ], [ 115.19807142, 31.52351377 ], [ 115.1977479, 31.52352421 ], [ 115.19693364, 31.52337578 ], [ 115.19526972, 31.52341962 ], [ 115.19484698, 31.52347388 ], [ 115.1934291, 31.52385335 ], [ 115.19320159, 31.5238484 ], [ 115.19161396, 31.52294957 ], [ 115.19026474, 31.52232615 ], [ 115.18924438, 31.52200371 ], [ 115.18819404, 31.5214883 ], [ 115.18779959, 31.52141892 ], [ 115.18757238, 31.52146916 ], [ 115.18739046, 31.52159967 ], [ 115.18709129, 31.52218001 ], [ 115.18716009, 31.52502908 ], [ 115.18703108, 31.52536751 ], [ 115.18666866, 31.52564119 ], [ 115.18644519, 31.52564824 ], [ 115.18615572, 31.52551193 ], [ 115.18491792, 31.52452781 ], [ 115.18448259, 31.52427369 ], [ 115.18321076, 31.52418229 ], [ 115.18267208, 31.52398047 ], [ 115.18181013, 31.52345381 ], [ 115.18086914, 31.52340076 ], [ 115.18009533, 31.52347247 ], [ 115.17942455, 31.52377031 ], [ 115.17756761, 31.52500549 ], [ 115.17628222, 31.52612409 ], [ 115.17537551, 31.52669173 ], [ 115.17485401, 31.52692817 ], [ 115.17409459, 31.52699807 ], [ 115.17337992, 31.52678763 ], [ 115.17294967, 31.52652636 ], [ 115.17234612, 31.52590567 ], [ 115.17208936, 31.52577157 ], [ 115.17176961, 31.52583464 ], [ 115.17115432, 31.52618955 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121K00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122K00000", "INDCD": "-1", "ONDCD": "QFA9800121K00000", "BWSCD": "WFA9800121K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4258.0, "RVSLP": 0.0059, "IELV": 84.86, "OELV": 60.05, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95960583, 31.28309987 ], [ 114.96034608, 31.28371016 ], [ 114.96078583, 31.28391794 ], [ 114.9611042, 31.28390775 ], [ 114.96156361, 31.2837536 ], [ 114.96198625, 31.28369231 ], [ 114.9626775, 31.28367078 ], [ 114.96300299, 31.28372362 ], [ 114.96334596, 31.28393636 ], [ 114.96385766, 31.28452436 ], [ 114.96459822, 31.28509563 ], [ 114.96548434, 31.28555005 ], [ 114.96626848, 31.28573848 ], [ 114.96648098, 31.2857125 ], [ 114.96671773, 31.28547351 ], [ 114.96694773, 31.28479007 ], [ 114.96693019, 31.28322675 ], [ 114.96702374, 31.28281233 ], [ 114.96775165, 31.28201275 ], [ 114.96816558, 31.28144879 ], [ 114.96886495, 31.28084176 ], [ 114.96925884, 31.28074005 ], [ 114.96974204, 31.28081288 ], [ 114.97111611, 31.28184824 ], [ 114.97133778, 31.28195785 ], [ 114.97166297, 31.28200851 ], [ 114.97225039, 31.28195833 ], [ 114.97336381, 31.28166308 ], [ 114.97426015, 31.28129358 ], [ 114.97483176, 31.28117984 ], [ 114.97538389, 31.28081778 ], [ 114.976076, 31.28008812 ], [ 114.97615785, 31.27981479 ], [ 114.97620625, 31.27872781 ], [ 114.97663345, 31.27785482 ], [ 114.97687772, 31.27755615 ], [ 114.97714375, 31.27738004 ], [ 114.97787178, 31.27721653 ], [ 114.97839601, 31.27699765 ], [ 114.98043851, 31.27601455 ], [ 114.98167201, 31.27500049 ], [ 114.98311151, 31.27466693 ], [ 114.98343189, 31.27465589 ], [ 114.98535362, 31.27505194 ], [ 114.98646826, 31.27556998 ], [ 114.98725992, 31.27578248 ], [ 114.9875802, 31.27579155 ], [ 114.98786869, 31.27567493 ], [ 114.98809337, 31.27545458 ], [ 114.98835023, 31.27463585 ], [ 114.98872633, 31.27420478 ], [ 114.98943305, 31.27379211 ], [ 114.99026508, 31.27346954 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122QB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121QB0000", "TRVCD": "AFA9800123QB0000", "INDCD": "QFA9800121QB0000", "ONDCD": "QFA9800122QB0000", "BWSCD": "WFA9800122QB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 1619.0, "RVSLP": 0.002, "IELV": 92.47, "OELV": 92.08, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15546923, 30.96130994 ], [ 115.15508221, 30.96175634 ], [ 115.15459412, 30.96287363 ], [ 115.15447374, 30.96372002 ], [ 115.15425534, 30.96440776 ], [ 115.15399445, 30.96493167 ], [ 115.15361153, 30.96544728 ], [ 115.15341514, 30.96583991 ], [ 115.15322527, 30.96681412 ], [ 115.15220026, 30.96812758 ], [ 115.15092555, 30.9700336 ], [ 115.15069078, 30.97049461 ], [ 115.15010364, 30.97225187 ], [ 115.14919178, 30.97366508 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126L00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800125L00000", "TRVCD": "AFA980012I000000", "INDCD": "QFA9800125L00000", "ONDCD": "QFA980012H000000", "BWSCD": "WFA9800126L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 3557.0, "RVSLP": 0.0031, "IELV": 60.15, "OELV": 54.09, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06854629, 31.24211425 ], [ 115.06817033, 31.24159153 ], [ 115.06786, 31.24097591 ], [ 115.06755596, 31.24071004 ], [ 115.06686136, 31.24029217 ], [ 115.06649086, 31.23967136 ], [ 115.06607285, 31.23926326 ], [ 115.06558401, 31.23893572 ], [ 115.0650316, 31.23877553 ], [ 115.06424067, 31.23831224 ], [ 115.06353846, 31.23808442 ], [ 115.0628979, 31.23755045 ], [ 115.06263944, 31.23710152 ], [ 115.06262704, 31.23671037 ], [ 115.06290398, 31.23618156 ], [ 115.06338787, 31.23562581 ], [ 115.06346213, 31.23538042 ], [ 115.06308471, 31.23459591 ], [ 115.06289244, 31.23399403 ], [ 115.06268975, 31.23373974 ], [ 115.06235984, 31.23348232 ], [ 115.06206188, 31.23336368 ], [ 115.0617403, 31.23336962 ], [ 115.06119622, 31.23354009 ], [ 115.06068749, 31.23358225 ], [ 115.05956436, 31.23334018 ], [ 115.05922342, 31.23312369 ], [ 115.05876829, 31.23259847 ], [ 115.0577441, 31.23169935 ], [ 115.05745886, 31.23126051 ], [ 115.05701329, 31.23035633 ], [ 115.05613215, 31.22896441 ], [ 115.05497169, 31.22750172 ], [ 115.05487042, 31.22723367 ], [ 115.05476789, 31.22651794 ], [ 115.054576, 31.22620525 ], [ 115.05431553, 31.2260207 ], [ 115.05364361, 31.22578037 ], [ 115.05256593, 31.2245696 ], [ 115.05215636, 31.22427428 ], [ 115.05134828, 31.22386514 ], [ 115.05001498, 31.22373785 ], [ 115.04916188, 31.22321712 ], [ 115.04827943, 31.22278587 ], [ 115.04790196, 31.22280348 ], [ 115.04734591, 31.22300105 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012I000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012H000000,AFA9800126L00000", "TRVCD": "AFA980012J000000", "INDCD": "QFA980012H000000", "ONDCD": "QFA980012I000000", "BWSCD": "WFA980012I000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 19.0, "RVLEN": 1142.0, "RVSLP": 0.0019, "IELV": 54.09, "OELV": 50.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04734591, 31.22300105 ], [ 115.04586025, 31.22180727 ], [ 115.04543754, 31.22153562 ], [ 115.04482237, 31.22132358 ], [ 115.04398185, 31.22127072 ], [ 115.04292753, 31.22108293 ], [ 115.04262767, 31.22095395 ], [ 115.04221364, 31.22065197 ], [ 115.04163389, 31.22014791 ], [ 115.04098164, 31.21936431 ], [ 115.03990842, 31.21766475 ], [ 115.03966018, 31.21694639 ], [ 115.03951024, 31.21673755 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820300000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820200000000", "TRVCD": "AFA9820400000000", "INDCD": "QFA9820200000000", "ONDCD": "QFA9820300000000", "BWSCD": "WFA9820300000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 4896.0, "RVSLP": 0.002, "IELV": 84.38, "OELV": 77.53, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87555621, 31.42027029 ], [ 114.87504295, 31.41950848 ], [ 114.87498245, 31.41886371 ], [ 114.87510589, 31.41805081 ], [ 114.87469119, 31.41704002 ], [ 114.87453572, 31.41627404 ], [ 114.874196, 31.41553807 ], [ 114.87383863, 31.41518425 ], [ 114.87335049, 31.41483269 ], [ 114.87240184, 31.41455556 ], [ 114.87191959, 31.41457811 ], [ 114.87093196, 31.41497225 ], [ 114.87023926, 31.41502259 ], [ 114.8697398, 31.41493779 ], [ 114.8691919, 31.41453598 ], [ 114.86900394, 31.4142113 ], [ 114.86902847, 31.41373997 ], [ 114.86926947, 31.41341292 ], [ 114.87007727, 31.41264067 ], [ 114.87044223, 31.41205848 ], [ 114.87068903, 31.41145357 ], [ 114.8706833, 31.41117998 ], [ 114.87058412, 31.4109164 ], [ 114.87022915, 31.41055955 ], [ 114.86932998, 31.40986451 ], [ 114.8681303, 31.40930174 ], [ 114.86708811, 31.40853433 ], [ 114.86635229, 31.4081335 ], [ 114.86597752, 31.40779952 ], [ 114.86584091, 31.40753778 ], [ 114.865734, 31.40659582 ], [ 114.86550449, 31.40589407 ], [ 114.86540242, 31.40456351 ], [ 114.86523835, 31.4042643 ], [ 114.86479581, 31.40412761 ], [ 114.86339171, 31.40413173 ], [ 114.86285142, 31.40394406 ], [ 114.86253773, 31.40371178 ], [ 114.86201565, 31.4028959 ], [ 114.86193588, 31.40262431 ], [ 114.86194178, 31.40227897 ], [ 114.86241749, 31.40061517 ], [ 114.8627516, 31.4000254 ], [ 114.86400009, 31.3988535 ], [ 114.86429606, 31.39846987 ], [ 114.86444853, 31.39786942 ], [ 114.86479373, 31.39726251 ], [ 114.86492207, 31.3965043 ], [ 114.86527411, 31.39589522 ], [ 114.86532164, 31.39546782 ], [ 114.86528756, 31.3949517 ], [ 114.8652073, 31.394682 ], [ 114.8650628, 31.39448587 ], [ 114.86445013, 31.394037 ], [ 114.86383521, 31.39385666 ], [ 114.86321941, 31.3939916 ], [ 114.86289379, 31.39398037 ], [ 114.86235608, 31.39378752 ], [ 114.86208319, 31.39360501 ], [ 114.86104026, 31.39211196 ], [ 114.86053582, 31.39111969 ], [ 114.86009725, 31.39051374 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820500000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820400000000,AFA98201C0000000", "TRVCD": "AFA9820600000000", "INDCD": "QFA9820400000000", "ONDCD": "QFA9820500000000", "BWSCD": "WFA9820500000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 5273.0, "RVSLP": 0.0004, "IELV": 70.0, "OELV": 69.04, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85780631, 31.33468949 ], [ 114.85782633, 31.33420191 ], [ 114.85805688, 31.33320132 ], [ 114.85831575, 31.33245218 ], [ 114.85867703, 31.3316984 ], [ 114.85872556, 31.33135181 ], [ 114.85868314, 31.33100084 ], [ 114.85854648, 31.33073963 ], [ 114.85776032, 31.33006052 ], [ 114.85712193, 31.3296274 ], [ 114.85604206, 31.32947396 ], [ 114.85532363, 31.32903958 ], [ 114.85501302, 31.32893777 ], [ 114.85459775, 31.32894354 ], [ 114.85405099, 31.32911218 ], [ 114.85345375, 31.32917751 ], [ 114.85143548, 31.32923133 ], [ 114.85093823, 31.32916381 ], [ 114.84967902, 31.32876776 ], [ 114.84931777, 31.32855827 ], [ 114.84889221, 31.32815615 ], [ 114.84840357, 31.32733617 ], [ 114.84836585, 31.32714757 ], [ 114.84841299, 31.32663626 ], [ 114.84817638, 31.32619969 ], [ 114.84774403, 31.32562739 ], [ 114.84764149, 31.32460986 ], [ 114.84767383, 31.32425194 ], [ 114.84791602, 31.32334822 ], [ 114.84828235, 31.3227503 ], [ 114.84854963, 31.32200314 ], [ 114.8485465, 31.32105783 ], [ 114.848198, 31.32010966 ], [ 114.84784329, 31.31938389 ], [ 114.84644615, 31.31813355 ], [ 114.84620155, 31.31724512 ], [ 114.84579012, 31.3164482 ], [ 114.84580376, 31.31612997 ], [ 114.84616638, 31.31553558 ], [ 114.84639215, 31.31491983 ], [ 114.84644075, 31.31456804 ], [ 114.84635754, 31.31331561 ], [ 114.84593956, 31.31251991 ], [ 114.84585697, 31.31224995 ], [ 114.84586588, 31.31190626 ], [ 114.84602758, 31.31133841 ], [ 114.84599623, 31.31084554 ], [ 114.84574645, 31.31046398 ], [ 114.84450818, 31.30939976 ], [ 114.84415791, 31.30844212 ], [ 114.84394758, 31.3075401 ], [ 114.84366429, 31.30709801 ], [ 114.84296977, 31.30639639 ], [ 114.84248677, 31.30563245 ], [ 114.84238406, 31.30528753 ], [ 114.84235399, 31.3042554 ], [ 114.84260329, 31.3032061 ], [ 114.84320291, 31.30148217 ], [ 114.84332583, 31.30086887 ], [ 114.84370173, 31.3000546 ], [ 114.84393423, 31.29931171 ], [ 114.84396554, 31.29901483 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121F00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900128000000", "INDCD": "-1", "ONDCD": "QFA9900127000000", "BWSCD": "WFA9900121F00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 8764.0, "RVSLP": 0.0356, "IELV": 444.07, "OELV": 120.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29769709, 31.1979778 ], [ 115.29829998, 31.19761851 ], [ 115.29861053, 31.19730951 ], [ 115.29887029, 31.19677393 ], [ 115.29900096, 31.19616611 ], [ 115.29918361, 31.19591363 ], [ 115.29998215, 31.19535013 ], [ 115.30074829, 31.19445778 ], [ 115.30148414, 31.19413163 ], [ 115.30198774, 31.19370802 ], [ 115.3023299, 31.19311787 ], [ 115.30248757, 31.19265512 ], [ 115.30279412, 31.19229621 ], [ 115.30336627, 31.19199976 ], [ 115.3039156, 31.19183421 ], [ 115.30447993, 31.1915536 ], [ 115.30482861, 31.19123023 ], [ 115.30577016, 31.19064179 ], [ 115.3072722, 31.18923434 ], [ 115.30766942, 31.18893576 ], [ 115.30798351, 31.18884051 ], [ 115.30891578, 31.18874425 ], [ 115.30925188, 31.18854026 ], [ 115.30945393, 31.18822331 ], [ 115.30955243, 31.18744963 ], [ 115.30979368, 31.1869036 ], [ 115.31049427, 31.18581056 ], [ 115.31082771, 31.18547798 ], [ 115.31103462, 31.18539619 ], [ 115.31125841, 31.18541051 ], [ 115.31202082, 31.18568025 ], [ 115.31306165, 31.18592154 ], [ 115.31374446, 31.18589866 ], [ 115.31453409, 31.18568247 ], [ 115.31494632, 31.18567177 ], [ 115.31518201, 31.18573385 ], [ 115.31634626, 31.18633601 ], [ 115.31654374, 31.18634572 ], [ 115.31672186, 31.18623858 ], [ 115.31690241, 31.18599835 ], [ 115.31696034, 31.18572367 ], [ 115.3169376, 31.18520433 ], [ 115.31681306, 31.18486758 ], [ 115.31636245, 31.18453554 ], [ 115.31569315, 31.18443723 ], [ 115.31538588, 31.18431167 ], [ 115.3149979, 31.18400251 ], [ 115.31486235, 31.18370412 ], [ 115.31492407, 31.18351398 ], [ 115.31531368, 31.1829621 ], [ 115.31590981, 31.18246759 ], [ 115.31672613, 31.18141968 ], [ 115.31693021, 31.18136195 ], [ 115.3175237, 31.18140155 ], [ 115.31803368, 31.18118601 ], [ 115.31858773, 31.18084553 ], [ 115.31897951, 31.18080953 ], [ 115.31941465, 31.18102671 ], [ 115.3204373, 31.18184115 ], [ 115.3206481, 31.18195435 ], [ 115.32086622, 31.18198211 ], [ 115.32119418, 31.18180553 ], [ 115.32167281, 31.18122628 ], [ 115.32216049, 31.1809638 ], [ 115.32444614, 31.18052822 ], [ 115.32484694, 31.18026796 ], [ 115.32521812, 31.17969461 ], [ 115.32547075, 31.17914364 ], [ 115.32548466, 31.17851394 ], [ 115.32537162, 31.17827012 ], [ 115.32518995, 31.17814366 ], [ 115.32428251, 31.17804506 ], [ 115.32401122, 31.1779043 ], [ 115.32367209, 31.17742132 ], [ 115.3233878, 31.17674771 ], [ 115.32333208, 31.17640709 ], [ 115.32336813, 31.17613569 ], [ 115.32393786, 31.17499013 ], [ 115.3239959, 31.17464702 ], [ 115.32387648, 31.17424799 ], [ 115.32326614, 31.17357209 ], [ 115.3232308, 31.17326681 ], [ 115.32337641, 31.17306188 ], [ 115.32364619, 31.17300741 ], [ 115.32449516, 31.17327983 ], [ 115.32523531, 31.17340572 ], [ 115.32607114, 31.17395757 ], [ 115.32634164, 31.17406387 ], [ 115.32718808, 31.17391373 ], [ 115.32781071, 31.17371202 ], [ 115.32839985, 31.17368134 ], [ 115.32879159, 31.17379614 ], [ 115.32955591, 31.17434415 ], [ 115.3298431, 31.17446267 ], [ 115.33012817, 31.17444694 ], [ 115.33077229, 31.1741755 ], [ 115.33097241, 31.17423775 ], [ 115.33186619, 31.17480587 ], [ 115.33288536, 31.1746562 ], [ 115.33391802, 31.1747424 ], [ 115.33433438, 31.17440894 ], [ 115.33477571, 31.17363755 ], [ 115.33531157, 31.1730116 ], [ 115.33612371, 31.17173417 ], [ 115.33632444, 31.17133237 ], [ 115.33655784, 31.17057574 ], [ 115.33662391, 31.16964192 ], [ 115.33672228, 31.16944373 ], [ 115.33694817, 31.16922308 ], [ 115.33785779, 31.16888612 ], [ 115.33858951, 31.16872814 ], [ 115.33915214, 31.16840805 ], [ 115.33975645, 31.16819 ], [ 115.34076558, 31.16745992 ], [ 115.34165643, 31.16666762 ], [ 115.34193224, 31.16649351 ], [ 115.3422517, 31.16642606 ], [ 115.34258179, 31.16644009 ], [ 115.34404042, 31.16697826 ], [ 115.34487657, 31.16698825 ], [ 115.34581348, 31.1666976 ], [ 115.34646218, 31.16636964 ], [ 115.34676157, 31.16597772 ], [ 115.3468246, 31.16558619 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900124X00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121XA0000,AFA9900123X00000", "TRVCD": "AFA9900125X00000", "INDCD": "QFA9900123X00000", "ONDCD": "QFA9900124X00000", "BWSCD": "WFA9900124X00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 262.0, "RVSLP": -0.0008, "IELV": 126.46, "OELV": 127.23, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20077245, 30.9132887 ], [ 115.20119027, 30.91288325 ], [ 115.20136951, 30.9122751 ], [ 115.20226037, 30.91143964 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900127000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900126000000,AFA9900122E00000", "TRVCD": "AFA9900128000000", "INDCD": "QFA9900126000000", "ONDCD": "QFA9900127000000", "BWSCD": "WFA9900127000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 2882.0, "RVSLP": 0.0001, "IELV": 120.01, "OELV": 120.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35640662, 31.18666103 ], [ 115.35220569, 31.18331194 ], [ 115.35102758, 31.18208838 ], [ 115.35075244, 31.18164477 ], [ 115.35046582, 31.18097578 ], [ 115.34954183, 31.17823637 ], [ 115.34939835, 31.17677605 ], [ 115.34919625, 31.1762162 ], [ 115.34898967, 31.17516001 ], [ 115.34871177, 31.17471637 ], [ 115.34815623, 31.17406173 ], [ 115.34657028, 31.1727435 ], [ 115.34613649, 31.17211164 ], [ 115.34606269, 31.1717695 ], [ 115.34606934, 31.17141331 ], [ 115.34630558, 31.17065343 ], [ 115.3476303, 31.16807603 ], [ 115.34789605, 31.16725693 ], [ 115.34782204, 31.16686891 ], [ 115.3468246, 31.16558619 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900128J00000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA9900127J00000", "TRVCD": "AFA990012C000000", "INDCD": "QFA9900127J00000", "ONDCD": "QFA990012B000000", "BWSCD": "WFA9900128J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 1374.0, "RVSLP": 0.0008, "IELV": 88.37, "OELV": 87.47, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3724396, 31.06872215 ], [ 115.37237818, 31.06714233 ], [ 115.37223467, 31.06666494 ], [ 115.37050383, 31.06515401 ], [ 115.37002512, 31.06426438 ], [ 115.36829709, 31.06206173 ], [ 115.36783639, 31.06063777 ], [ 115.36771847, 31.06044389 ], [ 115.36571577, 31.05880678 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121J00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122J00000", "INDCD": "-1", "ONDCD": "QFA9800121J00000", "BWSCD": "WFA9800121J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 5478.0, "RVSLP": 0.0094, "IELV": 187.03, "OELV": 127.06, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96748249, 31.4775182 ], [ 114.96797006, 31.47759234 ], [ 114.96892211, 31.47811026 ], [ 114.96978439, 31.47813364 ], [ 114.97036773, 31.47803539 ], [ 114.97062918, 31.47785452 ], [ 114.9708104, 31.47760028 ], [ 114.97089326, 31.47644581 ], [ 114.97129139, 31.47563668 ], [ 114.97124956, 31.47516582 ], [ 114.97098357, 31.47471771 ], [ 114.96950562, 31.47343092 ], [ 114.96889927, 31.47271152 ], [ 114.96833813, 31.47176188 ], [ 114.96836592, 31.47136437 ], [ 114.9692136, 31.46977649 ], [ 114.96944227, 31.46917954 ], [ 114.96937634, 31.4688515 ], [ 114.96866883, 31.46769175 ], [ 114.96843516, 31.46697837 ], [ 114.96860745, 31.46666545 ], [ 114.96940014, 31.46588977 ], [ 114.96949843, 31.46571396 ], [ 114.96948146, 31.46557591 ], [ 114.96913805, 31.46537406 ], [ 114.96882065, 31.46533427 ], [ 114.96850038, 31.4654035 ], [ 114.96766532, 31.46575648 ], [ 114.96719435, 31.46572024 ], [ 114.96693237, 31.46553753 ], [ 114.96678981, 31.46535 ], [ 114.96660101, 31.46451425 ], [ 114.96632632, 31.46383516 ], [ 114.96607106, 31.46349938 ], [ 114.96566138, 31.4633918 ], [ 114.96523953, 31.46343108 ], [ 114.96470426, 31.4635743 ], [ 114.9644447, 31.4634951 ], [ 114.9643357, 31.46333997 ], [ 114.96431236, 31.46315592 ], [ 114.96445826, 31.4625935 ], [ 114.96445716, 31.46209001 ], [ 114.96437188, 31.4618163 ], [ 114.96414217, 31.46143613 ], [ 114.963421, 31.46059796 ], [ 114.96190376, 31.45933576 ], [ 114.96102208, 31.45840303 ], [ 114.96067345, 31.4579059 ], [ 114.96042119, 31.45745098 ], [ 114.96036421, 31.45711579 ], [ 114.96039647, 31.45684305 ], [ 114.96077763, 31.45572819 ], [ 114.9607963, 31.4550653 ], [ 114.96073154, 31.45432827 ], [ 114.96051802, 31.45393828 ], [ 114.95967188, 31.45322622 ], [ 114.95954627, 31.45300614 ], [ 114.95965577, 31.45278004 ], [ 114.96053629, 31.45187798 ], [ 114.9605923, 31.45155597 ], [ 114.96042158, 31.45124224 ], [ 114.95690393, 31.4484258 ], [ 114.9557464, 31.44777808 ], [ 114.95475601, 31.44739403 ], [ 114.95443846, 31.44735232 ], [ 114.95304427, 31.44778244 ], [ 114.95262926, 31.44782324 ], [ 114.95223496, 31.44770821 ], [ 114.95182147, 31.44741139 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QD0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122QD0000", "INDCD": "-1", "ONDCD": "QFA9800121QD0000", "BWSCD": "WFA9800121QD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3905.0, "RVSLP": 0.0038, "IELV": 224.33, "OELV": 205.21, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15420705, 31.08280956 ], [ 115.15275996, 31.08459555 ], [ 115.15182251, 31.08545128 ], [ 115.14969532, 31.08647247 ], [ 115.14946159, 31.08653156 ], [ 115.1491383, 31.08651574 ], [ 115.14859754, 31.08631836 ], [ 115.14830423, 31.08614367 ], [ 115.14776815, 31.08571002 ], [ 115.14758398, 31.08540815 ], [ 115.14764404, 31.08516211 ], [ 115.14841023, 31.08407701 ], [ 115.14867617, 31.08333027 ], [ 115.14890631, 31.08240919 ], [ 115.14892951, 31.08205284 ], [ 115.14883489, 31.08165664 ], [ 115.14861143, 31.08146527 ], [ 115.1480387, 31.08141211 ], [ 115.1469802, 31.08166296 ], [ 115.14586183, 31.08167187 ], [ 115.14498403, 31.08145515 ], [ 115.14436834, 31.08122885 ], [ 115.14384158, 31.08099771 ], [ 115.14306299, 31.08048715 ], [ 115.14253018, 31.08029008 ], [ 115.14212845, 31.08028819 ], [ 115.14124366, 31.08049686 ], [ 115.14048433, 31.08045162 ], [ 115.14019176, 31.08029434 ], [ 115.13929985, 31.07961074 ], [ 115.13900029, 31.0794783 ], [ 115.13657229, 31.07949851 ], [ 115.13584223, 31.07935582 ], [ 115.13500127, 31.07928285 ], [ 115.13412592, 31.07879603 ], [ 115.13357416, 31.0786295 ], [ 115.13329961, 31.07846099 ], [ 115.13306841, 31.07809847 ], [ 115.13307264, 31.07752603 ], [ 115.13289371, 31.07732352 ], [ 115.13269754, 31.07722988 ], [ 115.1324744, 31.07722637 ], [ 115.13184273, 31.07737964 ], [ 115.13105971, 31.07741549 ], [ 115.13015995, 31.07725155 ], [ 115.12903565, 31.07716772 ], [ 115.12833996, 31.07745628 ], [ 115.12756015, 31.07737408 ], [ 115.12668932, 31.07755382 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QF0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800129Q00000", "INDCD": "-1", "ONDCD": "QFA9800128Q00000", "BWSCD": "WFA9800121QF0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7127.0, "RVSLP": 0.0015, "IELV": 52.22, "OELV": 41.58, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02479006, 31.09644954 ], [ 115.02402992, 31.0971417 ], [ 115.0232923, 31.09764524 ], [ 115.02282918, 31.09825978 ], [ 115.02228404, 31.09879008 ], [ 115.02149968, 31.09921854 ], [ 115.02075171, 31.09928276 ], [ 115.01977839, 31.09911409 ], [ 115.01935797, 31.09914827 ], [ 115.01848403, 31.09936238 ], [ 115.01744745, 31.09926182 ], [ 115.0171063, 31.09943395 ], [ 115.01614425, 31.10025479 ], [ 115.01583237, 31.10035226 ], [ 115.01490782, 31.10045798 ], [ 115.01376361, 31.10106111 ], [ 115.0132735, 31.10111576 ], [ 115.01264063, 31.10098555 ], [ 115.01232375, 31.10100305 ], [ 115.01168977, 31.10134552 ], [ 115.01092439, 31.10161204 ], [ 115.00922366, 31.10194758 ], [ 115.00889626, 31.10191967 ], [ 115.00803522, 31.10167713 ], [ 115.00674019, 31.10069715 ], [ 115.00628961, 31.10050643 ], [ 115.00526546, 31.10052641 ], [ 115.00439357, 31.10075411 ], [ 115.00311037, 31.10084273 ], [ 115.00223966, 31.10106781 ], [ 115.00120438, 31.10112217 ], [ 115.0005325, 31.10107977 ], [ 114.99905183, 31.10062942 ], [ 114.99868976, 31.10047283 ], [ 114.99851808, 31.10032765 ], [ 114.99800767, 31.09900477 ], [ 114.99736387, 31.09824869 ], [ 114.99715563, 31.09815243 ], [ 114.9965119, 31.09804413 ], [ 114.99572169, 31.09758627 ], [ 114.99465619, 31.09722488 ], [ 114.99447879, 31.09708698 ], [ 114.99422854, 31.09674445 ], [ 114.99359021, 31.09657039 ], [ 114.99339782, 31.09644687 ], [ 114.9929404, 31.09588269 ], [ 114.99281875, 31.09551002 ], [ 114.99267073, 31.09540059 ], [ 114.99144905, 31.09529412 ], [ 114.99065783, 31.09482236 ], [ 114.99033818, 31.09474209 ], [ 114.98966469, 31.09479183 ], [ 114.9892813, 31.09505534 ], [ 114.98916565, 31.09536247 ], [ 114.98935248, 31.09605447 ], [ 114.98934413, 31.0964056 ], [ 114.98926985, 31.09659648 ], [ 114.98911213, 31.09675202 ], [ 114.98876015, 31.09693024 ], [ 114.98795004, 31.09712233 ], [ 114.98759597, 31.09731997 ], [ 114.98721514, 31.09774228 ], [ 114.98703471, 31.09842012 ], [ 114.98667263, 31.09883382 ], [ 114.98584213, 31.09936161 ], [ 114.98532561, 31.09959751 ], [ 114.98508355, 31.0996448 ], [ 114.98459631, 31.09960338 ], [ 114.98388474, 31.09916566 ], [ 114.98358222, 31.09907201 ], [ 114.98272247, 31.09925492 ], [ 114.98187062, 31.09933795 ], [ 114.98156002, 31.09943638 ], [ 114.9810525, 31.099697 ], [ 114.98063266, 31.10009552 ], [ 114.98047289, 31.10043288 ], [ 114.9803897, 31.10114568 ], [ 114.98020228, 31.10156225 ], [ 114.97990397, 31.10191357 ], [ 114.97963282, 31.10203513 ], [ 114.97934156, 31.10197437 ], [ 114.97843966, 31.10133167 ], [ 114.97748411, 31.10086602 ], [ 114.97702359, 31.10093845 ], [ 114.97642461, 31.10138772 ], [ 114.97612576, 31.10151798 ], [ 114.97527265, 31.10158599 ], [ 114.97469972, 31.10149597 ], [ 114.97399597, 31.10104454 ], [ 114.97309838, 31.10065254 ], [ 114.97239587, 31.10019603 ], [ 114.97156768, 31.09984839 ], [ 114.97129283, 31.09967361 ], [ 114.97087181, 31.0991383 ], [ 114.97039358, 31.09819423 ], [ 114.96989981, 31.09770354 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122C00000", "RVNM": "九里冲", "GB": "210101", "FRVCD": "AFA9800121CA0000,AFA9800121C00000", "TRVCD": "AFA9800127000000", "INDCD": "QFA9800121C00000", "ONDCD": "QFA9800126000000", "BWSCD": "WFA9800122C00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 3917.0, "RVSLP": 0.0069, "IELV": 132.97, "OELV": 103.3, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09059442, 31.50952444 ], [ 115.09021122, 31.50918982 ], [ 115.08989378, 31.50875615 ], [ 115.08954564, 31.50789894 ], [ 115.08972557, 31.50738581 ], [ 115.09011614, 31.50679616 ], [ 115.09030639, 31.50612605 ], [ 115.09131363, 31.5048842 ], [ 115.09527457, 31.50120118 ], [ 115.0963717, 31.49969159 ], [ 115.09710436, 31.49847948 ], [ 115.09710955, 31.49830173 ], [ 115.09695789, 31.49782134 ], [ 115.0967939, 31.49651967 ], [ 115.09646951, 31.49600846 ], [ 115.09588084, 31.49541967 ], [ 115.09575845, 31.49508636 ], [ 115.09567027, 31.49307298 ], [ 115.0958513, 31.49229223 ], [ 115.09586688, 31.4917099 ], [ 115.09581083, 31.49112423 ], [ 115.09560266, 31.49056594 ], [ 115.09555031, 31.49014581 ], [ 115.09570417, 31.48931202 ], [ 115.09525483, 31.48817019 ], [ 115.09522681, 31.4878446 ], [ 115.09595396, 31.48596188 ], [ 115.09629495, 31.48542666 ], [ 115.09645899, 31.48496802 ], [ 115.0972401, 31.48344602 ], [ 115.0980836, 31.48137238 ], [ 115.0983821, 31.48085123 ], [ 115.09907486, 31.48010638 ], [ 115.0992834, 31.47973768 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122JA0000,AFA9800121J00000", "TRVCD": "AFA9800123J00000", "INDCD": "QFA9800121J00000", "ONDCD": "QFA9800122J00000", "BWSCD": "WFA9800122J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 6959.0, "RVSLP": 0.003, "IELV": 127.06, "OELV": 105.93, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95182147, 31.44741139 ], [ 114.95180379, 31.44661807 ], [ 114.95199022, 31.44581619 ], [ 114.95201224, 31.44457373 ], [ 114.95227222, 31.44382608 ], [ 114.95262113, 31.44329373 ], [ 114.9528425, 31.44268757 ], [ 114.95290228, 31.44197396 ], [ 114.95261027, 31.44092223 ], [ 114.95243384, 31.43786928 ], [ 114.95230186, 31.43760671 ], [ 114.95147382, 31.43664665 ], [ 114.95118813, 31.43620794 ], [ 114.95057217, 31.43480208 ], [ 114.95054389, 31.43447576 ], [ 114.95083167, 31.43390447 ], [ 114.95167513, 31.433272 ], [ 114.95220657, 31.43259582 ], [ 114.95311971, 31.43169458 ], [ 114.95327033, 31.43144799 ], [ 114.95335776, 31.43114246 ], [ 114.95310434, 31.43080202 ], [ 114.95213031, 31.43009525 ], [ 114.95152193, 31.42991439 ], [ 114.95073421, 31.43009119 ], [ 114.94996008, 31.43010413 ], [ 114.94963275, 31.42993247 ], [ 114.94954416, 31.42956604 ], [ 114.94979219, 31.42880986 ], [ 114.95022961, 31.42831965 ], [ 114.9505883, 31.42812215 ], [ 114.95142785, 31.42800293 ], [ 114.9519539, 31.42778613 ], [ 114.95282868, 31.42715812 ], [ 114.95415595, 31.4265144 ], [ 114.95453176, 31.42610244 ], [ 114.9545837, 31.42561526 ], [ 114.95452579, 31.42534044 ], [ 114.95435227, 31.42508636 ], [ 114.9540151, 31.42485038 ], [ 114.95355226, 31.42467569 ], [ 114.95207802, 31.42449448 ], [ 114.95140344, 31.42459245 ], [ 114.95027014, 31.42438409 ], [ 114.94967276, 31.42392387 ], [ 114.94956753, 31.42372988 ], [ 114.94954837, 31.42353624 ], [ 114.94969744, 31.42321712 ], [ 114.95001887, 31.4229816 ], [ 114.95147281, 31.42281972 ], [ 114.95237189, 31.42244763 ], [ 114.95354584, 31.42208266 ], [ 114.95383287, 31.42192781 ], [ 114.95425836, 31.42152828 ], [ 114.95455551, 31.42100117 ], [ 114.95462773, 31.4206488 ], [ 114.95459627, 31.42006482 ], [ 114.95424117, 31.41919199 ], [ 114.95402641, 31.41895622 ], [ 114.95374779, 31.41879837 ], [ 114.95274205, 31.41869916 ], [ 114.94996168, 31.4180016 ], [ 114.94954766, 31.41799816 ], [ 114.94894993, 31.4180917 ], [ 114.94830243, 31.41783573 ], [ 114.9480109, 31.4175539 ], [ 114.94750021, 31.41681668 ], [ 114.94637999, 31.41587975 ], [ 114.94611367, 31.41557153 ], [ 114.94575794, 31.41455151 ], [ 114.9456846, 31.41359591 ], [ 114.94578599, 31.41310771 ], [ 114.94676798, 31.41207554 ], [ 114.94726011, 31.41102233 ], [ 114.94778223, 31.41047466 ], [ 114.94830168, 31.41004158 ], [ 114.94898212, 31.40976588 ], [ 114.94947306, 31.40947946 ], [ 114.94979798, 31.40940653 ], [ 114.95144862, 31.40935197 ], [ 114.95233201, 31.4095422 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123JB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121JBA000,AFA9800122JB0000", "TRVCD": "AFA9800124J00000", "INDCD": "QFA9800122JB0000", "ONDCD": "QFA9800123J00000", "BWSCD": "WFA9800123JB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 1417.0, "RVSLP": 0.008, "IELV": 98.28, "OELV": 89.62, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94163852, 31.37294405 ], [ 114.94206949, 31.37273195 ], [ 114.94297773, 31.37195614 ], [ 114.94413044, 31.3711517 ], [ 114.9457076, 31.37049957 ], [ 114.94635811, 31.36989079 ], [ 114.94709239, 31.36942773 ], [ 114.94774639, 31.36929335 ], [ 114.94890416, 31.36891004 ], [ 114.95000709, 31.36867571 ], [ 114.95139162, 31.36884816 ], [ 114.95223605, 31.36915011 ], [ 114.95306316, 31.3693523 ], [ 114.95379395, 31.36938368 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012N000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012M000000,AFA9800129Q00000", "TRVCD": "AFA980012P000000", "INDCD": "QFA980012M000000", "ONDCD": "QFA980012N000000", "BWSCD": "WFA980012N000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 24.0, "RVLEN": 1282.0, "RVSLP": 0.0003, "IELV": 40.97, "OELV": 40.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96543829, 31.09695642 ], [ 114.96508412, 31.09682966 ], [ 114.9646403, 31.09653406 ], [ 114.96187673, 31.09431201 ], [ 114.9613822, 31.09400079 ], [ 114.96034819, 31.09376172 ], [ 114.95732794, 31.09381024 ], [ 114.95640503, 31.09349826 ], [ 114.95566736, 31.09339411 ], [ 114.95405538, 31.09283426 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012R000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012Q000000,AFA9800121S00000", "TRVCD": "AFA980012S000000", "INDCD": "QFA980012Q000000", "ONDCD": "QFA980012R000000", "BWSCD": "WFA980012R000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 27.0, "RVLEN": 11738.0, "RVSLP": 0.0009, "IELV": 38.33, "OELV": 29.11, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86980728, 31.09430158 ], [ 114.86937034, 31.09440777 ], [ 114.86914767, 31.09432592 ], [ 114.86904094, 31.09408297 ], [ 114.86898029, 31.09334757 ], [ 114.86889202, 31.09300446 ], [ 114.86856556, 31.09263953 ], [ 114.86813617, 31.09238442 ], [ 114.86666726, 31.09209772 ], [ 114.8657419, 31.09177013 ], [ 114.86335212, 31.09116195 ], [ 114.86162757, 31.0908807 ], [ 114.8603561, 31.09054983 ], [ 114.8586259, 31.09054011 ], [ 114.85718764, 31.09019028 ], [ 114.85599826, 31.09011843 ], [ 114.85492623, 31.08970643 ], [ 114.854346, 31.08937951 ], [ 114.85305306, 31.08885297 ], [ 114.85227383, 31.08834954 ], [ 114.85088247, 31.08760681 ], [ 114.84740463, 31.08487136 ], [ 114.84417038, 31.08369227 ], [ 114.84328702, 31.0832283 ], [ 114.84286657, 31.08293838 ], [ 114.84231413, 31.0824186 ], [ 114.84135248, 31.08091817 ], [ 114.84042084, 31.07982721 ], [ 114.83996756, 31.0791537 ], [ 114.83936756, 31.07842554 ], [ 114.83817205, 31.07746129 ], [ 114.83729049, 31.07699573 ], [ 114.83675433, 31.07679189 ], [ 114.83277179, 31.07577588 ], [ 114.83069539, 31.07576233 ], [ 114.82973187, 31.07554017 ], [ 114.82842764, 31.07479788 ], [ 114.82759581, 31.07419841 ], [ 114.82707911, 31.07393432 ], [ 114.82486659, 31.07214411 ], [ 114.82430435, 31.07125752 ], [ 114.82411972, 31.07080262 ], [ 114.82384865, 31.07035431 ], [ 114.82307207, 31.06945152 ], [ 114.82165042, 31.06831983 ], [ 114.82033032, 31.06762228 ], [ 114.81969588, 31.06720267 ], [ 114.81859156, 31.0668912 ], [ 114.81720669, 31.06688472 ], [ 114.81639634, 31.06672403 ], [ 114.81509721, 31.06672358 ], [ 114.81431045, 31.0664961 ], [ 114.81218005, 31.06563925 ], [ 114.81095751, 31.06491552 ], [ 114.80980386, 31.06401025 ], [ 114.80903902, 31.06318971 ], [ 114.80754817, 31.06199975 ], [ 114.80404408, 31.06011199 ], [ 114.80161883, 31.05936384 ], [ 114.79978648, 31.0586606 ], [ 114.79928154, 31.0586154 ], [ 114.79744876, 31.05865732 ], [ 114.79712821, 31.05858244 ], [ 114.79683975, 31.05840858 ], [ 114.79621707, 31.0578392 ], [ 114.79575597, 31.05693647 ], [ 114.7951383, 31.05598987 ], [ 114.7938438, 31.05487113 ], [ 114.79343049, 31.0541782 ], [ 114.79293983, 31.05357592 ], [ 114.79233807, 31.05299383 ], [ 114.7920548, 31.05255172 ], [ 114.79193163, 31.0519903 ], [ 114.79178839, 31.0490763 ], [ 114.79116571, 31.04760778 ], [ 114.79078165, 31.04694768 ], [ 114.79069198, 31.04667512 ], [ 114.79067428, 31.04624914 ], [ 114.79074225, 31.0459719 ], [ 114.79192831, 31.04374849 ], [ 114.79301742, 31.04223854 ], [ 114.79422546, 31.04105191 ], [ 114.79457221, 31.04017185 ], [ 114.79457772, 31.03890989 ], [ 114.79446578, 31.03827273 ], [ 114.79400619, 31.03780387 ], [ 114.79323057, 31.03735247 ], [ 114.79301441, 31.03714039 ], [ 114.79291038, 31.03693243 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820400000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820300000000,AFA98201B0000000", "TRVCD": "AFA9820500000000", "INDCD": "QFA9820300000000", "ONDCD": "QFA9820400000000", "BWSCD": "WFA9820400000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 8950.0, "RVSLP": 0.0008, "IELV": 77.53, "OELV": 70.0, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86009725, 31.39051374 ], [ 114.85996807, 31.39037014 ], [ 114.85985413, 31.39005317 ], [ 114.85988879, 31.3895739 ], [ 114.86043319, 31.38859355 ], [ 114.86118386, 31.38791756 ], [ 114.86266045, 31.38742326 ], [ 114.86495617, 31.38637841 ], [ 114.86581911, 31.38611566 ], [ 114.86665805, 31.38599555 ], [ 114.86730801, 31.38566027 ], [ 114.86803724, 31.38548701 ], [ 114.86838561, 31.38526538 ], [ 114.86901797, 31.38468891 ], [ 114.86928058, 31.38437355 ], [ 114.86948816, 31.38398389 ], [ 114.86976247, 31.38315847 ], [ 114.86979178, 31.3819165 ], [ 114.8699639, 31.38127713 ], [ 114.86998171, 31.38061716 ], [ 114.86985974, 31.37991206 ], [ 114.86925489, 31.37923839 ], [ 114.86892008, 31.3784518 ], [ 114.86756017, 31.37704343 ], [ 114.86699594, 31.37624662 ], [ 114.86559154, 31.37509249 ], [ 114.86470192, 31.37464785 ], [ 114.86415757, 31.37446261 ], [ 114.8634082, 31.37436228 ], [ 114.86272169, 31.37408356 ], [ 114.86214361, 31.37359575 ], [ 114.86158447, 31.37279232 ], [ 114.8611881, 31.37249981 ], [ 114.86048389, 31.37226969 ], [ 114.85899839, 31.37228911 ], [ 114.85857952, 31.37223661 ], [ 114.85761225, 31.37175154 ], [ 114.85721223, 31.37143856 ], [ 114.85698558, 31.37112206 ], [ 114.85682072, 31.3703583 ], [ 114.85652999, 31.369831 ], [ 114.85621875, 31.36941843 ], [ 114.85560533, 31.36904056 ], [ 114.8553278, 31.36875222 ], [ 114.85487254, 31.36770785 ], [ 114.85445245, 31.36697795 ], [ 114.85385251, 31.36557635 ], [ 114.85382592, 31.36516442 ], [ 114.8539624, 31.36454591 ], [ 114.85374161, 31.36378983 ], [ 114.85374445, 31.36307093 ], [ 114.85399355, 31.36253988 ], [ 114.854386, 31.36202539 ], [ 114.85484801, 31.36117956 ], [ 114.85506928, 31.36050588 ], [ 114.85507928, 31.36025191 ], [ 114.85478823, 31.35937849 ], [ 114.85437977, 31.35887063 ], [ 114.85383059, 31.35797765 ], [ 114.8536299, 31.35715825 ], [ 114.85295406, 31.35635623 ], [ 114.85262464, 31.35533216 ], [ 114.85263299, 31.35498974 ], [ 114.85273586, 31.35457999 ], [ 114.8527021, 31.35438839 ], [ 114.85245141, 31.35380522 ], [ 114.85185648, 31.35314584 ], [ 114.85180331, 31.35296418 ], [ 114.85188131, 31.35256402 ], [ 114.85185679, 31.35230841 ], [ 114.85174994, 31.35211599 ], [ 114.85123602, 31.35157772 ], [ 114.8511536, 31.35125896 ], [ 114.85124924, 31.35100039 ], [ 114.85152649, 31.35069082 ], [ 114.85230236, 31.34999422 ], [ 114.85265074, 31.34977237 ], [ 114.85314375, 31.349712 ], [ 114.85378621, 31.34985073 ], [ 114.85410827, 31.34983544 ], [ 114.85500393, 31.3492651 ], [ 114.85578209, 31.34900633 ], [ 114.85652408, 31.34886506 ], [ 114.85711983, 31.34859559 ], [ 114.85766263, 31.34809152 ], [ 114.85793228, 31.34728202 ], [ 114.85847981, 31.34657611 ], [ 114.85854647, 31.34608714 ], [ 114.85847579, 31.34559041 ], [ 114.85788136, 31.34440516 ], [ 114.85755755, 31.34389277 ], [ 114.85669851, 31.34319963 ], [ 114.85552418, 31.34281397 ], [ 114.85495563, 31.34243756 ], [ 114.8540309, 31.34165489 ], [ 114.85389224, 31.34139238 ], [ 114.85384158, 31.34103737 ], [ 114.85387231, 31.34053414 ], [ 114.85424227, 31.33942645 ], [ 114.85410964, 31.33864117 ], [ 114.8543585, 31.33790599 ], [ 114.85513804, 31.33713198 ], [ 114.85586961, 31.33661771 ], [ 114.85654028, 31.33586289 ], [ 114.85738006, 31.33529696 ], [ 114.85772209, 31.33490418 ], [ 114.85780631, 31.33468949 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900128000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900127000000,AFA9900121F00000", "TRVCD": "AFA9900129000000", "INDCD": "QFA9900127000000", "ONDCD": "QFA9900128000000", "BWSCD": "WFA9900128000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 2223.0, "RVSLP": 0.0052, "IELV": 120.0, "OELV": 110.1, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3468246, 31.16558619 ], [ 115.34499645, 31.16412763 ], [ 115.34466965, 31.16377595 ], [ 115.34416438, 31.1629417 ], [ 115.34399034, 31.16234043 ], [ 115.34342632, 31.16122841 ], [ 115.34273379, 31.16005805 ], [ 115.34252786, 31.15924113 ], [ 115.34191596, 31.15851803 ], [ 115.34198984, 31.15772201 ], [ 115.34183342, 31.15705325 ], [ 115.34194236, 31.15657448 ], [ 115.34194443, 31.1562196 ], [ 115.34186997, 31.1558788 ], [ 115.34148012, 31.15509897 ], [ 115.34159196, 31.15449004 ], [ 115.34160045, 31.15389965 ], [ 115.34154243, 31.15316195 ], [ 115.34141319, 31.15281858 ], [ 115.34065541, 31.15162704 ], [ 115.34036771, 31.15133407 ], [ 115.33774975, 31.14967829 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121E00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122E00000", "INDCD": "-1", "ONDCD": "QFA9800121E00000", "BWSCD": "WFA9800121E00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5657.0, "RVSLP": 0.0517, "IELV": 405.98, "OELV": 197.45, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19298407, 31.43113177 ], [ 115.19184364, 31.43159601 ], [ 115.19108025, 31.43162671 ], [ 115.19084696, 31.43155585 ], [ 115.19058415, 31.43136405 ], [ 115.19016365, 31.43066973 ], [ 115.1897723, 31.43040042 ], [ 115.18937417, 31.43038391 ], [ 115.18848507, 31.43059645 ], [ 115.18761991, 31.43059999 ], [ 115.18723609, 31.43045095 ], [ 115.18641055, 31.42981655 ], [ 115.18604704, 31.4296087 ], [ 115.1856307, 31.42954994 ], [ 115.18493416, 31.42956985 ], [ 115.18459966, 31.42962702 ], [ 115.18431004, 31.42977782 ], [ 115.18291005, 31.43104222 ], [ 115.18218793, 31.43141003 ], [ 115.18178557, 31.4314388 ], [ 115.18122574, 31.43130959 ], [ 115.18046071, 31.43125148 ], [ 115.17918401, 31.43091848 ], [ 115.17868339, 31.43091985 ], [ 115.1776669, 31.43123515 ], [ 115.17715561, 31.4314894 ], [ 115.17641546, 31.43202419 ], [ 115.17519993, 31.43250231 ], [ 115.17488526, 31.43256427 ], [ 115.17448987, 31.43249319 ], [ 115.17351768, 31.43203208 ], [ 115.17249766, 31.431708 ], [ 115.17116832, 31.43098963 ], [ 115.17084944, 31.43093365 ], [ 115.17061257, 31.43097795 ], [ 115.17034842, 31.43115384 ], [ 115.17016158, 31.43140778 ], [ 115.1701061, 31.43168097 ], [ 115.17013409, 31.43203871 ], [ 115.17029572, 31.4323725 ], [ 115.17085143, 31.43290778 ], [ 115.17110649, 31.43328074 ], [ 115.17120462, 31.43354579 ], [ 115.17117635, 31.43379204 ], [ 115.17098579, 31.4340095 ], [ 115.17031791, 31.43430373 ], [ 115.16970757, 31.43442989 ], [ 115.16887411, 31.43418641 ], [ 115.16855166, 31.43416994 ], [ 115.16825064, 31.43427659 ], [ 115.1678678, 31.43459762 ], [ 115.16746411, 31.43524857 ], [ 115.16721611, 31.43623567 ], [ 115.16720285, 31.43771832 ], [ 115.16706004, 31.43808841 ], [ 115.16687972, 31.43817835 ], [ 115.1665944, 31.43811968 ], [ 115.16540249, 31.43725158 ], [ 115.16440352, 31.43684301 ], [ 115.16400409, 31.43677168 ], [ 115.16362148, 31.436868 ], [ 115.16330607, 31.43706394 ], [ 115.16304743, 31.43747683 ], [ 115.16281058, 31.43823519 ], [ 115.16272162, 31.43901026 ], [ 115.16225412, 31.43993579 ], [ 115.16186914, 31.44036758 ], [ 115.16015751, 31.44195021 ], [ 115.15982556, 31.44218184 ], [ 115.15952983, 31.4422249 ], [ 115.15899815, 31.4420401 ], [ 115.15841268, 31.44170008 ], [ 115.15795157, 31.44151827 ], [ 115.15763087, 31.44147407 ], [ 115.15732186, 31.44155384 ], [ 115.15693169, 31.44185704 ], [ 115.15650846, 31.44239962 ], [ 115.15614018, 31.44274224 ], [ 115.15486818, 31.44446258 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PDA000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PDA000,AFA9800121PDAA00", "TRVCD": "AFA9800124PD0000", "INDCD": "QFA9800121PDA000", "ONDCD": "QFA9800122PDA000", "BWSCD": "WFA9800122PDA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2392.0, "RVSLP": 0.0031, "IELV": 136.03, "OELV": 129.66, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25379834, 31.25474197 ], [ 115.25384088, 31.25513613 ], [ 115.25404731, 31.25573567 ], [ 115.25422856, 31.25671841 ], [ 115.25443428, 31.25696992 ], [ 115.25529782, 31.25769857 ], [ 115.255435, 31.25789071 ], [ 115.25547777, 31.25807519 ], [ 115.25541378, 31.25830849 ], [ 115.25519031, 31.25844839 ], [ 115.25496952, 31.25843494 ], [ 115.25402382, 31.2581439 ], [ 115.25372211, 31.25819385 ], [ 115.25355778, 31.25833031 ], [ 115.25345498, 31.25872365 ], [ 115.25349435, 31.26044342 ], [ 115.25308776, 31.26139643 ], [ 115.25287823, 31.2620776 ], [ 115.25291559, 31.2624016 ], [ 115.25330238, 31.26317805 ], [ 115.2529718, 31.26433182 ], [ 115.25294812, 31.26505922 ], [ 115.25301473, 31.26563994 ], [ 115.25320865, 31.26612754 ], [ 115.25327121, 31.26647956 ], [ 115.25343529, 31.26954418 ], [ 115.25370369, 31.2704472 ], [ 115.25368891, 31.27087024 ], [ 115.25352812, 31.2714364 ], [ 115.25353205, 31.27180554 ], [ 115.25381122, 31.27254203 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123P00000", "RVNM": "张广河", "GB": "210101", "FRVCD": "AFA9800122P00000,AFA9800123PA0000", "TRVCD": "AFA9800124P00000", "INDCD": "QFA9800122P00000", "ONDCD": "QFA9800123P00000", "BWSCD": "WFA9800123P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 3733.0, "RVSLP": 0.0024, "IELV": 165.33, "OELV": 156.35, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30386888, 31.34602229 ], [ 115.30343095, 31.34622466 ], [ 115.30266239, 31.34629137 ], [ 115.30233024, 31.3462538 ], [ 115.30139591, 31.34597428 ], [ 115.30108195, 31.34571765 ], [ 115.30048505, 31.34499212 ], [ 115.29990553, 31.34396809 ], [ 115.29938629, 31.34352367 ], [ 115.29902271, 31.34332612 ], [ 115.29870591, 31.34330578 ], [ 115.29841113, 31.34342072 ], [ 115.29749006, 31.34437753 ], [ 115.29684064, 31.34448589 ], [ 115.29617216, 31.34441786 ], [ 115.29465089, 31.34381197 ], [ 115.29413953, 31.34353433 ], [ 115.29365474, 31.34346308 ], [ 115.2933377, 31.34353024 ], [ 115.2930726, 31.34371021 ], [ 115.29195161, 31.34521228 ], [ 115.29144335, 31.34565593 ], [ 115.29088666, 31.34600378 ], [ 115.28985724, 31.3468762 ], [ 115.28808452, 31.3474668 ], [ 115.28610569, 31.34753767 ], [ 115.2848873, 31.34732591 ], [ 115.28394961, 31.34705008 ], [ 115.279192, 31.34329582 ], [ 115.27882563, 31.3430936 ], [ 115.27838982, 31.34299963 ], [ 115.27819975, 31.34308126 ], [ 115.27800262, 31.34329862 ], [ 115.27796817, 31.34368283 ], [ 115.27892778, 31.34507613 ], [ 115.27902145, 31.34534827 ], [ 115.27904297, 31.34577565 ], [ 115.27896763, 31.34604833 ], [ 115.27875386, 31.34631429 ], [ 115.27831827, 31.34662941 ], [ 115.27804827, 31.34672417 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124PD0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800122PDA000,AFA9800123PD0000", "TRVCD": "AFA9800125PD0000", "INDCD": "QFA9800122PDA000,QFA9800123PD0000", "ONDCD": "QFA9800124PD0000", "BWSCD": "WFA9800124PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25381122, 31.27254203 ], [ 115.25384313, 31.27256845 ] ], [ [ 115.25384313, 31.27256845 ], [ 115.25421323, 31.27337645 ], [ 115.25427762, 31.27440675 ], [ 115.25459775, 31.27575391 ], [ 115.25453356, 31.27613247 ], [ 115.25439807, 31.27623286 ], [ 115.25423717, 31.27624937 ], [ 115.25224266, 31.27606012 ], [ 115.25199019, 31.27590384 ], [ 115.25166823, 31.27532983 ], [ 115.25152362, 31.27526302 ], [ 115.25127808, 31.27575446 ], [ 115.25072802, 31.27635372 ], [ 115.25053845, 31.27692366 ], [ 115.25062983, 31.27724512 ], [ 115.25109183, 31.27785864 ], [ 115.25155003, 31.27859013 ], [ 115.25158396, 31.27874183 ], [ 115.25142108, 31.27891789 ], [ 115.25048901, 31.2793199 ], [ 115.25010221, 31.27991841 ], [ 115.24998632, 31.2805641 ], [ 115.25010416, 31.2814946 ], [ 115.25009557, 31.28332598 ], [ 115.2501998, 31.283627 ], [ 115.25048822, 31.2840745 ], [ 115.25121358, 31.28460984 ], [ 115.25138412, 31.28480405 ], [ 115.25140043, 31.2853538 ], [ 115.25133156, 31.28558804 ], [ 115.25109135, 31.28582293 ], [ 115.25075616, 31.28595167 ], [ 115.24989957, 31.28605638 ], [ 115.24957397, 31.28594983 ], [ 115.24938814, 31.28568246 ], [ 115.24917378, 31.28499422 ], [ 115.2486949, 31.28396242 ], [ 115.24859162, 31.28337763 ], [ 115.2484843, 31.28320622 ], [ 115.24845002, 31.28397245 ], [ 115.24859151, 31.28473234 ], [ 115.24883142, 31.28551044 ], [ 115.24876025, 31.28627843 ], [ 115.24851591, 31.28653351 ], [ 115.2478265, 31.28689896 ], [ 115.24731378, 31.28692044 ], [ 115.24690643, 31.28713799 ], [ 115.24630562, 31.28706454 ], [ 115.24572955, 31.28754636 ], [ 115.24533643, 31.28815759 ], [ 115.24522447, 31.28931407 ], [ 115.24479989, 31.28966694 ], [ 115.24406239, 31.28961959 ], [ 115.2439363, 31.2896899 ], [ 115.24394383, 31.28982323 ], [ 115.24416764, 31.29026676 ], [ 115.24410638, 31.29078183 ], [ 115.24398362, 31.29102053 ], [ 115.2435441, 31.29109752 ], [ 115.24352377, 31.2917683 ], [ 115.24330599, 31.29212166 ], [ 115.24303334, 31.29213218 ], [ 115.24275006, 31.29193584 ], [ 115.24256791, 31.29157359 ], [ 115.24258167, 31.29122556 ], [ 115.24250625, 31.29104425 ], [ 115.24219442, 31.29063082 ], [ 115.24167075, 31.29017984 ], [ 115.24124254, 31.2899821 ], [ 115.24068529, 31.2890546 ], [ 115.24061171, 31.28915771 ], [ 115.24061157, 31.28974408 ], [ 115.24051582, 31.29000186 ], [ 115.24022622, 31.29015012 ], [ 115.23978993, 31.29013559 ], [ 115.23925123, 31.28996002 ], [ 115.23877413, 31.28962329 ], [ 115.23759439, 31.28957204 ], [ 115.23651204, 31.28901879 ], [ 115.23390958, 31.2885763 ], [ 115.23164968, 31.2878182 ], [ 115.23094801, 31.28743523 ], [ 115.2310422, 31.28770213 ], [ 115.23140271, 31.28796403 ], [ 115.23215761, 31.2881685 ], [ 115.23365762, 31.28877987 ], [ 115.23558754, 31.28919996 ], [ 115.23672028, 31.2899445 ], [ 115.23684621, 31.29008652 ], [ 115.23669072, 31.29021534 ], [ 115.23627321, 31.29021078 ], [ 115.23611367, 31.29027715 ], [ 115.23592192, 31.29098153 ], [ 115.23579831, 31.29110243 ], [ 115.23522088, 31.29080256 ], [ 115.23488847, 31.29075398 ], [ 115.23375228, 31.29107821 ], [ 115.23285442, 31.29108865 ], [ 115.23297236, 31.29127704 ], [ 115.23339403, 31.29144998 ], [ 115.23437559, 31.29136602 ], [ 115.23460573, 31.2914162 ], [ 115.2348469, 31.29172963 ], [ 115.23512002, 31.29194994 ], [ 115.23515637, 31.29289048 ], [ 115.23511202, 31.29321939 ], [ 115.23498789, 31.29349798 ], [ 115.23448907, 31.29377759 ], [ 115.23434789, 31.29403179 ], [ 115.23439186, 31.29416764 ], [ 115.23478207, 31.29439644 ], [ 115.23496777, 31.29460662 ], [ 115.23506067, 31.29490161 ], [ 115.23502777, 31.29512215 ], [ 115.23463071, 31.29538378 ], [ 115.23451819, 31.29567593 ], [ 115.23437185, 31.2958325 ], [ 115.23355754, 31.2961102 ], [ 115.23341392, 31.29626732 ], [ 115.23347165, 31.29656003 ], [ 115.23359612, 31.29676985 ], [ 115.23420138, 31.29718442 ], [ 115.23432966, 31.29737574 ], [ 115.23377438, 31.29763034 ], [ 115.23354041, 31.29839601 ], [ 115.2334405, 31.29841064 ], [ 115.23310372, 31.29824895 ], [ 115.23291362, 31.29834796 ], [ 115.23279763, 31.29872428 ], [ 115.23290621, 31.29932815 ], [ 115.23282317, 31.29948862 ], [ 115.23250033, 31.29980659 ], [ 115.23237954, 31.29982318 ], [ 115.23230361, 31.29966415 ], [ 115.23239424, 31.29899426 ], [ 115.23233381, 31.29880293 ], [ 115.23169925, 31.29882966 ], [ 115.23135772, 31.29871402 ], [ 115.23124422, 31.29857963 ], [ 115.23126127, 31.29816813 ], [ 115.23108201, 31.2979122 ], [ 115.23059192, 31.29765987 ], [ 115.22900028, 31.29651626 ], [ 115.22811446, 31.29627279 ], [ 115.2275697, 31.29572245 ], [ 115.22705804, 31.29547175 ], [ 115.22669762, 31.29539412 ], [ 115.22638597, 31.29541667 ], [ 115.22568023, 31.29594414 ], [ 115.22538787, 31.29628134 ], [ 115.22511391, 31.29706469 ], [ 115.22500627, 31.29724578 ], [ 115.22489454, 31.29729308 ], [ 115.22475998, 31.29690228 ], [ 115.22477971, 31.29562356 ], [ 115.22459986, 31.2950618 ], [ 115.22446424, 31.29490386 ], [ 115.22424167, 31.29502006 ], [ 115.22401727, 31.29532846 ], [ 115.22388315, 31.29583991 ], [ 115.22368728, 31.29626029 ], [ 115.22365376, 31.2967202 ], [ 115.22347868, 31.29714596 ], [ 115.22348132, 31.29757559 ], [ 115.22368526, 31.29789109 ], [ 115.2238784, 31.29848449 ], [ 115.22374045, 31.29858965 ], [ 115.22315578, 31.29863778 ], [ 115.22314574, 31.29884264 ], [ 115.22328891, 31.29916405 ], [ 115.22322447, 31.29927385 ], [ 115.22252151, 31.29930764 ], [ 115.22263308, 31.29887368 ], [ 115.22218995, 31.29800309 ], [ 115.22191799, 31.29786567 ], [ 115.22129902, 31.29786499 ], [ 115.22103908, 31.29740695 ], [ 115.2207318, 31.29724457 ], [ 115.2200945, 31.29727075 ], [ 115.2197479, 31.29714178 ], [ 115.21955772, 31.29714414 ], [ 115.21940493, 31.29724371 ], [ 115.21914556, 31.29762841 ], [ 115.21884804, 31.29772002 ], [ 115.21851214, 31.29765873 ], [ 115.21740747, 31.29722264 ], [ 115.21724138, 31.29732374 ], [ 115.21718436, 31.29765437 ] ], [ [ 115.25613431, 31.28355573 ], [ 115.25615753, 31.28324108 ], [ 115.25595986, 31.28285333 ], [ 115.25539046, 31.28238766 ], [ 115.25512788, 31.28209208 ], [ 115.25478594, 31.28158995 ], [ 115.25431376, 31.2806528 ], [ 115.2540073, 31.28022141 ], [ 115.25260478, 31.27890248 ], [ 115.25233397, 31.27843317 ], [ 115.25221675, 31.27778438 ], [ 115.25165165, 31.27736237 ], [ 115.25142035, 31.27692991 ], [ 115.25149945, 31.27674155 ], [ 115.25180933, 31.27664823 ], [ 115.25264174, 31.27674396 ], [ 115.25439824, 31.27667065 ], [ 115.25466361, 31.27656586 ], [ 115.25486159, 31.27634005 ], [ 115.25494401, 31.27610968 ], [ 115.25495026, 31.27584242 ], [ 115.25470802, 31.27443222 ], [ 115.25460618, 31.27326828 ], [ 115.25437844, 31.27282529 ], [ 115.25402432, 31.2725838 ], [ 115.25384313, 31.27256845 ] ], [ [ 115.25614203, 31.28372797 ], [ 115.25613431, 31.28355573 ] ], [ [ 115.21718436, 31.29765437 ], [ 115.21671197, 31.29766968 ] ], [ [ 115.21718436, 31.29765437 ], [ 115.217657, 31.29964146 ], [ 115.21769062, 31.30066054 ], [ 115.21842398, 31.30148625 ], [ 115.21887675, 31.30215755 ], [ 115.21921159, 31.30238565 ], [ 115.21943422, 31.30242175 ], [ 115.21962388, 31.30237781 ], [ 115.21981081, 31.30220347 ], [ 115.22001215, 31.30169843 ], [ 115.2202043, 31.30142642 ], [ 115.22055966, 31.30130606 ], [ 115.22073197, 31.30107324 ], [ 115.2208538, 31.30106042 ], [ 115.22103851, 31.30132007 ], [ 115.22116625, 31.30169448 ], [ 115.22109976, 31.30245126 ], [ 115.22155625, 31.30253619 ], [ 115.22195033, 31.30247877 ], [ 115.2228258, 31.30279246 ], [ 115.22297819, 31.30319166 ], [ 115.22337444, 31.30367981 ], [ 115.22352841, 31.30439555 ], [ 115.22369814, 31.30458563 ], [ 115.22384412, 31.30459357 ], [ 115.22399036, 31.30451647 ], [ 115.2244238, 31.30402516 ], [ 115.22447603, 31.30368658 ], [ 115.22441104, 31.30326933 ], [ 115.22449112, 31.30299405 ], [ 115.22436788, 31.30260023 ], [ 115.22455381, 31.30227899 ], [ 115.22467646, 31.3017699 ], [ 115.22482733, 31.30148905 ], [ 115.22527365, 31.30152987 ], [ 115.22557975, 31.30126327 ], [ 115.22571759, 31.30126923 ], [ 115.22584886, 31.30145812 ], [ 115.22609605, 31.30214566 ], [ 115.22621793, 31.30225301 ], [ 115.22635386, 31.30216776 ], [ 115.22658172, 31.30169442 ], [ 115.22684029, 31.30137836 ], [ 115.22683505, 31.3009197 ], [ 115.22707681, 31.30056981 ], [ 115.22708094, 31.30034584 ], [ 115.22700162, 31.30019037 ], [ 115.22673585, 31.30002109 ], [ 115.22674958, 31.29971373 ], [ 115.22644288, 31.29939809 ], [ 115.22635219, 31.29914041 ], [ 115.2264286, 31.29902563 ], [ 115.22678754, 31.29895035 ], [ 115.2269822, 31.29872427 ], [ 115.22702973, 31.29856049 ], [ 115.22697835, 31.29784633 ], [ 115.22715774, 31.29760814 ], [ 115.22752586, 31.29777416 ], [ 115.22796419, 31.29849999 ], [ 115.22810957, 31.29857416 ], [ 115.22841963, 31.29860287 ], [ 115.22889876, 31.29885683 ], [ 115.22900585, 31.29918421 ], [ 115.2289283, 31.29973426 ], [ 115.22922497, 31.30009982 ], [ 115.23003639, 31.30037444 ], [ 115.23063957, 31.3009264 ], [ 115.23142071, 31.30141698 ], [ 115.23276158, 31.30173219 ], [ 115.23326796, 31.30175363 ], [ 115.23388272, 31.30223843 ], [ 115.23407863, 31.3022907 ], [ 115.23419849, 31.30216804 ], [ 115.23428901, 31.30178835 ], [ 115.23460681, 31.30107582 ], [ 115.23486101, 31.30081203 ], [ 115.2349841, 31.30080054 ], [ 115.23523371, 31.30100056 ], [ 115.23546064, 31.30104848 ], [ 115.236104, 31.30103786 ], [ 115.23639968, 31.3008801 ], [ 115.23638003, 31.30069843 ], [ 115.23603857, 31.3002398 ], [ 115.23593605, 31.29982444 ], [ 115.23551247, 31.29954035 ], [ 115.2354549, 31.29935998 ], [ 115.23563086, 31.29920955 ], [ 115.23622611, 31.29906513 ], [ 115.2364245, 31.29895376 ], [ 115.23645235, 31.29872576 ], [ 115.23616604, 31.29823845 ], [ 115.2362514, 31.29793839 ], [ 115.23662484, 31.29730203 ], [ 115.23702329, 31.29713429 ], [ 115.23731557, 31.29677629 ], [ 115.23773997, 31.29649078 ], [ 115.23790241, 31.29628972 ], [ 115.23775961, 31.29607745 ], [ 115.23715968, 31.29573012 ], [ 115.23696759, 31.29543484 ], [ 115.23703271, 31.2947617 ], [ 115.23699203, 31.29441134 ], [ 115.23708153, 31.29417635 ], [ 115.2369877, 31.29364064 ], [ 115.23679554, 31.29305235 ], [ 115.2370781, 31.29267997 ], [ 115.23694774, 31.29223517 ], [ 115.23734038, 31.29176829 ], [ 115.23751374, 31.29171416 ], [ 115.23784392, 31.2920043 ], [ 115.23813376, 31.29192555 ], [ 115.23868449, 31.29203007 ], [ 115.23888202, 31.2920071 ], [ 115.23900792, 31.29188477 ], [ 115.23904928, 31.29169269 ], [ 115.23881466, 31.29114177 ], [ 115.23896444, 31.29106424 ], [ 115.23922651, 31.29109507 ], [ 115.23985438, 31.2913784 ], [ 115.24031623, 31.29144908 ], [ 115.24048035, 31.29156647 ], [ 115.24053762, 31.29173814 ], [ 115.24028746, 31.29191775 ], [ 115.24027107, 31.2920201 ], [ 115.24075765, 31.29263361 ], [ 115.24106145, 31.29319806 ], [ 115.24131357, 31.29346602 ], [ 115.24165064, 31.2935699 ], [ 115.24205548, 31.29382222 ], [ 115.24221459, 31.29383759 ], [ 115.24258806, 31.29365865 ], [ 115.24299567, 31.29400569 ], [ 115.24328306, 31.29406566 ], [ 115.24337796, 31.29396362 ], [ 115.24361661, 31.29320918 ], [ 115.24370231, 31.2930952 ], [ 115.24381531, 31.29306122 ], [ 115.24434248, 31.29357598 ], [ 115.24453608, 31.29358836 ], [ 115.24497449, 31.29342559 ], [ 115.24550563, 31.2935223 ], [ 115.24579431, 31.29378009 ], [ 115.24605939, 31.29416031 ], [ 115.24628116, 31.29429271 ], [ 115.24642814, 31.29427337 ], [ 115.24654191, 31.2940211 ], [ 115.24664931, 31.2939699 ], [ 115.24754963, 31.29407749 ], [ 115.24746854, 31.29392224 ], [ 115.24700706, 31.29365063 ], [ 115.24664805, 31.29329895 ], [ 115.24569254, 31.29259635 ], [ 115.24519971, 31.29257956 ], [ 115.24498836, 31.29249207 ], [ 115.24484904, 31.29233412 ], [ 115.24483447, 31.29209193 ], [ 115.24499561, 31.29175241 ], [ 115.24563863, 31.29097161 ], [ 115.2459963, 31.28988129 ], [ 115.24633353, 31.28929606 ], [ 115.24639041, 31.28895384 ], [ 115.24636648, 31.2885138 ], [ 115.24651379, 31.28828492 ], [ 115.24695821, 31.28805741 ], [ 115.2479819, 31.2877856 ], [ 115.24819162, 31.28781069 ], [ 115.24845121, 31.28803978 ], [ 115.2485735, 31.28805573 ], [ 115.24891049, 31.28749965 ], [ 115.24976765, 31.28705006 ], [ 115.2511196, 31.28674201 ], [ 115.25145324, 31.28678431 ], [ 115.25185272, 31.28704952 ], [ 115.25197963, 31.28701826 ], [ 115.25211794, 31.28686409 ], [ 115.25226667, 31.28647799 ], [ 115.25237792, 31.28587893 ], [ 115.25241768, 31.28481619 ], [ 115.25223827, 31.28427388 ], [ 115.25190811, 31.28377172 ], [ 115.25175981, 31.28363202 ], [ 115.25126919, 31.28343209 ], [ 115.25099213, 31.28291806 ], [ 115.25092645, 31.28247347 ], [ 115.25091818, 31.28135803 ], [ 115.25100017, 31.28089513 ], [ 115.25099563, 31.28049051 ], [ 115.25114629, 31.28017799 ], [ 115.25162641, 31.27969209 ], [ 115.25195429, 31.27957825 ], [ 115.25235996, 31.27963614 ], [ 115.25292225, 31.27994638 ], [ 115.25335397, 31.28029125 ], [ 115.25372953, 31.28071441 ], [ 115.25427723, 31.28185296 ], [ 115.25466698, 31.28231627 ], [ 115.25517356, 31.28277751 ], [ 115.25547879, 31.28320479 ], [ 115.25588271, 31.28347751 ], [ 115.25613431, 31.28355573 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800127Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800126Q00000,AFA9800124QD0000", "TRVCD": "AFA9800128Q00000", "INDCD": "QFA9800126Q00000", "ONDCD": "QFA9800127Q00000", "BWSCD": "WFA9800127Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 10.0, "RVLEN": 560.0, "RVSLP": -0.0036, "IELV": 47.89, "OELV": 49.45, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99425113, 31.06958236 ], [ 114.99385121, 31.070025 ], [ 114.99311429, 31.07107381 ], [ 114.99262051, 31.07162951 ], [ 114.99188335, 31.07269618 ], [ 114.99103169, 31.07352627 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820200000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820100000000,AFA98201A0000000", "TRVCD": "AFA9820300000000", "INDCD": "QFA9820100000000", "ONDCD": "QFA9820200000000", "BWSCD": "WFA9820200000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 3438.0, "RVSLP": 0.0026, "IELV": 93.62, "OELV": 84.38, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87568679, 31.44257433 ], [ 114.87639582, 31.44220001 ], [ 114.87696357, 31.44203186 ], [ 114.87747937, 31.44179174 ], [ 114.8782141, 31.44124018 ], [ 114.87872987, 31.44099416 ], [ 114.88007267, 31.44080975 ], [ 114.88111398, 31.44034185 ], [ 114.88157152, 31.43998244 ], [ 114.88205057, 31.43937205 ], [ 114.88255237, 31.43890632 ], [ 114.88281616, 31.43805982 ], [ 114.88284342, 31.43778831 ], [ 114.88258353, 31.43688336 ], [ 114.88255979, 31.43578591 ], [ 114.88292394, 31.43511179 ], [ 114.88307689, 31.4342895 ], [ 114.88367183, 31.4335198 ], [ 114.88393235, 31.43264819 ], [ 114.88386323, 31.43238417 ], [ 114.88349498, 31.43172001 ], [ 114.88325342, 31.43107668 ], [ 114.88252996, 31.43058625 ], [ 114.88163735, 31.42965933 ], [ 114.88106738, 31.42886452 ], [ 114.88046198, 31.428279 ], [ 114.88018171, 31.42783981 ], [ 114.88012231, 31.42764264 ], [ 114.8801423, 31.42738231 ], [ 114.88053632, 31.42642148 ], [ 114.88052182, 31.42599585 ], [ 114.88041706, 31.42573009 ], [ 114.87999564, 31.42531602 ], [ 114.8792934, 31.42481235 ], [ 114.8784785, 31.42464354 ], [ 114.87817583, 31.42451555 ], [ 114.87683735, 31.42343123 ], [ 114.87648036, 31.42278384 ], [ 114.8763285, 31.42140563 ], [ 114.87599229, 31.42069482 ], [ 114.87555621, 31.42027029 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98502B0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98501B0000000", "TRVCD": "AFA9850500000000", "INDCD": "QFA98501B0000000", "ONDCD": "QFA9850400000000", "BWSCD": "WFA98502B0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3326.0, "RVSLP": 0.0019, "IELV": 60.0, "OELV": 56.09, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04109832, 30.98882996 ], [ 115.04055044, 30.98900551 ], [ 115.04027316, 30.98897962 ], [ 115.0391795, 30.98817846 ], [ 115.03838014, 30.98775236 ], [ 115.03807541, 30.98763482 ], [ 115.03715829, 30.98754766 ], [ 115.03688205, 30.98738843 ], [ 115.03667897, 30.98715008 ], [ 115.03651025, 30.98639232 ], [ 115.03632586, 30.98589951 ], [ 115.03621083, 30.98526812 ], [ 115.03591955, 30.98437407 ], [ 115.03557389, 30.98357203 ], [ 115.03464687, 30.98203618 ], [ 115.03461087, 30.98177777 ], [ 115.03468846, 30.98118797 ], [ 115.03404227, 30.98002413 ], [ 115.03384493, 30.97920459 ], [ 115.03352399, 30.97883848 ], [ 115.03246872, 30.97796389 ], [ 115.03161269, 30.97702143 ], [ 115.03150986, 30.97675579 ], [ 115.03135225, 30.97568779 ], [ 115.03070825, 30.97495606 ], [ 115.03010796, 30.97379 ], [ 115.02996793, 30.97309377 ], [ 115.02975394, 30.9724643 ], [ 115.02973766, 30.97129432 ], [ 115.03024859, 30.96978621 ], [ 115.03050382, 30.96933157 ], [ 115.03106681, 30.96863208 ], [ 115.03112195, 30.96814989 ], [ 115.03105236, 30.96780489 ], [ 115.03042068, 30.96640383 ], [ 115.03024349, 30.96622541 ], [ 115.02996839, 30.96608068 ], [ 115.02947219, 30.96602279 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850500000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850400000000,AFA98502B0000000", "TRVCD": "AFA9850600000000", "INDCD": "QFA9850400000000", "ONDCD": "QFA9850500000000", "BWSCD": "WFA9850500000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 2772.0, "RVSLP": 0.0025, "IELV": 56.09, "OELV": 49.36, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02947219, 30.96602279 ], [ 115.02796445, 30.96680733 ], [ 115.02614963, 30.96788641 ], [ 115.02491369, 30.96849165 ], [ 115.02182771, 30.97029129 ], [ 115.02059401, 30.97089687 ], [ 115.01878847, 30.9722026 ], [ 115.01781015, 30.97259172 ], [ 115.01725114, 30.9729183 ], [ 115.01589836, 30.97344415 ], [ 115.01550222, 30.97344211 ], [ 115.0141125, 30.97299965 ], [ 115.01324021, 30.97254172 ], [ 115.0123458, 30.97189989 ], [ 115.0112906, 30.97148048 ], [ 115.00950619, 30.97119445 ], [ 115.00871955, 30.97099434 ], [ 115.00786195, 30.97049553 ], [ 115.00731776, 30.97033649 ], [ 115.00679377, 30.97007512 ], [ 115.0064823, 30.9700069 ], [ 115.0059757, 30.97000482 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850700000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850600000000,AFA98501D0000000", "TRVCD": "AFA9850800000000", "INDCD": "QFA9850600000000", "ONDCD": "QFA9850700000000", "BWSCD": "WFA9850700000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 2362.0, "RVSLP": 0.0033, "IELV": 48.67, "OELV": 39.15, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99107873, 30.93672775 ], [ 114.99103867, 30.93633191 ], [ 114.99093794, 30.93606566 ], [ 114.9903257, 30.93536372 ], [ 114.99014023, 30.9347679 ], [ 114.98973206, 30.93404039 ], [ 114.98944702, 30.93337364 ], [ 114.98936779, 30.93295358 ], [ 114.98930194, 30.93152972 ], [ 114.98921402, 30.93119159 ], [ 114.98901361, 30.93094184 ], [ 114.98868249, 30.930688 ], [ 114.9880424, 30.93042594 ], [ 114.98772637, 30.93006479 ], [ 114.98744828, 30.92954969 ], [ 114.98699209, 30.92789533 ], [ 114.98531171, 30.92539438 ], [ 114.98481381, 30.9249418 ], [ 114.98431965, 30.92463376 ], [ 114.98300021, 30.92423107 ], [ 114.98216558, 30.92416583 ], [ 114.98178423, 30.92402447 ], [ 114.98112563, 30.92349589 ], [ 114.98073399, 30.92302033 ], [ 114.98004371, 30.92239845 ], [ 114.97953192, 30.92181747 ], [ 114.97874839, 30.92138444 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PC0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PC0000", "INDCD": "-1", "ONDCD": "QFA9800121PC0000", "BWSCD": "WFA9800121PC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5472.0, "RVSLP": 0.0094, "IELV": 209.77, "OELV": 154.75, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22928524, 31.40878849 ], [ 115.22988423, 31.40775004 ], [ 115.23008706, 31.40691624 ], [ 115.23043073, 31.40632978 ], [ 115.23125642, 31.40561833 ], [ 115.23310176, 31.40475809 ], [ 115.23373758, 31.40440026 ], [ 115.23396581, 31.40416999 ], [ 115.23444668, 31.40346843 ], [ 115.23451983, 31.40319969 ], [ 115.23450218, 31.40292386 ], [ 115.23417404, 31.40212184 ], [ 115.23315245, 31.40038422 ], [ 115.23241348, 31.39981522 ], [ 115.23171246, 31.39958976 ], [ 115.23144269, 31.39940766 ], [ 115.23086008, 31.39877232 ], [ 115.22904223, 31.39730194 ], [ 115.22804015, 31.39625067 ], [ 115.2268995, 31.39426158 ], [ 115.22670818, 31.39381021 ], [ 115.22600025, 31.39263917 ], [ 115.2259544, 31.39209757 ], [ 115.22616421, 31.39162687 ], [ 115.22640645, 31.39131407 ], [ 115.22746539, 31.39030779 ], [ 115.22761112, 31.39004227 ], [ 115.22762309, 31.38970605 ], [ 115.22752779, 31.38944189 ], [ 115.2271785, 31.38899438 ], [ 115.22695395, 31.38855574 ], [ 115.22617237, 31.38751611 ], [ 115.22536037, 31.38677228 ], [ 115.22516406, 31.38645019 ], [ 115.22510645, 31.38602296 ], [ 115.22515789, 31.38552826 ], [ 115.22541952, 31.38498627 ], [ 115.22597446, 31.38413972 ], [ 115.22602396, 31.38381456 ], [ 115.22590359, 31.38356821 ], [ 115.22558231, 31.38333194 ], [ 115.22457781, 31.38320939 ], [ 115.22427831, 31.38299989 ], [ 115.22389145, 31.38169369 ], [ 115.22382154, 31.38042933 ], [ 115.22391578, 31.38008969 ], [ 115.22412563, 31.37985693 ], [ 115.22440882, 31.37970588 ], [ 115.22499359, 31.37959044 ], [ 115.22522041, 31.37948804 ], [ 115.2256489, 31.37911177 ], [ 115.22575586, 31.37880591 ], [ 115.22508316, 31.37780604 ], [ 115.22479635, 31.37713212 ], [ 115.22462969, 31.37636778 ], [ 115.22451208, 31.37617825 ], [ 115.2241123, 31.37591046 ], [ 115.22318617, 31.37581811 ], [ 115.22291587, 31.37561909 ], [ 115.22289477, 31.3754555 ], [ 115.22296777, 31.37525761 ], [ 115.22350221, 31.37441282 ], [ 115.22372617, 31.37379239 ], [ 115.22375624, 31.37345106 ], [ 115.22360525, 31.3730544 ], [ 115.22265591, 31.37205705 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PDAA00", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PDA000", "INDCD": "-1", "ONDCD": "QFA9800121PDA000", "BWSCD": "WFA9800121PDAA00", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3046.0, "RVSLP": 0.008, "IELV": 160.77, "OELV": 136.03, "VR": "0", "LEVEL": 9, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25481612, 31.23081772 ], [ 115.25530951, 31.23188856 ], [ 115.25535785, 31.23221732 ], [ 115.2552001, 31.23253972 ], [ 115.25451591, 31.23327786 ], [ 115.25444165, 31.23347953 ], [ 115.25443014, 31.23383051 ], [ 115.2545618, 31.23423304 ], [ 115.25517644, 31.23490167 ], [ 115.25525046, 31.2352977 ], [ 115.25508491, 31.23600251 ], [ 115.25505196, 31.23724577 ], [ 115.25444221, 31.23852793 ], [ 115.25439583, 31.23902034 ], [ 115.25447777, 31.23951187 ], [ 115.25488666, 31.24009573 ], [ 115.25499205, 31.2405784 ], [ 115.25496832, 31.24107873 ], [ 115.25461104, 31.242124 ], [ 115.25460137, 31.24238598 ], [ 115.25486251, 31.2429038 ], [ 115.25525157, 31.24339176 ], [ 115.25529504, 31.24356971 ], [ 115.25518199, 31.24380618 ], [ 115.25493967, 31.24399999 ], [ 115.25408231, 31.24425259 ], [ 115.25393845, 31.24441467 ], [ 115.25388477, 31.24460536 ], [ 115.25392577, 31.24563467 ], [ 115.25417175, 31.24633422 ], [ 115.25422449, 31.24691015 ], [ 115.25380588, 31.2487415 ], [ 115.25384091, 31.24932028 ], [ 115.25400759, 31.24986036 ], [ 115.25392645, 31.25045454 ], [ 115.25406279, 31.25104247 ], [ 115.25393977, 31.25173444 ], [ 115.25398796, 31.25359822 ], [ 115.25382252, 31.25425602 ], [ 115.25379834, 31.25474197 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TF0000", "RVNM": "尾斗山水库干渠", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800128T00000", "INDCD": "-1", "ONDCD": "QFA9800127T00000", "BWSCD": "WFA9800121TF0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6433.0, "RVSLP": 0.0002, "IELV": 45.56, "OELV": 39.89, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7117705, 31.08152205 ], [ 114.71243916, 31.08203587 ], [ 114.71344919, 31.08264431 ], [ 114.71381293, 31.08274629 ], [ 114.71477247, 31.08236791 ], [ 114.71571228, 31.0820907 ], [ 114.71620526, 31.08211998 ], [ 114.71713019, 31.08244361 ], [ 114.71788172, 31.08243022 ], [ 114.71876157, 31.08201594 ], [ 114.72037619, 31.08186939 ], [ 114.72089097, 31.081635 ], [ 114.72144417, 31.08128774 ], [ 114.72237384, 31.0809902 ], [ 114.72278798, 31.08098005 ], [ 114.72367815, 31.08114446 ], [ 114.72480636, 31.08111969 ], [ 114.72530751, 31.08104814 ], [ 114.72615049, 31.08075401 ], [ 114.72690811, 31.08009189 ], [ 114.72754798, 31.07920312 ], [ 114.72798751, 31.07834954 ], [ 114.72814981, 31.07788793 ], [ 114.728452, 31.07751034 ], [ 114.72877597, 31.07725277 ], [ 114.72971841, 31.07676564 ], [ 114.73080457, 31.07579773 ], [ 114.73112389, 31.07564118 ], [ 114.73149387, 31.07583817 ], [ 114.73210978, 31.07670236 ], [ 114.7331118, 31.07760491 ], [ 114.73318246, 31.07790247 ], [ 114.73296774, 31.07838395 ], [ 114.73308753, 31.07860715 ], [ 114.73460651, 31.07986191 ], [ 114.73512173, 31.08045664 ], [ 114.73550353, 31.08078407 ], [ 114.7359485, 31.08095819 ], [ 114.73678807, 31.08084681 ], [ 114.73753368, 31.0811322 ], [ 114.73831597, 31.08105607 ], [ 114.73851414, 31.08109112 ], [ 114.7388003, 31.08132801 ], [ 114.73901503, 31.08176202 ], [ 114.73922381, 31.08200367 ], [ 114.74034952, 31.08270416 ], [ 114.74065019, 31.08283182 ], [ 114.74138042, 31.08296984 ], [ 114.74295816, 31.08388868 ], [ 114.7441856, 31.08433244 ], [ 114.74529816, 31.08430391 ], [ 114.74625838, 31.0840715 ], [ 114.74816558, 31.08399237 ], [ 114.74969253, 31.08344079 ], [ 114.7509875, 31.08255976 ], [ 114.75134016, 31.08220798 ], [ 114.75180733, 31.08158575 ], [ 114.7526325, 31.08085435 ], [ 114.75293446, 31.08072988 ], [ 114.75380577, 31.08053843 ], [ 114.75435608, 31.08050595 ], [ 114.7545057, 31.08038008 ], [ 114.7548665, 31.07978772 ], [ 114.7550934, 31.07959378 ], [ 114.75606874, 31.07941334 ], [ 114.75697245, 31.07904557 ], [ 114.75823191, 31.07888464 ], [ 114.76006901, 31.07997049 ], [ 114.76098758, 31.08006604 ], [ 114.7614624, 31.08019005 ], [ 114.76207141, 31.08015221 ], [ 114.76264983, 31.07973849 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122K00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800121K00000", "TRVCD": "AFA980012H000000", "INDCD": "QFA9800121K00000", "ONDCD": "QFA980012G000000", "BWSCD": "WFA9800122K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4482.0, "RVSLP": 0.0, "IELV": 60.05, "OELV": 60.09, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99026508, 31.27346954 ], [ 114.9907405, 31.2741599 ], [ 114.9909204, 31.27499374 ], [ 114.99148919, 31.27610985 ], [ 114.99176755, 31.2763982 ], [ 114.99213771, 31.27654567 ], [ 114.99271005, 31.27648322 ], [ 114.99355599, 31.27597419 ], [ 114.99399445, 31.27558778 ], [ 114.99440083, 31.2750244 ], [ 114.99475417, 31.27467526 ], [ 114.99502677, 31.27449752 ], [ 114.9956319, 31.27425333 ], [ 114.99646289, 31.27353187 ], [ 114.99671606, 31.27338563 ], [ 114.99697814, 31.27342889 ], [ 114.99779836, 31.27400523 ], [ 114.99840332, 31.27425293 ], [ 115.00041826, 31.27467257 ], [ 115.00116615, 31.27462412 ], [ 115.00141914, 31.27445894 ], [ 115.0016717, 31.27401785 ], [ 115.00188404, 31.27281401 ], [ 115.00185109, 31.272562 ], [ 115.00146816, 31.27168374 ], [ 115.00138795, 31.2713364 ], [ 115.00140669, 31.27068691 ], [ 115.00161317, 31.27036843 ], [ 115.00187631, 31.27018806 ], [ 115.00211635, 31.27012393 ], [ 115.00306942, 31.2700865 ], [ 115.00411367, 31.2703184 ], [ 115.00470217, 31.27060258 ], [ 115.0050209, 31.27067677 ], [ 115.00649534, 31.27065209 ], [ 115.00707733, 31.27055778 ], [ 115.00741601, 31.27033167 ], [ 115.0077396, 31.26996241 ], [ 115.00814574, 31.26881618 ], [ 115.00868945, 31.26810844 ], [ 115.00900481, 31.2674521 ], [ 115.00950166, 31.267019 ], [ 115.00998153, 31.26690381 ], [ 115.01064682, 31.26696421 ], [ 115.01163462, 31.26735555 ], [ 115.01228609, 31.26771042 ], [ 115.0137981, 31.26831171 ], [ 115.01512424, 31.26870044 ], [ 115.01571156, 31.26873786 ], [ 115.01754419, 31.26866537 ], [ 115.01803055, 31.26874756 ], [ 115.0182918, 31.26893228 ], [ 115.01846084, 31.26918245 ], [ 115.01858579, 31.27019809 ], [ 115.01872623, 31.27053423 ], [ 115.01940226, 31.27130581 ], [ 115.01978414, 31.27147947 ], [ 115.02017629, 31.27150785 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012A000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800129000000,AFA9800123F00000", "TRVCD": "AFA980012B000000", "INDCD": "QFA9800129000000", "ONDCD": "QFA980012A000000", "BWSCD": "WFA980012A000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 11.0, "RVLEN": 7668.0, "RVSLP": 0.0012, "IELV": 88.06, "OELV": 77.31, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08638173, 31.43081297 ], [ 115.08633357, 31.42992628 ], [ 115.08617203, 31.42959352 ], [ 115.08368136, 31.42757838 ], [ 115.08339225, 31.42720427 ], [ 115.08324603, 31.42651214 ], [ 115.08280246, 31.42548906 ], [ 115.08271223, 31.4249977 ], [ 115.08271014, 31.42441152 ], [ 115.08287562, 31.42377185 ], [ 115.08292602, 31.42297972 ], [ 115.08308795, 31.42264324 ], [ 115.08376839, 31.42201565 ], [ 115.08435396, 31.42172177 ], [ 115.08598829, 31.4211862 ], [ 115.08656407, 31.42113996 ], [ 115.08687406, 31.42124053 ], [ 115.08736354, 31.42158838 ], [ 115.08836821, 31.42241786 ], [ 115.08907007, 31.42318372 ], [ 115.08976224, 31.42367485 ], [ 115.09055008, 31.423912 ], [ 115.09201676, 31.42383964 ], [ 115.09261555, 31.4235822 ], [ 115.09307982, 31.42322495 ], [ 115.09363321, 31.42269203 ], [ 115.09409989, 31.42207058 ], [ 115.09479775, 31.4213442 ], [ 115.09532235, 31.4203515 ], [ 115.0953738, 31.42000013 ], [ 115.09534795, 31.41956193 ], [ 115.09517561, 31.41916557 ], [ 115.09478407, 31.41887203 ], [ 115.09424041, 31.41867669 ], [ 115.09357047, 31.41859831 ], [ 115.09302699, 31.41841337 ], [ 115.0921738, 31.41787577 ], [ 115.09128784, 31.417429 ], [ 115.09087261, 31.41737816 ], [ 115.08939392, 31.41740129 ], [ 115.08869205, 31.41717401 ], [ 115.08820891, 31.4168399 ], [ 115.08768858, 31.41625433 ], [ 115.08743118, 31.41605356 ], [ 115.086812, 31.41584971 ], [ 115.08584551, 31.41540505 ], [ 115.08554236, 31.41536215 ], [ 115.08492408, 31.41551797 ], [ 115.08379597, 31.41557831 ], [ 115.08337819, 31.41553564 ], [ 115.08291625, 31.41536761 ], [ 115.08140237, 31.41447017 ], [ 115.08093951, 31.41409157 ], [ 115.08069733, 31.41378177 ], [ 115.080136, 31.4125084 ], [ 115.08006318, 31.41209365 ], [ 115.08010796, 31.41167674 ], [ 115.0804732, 31.41085178 ], [ 115.08064085, 31.40979815 ], [ 115.08051812, 31.40927561 ], [ 115.0805217, 31.4090265 ], [ 115.08066783, 31.40879812 ], [ 115.08120087, 31.40843923 ], [ 115.08170784, 31.40798229 ], [ 115.08213229, 31.40734377 ], [ 115.08238962, 31.40680673 ], [ 115.08286132, 31.40543928 ], [ 115.08309366, 31.40475022 ], [ 115.08313582, 31.40440103 ], [ 115.0830932, 31.40405079 ], [ 115.08295631, 31.40379033 ], [ 115.08142513, 31.40252572 ], [ 115.08097153, 31.40182741 ], [ 115.08083882, 31.40097244 ], [ 115.08065382, 31.40048437 ], [ 115.08061855, 31.40021134 ], [ 115.08101614, 31.39860134 ], [ 115.08098045, 31.39742909 ], [ 115.08084938, 31.39708704 ], [ 115.07993006, 31.39562012 ], [ 115.07958597, 31.39474833 ], [ 115.07960921, 31.39411959 ], [ 115.0799565, 31.39336171 ], [ 115.08008195, 31.3927497 ], [ 115.08045131, 31.39163732 ], [ 115.0803556, 31.38865133 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012L000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012K000000,AFA9800122N00000", "TRVCD": "AFA980012M000000", "INDCD": "QFA980012K000000", "ONDCD": "QFA980012L000000", "BWSCD": "WFA980012L000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 22.0, "RVLEN": 262.0, "RVSLP": 0.0001, "IELV": 49.17, "OELV": 49.15, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01509409, 31.13848679 ], [ 115.01464782, 31.13810966 ], [ 115.01442204, 31.13774169 ], [ 115.01362034, 31.13707902 ], [ 115.01345814, 31.13674162 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201A0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820200000000", "INDCD": "-1", "ONDCD": "QFA9820100000000", "BWSCD": "WFA98201A0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 5357.0, "RVSLP": 0.0055, "IELV": 119.14, "OELV": 93.62, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88165029, 31.4847601 ], [ 114.88143656, 31.48438979 ], [ 114.88129379, 31.4832044 ], [ 114.88103077, 31.48236813 ], [ 114.88101827, 31.48163658 ], [ 114.88119423, 31.481 ], [ 114.88121164, 31.48049134 ], [ 114.88115449, 31.47998755 ], [ 114.88096047, 31.47949787 ], [ 114.88089715, 31.47914638 ], [ 114.88082785, 31.47713351 ], [ 114.88109758, 31.47624265 ], [ 114.88194249, 31.47435613 ], [ 114.88229905, 31.47328158 ], [ 114.88268601, 31.47246983 ], [ 114.88291447, 31.47178367 ], [ 114.88292369, 31.47128911 ], [ 114.88267568, 31.47052368 ], [ 114.88259001, 31.46933957 ], [ 114.88250032, 31.46900024 ], [ 114.88223557, 31.46869004 ], [ 114.88121824, 31.46787041 ], [ 114.88096445, 31.4674885 ], [ 114.88089818, 31.46691163 ], [ 114.88092362, 31.46647527 ], [ 114.88133227, 31.46551634 ], [ 114.8813282, 31.46488374 ], [ 114.88098389, 31.46408704 ], [ 114.8805679, 31.46358557 ], [ 114.88027716, 31.46307061 ], [ 114.88013243, 31.46214846 ], [ 114.87904681, 31.45920817 ], [ 114.87894751, 31.45772776 ], [ 114.87885883, 31.45738761 ], [ 114.87859632, 31.45707558 ], [ 114.87812585, 31.45669335 ], [ 114.87696988, 31.45599362 ], [ 114.87552642, 31.45485825 ], [ 114.8751684, 31.45450441 ], [ 114.87493043, 31.45406643 ], [ 114.87494423, 31.45381733 ], [ 114.87524909, 31.45314234 ], [ 114.87538955, 31.45252963 ], [ 114.87573358, 31.45177794 ], [ 114.87574362, 31.45152013 ], [ 114.87562138, 31.45126706 ], [ 114.87499377, 31.4506184 ], [ 114.87475827, 31.4502274 ], [ 114.87456804, 31.44963351 ], [ 114.87419239, 31.44911244 ], [ 114.87408692, 31.4486269 ], [ 114.8740663, 31.44766149 ], [ 114.87425382, 31.44688256 ], [ 114.87427713, 31.44512214 ], [ 114.87453956, 31.44436578 ], [ 114.8750172, 31.44344608 ], [ 114.8753436, 31.44292823 ], [ 114.87568679, 31.44257433 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501D0000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9850700000000", "INDCD": "-1", "ONDCD": "QFA9850600000000", "BWSCD": "WFA98501D0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3754.0, "RVSLP": -0.0014, "IELV": 46.66, "OELV": 48.67, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0118313, 30.96078387 ], [ 115.01147533, 30.96044301 ], [ 115.01115779, 30.95987314 ], [ 115.01031232, 30.95883253 ], [ 115.01011978, 30.95794011 ], [ 115.00998962, 30.95775781 ], [ 115.00947774, 30.9577422 ], [ 115.00893367, 30.95792156 ], [ 115.00773153, 30.9581581 ], [ 115.00752419, 30.95811638 ], [ 115.0073499, 30.95798603 ], [ 115.00685226, 30.95740149 ], [ 115.00635558, 30.95665964 ], [ 115.00433197, 30.95403466 ], [ 115.00305459, 30.95226702 ], [ 115.00218156, 30.95124676 ], [ 115.00085684, 30.94941498 ], [ 114.99998378, 30.94839575 ], [ 114.99953215, 30.94772607 ], [ 114.99911033, 30.94723336 ], [ 114.99842921, 30.94618573 ], [ 114.99718381, 30.94459752 ], [ 114.99677978, 30.94399035 ], [ 114.99585763, 30.94290634 ], [ 114.99375601, 30.94004101 ], [ 114.99338182, 30.93961331 ], [ 114.99257568, 30.93850632 ], [ 114.99225651, 30.93771575 ], [ 114.99107873, 30.93672775 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TE0000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800127T00000", "INDCD": "-1", "ONDCD": "QFA9800126T00000", "BWSCD": "WFA9800121TE0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7790.0, "RVSLP": 0.0018, "IELV": 54.64, "OELV": 40.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77600924, 31.13276826 ], [ 114.77539165, 31.1328245 ], [ 114.77478557, 31.13299985 ], [ 114.77384831, 31.13308482 ], [ 114.77279003, 31.13349255 ], [ 114.77168596, 31.13361139 ], [ 114.77048686, 31.13393168 ], [ 114.77026441, 31.13412024 ], [ 114.77021205, 31.13433811 ], [ 114.77096007, 31.13508455 ], [ 114.77109055, 31.13540499 ], [ 114.77106033, 31.13558598 ], [ 114.77092795, 31.13574598 ], [ 114.77056613, 31.13583053 ], [ 114.77018553, 31.13569555 ], [ 114.76906593, 31.13488052 ], [ 114.76874619, 31.13480498 ], [ 114.76780535, 31.13476762 ], [ 114.76743464, 31.13459363 ], [ 114.76700002, 31.13420425 ], [ 114.76638564, 31.13334218 ], [ 114.76489604, 31.13213435 ], [ 114.76460313, 31.1318025 ], [ 114.7646568, 31.13157618 ], [ 114.76493227, 31.13130356 ], [ 114.76590031, 31.13084654 ], [ 114.76687237, 31.12999956 ], [ 114.7673402, 31.12951581 ], [ 114.76746782, 31.12917756 ], [ 114.76744141, 31.12852755 ], [ 114.76721522, 31.12789873 ], [ 114.76709014, 31.12688711 ], [ 114.76687254, 31.12625999 ], [ 114.76676573, 31.12532019 ], [ 114.76654625, 31.12469282 ], [ 114.76642451, 31.12291804 ], [ 114.76594028, 31.12191789 ], [ 114.76579391, 31.12083724 ], [ 114.76560567, 31.12028646 ], [ 114.76561636, 31.12002291 ], [ 114.76582358, 31.11941059 ], [ 114.76610798, 31.11904663 ], [ 114.76666483, 31.118702 ], [ 114.76709131, 31.11830793 ], [ 114.76724098, 31.11804166 ], [ 114.7673663, 31.11749979 ], [ 114.76767188, 31.1171479 ], [ 114.76804929, 31.11701104 ], [ 114.76925719, 31.11691977 ], [ 114.76954845, 31.11677436 ], [ 114.76991004, 31.11643476 ], [ 114.77005551, 31.11616802 ], [ 114.77016205, 31.11539571 ], [ 114.77076552, 31.11411011 ], [ 114.77078182, 31.11353429 ], [ 114.77059638, 31.11283667 ], [ 114.77063028, 31.11260676 ], [ 114.77077439, 31.11245905 ], [ 114.77119838, 31.11225469 ], [ 114.77220419, 31.11209449 ], [ 114.77262448, 31.11184603 ], [ 114.77295249, 31.11148155 ], [ 114.77322131, 31.11089246 ], [ 114.7739695, 31.11009819 ], [ 114.77421516, 31.10952646 ], [ 114.77416582, 31.10934438 ], [ 114.77379959, 31.10877025 ], [ 114.77366976, 31.10798598 ], [ 114.77343338, 31.10721502 ], [ 114.77345667, 31.10679199 ], [ 114.77386478, 31.10590208 ], [ 114.77398633, 31.1054424 ], [ 114.77397593, 31.10526275 ], [ 114.77379225, 31.10506482 ], [ 114.77351608, 31.10496431 ], [ 114.77272606, 31.10512377 ], [ 114.77232431, 31.1050807 ], [ 114.77207646, 31.10490556 ], [ 114.77180759, 31.10446662 ], [ 114.77161984, 31.10317574 ], [ 114.77132592, 31.10228096 ], [ 114.77088073, 31.10126135 ], [ 114.7704643, 31.09989268 ], [ 114.77002213, 31.09887215 ], [ 114.76985529, 31.09826733 ], [ 114.76912352, 31.09658026 ], [ 114.76882881, 31.09568564 ], [ 114.76869469, 31.09498779 ], [ 114.76852421, 31.09456789 ], [ 114.7683904, 31.09386939 ], [ 114.76821881, 31.09344854 ], [ 114.76808406, 31.09275202 ], [ 114.76761493, 31.09143803 ], [ 114.76748085, 31.09074018 ], [ 114.76655443, 31.08802816 ], [ 114.76636828, 31.08774392 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122P00000", "RVNM": "汪家河", "GB": "210101", "FRVCD": "AFA9800121P00000", "TRVCD": "AFA9800123P00000", "INDCD": "QFA9800121P00000", "ONDCD": "QFA9800122P00000", "BWSCD": "WFA9800122P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4486.0, "RVSLP": 0.0201, "IELV": 245.25, "OELV": 165.33, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33107295, 31.34121735 ], [ 115.33050645, 31.34167253 ], [ 115.33011013, 31.34185384 ], [ 115.32988714, 31.3418793 ], [ 115.3294635, 31.34167142 ], [ 115.32875601, 31.34091558 ], [ 115.32841205, 31.34070376 ], [ 115.32791585, 31.34064854 ], [ 115.3261599, 31.34071638 ], [ 115.32572003, 31.34058213 ], [ 115.32559157, 31.34035835 ], [ 115.32559972, 31.34010364 ], [ 115.32595188, 31.33934613 ], [ 115.32622061, 31.33851954 ], [ 115.32623795, 31.33800683 ], [ 115.32617429, 31.33750232 ], [ 115.32603414, 31.33724022 ], [ 115.32579553, 31.33700451 ], [ 115.32497829, 31.33635431 ], [ 115.32455386, 31.33612423 ], [ 115.32319988, 31.33634631 ], [ 115.3224918, 31.33654802 ], [ 115.32189892, 31.33655384 ], [ 115.3212617, 31.33641713 ], [ 115.32095013, 31.33646486 ], [ 115.32058805, 31.33675763 ], [ 115.32028234, 31.33741527 ], [ 115.3197624, 31.33796368 ], [ 115.31935433, 31.33824775 ], [ 115.31866943, 31.33849316 ], [ 115.31825476, 31.33848443 ], [ 115.31761376, 31.33834214 ], [ 115.31563502, 31.33834426 ], [ 115.31370995, 31.33742689 ], [ 115.31339768, 31.33737201 ], [ 115.31308563, 31.33743192 ], [ 115.31213611, 31.33789225 ], [ 115.31126729, 31.33853589 ], [ 115.31082752, 31.33873378 ], [ 115.31051042, 31.33877245 ], [ 115.30981649, 31.33855365 ], [ 115.30930776, 31.33827049 ], [ 115.30875392, 31.33810373 ], [ 115.30823377, 31.33784136 ], [ 115.30784663, 31.3377964 ], [ 115.30764315, 31.3378757 ], [ 115.30748159, 31.33809818 ], [ 115.30744162, 31.33949136 ], [ 115.30719363, 31.34025351 ], [ 115.30700205, 31.34050006 ], [ 115.30674776, 31.34065613 ], [ 115.30652612, 31.34066142 ], [ 115.30573588, 31.34019787 ], [ 115.30533977, 31.34012019 ], [ 115.30499193, 31.34020794 ], [ 115.30475801, 31.34053006 ], [ 115.30449194, 31.34136216 ], [ 115.30438799, 31.34213377 ], [ 115.30405861, 31.34267242 ], [ 115.30354215, 31.34394793 ], [ 115.30356834, 31.34489362 ], [ 115.30380006, 31.34554037 ], [ 115.30386888, 31.34602229 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122J00000", "TRVCD": "AFA9800124J00000", "INDCD": "QFA9800122J00000", "ONDCD": "QFA9800123J00000", "BWSCD": "WFA9800123J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 8083.0, "RVSLP": 0.0018, "IELV": 105.93, "OELV": 89.62, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95233201, 31.4095422 ], [ 114.95341559, 31.4098985 ], [ 114.95472403, 31.41013198 ], [ 114.9553975, 31.41007971 ], [ 114.95587884, 31.40976975 ], [ 114.95618441, 31.40938789 ], [ 114.95642045, 31.40870023 ], [ 114.95645948, 31.40709291 ], [ 114.95684021, 31.40635402 ], [ 114.9569439, 31.40558391 ], [ 114.95721962, 31.40483498 ], [ 114.95749364, 31.40454626 ], [ 114.95798206, 31.40424752 ], [ 114.95876387, 31.40359977 ], [ 114.95953152, 31.40312791 ], [ 114.95983371, 31.40301236 ], [ 114.9606625, 31.40287761 ], [ 114.96120021, 31.40248823 ], [ 114.96174443, 31.40195019 ], [ 114.96220931, 31.40132752 ], [ 114.96304096, 31.40048666 ], [ 114.96314612, 31.40028624 ], [ 114.96340412, 31.39916617 ], [ 114.96331567, 31.39861507 ], [ 114.96273777, 31.39787996 ], [ 114.96067828, 31.39618385 ], [ 114.95940609, 31.39485511 ], [ 114.95938629, 31.39467757 ], [ 114.95956582, 31.39362587 ], [ 114.95996224, 31.39266687 ], [ 114.9599658, 31.39067797 ], [ 114.96055202, 31.38947111 ], [ 114.96062941, 31.3891215 ], [ 114.96061979, 31.38852991 ], [ 114.96053609, 31.38810778 ], [ 114.96026803, 31.38765485 ], [ 114.95990351, 31.38733641 ], [ 114.95942644, 31.38721914 ], [ 114.95760309, 31.38725127 ], [ 114.95704593, 31.38712005 ], [ 114.9560265, 31.38707809 ], [ 114.95538767, 31.38693571 ], [ 114.95462801, 31.3868818 ], [ 114.95398632, 31.386738 ], [ 114.95313378, 31.38677623 ], [ 114.95263369, 31.38705082 ], [ 114.95073241, 31.38877583 ], [ 114.9498907, 31.38928038 ], [ 114.94912024, 31.38954025 ], [ 114.94870576, 31.38960754 ], [ 114.94678634, 31.38967825 ], [ 114.94628627, 31.38962313 ], [ 114.94505606, 31.38892377 ], [ 114.94481147, 31.38871155 ], [ 114.94467285, 31.38845383 ], [ 114.94457439, 31.38704169 ], [ 114.94459399, 31.38623586 ], [ 114.94488873, 31.38541745 ], [ 114.94567565, 31.38421857 ], [ 114.94630163, 31.38388644 ], [ 114.94739985, 31.383756 ], [ 114.94820238, 31.38337025 ], [ 114.94929757, 31.38323894 ], [ 114.95007254, 31.38298814 ], [ 114.95088443, 31.38242044 ], [ 114.95132187, 31.3822047 ], [ 114.95220464, 31.38199444 ], [ 114.95272358, 31.3817637 ], [ 114.9531862, 31.38140723 ], [ 114.9542485, 31.38040722 ], [ 114.95474172, 31.3796386 ], [ 114.95496622, 31.37902279 ], [ 114.95494613, 31.3781377 ], [ 114.95488268, 31.37778422 ], [ 114.95438558, 31.37640628 ], [ 114.95424402, 31.3747161 ], [ 114.95398379, 31.37418961 ], [ 114.95322697, 31.37297426 ], [ 114.95289873, 31.37201775 ], [ 114.95284063, 31.37166526 ], [ 114.95285736, 31.3710897 ], [ 114.95311196, 31.37011598 ], [ 114.95333752, 31.36980478 ], [ 114.95379395, 31.36938368 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124L00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800123L00000", "TRVCD": "AFA9800125L00000", "INDCD": "QFA9800123L00000", "ONDCD": "QFA9800124L00000", "BWSCD": "WFA9800124L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 3420.0, "RVSLP": 0.0023, "IELV": 67.62, "OELV": 60.76, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10148786, 31.27079788 ], [ 115.10032817, 31.26988932 ], [ 115.09906311, 31.26928835 ], [ 115.09804893, 31.26848106 ], [ 115.09747152, 31.26783249 ], [ 115.09695005, 31.26738752 ], [ 115.09538604, 31.26639643 ], [ 115.09490764, 31.2662791 ], [ 115.09318161, 31.26627176 ], [ 115.09238951, 31.26606346 ], [ 115.09187175, 31.26580551 ], [ 115.09124712, 31.26561349 ], [ 115.09097773, 31.26543036 ], [ 115.08982021, 31.26405397 ], [ 115.08933561, 31.26315364 ], [ 115.08907113, 31.26286434 ], [ 115.0880561, 31.26231589 ], [ 115.08708576, 31.26210371 ], [ 115.08652031, 31.2616233 ], [ 115.08614953, 31.26059758 ], [ 115.08599566, 31.25983254 ], [ 115.08513192, 31.25782682 ], [ 115.08453192, 31.2568689 ], [ 115.08402082, 31.25643699 ], [ 115.0836373, 31.25629471 ], [ 115.08261192, 31.25625751 ], [ 115.08181294, 31.25607044 ], [ 115.08093984, 31.25584642 ], [ 115.07940325, 31.25530991 ], [ 115.07893786, 31.2554043 ], [ 115.07750793, 31.25618762 ], [ 115.07648455, 31.25627799 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800125Q00000", "TRVCD": "AFA9800127Q00000", "INDCD": "QFA9800125Q00000", "ONDCD": "QFA9800126Q00000", "BWSCD": "WFA9800126Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 7832.0, "RVSLP": 0.0014, "IELV": 60.23, "OELV": 47.89, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05318247, 31.02830409 ], [ 115.05206544, 31.02837025 ], [ 115.0515264, 31.02854219 ], [ 115.05069342, 31.02865783 ], [ 115.04817202, 31.02933381 ], [ 115.0460471, 31.0297176 ], [ 115.04442371, 31.03023743 ], [ 115.04398599, 31.03044164 ], [ 115.04311579, 31.03107198 ], [ 115.0420998, 31.03157152 ], [ 115.04103587, 31.0319636 ], [ 115.04008635, 31.03241377 ], [ 115.03798396, 31.03365353 ], [ 115.03569704, 31.03527869 ], [ 115.03261569, 31.0381176 ], [ 115.03153605, 31.03887321 ], [ 115.03042067, 31.03955221 ], [ 115.02964625, 31.04019954 ], [ 115.02850192, 31.04100844 ], [ 115.02668551, 31.04189746 ], [ 115.0261403, 31.04225494 ], [ 115.0253443, 31.04265876 ], [ 115.02306198, 31.0440916 ], [ 115.02183647, 31.04511615 ], [ 115.02081431, 31.04560015 ], [ 115.02004244, 31.04584749 ], [ 115.01622105, 31.04677802 ], [ 115.01505959, 31.04734354 ], [ 115.01336214, 31.04890412 ], [ 115.01255249, 31.0498885 ], [ 115.01030646, 31.05199974 ], [ 115.00949667, 31.05298386 ], [ 115.00494036, 31.05726396 ], [ 115.00452987, 31.05782259 ], [ 115.00389227, 31.05848774 ], [ 115.00304791, 31.05954197 ], [ 115.00118833, 31.06254996 ], [ 115.00055211, 31.06343659 ], [ 114.99949915, 31.06442769 ], [ 114.9988784, 31.06482674 ], [ 114.99810439, 31.06547235 ], [ 114.99754846, 31.06581939 ], [ 114.99641496, 31.06685604 ], [ 114.99461798, 31.06905436 ], [ 114.99425113, 31.06958236 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800129000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800128000000,AFA9800122E00000", "TRVCD": "AFA980012A000000", "INDCD": "QFA9800128000000", "ONDCD": "QFA9800129000000", "BWSCD": "WFA9800129000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 402.0, "RVSLP": -0.0001, "IELV": 88.05, "OELV": 88.06, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0878284, 31.43392025 ], [ 115.08776991, 31.433566 ], [ 115.08748585, 31.43304985 ], [ 115.08715816, 31.4325623 ], [ 115.08674819, 31.43213205 ], [ 115.08646996, 31.43168731 ], [ 115.08638173, 31.43081297 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501FA000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98502F0000000", "INDCD": "-1", "ONDCD": "QFA98501F0000000", "BWSCD": "WFA98501FA000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3438.0, "RVSLP": 0.002, "IELV": 51.72, "OELV": 43.47, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97871427, 30.97727268 ], [ 114.97830602, 30.976984 ], [ 114.97800663, 30.97688072 ], [ 114.97688419, 30.9768643 ], [ 114.97616611, 30.97671203 ], [ 114.97548139, 30.9767019 ], [ 114.97445547, 30.97677976 ], [ 114.97367073, 30.97714048 ], [ 114.97297424, 30.97704038 ], [ 114.97238844, 30.97707407 ], [ 114.97166807, 30.97745144 ], [ 114.97098995, 30.97765139 ], [ 114.97077839, 30.97764065 ], [ 114.97033845, 30.97748366 ], [ 114.9699583, 30.9771759 ], [ 114.96962195, 30.97659225 ], [ 114.96957621, 30.9760966 ], [ 114.96970573, 30.97541071 ], [ 114.9693915, 30.97463161 ], [ 114.96835575, 30.97374019 ], [ 114.96723007, 30.97295448 ], [ 114.9671942, 30.97272971 ], [ 114.96746302, 30.97222049 ], [ 114.96742774, 30.97200857 ], [ 114.96714431, 30.97188601 ], [ 114.96637165, 30.97201368 ], [ 114.96539604, 30.97185123 ], [ 114.96512603, 30.97172993 ], [ 114.96499177, 30.97144209 ], [ 114.96511035, 30.9708947 ], [ 114.96508365, 30.97056624 ], [ 114.96420244, 30.96895161 ], [ 114.96320252, 30.9680445 ], [ 114.96277444, 30.9673855 ], [ 114.9618081, 30.96687982 ], [ 114.96121823, 30.9659143 ], [ 114.96103004, 30.96578624 ], [ 114.96042231, 30.96558177 ], [ 114.95978359, 30.96518617 ], [ 114.95918179, 30.96498035 ], [ 114.95862975, 30.96451438 ], [ 114.95817154, 30.96437565 ], [ 114.95758594, 30.96408916 ], [ 114.95711223, 30.96409479 ], [ 114.95632554, 30.96451845 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121CA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122C00000", "INDCD": "-1", "ONDCD": "QFA9900121C00000", "BWSCD": "WFA9900121CA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3882.0, "RVSLP": 0.0164, "IELV": 255.76, "OELV": 143.96, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43336632, 31.22338621 ], [ 115.43323932, 31.22360809 ], [ 115.43312765, 31.22436622 ], [ 115.43304396, 31.22455391 ], [ 115.43287975, 31.22470636 ], [ 115.43237432, 31.22494411 ], [ 115.43108668, 31.22522013 ], [ 115.43077225, 31.22515834 ], [ 115.43025358, 31.22490597 ], [ 115.42985875, 31.22489616 ], [ 115.42957387, 31.22503659 ], [ 115.42879014, 31.22567524 ], [ 115.42794623, 31.22597769 ], [ 115.42595649, 31.22611578 ], [ 115.42541612, 31.22620603 ], [ 115.42521745, 31.22616957 ], [ 115.42503475, 31.22604231 ], [ 115.42465972, 31.22544693 ], [ 115.42440467, 31.22529014 ], [ 115.42321129, 31.22525202 ], [ 115.42248068, 31.22510554 ], [ 115.42137383, 31.22505068 ], [ 115.42057969, 31.22483886 ], [ 115.41971983, 31.22430988 ], [ 115.41901905, 31.22407432 ], [ 115.41763618, 31.22411427 ], [ 115.41692587, 31.22431367 ], [ 115.41554775, 31.22440818 ], [ 115.41467043, 31.22462819 ], [ 115.41171779, 31.22477234 ], [ 115.41136039, 31.22497012 ], [ 115.41080977, 31.22549285 ], [ 115.40989547, 31.22690035 ], [ 115.4096877, 31.22737242 ], [ 115.40963678, 31.22823437 ], [ 115.40939589, 31.2292812 ], [ 115.40914569, 31.22982116 ], [ 115.40878151, 31.23039776 ], [ 115.40834791, 31.23078577 ], [ 115.40765434, 31.23123307 ], [ 115.40599989, 31.23270961 ], [ 115.40337183, 31.23378379 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122E00000", "RVNM": "观音寺河", "GB": "210101", "FRVCD": "AFA9900121EA0000,AFA9900121E00000", "TRVCD": "AFA9900127000000", "INDCD": "QFA9900121E00000", "ONDCD": "QFA9900126000000", "BWSCD": "WFA9900122E00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4616.0, "RVSLP": 0.0068, "IELV": 159.07, "OELV": 120.01, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33976239, 31.21112418 ], [ 115.33948819, 31.21029394 ], [ 115.33944226, 31.20993206 ], [ 115.33944425, 31.2093456 ], [ 115.33960453, 31.20877807 ], [ 115.339635, 31.20827253 ], [ 115.33957392, 31.20753817 ], [ 115.33929255, 31.20662449 ], [ 115.33927262, 31.20603309 ], [ 115.33936221, 31.20568627 ], [ 115.33962215, 31.20537041 ], [ 115.33995382, 31.20512156 ], [ 115.34026678, 31.20502746 ], [ 115.34060159, 31.20502288 ], [ 115.34137791, 31.20529969 ], [ 115.3422881, 31.20594445 ], [ 115.34250014, 31.20600551 ], [ 115.34269366, 31.20595431 ], [ 115.34286683, 31.20567767 ], [ 115.34293842, 31.20474169 ], [ 115.34320187, 31.20420542 ], [ 115.34348733, 31.20392153 ], [ 115.34417562, 31.20347006 ], [ 115.34511399, 31.20259848 ], [ 115.34554038, 31.20195849 ], [ 115.3457822, 31.20142015 ], [ 115.34576763, 31.20102925 ], [ 115.34543071, 31.20030249 ], [ 115.34482463, 31.19957977 ], [ 115.34395038, 31.19878362 ], [ 115.34346422, 31.19803245 ], [ 115.34336973, 31.1977676 ], [ 115.34342481, 31.19744072 ], [ 115.34380195, 31.19700838 ], [ 115.34426404, 31.19663618 ], [ 115.34554049, 31.19586763 ], [ 115.34584662, 31.19558628 ], [ 115.34601516, 31.19532777 ], [ 115.34599778, 31.19494993 ], [ 115.3455845, 31.19437447 ], [ 115.34500629, 31.19309959 ], [ 115.34498014, 31.19284724 ], [ 115.34504641, 31.19267108 ], [ 115.34527951, 31.19250599 ], [ 115.34619153, 31.19234982 ], [ 115.34650976, 31.19211774 ], [ 115.34666298, 31.19186121 ], [ 115.34676804, 31.1913117 ], [ 115.34703221, 31.19054976 ], [ 115.34750966, 31.18984164 ], [ 115.34779008, 31.18960041 ], [ 115.34791445, 31.18956551 ], [ 115.34811384, 31.18962003 ], [ 115.34927129, 31.19050439 ], [ 115.34960025, 31.19058611 ], [ 115.3499377, 31.19031635 ], [ 115.35037598, 31.18931637 ], [ 115.35077601, 31.1889317 ], [ 115.35129069, 31.18869401 ], [ 115.35248883, 31.18839978 ], [ 115.35290378, 31.18839019 ], [ 115.35371188, 31.18855013 ], [ 115.35445448, 31.18845415 ], [ 115.35496605, 31.18820592 ], [ 115.35535802, 31.18788968 ], [ 115.35571623, 31.18753188 ], [ 115.35640662, 31.18666103 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900124K00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900123K00000", "TRVCD": "AFA9900125K00000", "INDCD": "QFA9900123K00000", "ONDCD": "QFA9900124K00000", "BWSCD": "WFA9900124K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 3245.0, "RVSLP": 0.0064, "IELV": 105.25, "OELV": 89.38, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30065949, 31.04937244 ], [ 115.30256438, 31.04931199 ], [ 115.30370013, 31.04947341 ], [ 115.30517028, 31.04903934 ], [ 115.30609939, 31.04909996 ], [ 115.30674185, 31.04879994 ], [ 115.30789654, 31.04781427 ], [ 115.31027744, 31.04681323 ], [ 115.31146448, 31.04654018 ], [ 115.31288598, 31.04687432 ], [ 115.31321582, 31.0468876 ], [ 115.31353442, 31.04682135 ], [ 115.31400184, 31.04648323 ], [ 115.31643655, 31.04419211 ], [ 115.3173184, 31.04358368 ], [ 115.31813757, 31.04283578 ], [ 115.31848029, 31.04238602 ], [ 115.31857777, 31.04168592 ], [ 115.31868783, 31.04141412 ], [ 115.31915354, 31.04095009 ], [ 115.31973221, 31.04065929 ], [ 115.32012579, 31.04059973 ], [ 115.32067244, 31.04071405 ], [ 115.32099405, 31.04070624 ], [ 115.32153247, 31.0405482 ], [ 115.32280396, 31.04042667 ], [ 115.32436781, 31.03996997 ], [ 115.32808568, 31.039831 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PG0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PG0000", "INDCD": "-1", "ONDCD": "QFA9800121PG0000", "BWSCD": "WFA9800121PG0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5647.0, "RVSLP": 0.0109, "IELV": 219.04, "OELV": 144.47, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22574027, 31.21805273 ], [ 115.22535968, 31.21836783 ], [ 115.22488622, 31.21852613 ], [ 115.22009443, 31.21868782 ], [ 115.21958565, 31.21866138 ], [ 115.21894426, 31.21851971 ], [ 115.2167796, 31.21854232 ], [ 115.21552397, 31.2181759 ], [ 115.21493184, 31.21820634 ], [ 115.2143881, 31.2183816 ], [ 115.21379826, 31.21843285 ], [ 115.21346732, 31.21839193 ], [ 115.2123658, 31.21804665 ], [ 115.21139232, 31.2179676 ], [ 115.2112736, 31.21799403 ], [ 115.21114625, 31.2181258 ], [ 115.21111394, 31.21850204 ], [ 115.2113537, 31.21920202 ], [ 115.21136952, 31.21970188 ], [ 115.2110013, 31.22059449 ], [ 115.210879, 31.22142981 ], [ 115.21053032, 31.22218424 ], [ 115.21033174, 31.22285347 ], [ 115.21051238, 31.22358817 ], [ 115.21049506, 31.22407797 ], [ 115.20963789, 31.22537042 ], [ 115.20877606, 31.22749251 ], [ 115.20876383, 31.22768082 ], [ 115.20907464, 31.22852631 ], [ 115.20907297, 31.22870605 ], [ 115.20874222, 31.2292912 ], [ 115.20828895, 31.23059386 ], [ 115.20820658, 31.23159162 ], [ 115.20783633, 31.23299763 ], [ 115.20784524, 31.23349062 ], [ 115.20795966, 31.23395231 ], [ 115.20786482, 31.23506903 ], [ 115.20750965, 31.23636243 ], [ 115.20772559, 31.23680083 ], [ 115.20813155, 31.23729382 ], [ 115.2082382, 31.23756029 ], [ 115.20836376, 31.23987051 ], [ 115.20826934, 31.24028479 ], [ 115.20747186, 31.24144149 ], [ 115.20735995, 31.2422055 ], [ 115.20721562, 31.24270403 ], [ 115.2074005, 31.24778835 ], [ 115.20722497, 31.24857001 ], [ 115.20717998, 31.24965468 ], [ 115.20680272, 31.25105812 ], [ 115.20681126, 31.25201836 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PI0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012BP00000", "INDCD": "-1", "ONDCD": "QFA980012AP00000", "BWSCD": "WFA9800121PI0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7340.0, "RVSLP": 0.0065, "IELV": 116.95, "OELV": 64.96, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15766681, 31.17983623 ], [ 115.15706517, 31.18041584 ], [ 115.15693397, 31.18076981 ], [ 115.15697974, 31.18180071 ], [ 115.15726066, 31.1827103 ], [ 115.15723486, 31.18342311 ], [ 115.15676975, 31.18479213 ], [ 115.15654561, 31.18525889 ], [ 115.15580886, 31.18664159 ], [ 115.1554768, 31.18697396 ], [ 115.15511804, 31.1870538 ], [ 115.15419025, 31.18674792 ], [ 115.15313965, 31.18657999 ], [ 115.15203175, 31.18691353 ], [ 115.15129037, 31.18661975 ], [ 115.14992154, 31.18656244 ], [ 115.1479159, 31.18603831 ], [ 115.14759815, 31.18602975 ], [ 115.14734568, 31.18614998 ], [ 115.14726294, 31.18631234 ], [ 115.14728649, 31.18649229 ], [ 115.14754444, 31.18708087 ], [ 115.14796556, 31.18766932 ], [ 115.14825968, 31.18904692 ], [ 115.14806307, 31.18928757 ], [ 115.14719769, 31.18953615 ], [ 115.14687066, 31.18979429 ], [ 115.14667435, 31.19004335 ], [ 115.14661711, 31.19037 ], [ 115.14675617, 31.19089951 ], [ 115.14665838, 31.19138788 ], [ 115.14662024, 31.19212028 ], [ 115.14652759, 31.19236984 ], [ 115.14636756, 31.19249418 ], [ 115.14608898, 31.19248557 ], [ 115.14571807, 31.1921938 ], [ 115.14537227, 31.19144791 ], [ 115.14520645, 31.19083385 ], [ 115.1449424, 31.19037843 ], [ 115.14452039, 31.18997225 ], [ 115.14407528, 31.18974429 ], [ 115.1432965, 31.18971446 ], [ 115.1426378, 31.18982501 ], [ 115.14240915, 31.19002352 ], [ 115.14194951, 31.19078643 ], [ 115.14161303, 31.19100133 ], [ 115.14145994, 31.19092449 ], [ 115.14137363, 31.19076044 ], [ 115.14124927, 31.18973563 ], [ 115.14105676, 31.18941215 ], [ 115.14063581, 31.18916824 ], [ 115.13985498, 31.18914393 ], [ 115.13945843, 31.18923669 ], [ 115.13925524, 31.18944348 ], [ 115.13919625, 31.18970786 ], [ 115.13919387, 31.19082509 ], [ 115.13911751, 31.19100793 ], [ 115.1389581, 31.19113362 ], [ 115.13874584, 31.19115601 ], [ 115.1382882, 31.19101112 ], [ 115.13707721, 31.19045209 ], [ 115.13686755, 31.19046498 ], [ 115.13675557, 31.19053593 ], [ 115.13664772, 31.19075763 ], [ 115.1366779, 31.1910104 ], [ 115.13767056, 31.1928671 ], [ 115.13787028, 31.19414792 ], [ 115.13819416, 31.19488748 ], [ 115.13912161, 31.19636448 ], [ 115.13918559, 31.19662361 ], [ 115.13911641, 31.19686426 ], [ 115.13888453, 31.19703977 ], [ 115.13809443, 31.19728591 ], [ 115.13733594, 31.19737972 ], [ 115.13710819, 31.19749766 ], [ 115.13710984, 31.19769091 ], [ 115.1374993, 31.19812798 ], [ 115.13753599, 31.19829811 ], [ 115.13703651, 31.19897003 ], [ 115.13662474, 31.19967979 ], [ 115.13633801, 31.19995041 ], [ 115.1361304, 31.20002692 ], [ 115.13590828, 31.19999841 ], [ 115.13465038, 31.19911209 ], [ 115.13323838, 31.19865082 ], [ 115.13292417, 31.19864101 ], [ 115.13271805, 31.19872165 ], [ 115.13257224, 31.19887945 ], [ 115.13220092, 31.19972612 ], [ 115.13157044, 31.2007058 ], [ 115.13118368, 31.20163456 ], [ 115.13097049, 31.20186846 ], [ 115.13069162, 31.20202172 ], [ 115.13018597, 31.20208768 ], [ 115.12922405, 31.20209067 ], [ 115.12786396, 31.20174966 ], [ 115.12736174, 31.20171193 ], [ 115.12694197, 31.2017596 ], [ 115.12578194, 31.20215222 ], [ 115.12546243, 31.20218843 ], [ 115.12515399, 31.20210639 ], [ 115.12420392, 31.20158024 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TH0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012AT00000", "INDCD": "-1", "ONDCD": "QFA9800129T00000", "BWSCD": "WFA9800121TH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3748.0, "RVSLP": 0.0001, "IELV": 33.5, "OELV": 29.89, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.73863412, 31.02726757 ], [ 114.73877614, 31.02697976 ], [ 114.73947763, 31.02621356 ], [ 114.7398882, 31.02565458 ], [ 114.74057758, 31.02501799 ], [ 114.74124422, 31.02455788 ], [ 114.74147211, 31.02420654 ], [ 114.74155793, 31.02394565 ], [ 114.74145754, 31.02343304 ], [ 114.74154219, 31.02289794 ], [ 114.74140514, 31.02224362 ], [ 114.74156434, 31.02125556 ], [ 114.7417296, 31.02091962 ], [ 114.74221205, 31.02044671 ], [ 114.7425578, 31.02023333 ], [ 114.7428748, 31.02019182 ], [ 114.74349034, 31.02027856 ], [ 114.74383737, 31.02011376 ], [ 114.74483797, 31.01918831 ], [ 114.74525499, 31.01862886 ], [ 114.74598042, 31.0178359 ], [ 114.74603625, 31.01751229 ], [ 114.74582019, 31.01682262 ], [ 114.74584456, 31.01626143 ], [ 114.74607168, 31.01579557 ], [ 114.74720549, 31.01413372 ], [ 114.7476797, 31.0132112 ], [ 114.74793421, 31.01216763 ], [ 114.74794611, 31.01106458 ], [ 114.74811757, 31.0103557 ], [ 114.7481703, 31.00926917 ], [ 114.74852572, 31.00844606 ], [ 114.7486636, 31.00783922 ], [ 114.74912796, 31.00713607 ], [ 114.74957766, 31.00664611 ], [ 114.75116628, 31.00521193 ], [ 114.75197985, 31.00484925 ], [ 114.75308553, 31.00394231 ], [ 114.75414367, 31.00352777 ], [ 114.75497956, 31.00301261 ], [ 114.75573555, 31.00227067 ], [ 114.75620042, 31.00216605 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122JA0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121JA0000", "TRVCD": "AFA9800122J00000", "INDCD": "QFA9800121JA0000", "ONDCD": "QFA9800121J00000", "BWSCD": "WFA9800122JA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2321.0, "RVSLP": 0.0092, "IELV": 149.73, "OELV": 127.06, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94464172, 31.46364803 ], [ 114.94481913, 31.46335763 ], [ 114.94503119, 31.46271572 ], [ 114.94484102, 31.46197793 ], [ 114.94486149, 31.46148688 ], [ 114.94500894, 31.46121976 ], [ 114.94536375, 31.46085477 ], [ 114.94600323, 31.46027664 ], [ 114.94634963, 31.46005366 ], [ 114.94778962, 31.45989565 ], [ 114.94916183, 31.45937834 ], [ 114.94975843, 31.45892366 ], [ 114.95010963, 31.45847518 ], [ 114.95021353, 31.45770633 ], [ 114.95043935, 31.45701767 ], [ 114.95109627, 31.45597569 ], [ 114.95128705, 31.45557823 ], [ 114.95134561, 31.45530566 ], [ 114.951274, 31.45490608 ], [ 114.95086934, 31.45440134 ], [ 114.95057559, 31.45388791 ], [ 114.95043858, 31.45303546 ], [ 114.95021612, 31.45240805 ], [ 114.95019566, 31.45168794 ], [ 114.95045332, 31.45086463 ], [ 114.95093834, 31.44994602 ], [ 114.95181088, 31.44895574 ], [ 114.95187995, 31.44854202 ], [ 114.95182147, 31.44741139 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122L00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121L00000", "TRVCD": "AFA9800123L00000", "INDCD": "QFA9800121L00000", "ONDCD": "QFA9800122L00000", "BWSCD": "WFA9800122L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10473642, 31.30936402 ], [ 115.10471201, 31.30878032 ] ], [ [ 115.10473642, 31.30936402 ], [ 115.10437843, 31.30930044 ], [ 115.1038011, 31.309342 ], [ 115.10286945, 31.30955751 ], [ 115.10243236, 31.30973361 ], [ 115.10203128, 31.31020242 ], [ 115.10163605, 31.31125175 ], [ 115.1016347, 31.31137959 ], [ 115.10169987, 31.31143807 ], [ 115.10200691, 31.31140018 ], [ 115.10272422, 31.31076818 ], [ 115.10293998, 31.31073389 ], [ 115.10308659, 31.31089604 ], [ 115.10327993, 31.3112986 ], [ 115.10358366, 31.31164012 ], [ 115.10396629, 31.31192843 ], [ 115.10466868, 31.3123079 ], [ 115.10492991, 31.31254032 ], [ 115.10512849, 31.31286752 ], [ 115.10520353, 31.31317017 ], [ 115.10545368, 31.31340246 ], [ 115.10554376, 31.31367648 ], [ 115.10543971, 31.31398445 ], [ 115.10489491, 31.31430847 ], [ 115.10495822, 31.31475182 ], [ 115.10477228, 31.31524155 ], [ 115.10419979, 31.31562116 ], [ 115.10424634, 31.31572386 ], [ 115.10454972, 31.3159224 ], [ 115.10459406, 31.31606872 ], [ 115.10453584, 31.31619362 ], [ 115.10401515, 31.31650754 ], [ 115.10315025, 31.31675565 ], [ 115.10310353, 31.31688428 ], [ 115.1032126, 31.31727003 ], [ 115.10300054, 31.31760503 ], [ 115.10209928, 31.31855364 ], [ 115.1019076, 31.31863384 ], [ 115.10143339, 31.31868623 ], [ 115.1013535, 31.31876409 ], [ 115.10146073, 31.3188941 ], [ 115.10190393, 31.31915238 ], [ 115.10205051, 31.31942759 ], [ 115.10171404, 31.32096813 ], [ 115.10169089, 31.32173205 ], [ 115.10175377, 31.32212358 ], [ 115.10218216, 31.32312441 ], [ 115.10250625, 31.32432614 ], [ 115.1024962, 31.32465973 ], [ 115.1022952, 31.32558966 ], [ 115.10226107, 31.32720061 ], [ 115.1023663, 31.32695176 ], [ 115.1025217, 31.32575583 ], [ 115.10271844, 31.32500804 ], [ 115.10299845, 31.32434995 ], [ 115.10340021, 31.32385022 ], [ 115.10318771, 31.32277559 ], [ 115.10322619, 31.32235367 ], [ 115.10333788, 31.32209985 ], [ 115.10372629, 31.32164153 ], [ 115.10446978, 31.32145447 ], [ 115.10480047, 31.32149979 ], [ 115.10539208, 31.32183104 ], [ 115.10563991, 31.32190222 ] ], [ [ 115.10563991, 31.32190222 ], [ 115.1056481, 31.32160761 ], [ 115.10543125, 31.32112634 ], [ 115.10523993, 31.32096432 ], [ 115.10456802, 31.32062831 ], [ 115.10414571, 31.32020931 ], [ 115.10401934, 31.3199138 ], [ 115.10403191, 31.31955171 ], [ 115.10446337, 31.31884297 ], [ 115.10492563, 31.31848397 ], [ 115.10572158, 31.31857449 ], [ 115.10621477, 31.31903866 ], [ 115.10638615, 31.31892793 ], [ 115.10644749, 31.31840524 ], [ 115.10611247, 31.31758633 ], [ 115.10611619, 31.31683095 ], [ 115.10666467, 31.31569333 ], [ 115.10713183, 31.3151618 ], [ 115.10751967, 31.31493604 ], [ 115.10801986, 31.31502624 ], [ 115.10809531, 31.31498426 ], [ 115.10798765, 31.31439015 ], [ 115.10826564, 31.31357761 ], [ 115.10829639, 31.31319576 ], [ 115.10817002, 31.31264845 ], [ 115.10827549, 31.3124159 ], [ 115.10859975, 31.31227367 ], [ 115.10901812, 31.31239353 ], [ 115.10937357, 31.31270625 ], [ 115.10963066, 31.31313831 ], [ 115.10976195, 31.31317768 ], [ 115.11008477, 31.31312617 ], [ 115.11036571, 31.31324297 ], [ 115.11165655, 31.3141718 ], [ 115.1121356, 31.3147403 ], [ 115.11231765, 31.31486598 ], [ 115.11265916, 31.31483609 ], [ 115.11369863, 31.31448311 ], [ 115.11384146, 31.31433407 ], [ 115.11326735, 31.31364103 ], [ 115.11250559, 31.31310989 ], [ 115.11131427, 31.31206086 ], [ 115.11060803, 31.31164435 ], [ 115.10963994, 31.31078222 ], [ 115.10913249, 31.31057203 ], [ 115.10797636, 31.31044856 ], [ 115.10790381, 31.31035986 ], [ 115.10800347, 31.31005591 ], [ 115.10790833, 31.30993558 ], [ 115.1070714, 31.31005586 ], [ 115.10685055, 31.31004022 ], [ 115.1064672, 31.3098975 ], [ 115.10614423, 31.3099643 ], [ 115.10574826, 31.30970391 ], [ 115.10506728, 31.30951841 ], [ 115.10473642, 31.30936402 ] ], [ [ 115.10581265, 31.32203988 ], [ 115.10563991, 31.32190222 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124P00000", "RVNM": "张广河", "GB": "210501", "FRVCD": "AFA9800121PB0000,AFA9800122PC0000,AFA9800123P00000", "TRVCD": "AFA9800125P00000", "INDCD": "QFA9800121PB0000,QFA9800122PC0000,QFA9800123P00000", "ONDCD": "QFA9800124P00000", "BWSCD": "WFA9800124P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24875828, 31.33481878 ], [ 115.2487344, 31.33467522 ], [ 115.24848953, 31.33445982 ], [ 115.24846966, 31.33423988 ] ], [ [ 115.24875828, 31.33481878 ], [ 115.24848383, 31.3349601 ], [ 115.24804441, 31.33532975 ], [ 115.24752556, 31.33586209 ], [ 115.24727838, 31.33620774 ], [ 115.24726123, 31.33647316 ], [ 115.24753848, 31.33692186 ], [ 115.24762781, 31.33720479 ], [ 115.24764639, 31.33749915 ], [ 115.24756806, 31.33771613 ], [ 115.24707817, 31.33802604 ], [ 115.24644663, 31.33828805 ], [ 115.24577011, 31.33879356 ], [ 115.24525616, 31.33898811 ], [ 115.24436189, 31.33920389 ], [ 115.24349863, 31.33966948 ], [ 115.24337247, 31.33958203 ], [ 115.24343452, 31.33893222 ], [ 115.24331634, 31.33872807 ], [ 115.24317957, 31.33876352 ], [ 115.24275395, 31.33930642 ], [ 115.24200998, 31.33963405 ], [ 115.24183618, 31.33956844 ], [ 115.24143987, 31.33909712 ], [ 115.24122226, 31.33901023 ], [ 115.24034551, 31.33912163 ], [ 115.24015772, 31.33927655 ], [ 115.23994633, 31.34022651 ], [ 115.23999173, 31.34048356 ], [ 115.24024592, 31.34053621 ], [ 115.24092382, 31.34030613 ], [ 115.241088, 31.34033179 ], [ 115.24119226, 31.34045719 ], [ 115.24114964, 31.34068528 ], [ 115.24126147, 31.34094794 ], [ 115.24123437, 31.34103851 ], [ 115.24057952, 31.34142097 ], [ 115.24082499, 31.34215787 ], [ 115.24168744, 31.34260315 ], [ 115.24188879, 31.34256848 ], [ 115.24241155, 31.34225867 ], [ 115.24262879, 31.34222044 ], [ 115.24305364, 31.34230446 ], [ 115.2433256, 31.34249539 ], [ 115.24329738, 31.34272155 ], [ 115.24248427, 31.34365095 ], [ 115.24306817, 31.34401191 ], [ 115.24318627, 31.34429135 ], [ 115.24312367, 31.34440005 ], [ 115.24275953, 31.34449636 ], [ 115.24254198, 31.34464996 ], [ 115.2420641, 31.34533638 ], [ 115.24192399, 31.34564222 ], [ 115.24177426, 31.34574591 ], [ 115.24162564, 31.34573166 ], [ 115.24136399, 31.34556967 ], [ 115.24079232, 31.34488487 ], [ 115.24061845, 31.34484311 ], [ 115.24053786, 31.34507898 ], [ 115.24066922, 31.34568192 ], [ 115.24063764, 31.34591981 ], [ 115.24047176, 31.34601493 ], [ 115.23991433, 31.34597786 ], [ 115.23978012, 31.34651754 ], [ 115.23949153, 31.34691618 ], [ 115.23955368, 31.34706304 ], [ 115.23971211, 31.34713175 ], [ 115.24065547, 31.34714027 ], [ 115.24040847, 31.34763822 ], [ 115.24033845, 31.34806803 ], [ 115.24022607, 31.34810209 ], [ 115.23970449, 31.34799425 ], [ 115.23877981, 31.34793218 ], [ 115.23869154, 31.34799842 ], [ 115.23874988, 31.34813393 ], [ 115.2394395, 31.34868126 ], [ 115.23949351, 31.34887185 ], [ 115.23822103, 31.34872998 ], [ 115.23788383, 31.34877967 ], [ 115.23773967, 31.34889949 ], [ 115.23785792, 31.34909241 ], [ 115.23865816, 31.34958034 ], [ 115.23967808, 31.34993229 ], [ 115.23983203, 31.35035837 ], [ 115.23993791, 31.35048652 ], [ 115.24046093, 31.35061664 ], [ 115.23972954, 31.35096396 ], [ 115.23949807, 31.35099809 ], [ 115.23933597, 31.35089236 ], [ 115.23890234, 31.35038831 ], [ 115.23869891, 31.35029187 ], [ 115.23849685, 31.35028977 ], [ 115.23836211, 31.35041594 ], [ 115.23849245, 31.35078578 ], [ 115.23846385, 31.35097984 ], [ 115.23800932, 31.35141367 ], [ 115.23785124, 31.35138185 ], [ 115.23750825, 31.35102323 ], [ 115.23731186, 31.35098603 ], [ 115.23695155, 31.35134609 ], [ 115.2362512, 31.35141156 ], [ 115.23586274, 31.35187208 ], [ 115.23586786, 31.35207087 ], [ 115.23600006, 31.3522023 ], [ 115.23687048, 31.35248505 ], [ 115.2370239, 31.35260958 ], [ 115.23692222, 31.35300094 ], [ 115.23648199, 31.35339214 ], [ 115.23648177, 31.35397765 ], [ 115.23656422, 31.35410368 ], [ 115.23708273, 31.35430553 ], [ 115.23747123, 31.35474222 ], [ 115.23748616, 31.35488421 ], [ 115.23701069, 31.35494155 ], [ 115.23685213, 31.35513573 ], [ 115.2373463, 31.35556436 ], [ 115.23765198, 31.35618579 ], [ 115.23763367, 31.35633223 ], [ 115.2369696, 31.35650627 ], [ 115.23657832, 31.35653435 ], [ 115.23486582, 31.35630793 ], [ 115.23421254, 31.35584345 ], [ 115.23370375, 31.35526068 ], [ 115.23343452, 31.35511405 ], [ 115.23306446, 31.35503174 ], [ 115.23301105, 31.35509211 ], [ 115.23304764, 31.35521867 ], [ 115.23382361, 31.35656987 ], [ 115.23384096, 31.35672566 ], [ 115.23374383, 31.35687341 ], [ 115.23346232, 31.35698844 ], [ 115.23164068, 31.35739437 ], [ 115.23062824, 31.35775396 ], [ 115.23001191, 31.35778436 ], [ 115.22962101, 31.35765464 ], [ 115.22936606, 31.35745313 ], [ 115.22915197, 31.35707269 ], [ 115.22882059, 31.35617393 ], [ 115.22790216, 31.35508912 ], [ 115.22764902, 31.35488046 ], [ 115.22722405, 31.35466094 ], [ 115.22695585, 31.35458561 ], [ 115.22679228, 31.35460652 ], [ 115.2264139, 31.35494629 ], [ 115.22628851, 31.35531018 ], [ 115.22635751, 31.35533601 ], [ 115.22668684, 31.35508865 ], [ 115.22690971, 31.3550063 ], [ 115.22721943, 31.355013 ], [ 115.22743384, 31.35513372 ], [ 115.22793044, 31.35576992 ], [ 115.22812969, 31.35660881 ], [ 115.22854637, 31.35730609 ], [ 115.2285683, 31.35750795 ], [ 115.22850619, 31.3575903 ], [ 115.22832608, 31.35762463 ], [ 115.22682841, 31.35759793 ], [ 115.22659001, 31.35766883 ], [ 115.22639154, 31.35784241 ], [ 115.226184, 31.3582543 ], [ 115.2258931, 31.35952571 ], [ 115.2255256, 31.3598432 ], [ 115.22557185, 31.36009373 ], [ 115.22530841, 31.36089519 ], [ 115.22537009, 31.36132221 ], [ 115.2255199, 31.36157771 ], [ 115.22584236, 31.36189015 ], [ 115.22646806, 31.36214027 ], [ 115.22691412, 31.36214366 ], [ 115.22792168, 31.3617776 ], [ 115.22817016, 31.36179151 ], [ 115.22990234, 31.36303227 ], [ 115.23020219, 31.36336226 ], [ 115.23024865, 31.36348529 ], [ 115.23021442, 31.36363208 ], [ 115.22994013, 31.36378619 ], [ 115.22922701, 31.36388372 ], [ 115.22822067, 31.36414424 ], [ 115.22787212, 31.36402676 ], [ 115.22720767, 31.36350049 ], [ 115.2269715, 31.36345892 ], [ 115.22679985, 31.36361176 ], [ 115.22669044, 31.36412399 ], [ 115.2265477, 31.36441822 ], [ 115.22635641, 31.36460237 ], [ 115.2260489, 31.36476968 ], [ 115.22422853, 31.36548234 ], [ 115.22299417, 31.3655404 ], [ 115.22180935, 31.36578217 ], [ 115.22155787, 31.3656565 ], [ 115.22143837, 31.36540305 ], [ 115.22139157, 31.36414788 ], [ 115.22123592, 31.36362167 ], [ 115.22086638, 31.36328673 ], [ 115.22059166, 31.36324948 ], [ 115.22048086, 31.36334215 ] ], [ [ 115.27787194, 31.34658383 ], [ 115.27726043, 31.34625682 ], [ 115.27681541, 31.34589654 ], [ 115.27624791, 31.34505216 ], [ 115.27554796, 31.34437967 ], [ 115.27527201, 31.34385687 ], [ 115.27517829, 31.34328064 ], [ 115.27544011, 31.34127862 ], [ 115.27537638, 31.34052213 ], [ 115.2755642, 31.34024103 ], [ 115.27603589, 31.34001982 ], [ 115.27618829, 31.33987394 ], [ 115.27635995, 31.33912957 ], [ 115.27636554, 31.33873966 ], [ 115.27625825, 31.33848157 ], [ 115.2760276, 31.33820447 ], [ 115.27429927, 31.33658031 ], [ 115.27402833, 31.33644559 ], [ 115.2737757, 31.33645545 ], [ 115.27323046, 31.33716393 ], [ 115.27289203, 31.33745851 ], [ 115.27110356, 31.33792618 ], [ 115.2705196, 31.33818586 ], [ 115.26967237, 31.33891956 ], [ 115.26925891, 31.33983335 ], [ 115.26899779, 31.3401916 ], [ 115.26868004, 31.34032997 ], [ 115.26853798, 31.34028208 ], [ 115.26838849, 31.34011967 ], [ 115.26829458, 31.33983333 ], [ 115.26830363, 31.3395522 ], [ 115.26841009, 31.33922046 ], [ 115.26859414, 31.33896779 ], [ 115.26883699, 31.33786065 ], [ 115.26903407, 31.33778791 ], [ 115.26942014, 31.33799158 ], [ 115.26959839, 31.33801977 ], [ 115.26973795, 31.33795841 ], [ 115.2699304, 31.33770985 ], [ 115.27022623, 31.33758576 ], [ 115.27029786, 31.33749325 ], [ 115.27002763, 31.33706117 ], [ 115.26965939, 31.33676217 ], [ 115.26956554, 31.33656845 ], [ 115.26972987, 31.33557222 ], [ 115.26968945, 31.33496962 ], [ 115.26993411, 31.33437602 ], [ 115.27025294, 31.33405051 ], [ 115.26999831, 31.333112 ], [ 115.27020554, 31.3316942 ], [ 115.27012163, 31.33134387 ], [ 115.2699382, 31.3310909 ], [ 115.26981649, 31.33120415 ], [ 115.26969412, 31.33182668 ], [ 115.26949443, 31.33237002 ], [ 115.26887048, 31.33354953 ], [ 115.2688202, 31.33404369 ], [ 115.26839762, 31.33451018 ], [ 115.26808097, 31.33457586 ], [ 115.26701966, 31.33410367 ], [ 115.26599805, 31.33378011 ], [ 115.26532597, 31.33323085 ], [ 115.26509411, 31.33289471 ], [ 115.26486393, 31.33221012 ], [ 115.26436196, 31.33148669 ], [ 115.26365177, 31.33104846 ], [ 115.26361956, 31.33086012 ], [ 115.26371577, 31.33055953 ], [ 115.26364978, 31.33040014 ], [ 115.26232985, 31.32886212 ], [ 115.26211578, 31.32871421 ], [ 115.26197378, 31.3287402 ], [ 115.26180508, 31.32895794 ], [ 115.26177607, 31.32918995 ], [ 115.26219029, 31.33017199 ], [ 115.26226425, 31.33063871 ], [ 115.26221124, 31.33104915 ], [ 115.2620406, 31.33145292 ], [ 115.26173375, 31.33172627 ], [ 115.26099643, 31.33194417 ], [ 115.26084338, 31.33204621 ], [ 115.26076823, 31.33227756 ], [ 115.260796, 31.33292002 ], [ 115.26054241, 31.33341445 ], [ 115.26025381, 31.33371787 ], [ 115.25990172, 31.33383525 ], [ 115.25921969, 31.33364638 ], [ 115.2589684, 31.33364518 ], [ 115.25887732, 31.33371799 ], [ 115.25901082, 31.33401083 ], [ 115.25961365, 31.33485715 ], [ 115.259684, 31.33505375 ], [ 115.25953836, 31.33585912 ], [ 115.25954441, 31.33761582 ], [ 115.25944612, 31.33811767 ], [ 115.25930217, 31.33825039 ], [ 115.25882676, 31.33822763 ], [ 115.25813175, 31.3384972 ], [ 115.25726306, 31.33869774 ], [ 115.25684747, 31.33872987 ], [ 115.25600631, 31.33860212 ], [ 115.25533643, 31.33862068 ], [ 115.25417576, 31.33811014 ], [ 115.25400115, 31.33818008 ], [ 115.2536733, 31.33859796 ], [ 115.25341732, 31.3387121 ], [ 115.2532698, 31.33870413 ], [ 115.25320008, 31.33851408 ], [ 115.25322336, 31.33713036 ], [ 115.25313809, 31.33695813 ], [ 115.25263116, 31.33677039 ], [ 115.25213989, 31.33691558 ], [ 115.2519785, 31.33690353 ], [ 115.25167416, 31.33584637 ], [ 115.25155188, 31.33564125 ], [ 115.25136033, 31.33549197 ], [ 115.25095027, 31.33540745 ], [ 115.24992818, 31.33554796 ], [ 115.24939366, 31.33551245 ], [ 115.24917983, 31.33537013 ], [ 115.24875828, 31.33481878 ] ], [ [ 115.27804827, 31.34672417 ], [ 115.27787194, 31.34658383 ] ], [ [ 115.22048086, 31.36334215 ], [ 115.22083947, 31.36344138 ], [ 115.22098214, 31.36420046 ], [ 115.22105002, 31.36556795 ], [ 115.22126002, 31.3660133 ], [ 115.22157008, 31.36619378 ], [ 115.22269059, 31.36613803 ], [ 115.2234946, 31.36622849 ], [ 115.22483592, 31.36615999 ], [ 115.22613385, 31.36582508 ], [ 115.22743198, 31.36517178 ], [ 115.22827361, 31.3650552 ], [ 115.22928648, 31.36509806 ], [ 115.22998981, 31.36490421 ], [ 115.2305656, 31.36453637 ], [ 115.23101665, 31.364097 ], [ 115.23113018, 31.36375414 ], [ 115.23102128, 31.36329643 ], [ 115.23051445, 31.36253398 ], [ 115.22897774, 31.36079585 ], [ 115.22854842, 31.36074026 ], [ 115.22757557, 31.3610498 ], [ 115.227229, 31.3611017 ], [ 115.22683112, 31.36107141 ], [ 115.22656618, 31.36093971 ], [ 115.22648117, 31.36079364 ], [ 115.22646654, 31.36056242 ], [ 115.22674764, 31.35968107 ], [ 115.22689717, 31.35884685 ], [ 115.22699402, 31.3586823 ], [ 115.22716217, 31.35859444 ], [ 115.22739622, 31.35857233 ], [ 115.22762784, 31.35862885 ], [ 115.22788452, 31.35881333 ], [ 115.22827289, 31.35868967 ], [ 115.22869903, 31.35881036 ], [ 115.23003045, 31.35857955 ], [ 115.23112616, 31.35847387 ], [ 115.23208796, 31.35863955 ], [ 115.23237991, 31.35894789 ], [ 115.23290564, 31.3587357 ], [ 115.23313374, 31.35874027 ], [ 115.23323578, 31.35885941 ], [ 115.23333185, 31.35928905 ], [ 115.23343137, 31.35938584 ], [ 115.23359029, 31.35942177 ], [ 115.23373553, 31.35932646 ], [ 115.23383236, 31.35913994 ], [ 115.23401875, 31.35823018 ], [ 115.23413831, 31.35805411 ], [ 115.23434829, 31.35802378 ], [ 115.23451962, 31.35817449 ], [ 115.23473361, 31.35908568 ], [ 115.23488476, 31.35926447 ], [ 115.23498818, 31.35917421 ], [ 115.23505372, 31.35895365 ], [ 115.23507074, 31.35794035 ], [ 115.23517361, 31.35767263 ], [ 115.23543171, 31.35755373 ], [ 115.23598432, 31.35766773 ], [ 115.23632156, 31.35758021 ], [ 115.23666993, 31.35779619 ], [ 115.23728648, 31.35787706 ], [ 115.2381365, 31.35850416 ], [ 115.2382356, 31.35844734 ], [ 115.23810397, 31.35797637 ], [ 115.23815044, 31.35787249 ], [ 115.2382603, 31.35787328 ], [ 115.23872752, 31.35894156 ], [ 115.2388933, 31.35915402 ], [ 115.23909666, 31.35917822 ], [ 115.23939994, 31.35887402 ], [ 115.23971416, 31.35890213 ], [ 115.23980841, 31.35884751 ], [ 115.24001425, 31.35800606 ], [ 115.24014151, 31.35780268 ], [ 115.24043938, 31.35758162 ], [ 115.2405136, 31.3572128 ], [ 115.24116411, 31.35676639 ], [ 115.24137796, 31.35636196 ], [ 115.24162224, 31.35632628 ], [ 115.24167565, 31.3559503 ], [ 115.24159385, 31.35541747 ], [ 115.2411463, 31.35404504 ], [ 115.24121548, 31.35380602 ], [ 115.24153646, 31.3534872 ], [ 115.24167508, 31.35356429 ], [ 115.2419063, 31.3540099 ], [ 115.24210636, 31.35478161 ], [ 115.24234035, 31.35530379 ], [ 115.24245961, 31.35653648 ], [ 115.24255158, 31.35669871 ], [ 115.24267359, 31.35658444 ], [ 115.24291595, 31.35610243 ], [ 115.24307073, 31.3560204 ], [ 115.24346174, 31.35621447 ], [ 115.24375591, 31.35618241 ], [ 115.24391156, 31.35656043 ], [ 115.24402895, 31.35659397 ], [ 115.24410612, 31.35652036 ], [ 115.24412237, 31.3563643 ], [ 115.24404329, 31.35612766 ], [ 115.24347405, 31.35526157 ], [ 115.24343327, 31.3550273 ], [ 115.24366519, 31.35512615 ], [ 115.24439222, 31.35586925 ], [ 115.24455352, 31.35592186 ], [ 115.24466616, 31.35583033 ], [ 115.24464359, 31.35539012 ], [ 115.24396364, 31.3536902 ], [ 115.24390846, 31.35348039 ], [ 115.24394796, 31.35334757 ], [ 115.24473552, 31.35336778 ], [ 115.24485031, 31.35345229 ], [ 115.24497971, 31.3543136 ], [ 115.24523004, 31.35523615 ], [ 115.24531199, 31.35597351 ], [ 115.24539234, 31.35615805 ], [ 115.24551401, 31.35623384 ], [ 115.24562834, 31.35621 ], [ 115.24574204, 31.35606333 ], [ 115.24593243, 31.35526547 ], [ 115.24590039, 31.35421114 ], [ 115.24598649, 31.35370242 ], [ 115.24610221, 31.35356559 ], [ 115.24631373, 31.35363254 ], [ 115.24656004, 31.35391955 ], [ 115.24669002, 31.35423792 ], [ 115.2468133, 31.35573769 ], [ 115.24723026, 31.35730986 ], [ 115.24731182, 31.35744243 ], [ 115.2473923, 31.35744323 ], [ 115.24744834, 31.35688676 ], [ 115.24733818, 31.35604271 ], [ 115.24750813, 31.35507444 ], [ 115.24758791, 31.35499354 ], [ 115.24770433, 31.35498448 ], [ 115.24846986, 31.35535353 ], [ 115.24862019, 31.35536213 ], [ 115.24868644, 31.35522674 ], [ 115.24868282, 31.35482491 ], [ 115.24887673, 31.35454984 ], [ 115.24887442, 31.35445089 ], [ 115.24865341, 31.35428074 ], [ 115.24796238, 31.35402396 ], [ 115.24753151, 31.35356438 ], [ 115.24696163, 31.35246413 ], [ 115.24695371, 31.35229161 ], [ 115.24707029, 31.35197155 ], [ 115.24700318, 31.3516463 ], [ 115.24678764, 31.35162021 ], [ 115.24598203, 31.35211953 ], [ 115.24564656, 31.3522468 ], [ 115.24544926, 31.35224127 ], [ 115.24528769, 31.35210575 ], [ 115.24526154, 31.35197411 ], [ 115.24534038, 31.35181853 ], [ 115.2456318, 31.35156981 ], [ 115.24560863, 31.35143543 ], [ 115.24529232, 31.35127805 ], [ 115.2445156, 31.35121051 ], [ 115.2439044, 31.35059965 ], [ 115.24382314, 31.35041994 ], [ 115.24387489, 31.35025174 ], [ 115.24403223, 31.35010152 ], [ 115.24442521, 31.35001723 ], [ 115.245274, 31.35025309 ], [ 115.24561069, 31.35052975 ], [ 115.24599397, 31.35070195 ], [ 115.24617394, 31.35072781 ], [ 115.24626994, 31.35066125 ], [ 115.24630405, 31.35037229 ], [ 115.246063, 31.34971998 ], [ 115.24610606, 31.34959561 ], [ 115.24642958, 31.34940962 ], [ 115.24641448, 31.34912225 ], [ 115.24599774, 31.3486167 ], [ 115.24547554, 31.34851439 ], [ 115.24535167, 31.34843828 ], [ 115.24533777, 31.34828282 ], [ 115.24553555, 31.34806769 ], [ 115.24555766, 31.34791237 ], [ 115.24517164, 31.34743062 ], [ 115.24473599, 31.34702121 ], [ 115.24457405, 31.34665873 ], [ 115.24457031, 31.3463178 ], [ 115.24465834, 31.34619432 ], [ 115.24478822, 31.34619995 ], [ 115.24518624, 31.34663119 ], [ 115.24593648, 31.34671958 ], [ 115.24624926, 31.34699378 ], [ 115.246394, 31.34703608 ], [ 115.2466156, 31.34689195 ], [ 115.24691982, 31.34649854 ], [ 115.24734797, 31.34625407 ], [ 115.2473962, 31.34579637 ], [ 115.24749712, 31.34572423 ], [ 115.24775207, 31.3458492 ], [ 115.24810158, 31.34626352 ], [ 115.24848962, 31.34638173 ], [ 115.24856008, 31.34652449 ], [ 115.24833567, 31.34703558 ], [ 115.24755389, 31.34767077 ], [ 115.24740604, 31.34788495 ], [ 115.24744406, 31.34795418 ], [ 115.24791435, 31.34797607 ], [ 115.24815999, 31.34807854 ], [ 115.24835367, 31.34833602 ], [ 115.24846966, 31.34868705 ], [ 115.24847669, 31.34884252 ], [ 115.2483981, 31.34901326 ], [ 115.24787665, 31.34926819 ], [ 115.24773969, 31.34939753 ], [ 115.24779243, 31.34950791 ], [ 115.24838624, 31.34964606 ], [ 115.24850168, 31.34977809 ], [ 115.24790592, 31.35044258 ], [ 115.24782283, 31.35062215 ], [ 115.24784238, 31.35073791 ], [ 115.24796356, 31.35072771 ], [ 115.24846716, 31.35043205 ], [ 115.24870827, 31.35041995 ], [ 115.24888092, 31.35049404 ], [ 115.24908143, 31.35077645 ], [ 115.24924661, 31.35163312 ], [ 115.24933978, 31.35174225 ], [ 115.2496554, 31.35084788 ], [ 115.24974212, 31.35074824 ], [ 115.24982997, 31.35074401 ], [ 115.24999004, 31.35091821 ], [ 115.25021714, 31.35144064 ], [ 115.25034821, 31.35151189 ], [ 115.25048272, 31.35136037 ], [ 115.25054394, 31.35114569 ], [ 115.25046944, 31.35021603 ], [ 115.25051241, 31.34995361 ], [ 115.25060751, 31.34987115 ], [ 115.25124317, 31.34986045 ], [ 115.25131442, 31.34997789 ], [ 115.25140371, 31.35078228 ], [ 115.25155353, 31.35092395 ], [ 115.25190394, 31.35097553 ], [ 115.25198772, 31.35111403 ], [ 115.25199365, 31.351934 ], [ 115.25221388, 31.35237162 ], [ 115.2520538, 31.35287888 ], [ 115.25259018, 31.35280172 ], [ 115.25273574, 31.35328619 ], [ 115.2528601, 31.35340737 ], [ 115.25307412, 31.35348162 ], [ 115.25331645, 31.35340829 ], [ 115.2537641, 31.35300524 ], [ 115.25395005, 31.35298409 ], [ 115.25404645, 31.35309258 ], [ 115.25387133, 31.35342395 ], [ 115.25330602, 31.35381262 ], [ 115.25248856, 31.35463469 ], [ 115.25211979, 31.35490824 ], [ 115.25212765, 31.35520239 ], [ 115.25230399, 31.35538581 ], [ 115.2526218, 31.35543542 ], [ 115.25308028, 31.35536956 ], [ 115.25325411, 31.35542525 ], [ 115.25327999, 31.35559158 ], [ 115.25303987, 31.35586628 ], [ 115.2530006, 31.35601442 ], [ 115.2533322, 31.35637646 ], [ 115.25337377, 31.35651792 ], [ 115.2532008, 31.35664944 ], [ 115.25239194, 31.35679768 ], [ 115.25206462, 31.35702853 ], [ 115.25200541, 31.35728947 ], [ 115.25224947, 31.35774359 ], [ 115.25210622, 31.35797639 ], [ 115.25174597, 31.35811383 ], [ 115.25095431, 31.35818623 ], [ 115.25065821, 31.3583782 ], [ 115.25060725, 31.35858796 ], [ 115.25083933, 31.35903774 ], [ 115.25081074, 31.35924876 ], [ 115.25058628, 31.35965316 ], [ 115.25068679, 31.35994007 ], [ 115.25067038, 31.36013806 ], [ 115.25058195, 31.36028086 ], [ 115.25020595, 31.36058208 ], [ 115.25020628, 31.36092447 ], [ 115.25014787, 31.36103669 ], [ 115.24969846, 31.3612531 ], [ 115.24962015, 31.36136027 ], [ 115.25044225, 31.3617924 ], [ 115.25058831, 31.36207254 ], [ 115.25056787, 31.36246253 ], [ 115.25043117, 31.3627258 ], [ 115.25025656, 31.36286865 ], [ 115.25002223, 31.36292574 ], [ 115.24951965, 31.36286195 ], [ 115.24944866, 31.36288715 ], [ 115.24945034, 31.36295774 ], [ 115.2497843, 31.36313572 ], [ 115.25059008, 31.36319848 ], [ 115.25104309, 31.36311421 ], [ 115.25142524, 31.36290195 ], [ 115.25186161, 31.36245638 ], [ 115.25210958, 31.36199444 ], [ 115.25213634, 31.36163271 ], [ 115.25204177, 31.36101316 ], [ 115.25208578, 31.3608453 ], [ 115.25217188, 31.36077196 ], [ 115.25234769, 31.36078563 ], [ 115.25246244, 31.36091823 ], [ 115.25264392, 31.36178438 ], [ 115.25276771, 31.36194162 ], [ 115.25315189, 31.3618523 ], [ 115.25346959, 31.36190565 ], [ 115.25376374, 31.36133783 ], [ 115.25397608, 31.36126166 ], [ 115.25417767, 31.3613403 ], [ 115.25440296, 31.3616232 ], [ 115.25448337, 31.36201237 ], [ 115.2539603, 31.36283257 ], [ 115.25391391, 31.36301324 ], [ 115.25460682, 31.36280204 ], [ 115.25499375, 31.36288115 ], [ 115.25539247, 31.36316179 ], [ 115.25629049, 31.3642414 ], [ 115.25656449, 31.36437426 ], [ 115.25721249, 31.36449214 ], [ 115.25749693, 31.36477591 ], [ 115.25759188, 31.36524717 ], [ 115.25739636, 31.36588959 ], [ 115.25725615, 31.36691767 ], [ 115.25739576, 31.36804615 ], [ 115.25782118, 31.36884244 ], [ 115.25806483, 31.36917352 ], [ 115.25838406, 31.36933025 ], [ 115.25894389, 31.36940043 ] ], [ [ 115.22016782, 31.36335237 ], [ 115.22048086, 31.36334215 ] ], [ [ 115.25894389, 31.36940043 ], [ 115.25916177, 31.3692182 ], [ 115.2592125, 31.36908077 ], [ 115.25909706, 31.36813953 ], [ 115.25891012, 31.36740069 ], [ 115.2584425, 31.36677217 ], [ 115.25837619, 31.36643352 ], [ 115.25858784, 31.36600099 ], [ 115.25930417, 31.3652173 ], [ 115.25963448, 31.36448588 ], [ 115.25976236, 31.36386696 ], [ 115.25968994, 31.36298359 ], [ 115.25954586, 31.3624024 ], [ 115.25943365, 31.36227644 ], [ 115.25895624, 31.36204559 ], [ 115.25795575, 31.36193356 ], [ 115.2575842, 31.36171199 ], [ 115.25744231, 31.36149155 ], [ 115.25727067, 31.36084118 ], [ 115.25665614, 31.36016805 ], [ 115.25637005, 31.36004593 ], [ 115.25563298, 31.36001555 ], [ 115.25547724, 31.35994968 ], [ 115.25536358, 31.35981444 ], [ 115.2553601, 31.35966397 ], [ 115.25555173, 31.35922894 ], [ 115.25580133, 31.35827665 ], [ 115.25591353, 31.35809423 ], [ 115.25603449, 31.35808723 ], [ 115.25614801, 31.35818155 ], [ 115.25647264, 31.35884118 ], [ 115.25667838, 31.35900035 ], [ 115.25677774, 31.35894759 ], [ 115.2570267, 31.35852027 ], [ 115.25732957, 31.3583382 ], [ 115.25738238, 31.35824162 ], [ 115.25720043, 31.35784628 ], [ 115.25713609, 31.35744284 ], [ 115.25671423, 31.35719 ], [ 115.25679585, 31.35710571 ], [ 115.2571456, 31.35702898 ], [ 115.25729617, 31.3569238 ], [ 115.25731575, 31.35681252 ], [ 115.25720818, 31.35653799 ], [ 115.25723598, 31.35614604 ], [ 115.25698776, 31.35599636 ], [ 115.25655383, 31.3559344 ], [ 115.25570174, 31.35611178 ], [ 115.25572393, 31.35592037 ], [ 115.25595163, 31.35556755 ], [ 115.25632409, 31.35529263 ], [ 115.25637247, 31.35519356 ], [ 115.25626828, 31.35502938 ], [ 115.25568514, 31.35449576 ], [ 115.25557021, 31.35420004 ], [ 115.25565266, 31.3540593 ], [ 115.25594625, 31.35384248 ], [ 115.25609879, 31.35338824 ], [ 115.2564997, 31.3529483 ], [ 115.25649035, 31.35246593 ], [ 115.25669961, 31.35245005 ], [ 115.25732554, 31.35279169 ], [ 115.2576174, 31.35308447 ], [ 115.25786985, 31.3534669 ], [ 115.25804825, 31.35360423 ], [ 115.25835185, 31.35372231 ], [ 115.25855383, 31.35373195 ], [ 115.25899991, 31.35347922 ], [ 115.2591755, 31.35346925 ], [ 115.2604244, 31.35440637 ], [ 115.26104053, 31.35524365 ], [ 115.26196988, 31.35616041 ], [ 115.26194563, 31.35631844 ], [ 115.26153556, 31.3567804 ], [ 115.26150611, 31.35695043 ], [ 115.26156198, 31.35704008 ], [ 115.26171576, 31.356986 ], [ 115.26227191, 31.35648099 ], [ 115.26241514, 31.3562437 ], [ 115.26242016, 31.3560522 ], [ 115.26226606, 31.35579963 ], [ 115.26145587, 31.3549197 ], [ 115.26053171, 31.35370776 ], [ 115.2599138, 31.35255812 ], [ 115.25973618, 31.35249333 ], [ 115.25890593, 31.3525836 ], [ 115.25847015, 31.35286595 ], [ 115.25830782, 31.3528545 ], [ 115.2574098, 31.35191607 ], [ 115.25728846, 31.35094595 ], [ 115.25717184, 31.35072368 ], [ 115.25699005, 31.35066955 ], [ 115.25649237, 31.35079789 ], [ 115.25614594, 31.3508049 ], [ 115.25533781, 31.35028972 ], [ 115.25525755, 31.34987962 ], [ 115.25483705, 31.34955389 ], [ 115.25478157, 31.34943894 ], [ 115.2548517, 31.34930763 ], [ 115.25522164, 31.34913352 ], [ 115.25524284, 31.34895032 ], [ 115.2550001, 31.34874384 ], [ 115.25435994, 31.34847059 ], [ 115.25424024, 31.34832354 ], [ 115.25430411, 31.34812225 ], [ 115.25416411, 31.34775031 ], [ 115.254728, 31.34707071 ], [ 115.25478015, 31.34695761 ], [ 115.25474824, 31.34685983 ], [ 115.2543857, 31.34673782 ], [ 115.25395402, 31.346823 ], [ 115.25345944, 31.34677978 ], [ 115.25300455, 31.34688665 ], [ 115.25264865, 31.34682904 ], [ 115.25209953, 31.34649462 ], [ 115.25177971, 31.34616606 ], [ 115.25141692, 31.34562208 ], [ 115.25099355, 31.3454333 ], [ 115.25113772, 31.34535805 ], [ 115.25168274, 31.34532028 ], [ 115.25182254, 31.34515226 ], [ 115.25183469, 31.34492011 ], [ 115.25171436, 31.34452036 ], [ 115.25170443, 31.34419159 ], [ 115.25148147, 31.34373177 ], [ 115.25144039, 31.34350817 ], [ 115.25156787, 31.34322761 ], [ 115.25205924, 31.34291193 ], [ 115.25203506, 31.34279194 ], [ 115.25176847, 31.34246042 ], [ 115.25223915, 31.34250603 ], [ 115.2523984, 31.34245537 ], [ 115.25275634, 31.34184323 ], [ 115.25282161, 31.34130843 ], [ 115.25370422, 31.34067338 ], [ 115.25452755, 31.34075049 ], [ 115.25516779, 31.34117373 ], [ 115.25533412, 31.34110803 ], [ 115.25581519, 31.34058041 ], [ 115.25598239, 31.34051767 ], [ 115.2564852, 31.34057572 ], [ 115.25698446, 31.34082611 ], [ 115.25777011, 31.34094788 ], [ 115.25789074, 31.34089369 ], [ 115.25794842, 31.34078638 ], [ 115.2577575, 31.34012637 ], [ 115.25784628, 31.33995021 ], [ 115.25868932, 31.34016994 ], [ 115.25970971, 31.33996164 ], [ 115.26063835, 31.33988629 ], [ 115.26137799, 31.33960323 ], [ 115.26236194, 31.33872631 ], [ 115.26256046, 31.33785595 ], [ 115.26282571, 31.33719598 ], [ 115.26292559, 31.33717751 ], [ 115.26323722, 31.33743998 ], [ 115.2634112, 31.33731377 ], [ 115.26353643, 31.33698047 ], [ 115.26359151, 31.33630644 ], [ 115.26365804, 31.33619812 ], [ 115.26393562, 31.33623526 ], [ 115.26443061, 31.3365363 ], [ 115.26479973, 31.33717599 ], [ 115.26496188, 31.33727766 ], [ 115.26512792, 31.3371901 ], [ 115.26562417, 31.33656778 ], [ 115.2658795, 31.33647116 ], [ 115.26620672, 31.33648237 ], [ 115.26644539, 31.33658582 ], [ 115.26644972, 31.3369978 ], [ 115.26676589, 31.33718375 ], [ 115.26680331, 31.33740698 ], [ 115.26648992, 31.33806499 ], [ 115.26643434, 31.33899984 ], [ 115.26619829, 31.33972205 ], [ 115.2658607, 31.34031553 ], [ 115.26582191, 31.34076418 ], [ 115.26611166, 31.34141802 ], [ 115.26690575, 31.34234246 ], [ 115.26718405, 31.34290372 ], [ 115.26734554, 31.34292768 ], [ 115.26769229, 31.34272629 ], [ 115.26785449, 31.34269658 ], [ 115.2681143, 31.34279193 ], [ 115.26841255, 31.34299995 ], [ 115.26882122, 31.34276202 ], [ 115.26944919, 31.34332355 ], [ 115.26967467, 31.34333822 ], [ 115.26973964, 31.34302382 ], [ 115.26955957, 31.34174752 ], [ 115.27012629, 31.34099992 ], [ 115.27060051, 31.34005329 ], [ 115.27096815, 31.33972395 ], [ 115.2715081, 31.33969446 ], [ 115.27195439, 31.33950398 ], [ 115.27220126, 31.33916249 ], [ 115.27240974, 31.33908621 ], [ 115.27262165, 31.33909265 ], [ 115.27286475, 31.33927264 ], [ 115.2733144, 31.33997624 ], [ 115.27361665, 31.34090372 ], [ 115.27367819, 31.34206733 ], [ 115.2739183, 31.3438226 ], [ 115.27384974, 31.34550819 ], [ 115.27392964, 31.34553638 ], [ 115.27403897, 31.34541995 ], [ 115.27431215, 31.34473019 ], [ 115.27451963, 31.34463197 ], [ 115.27466201, 31.34473428 ], [ 115.2748716, 31.34516994 ], [ 115.27508448, 31.34540772 ], [ 115.27640293, 31.34638205 ], [ 115.27673796, 31.34652013 ], [ 115.27744615, 31.34662989 ], [ 115.27775836, 31.34664143 ], [ 115.27787194, 31.34658383 ] ], [ [ 115.25896761, 31.3699276 ], [ 115.25894389, 31.36940043 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012BT00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012AT00000,AFA9800121TI0000", "TRVCD": "AFA980012T000000", "INDCD": "QFA980012AT00000", "ONDCD": "QFA980012S000000", "BWSCD": "WFA980012BT00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 13.0, "RVLEN": 1247.0, "RVSLP": 0.0006, "IELV": 30.0, "OELV": 29.48, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7582773, 30.96851992 ], [ 114.75833591, 30.96813037 ], [ 114.75856216, 30.96763573 ], [ 114.75939614, 30.96635783 ], [ 114.7601477, 30.96543506 ], [ 114.76094416, 30.96458426 ], [ 114.76118848, 30.96412241 ], [ 114.76143575, 30.96336773 ], [ 114.7614378, 30.96302506 ], [ 114.76133832, 30.96276372 ], [ 114.76032025, 30.96185822 ], [ 114.76012553, 30.96153804 ], [ 114.76004832, 30.96021125 ], [ 114.76022737, 30.95948024 ], [ 114.76025559, 30.95899552 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012K000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012J000000", "TRVCD": "AFA980012L000000", "INDCD": "QFA980012J000000", "ONDCD": "QFA980012K000000", "BWSCD": "WFA980012K000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 21.0, "RVLEN": 6413.0, "RVSLP": 0.0002, "IELV": 50.0, "OELV": 49.17, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04136753, 31.18669724 ], [ 115.04130237, 31.18601196 ], [ 115.04107299, 31.18534412 ], [ 115.04096638, 31.18401972 ], [ 115.04071974, 31.18325469 ], [ 115.04061873, 31.18200356 ], [ 115.04037357, 31.18123829 ], [ 115.04027233, 31.17998828 ], [ 115.0400381, 31.17929306 ], [ 115.03992979, 31.17781626 ], [ 115.03968315, 31.17705126 ], [ 115.03957027, 31.17572959 ], [ 115.03932393, 31.17496596 ], [ 115.03920849, 31.1731081 ], [ 115.0389495, 31.17227333 ], [ 115.03884326, 31.1704884 ], [ 115.03858641, 31.16965255 ], [ 115.03846906, 31.16779769 ], [ 115.03821417, 31.16695984 ], [ 115.03811245, 31.1658629 ], [ 115.03745434, 31.16365171 ], [ 115.03655441, 31.16158192 ], [ 115.03520113, 31.15944312 ], [ 115.03477765, 31.15895156 ], [ 115.03349522, 31.15718373 ], [ 115.03124349, 31.1544959 ], [ 115.03036553, 31.15356587 ], [ 115.02940071, 31.15273219 ], [ 115.02900668, 31.15226059 ], [ 115.02777162, 31.15121186 ], [ 115.02416448, 31.14730777 ], [ 115.02341147, 31.14663089 ], [ 115.02307545, 31.14621922 ], [ 115.02211159, 31.14538642 ], [ 115.02165876, 31.14485658 ], [ 115.02075408, 31.14408105 ], [ 115.02024028, 31.14349497 ], [ 115.0193977, 31.14277768 ], [ 115.01894398, 31.14224785 ], [ 115.01803941, 31.14147235 ], [ 115.01758775, 31.1409445 ], [ 115.01668128, 31.14016951 ], [ 115.01622992, 31.13963902 ], [ 115.01550404, 31.1389883 ], [ 115.01509409, 31.13848679 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121A00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900123000000", "INDCD": "-1", "ONDCD": "QFA9900122000000", "BWSCD": "WFA9900121A00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4658.0, "RVSLP": 0.0264, "IELV": 324.0, "OELV": 168.95, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39253605, 31.29992353 ], [ 115.39327518, 31.29962291 ], [ 115.39408694, 31.29902037 ], [ 115.39504206, 31.29857582 ], [ 115.39543734, 31.29851771 ], [ 115.39598954, 31.29863487 ], [ 115.39631392, 31.2986292 ], [ 115.39731005, 31.29828196 ], [ 115.39809598, 31.29753432 ], [ 115.39882424, 31.29624366 ], [ 115.39992616, 31.29539819 ], [ 115.40068799, 31.29426777 ], [ 115.40187398, 31.29357422 ], [ 115.40240321, 31.29291012 ], [ 115.40284063, 31.2925303 ], [ 115.40362471, 31.29230566 ], [ 115.40381296, 31.29219026 ], [ 115.40392599, 31.29201712 ], [ 115.40403242, 31.2914803 ], [ 115.40430395, 31.29072818 ], [ 115.40451581, 31.29049162 ], [ 115.4050695, 31.2901461 ], [ 115.40549548, 31.28975365 ], [ 115.40564526, 31.28948962 ], [ 115.40579983, 31.28887766 ], [ 115.40642715, 31.28798352 ], [ 115.40695151, 31.28759012 ], [ 115.40821998, 31.28742371 ], [ 115.40872975, 31.28718988 ], [ 115.40895176, 31.28698046 ], [ 115.40919584, 31.28645721 ], [ 115.40921903, 31.28543362 ], [ 115.40928305, 31.2851557 ], [ 115.40952199, 31.28469519 ], [ 115.41030356, 31.28361655 ], [ 115.41070635, 31.28247259 ], [ 115.41106811, 31.2820384 ], [ 115.41148808, 31.28179007 ], [ 115.41259601, 31.28166444 ], [ 115.41302001, 31.28141818 ], [ 115.41358632, 31.28081301 ], [ 115.4137642, 31.28013782 ], [ 115.41405341, 31.27974951 ], [ 115.41512596, 31.2787643 ], [ 115.41588195, 31.27826442 ], [ 115.41691351, 31.27738617 ], [ 115.41782243, 31.27683355 ], [ 115.41963504, 31.276118 ], [ 115.42049714, 31.2758586 ], [ 115.42179758, 31.27578627 ], [ 115.42219792, 31.27568446 ], [ 115.42291229, 31.2750599 ], [ 115.4231058, 31.27469647 ], [ 115.42313604, 31.27439765 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121E00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122E00000", "INDCD": "-1", "ONDCD": "QFA9900121E00000", "BWSCD": "WFA9900121E00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3595.0, "RVSLP": 0.0196, "IELV": 237.09, "OELV": 159.07, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33231005, 31.23662419 ], [ 115.33221845, 31.23505916 ], [ 115.33141589, 31.23317783 ], [ 115.33130366, 31.23170641 ], [ 115.33155368, 31.2304387 ], [ 115.33191154, 31.22939617 ], [ 115.33214641, 31.22842008 ], [ 115.33216568, 31.22688099 ], [ 115.33255412, 31.22563194 ], [ 115.33251815, 31.22522269 ], [ 115.3321938, 31.22458235 ], [ 115.33215987, 31.22439423 ], [ 115.33232574, 31.22381603 ], [ 115.33284312, 31.22308025 ], [ 115.33249825, 31.22160311 ], [ 115.33260877, 31.22105225 ], [ 115.33264178, 31.21981159 ], [ 115.33284656, 31.2194951 ], [ 115.33351566, 31.21903978 ], [ 115.33378644, 31.21874575 ], [ 115.33448838, 31.21735833 ], [ 115.33460464, 31.2163124 ], [ 115.33479787, 31.21609021 ], [ 115.33533012, 31.21572229 ], [ 115.33567291, 31.21536394 ], [ 115.33645224, 31.21392576 ], [ 115.33668453, 31.21338971 ], [ 115.33691159, 31.21240809 ], [ 115.33698616, 31.21170015 ], [ 115.33720356, 31.21100261 ], [ 115.3374909, 31.21048975 ], [ 115.33773952, 31.21033165 ], [ 115.33812606, 31.2103324 ], [ 115.33841879, 31.21048098 ], [ 115.33929094, 31.21112027 ], [ 115.33954618, 31.21120019 ], [ 115.33976239, 31.21112418 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121G00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900129000000", "INDCD": "-1", "ONDCD": "QFA9900128000000", "BWSCD": "WFA9900121G00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4022.0, "RVSLP": 0.0227, "IELV": 237.48, "OELV": 110.1, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30264936, 31.15746399 ], [ 115.30349618, 31.1574603 ], [ 115.30467946, 31.15770628 ], [ 115.30519, 31.15762766 ], [ 115.30550184, 31.15765952 ], [ 115.30588989, 31.15793003 ], [ 115.30615951, 31.15843365 ], [ 115.30636985, 31.15867115 ], [ 115.30663669, 31.1588179 ], [ 115.30686055, 31.15882473 ], [ 115.30795762, 31.15852965 ], [ 115.30840141, 31.15815818 ], [ 115.30875802, 31.15765912 ], [ 115.30904606, 31.15738399 ], [ 115.30997243, 31.15708838 ], [ 115.31096363, 31.15633568 ], [ 115.31145399, 31.1562444 ], [ 115.31284585, 31.15620031 ], [ 115.31323836, 31.15611232 ], [ 115.31346295, 31.15591759 ], [ 115.31386078, 31.15522314 ], [ 115.3141338, 31.15491383 ], [ 115.31445328, 31.1546511 ], [ 115.3151043, 31.15432045 ], [ 115.31562813, 31.15410781 ], [ 115.31666097, 31.15385011 ], [ 115.31775623, 31.15372959 ], [ 115.31852566, 31.15347556 ], [ 115.31940103, 31.15286326 ], [ 115.32034849, 31.15240888 ], [ 115.32159624, 31.15223587 ], [ 115.3224475, 31.15196619 ], [ 115.32380184, 31.15143652 ], [ 115.32529747, 31.15062331 ], [ 115.32613009, 31.15056007 ], [ 115.32772646, 31.15092557 ], [ 115.33084591, 31.15082171 ], [ 115.33133244, 31.15072215 ], [ 115.33324635, 31.14985947 ], [ 115.3346183, 31.14980233 ], [ 115.33578788, 31.15015845 ], [ 115.33655372, 31.15018159 ], [ 115.33717753, 31.1500931 ], [ 115.33774975, 31.14967829 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122C00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121CA0000,AFA9900121C00000", "TRVCD": "AFA9900125000000", "INDCD": "QFA9900121C00000", "ONDCD": "QFA9900124000000", "BWSCD": "WFA9900122C00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 175.0, "RVSLP": -0.0247, "IELV": 143.96, "OELV": 144.37, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40337183, 31.23378379 ], [ 115.401536, 31.23384105 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123B00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800122B00000", "TRVCD": "AFA9800126000000", "INDCD": "QFA9800122B00000", "ONDCD": "QFA9800125000000", "BWSCD": "WFA9800123B00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 3181.0, "RVSLP": 0.0047, "IELV": 157.9, "OELV": 115.4, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13663572, 31.47903111 ], [ 115.1367096, 31.48014569 ], [ 115.13692579, 31.48070403 ], [ 115.13724182, 31.48192814 ], [ 115.13715833, 31.48213576 ], [ 115.13666244, 31.48251165 ], [ 115.13569839, 31.48314597 ], [ 115.13545223, 31.4832003 ], [ 115.13528619, 31.48309483 ], [ 115.13452995, 31.48228321 ], [ 115.13427409, 31.48152781 ], [ 115.1340362, 31.48099627 ], [ 115.13390385, 31.48083657 ], [ 115.13371627, 31.48076245 ], [ 115.13346287, 31.48084618 ], [ 115.13309694, 31.48139405 ], [ 115.13250232, 31.48272351 ], [ 115.13193566, 31.48363926 ], [ 115.13155383, 31.4847885 ], [ 115.13133161, 31.48525371 ], [ 115.13048082, 31.48661084 ], [ 115.13021578, 31.4873679 ], [ 115.12998805, 31.48846851 ], [ 115.13007141, 31.48872614 ], [ 115.13041996, 31.4891724 ], [ 115.13072752, 31.48983959 ], [ 115.13074835, 31.49016566 ], [ 115.13060735, 31.49042063 ], [ 115.13028913, 31.49065122 ], [ 115.12980634, 31.49067726 ], [ 115.12846339, 31.49025001 ], [ 115.1273362, 31.48973412 ], [ 115.12599007, 31.48931586 ], [ 115.1255982, 31.48932216 ], [ 115.1254101, 31.48942979 ], [ 115.12528381, 31.48966899 ], [ 115.12527868, 31.49077796 ], [ 115.12521407, 31.49113226 ], [ 115.12497959, 31.49161963 ], [ 115.12457225, 31.49223933 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123PA0000", "RVNM": "张广河", "GB": "210101", "FRVCD": "AFA9800122PA0000", "TRVCD": "AFA9800123P00000", "INDCD": "QFA9800122PA0000", "ONDCD": "QFA9800122P00000", "BWSCD": "WFA9800123PA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 2623.0, "RVSLP": 0.0101, "IELV": 203.41, "OELV": 165.33, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32442641, 31.35587347 ], [ 115.32398157, 31.35510603 ], [ 115.32310969, 31.35443043 ], [ 115.3220444, 31.3540182 ], [ 115.3212255, 31.35389656 ], [ 115.32068626, 31.35371384 ], [ 115.31754205, 31.35233354 ], [ 115.31731632, 31.35210776 ], [ 115.31722762, 31.35191375 ], [ 115.31712969, 31.35080918 ], [ 115.3170306, 31.35046265 ], [ 115.31663723, 31.34990022 ], [ 115.31602371, 31.3494631 ], [ 115.31434001, 31.34883835 ], [ 115.31243817, 31.34886578 ], [ 115.31203351, 31.34880228 ], [ 115.31159009, 31.34855606 ], [ 115.31088478, 31.34752768 ], [ 115.31050156, 31.34723077 ], [ 115.31018619, 31.34715631 ], [ 115.30984577, 31.34716035 ], [ 115.30897202, 31.34738009 ], [ 115.30857435, 31.34734801 ], [ 115.30797407, 31.34709665 ], [ 115.30680406, 31.3462293 ], [ 115.30619839, 31.34599248 ], [ 115.30569588, 31.34594969 ], [ 115.30386888, 31.34602229 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201I0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820900000000", "INDCD": "-1", "ONDCD": "QFA9820800000000", "BWSCD": "WFA98201I0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 8000.0, "RVSLP": 0.0006, "IELV": 44.93, "OELV": 39.77, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94399154, 31.12720322 ], [ 114.94394637, 31.12680782 ], [ 114.94383928, 31.12654172 ], [ 114.94329579, 31.12596643 ], [ 114.94316602, 31.12570435 ], [ 114.94316843, 31.12529784 ], [ 114.94343458, 31.12492832 ], [ 114.94492559, 31.12407164 ], [ 114.94616621, 31.1234688 ], [ 114.94671398, 31.12311225 ], [ 114.94824466, 31.12237049 ], [ 114.94884554, 31.12212822 ], [ 114.95003044, 31.12198823 ], [ 114.95055625, 31.12175403 ], [ 114.95094351, 31.12137818 ], [ 114.95095018, 31.12106788 ], [ 114.95073383, 31.12069703 ], [ 114.9504985, 31.12047057 ], [ 114.95021251, 31.12030805 ], [ 114.94975028, 31.12017366 ], [ 114.94956557, 31.12004222 ], [ 114.94929031, 31.11956434 ], [ 114.94892987, 31.11912771 ], [ 114.94868867, 31.11862423 ], [ 114.94879807, 31.11808026 ], [ 114.94877227, 31.11766854 ], [ 114.94846635, 31.11723144 ], [ 114.94818562, 31.11715757 ], [ 114.9471799, 31.11709135 ], [ 114.94618974, 31.11670985 ], [ 114.94508537, 31.11616588 ], [ 114.94356411, 31.11558795 ], [ 114.94241175, 31.11543307 ], [ 114.94199027, 31.11516027 ], [ 114.93996154, 31.11354407 ], [ 114.93845897, 31.11289742 ], [ 114.93760233, 31.11237246 ], [ 114.93727849, 31.11232757 ], [ 114.93687427, 31.11239371 ], [ 114.93596023, 31.11294391 ], [ 114.93542794, 31.11346602 ], [ 114.93489174, 31.11458833 ], [ 114.93378564, 31.11565364 ], [ 114.93339235, 31.11597035 ], [ 114.93287927, 31.11622128 ], [ 114.93213627, 31.11632397 ], [ 114.93172593, 31.11625784 ], [ 114.93112367, 31.11599756 ], [ 114.93029567, 31.11539355 ], [ 114.92871033, 31.11448498 ], [ 114.92774957, 31.11375354 ], [ 114.92745569, 31.11359831 ], [ 114.92713185, 31.1135542 ], [ 114.92681329, 31.11360442 ], [ 114.92661349, 31.11372199 ], [ 114.92604792, 31.11434371 ], [ 114.92577565, 31.11442311 ], [ 114.92559198, 31.11434964 ], [ 114.92548399, 31.11419239 ], [ 114.92546375, 31.11400755 ], [ 114.92579181, 31.11328553 ], [ 114.92574439, 31.1127178 ], [ 114.92621108, 31.11209299 ], [ 114.9262792, 31.11191156 ], [ 114.92623406, 31.11174557 ], [ 114.92601291, 31.1115699 ], [ 114.92556032, 31.1113985 ], [ 114.92513422, 31.11135796 ], [ 114.92375953, 31.11153991 ], [ 114.92263792, 31.110834 ], [ 114.92216411, 31.11070201 ], [ 114.92157219, 31.11041901 ], [ 114.92083908, 31.1102895 ], [ 114.91979971, 31.10981328 ], [ 114.9193079, 31.10976409 ], [ 114.91868375, 31.10991035 ], [ 114.91845961, 31.10990625 ], [ 114.9180769, 31.10965299 ], [ 114.91764752, 31.10899587 ], [ 114.91707325, 31.10871409 ], [ 114.91645343, 31.10851563 ], [ 114.91613358, 31.10853209 ], [ 114.91591422, 31.10862442 ], [ 114.91514788, 31.10910771 ], [ 114.91443535, 31.10971228 ], [ 114.9141503, 31.10985264 ], [ 114.91383178, 31.1098708 ], [ 114.91327568, 31.109742 ], [ 114.91233157, 31.10969172 ], [ 114.91186167, 31.10959375 ], [ 114.91156986, 31.10963994 ], [ 114.91126573, 31.10988188 ], [ 114.9104767, 31.11102055 ], [ 114.90993769, 31.11155426 ], [ 114.90959605, 31.11178376 ], [ 114.9087402, 31.11205994 ], [ 114.90772172, 31.11216376 ], [ 114.90718752, 31.11229768 ], [ 114.90631195, 31.11218011 ], [ 114.90404581, 31.11223355 ], [ 114.9020196, 31.11187967 ], [ 114.90130616, 31.11205986 ], [ 114.90045667, 31.11212188 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820800000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820700000000,AFA98206H0000000", "TRVCD": "AFA9820900000000", "INDCD": "QFA9820700000000", "ONDCD": "QFA9820800000000", "BWSCD": "WFA9820800000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 16.0, "RVLEN": 4455.0, "RVSLP": 0.0012, "IELV": 44.17, "OELV": 39.77, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90867812, 31.14635964 ], [ 114.9084454, 31.14095238 ], [ 114.90848338, 31.14037769 ], [ 114.90868425, 31.14004801 ], [ 114.90917605, 31.13957632 ], [ 114.90982895, 31.13902531 ], [ 114.91046018, 31.13863227 ], [ 114.9108703, 31.13822113 ], [ 114.91116553, 31.13762132 ], [ 114.91119622, 31.13726506 ], [ 114.91114192, 31.13676173 ], [ 114.91040375, 31.13545115 ], [ 114.91022919, 31.13469614 ], [ 114.90982927, 31.13411182 ], [ 114.90952175, 31.13323227 ], [ 114.90949719, 31.13290633 ], [ 114.90962409, 31.13248261 ], [ 114.90966073, 31.13205146 ], [ 114.90963125, 31.13122926 ], [ 114.90954618, 31.13081175 ], [ 114.90927944, 31.13036184 ], [ 114.90891372, 31.12992566 ], [ 114.9086465, 31.12942556 ], [ 114.90806434, 31.12892976 ], [ 114.90755364, 31.12810351 ], [ 114.906978, 31.1275077 ], [ 114.90687239, 31.12724195 ], [ 114.90673836, 31.12623655 ], [ 114.90627197, 31.12560849 ], [ 114.90601645, 31.12515223 ], [ 114.90598553, 31.12445131 ], [ 114.90624568, 31.12347374 ], [ 114.90654607, 31.12280215 ], [ 114.9065484, 31.12255989 ], [ 114.90590956, 31.12161343 ], [ 114.90566755, 31.12072551 ], [ 114.90452598, 31.11947842 ], [ 114.90421353, 31.11896371 ], [ 114.90405171, 31.11743457 ], [ 114.90394951, 31.11716806 ], [ 114.90360986, 31.11665648 ], [ 114.90361092, 31.11608875 ], [ 114.90356207, 31.11597239 ], [ 114.90149126, 31.11421691 ], [ 114.90081751, 31.11298224 ], [ 114.90045667, 31.11212188 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850100000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9850200000000", "INDCD": "-1", "ONDCD": "QFA9850100000000", "BWSCD": "WFA9850100000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4509.0, "RVSLP": 0.0144, "IELV": 166.32, "OELV": 99.71, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11345342, 30.89204965 ], [ 115.11235449, 30.89430566 ], [ 115.11219178, 30.89499203 ], [ 115.11188602, 30.89534194 ], [ 115.11151577, 30.89545715 ], [ 115.11079562, 30.89531754 ], [ 115.11029959, 30.89534615 ], [ 115.10994634, 30.89554201 ], [ 115.10872598, 30.89659956 ], [ 115.10841185, 30.89669257 ], [ 115.10745947, 30.89674762 ], [ 115.10715223, 30.89682423 ], [ 115.10698973, 30.8969658 ], [ 115.1069118, 30.89715214 ], [ 115.10686004, 30.89823419 ], [ 115.10675435, 30.8984118 ], [ 115.1065679, 30.8985282 ], [ 115.10468654, 30.89867103 ], [ 115.10422209, 30.89881743 ], [ 115.10338818, 30.89893795 ], [ 115.1029062, 30.89924368 ], [ 115.10258369, 30.89961343 ], [ 115.10218196, 30.90040004 ], [ 115.10196968, 30.90145073 ], [ 115.10127866, 30.90239986 ], [ 115.10038751, 30.90318175 ], [ 115.09936209, 30.90366548 ], [ 115.09881303, 30.90382757 ], [ 115.0982981, 30.90406326 ], [ 115.09777187, 30.90447436 ], [ 115.09672601, 30.90547757 ], [ 115.09637154, 30.90597409 ], [ 115.09567941, 30.90669995 ], [ 115.09521114, 30.90731802 ], [ 115.09408478, 30.90836365 ], [ 115.09333015, 30.90886227 ], [ 115.09225431, 30.90983506 ], [ 115.09155195, 30.91069391 ], [ 115.09091424, 30.91135754 ], [ 115.09056029, 30.91185349 ], [ 115.08921559, 30.91315358 ], [ 115.08885976, 30.91364817 ], [ 115.08811794, 30.91443731 ], [ 115.08771761, 30.91513629 ], [ 115.08733811, 30.91565301 ], [ 115.08602345, 30.91812235 ], [ 115.08532755, 30.91884586 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121000000", "RVNM": "举水", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122000000", "INDCD": "-1", "ONDCD": "QFA9800121000000", "BWSCD": "WFA9800121000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5590.0, "RVSLP": 0.0164, "IELV": 326.47, "OELV": 178.7, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14056203, 31.59738624 ], [ 115.14141759, 31.59767417 ], [ 115.14230011, 31.59814772 ], [ 115.14328341, 31.59882857 ], [ 115.14382173, 31.59903363 ], [ 115.14519044, 31.59935826 ], [ 115.14572394, 31.59957798 ], [ 115.14651434, 31.60005942 ], [ 115.14752017, 31.60017026 ], [ 115.14837639, 31.60046172 ], [ 115.14912208, 31.6005703 ], [ 115.15005688, 31.60088412 ], [ 115.15112178, 31.60107508 ], [ 115.15205243, 31.60115385 ], [ 115.15397777, 31.60187244 ], [ 115.15430008, 31.60188744 ], [ 115.15492574, 31.60171178 ], [ 115.15552805, 31.60166451 ], [ 115.15595421, 31.60169085 ], [ 115.15660131, 31.60183719 ], [ 115.15792188, 31.60182465 ], [ 115.15833809, 31.60176163 ], [ 115.15864015, 31.60154044 ], [ 115.15884484, 31.60103707 ], [ 115.1586732, 31.60042964 ], [ 115.1587115, 31.60003758 ], [ 115.1589062, 31.59982021 ], [ 115.15970416, 31.59941525 ], [ 115.1600005, 31.5991464 ], [ 115.16012176, 31.59888246 ], [ 115.16019372, 31.59824773 ], [ 115.16034047, 31.59774635 ], [ 115.16030597, 31.59679977 ], [ 115.15982781, 31.59553385 ], [ 115.16019593, 31.59423322 ], [ 115.16008475, 31.59094805 ], [ 115.16036576, 31.59006282 ], [ 115.16118397, 31.58885514 ], [ 115.16118615, 31.58867664 ], [ 115.16100706, 31.58805463 ], [ 115.16097993, 31.58739371 ], [ 115.16134647, 31.58602827 ], [ 115.16110598, 31.58552624 ], [ 115.16015805, 31.58406436 ], [ 115.16002567, 31.5837225 ], [ 115.15984275, 31.58255238 ], [ 115.16014572, 31.58183493 ], [ 115.16033989, 31.58116754 ], [ 115.16006579, 31.58023204 ], [ 115.15906405, 31.57900677 ], [ 115.15751823, 31.57663289 ], [ 115.15708382, 31.57614222 ], [ 115.1567919, 31.57562671 ], [ 115.15665785, 31.57477218 ], [ 115.15646025, 31.57415163 ], [ 115.15657039, 31.57382728 ], [ 115.15691187, 31.57346925 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PKA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800123PK0000", "INDCD": "-1", "ONDCD": "QFA9800122PK0000", "BWSCD": "WFA9800121PKA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2863.0, "RVSLP": 0.0057, "IELV": 91.95, "OELV": 76.99, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1727439, 31.15233794 ], [ 115.17239159, 31.15218356 ], [ 115.1718683, 31.15216017 ], [ 115.17066851, 31.15266346 ], [ 115.17002794, 31.15300947 ], [ 115.16932569, 31.1538524 ], [ 115.16878573, 31.15422216 ], [ 115.16775249, 31.15430799 ], [ 115.16707565, 31.15424946 ], [ 115.16657417, 31.15394164 ], [ 115.16439837, 31.15220199 ], [ 115.16360024, 31.15175024 ], [ 115.16256405, 31.1509838 ], [ 115.16197558, 31.1506741 ], [ 115.16033245, 31.14939624 ], [ 115.15963498, 31.14897623 ], [ 115.15910574, 31.14841353 ], [ 115.15829074, 31.14777992 ], [ 115.15751816, 31.14750588 ], [ 115.15680519, 31.14705621 ], [ 115.15589852, 31.14666768 ], [ 115.15430828, 31.14575393 ], [ 115.15320607, 31.14568081 ], [ 115.15247764, 31.14553355 ], [ 115.15153445, 31.14550226 ], [ 115.15040573, 31.14528034 ], [ 115.15017233, 31.14509808 ], [ 115.14993215, 31.14457209 ], [ 115.14981689, 31.14419431 ], [ 115.14978366, 31.14378997 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122Q00000", "INDCD": "-1", "ONDCD": "QFA9800121Q00000", "BWSCD": "WFA9800121QA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7029.0, "RVSLP": 0.0112, "IELV": 226.44, "OELV": 139.76, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20934568, 30.9716021 ], [ 115.20923988, 30.97174797 ], [ 115.20920984, 30.97195959 ], [ 115.20943615, 30.97247914 ], [ 115.20986751, 30.97287421 ], [ 115.21062862, 30.97333993 ], [ 115.21087886, 30.97380286 ], [ 115.21075601, 30.97476604 ], [ 115.21058962, 30.97533572 ], [ 115.21058018, 30.97584163 ], [ 115.21066712, 30.97625683 ], [ 115.21111971, 30.9771242 ], [ 115.21115846, 30.97754831 ], [ 115.2110559, 30.97822338 ], [ 115.21131795, 30.97874974 ], [ 115.21081015, 30.97954366 ], [ 115.21074587, 30.98070617 ], [ 115.21044781, 30.9815118 ], [ 115.21013213, 30.98169954 ], [ 115.20963991, 30.98170752 ], [ 115.20901859, 30.98148264 ], [ 115.20836232, 30.98112188 ], [ 115.20742482, 30.98082396 ], [ 115.2068341, 30.98054754 ], [ 115.20651643, 30.98052447 ], [ 115.20598802, 30.98065145 ], [ 115.20576021, 30.98063137 ], [ 115.20525514, 30.98042147 ], [ 115.20478796, 30.97993189 ], [ 115.20451971, 30.97974386 ], [ 115.20365702, 30.97949719 ], [ 115.20219237, 30.97946832 ], [ 115.20145708, 30.9793262 ], [ 115.20113592, 30.97934423 ], [ 115.20081242, 30.97953199 ], [ 115.20069037, 30.97975437 ], [ 115.20087851, 30.98017006 ], [ 115.20142019, 30.980706 ], [ 115.20158562, 30.98095979 ], [ 115.20160045, 30.98128372 ], [ 115.20132834, 30.98203171 ], [ 115.20091607, 30.98240954 ], [ 115.20039566, 30.98264 ], [ 115.19978397, 30.98279195 ], [ 115.19917182, 30.9832994 ], [ 115.19833797, 30.98356766 ], [ 115.19817174, 30.98379201 ], [ 115.19804237, 30.9842977 ], [ 115.19785836, 30.98445034 ], [ 115.1973744, 30.98433577 ], [ 115.19649118, 30.98385996 ], [ 115.19544118, 30.98313421 ], [ 115.1941517, 30.98261401 ], [ 115.19363957, 30.98234214 ], [ 115.19286653, 30.98207233 ], [ 115.19219972, 30.98154379 ], [ 115.19114161, 30.98027983 ], [ 115.19066113, 30.9799463 ], [ 115.19034039, 30.97987116 ], [ 115.18920915, 30.97989014 ], [ 115.18879849, 30.97983508 ], [ 115.18845483, 30.97962075 ], [ 115.18805757, 30.97915435 ], [ 115.18773048, 30.97891626 ], [ 115.18741336, 30.97883764 ], [ 115.18646265, 30.97883839 ], [ 115.18605642, 30.97876249 ], [ 115.18524818, 30.97834781 ], [ 115.1831205, 30.97699974 ], [ 115.18281921, 30.97701432 ], [ 115.18224407, 30.97729618 ], [ 115.1819402, 30.97766217 ], [ 115.18187526, 30.97815794 ], [ 115.18195837, 30.97904207 ], [ 115.18219767, 30.9797417 ], [ 115.18230841, 30.98121877 ], [ 115.18246484, 30.98154788 ], [ 115.18302386, 30.98215 ], [ 115.18334366, 30.98303317 ], [ 115.18353785, 30.9843156 ], [ 115.1839602, 30.98527019 ], [ 115.18413581, 30.98587096 ], [ 115.18458568, 30.98673595 ], [ 115.18474756, 30.98849387 ], [ 115.18507344, 30.98945148 ], [ 115.18556609, 30.99061163 ], [ 115.18557645, 30.99110819 ], [ 115.18541616, 30.99143708 ], [ 115.18508638, 30.99168886 ], [ 115.18432756, 30.99198603 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122N00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800121N00000,AFA9800121NA0000", "TRVCD": "AFA980012L000000", "INDCD": "QFA9800121N00000", "ONDCD": "QFA980012K000000", "BWSCD": "WFA9800122N00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2822.0, "RVSLP": 0.0005, "IELV": 50.0, "OELV": 49.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02840492, 31.15762547 ], [ 115.02802875, 31.15654557 ], [ 115.02701738, 31.15464997 ], [ 115.02674556, 31.15397569 ], [ 115.02660266, 31.15328151 ], [ 115.02643502, 31.15302448 ], [ 115.02550786, 31.15227482 ], [ 115.02419227, 31.15159175 ], [ 115.02356188, 31.15118006 ], [ 115.02239977, 31.15080963 ], [ 115.0216551, 31.150471 ], [ 115.02115216, 31.15003544 ], [ 115.02069475, 31.14936449 ], [ 115.02027136, 31.1488724 ], [ 115.019988, 31.14835814 ], [ 115.01982223, 31.14721299 ], [ 115.01942217, 31.14657037 ], [ 115.01940182, 31.14631437 ], [ 115.0194814, 31.1459138 ], [ 115.01939049, 31.14567123 ], [ 115.01844499, 31.14483843 ], [ 115.01804728, 31.14436985 ], [ 115.01735396, 31.14375175 ], [ 115.01647372, 31.14282092 ], [ 115.01588391, 31.14209665 ], [ 115.01557029, 31.14153167 ], [ 115.01473953, 31.14071591 ], [ 115.01465146, 31.14038042 ], [ 115.01465479, 31.14002496 ], [ 115.01505963, 31.13878239 ], [ 115.01509409, 31.13848679 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PA0000", "RVNM": "张广河", "GB": "210101", "FRVCD": "AFA9800121PA0000", "TRVCD": "AFA9800123PA0000", "INDCD": "QFA9800121PA0000", "ONDCD": "QFA9800122PA0000", "BWSCD": "WFA9800122PA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3253.0, "RVSLP": 0.0338, "IELV": 336.52, "OELV": 203.41, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34308228, 31.36940638 ], [ 115.3422607, 31.36904116 ], [ 115.34137842, 31.36883872 ], [ 115.34061377, 31.36879591 ], [ 115.34031004, 31.36869005 ], [ 115.33997625, 31.3683556 ], [ 115.33981154, 31.36742793 ], [ 115.33962143, 31.36711204 ], [ 115.33922002, 31.36691569 ], [ 115.33900024, 31.36696247 ], [ 115.33851438, 31.36722017 ], [ 115.33815425, 31.36717843 ], [ 115.33785716, 31.36692359 ], [ 115.33737151, 31.36602616 ], [ 115.33712971, 31.36584912 ], [ 115.33682989, 31.36582413 ], [ 115.33656016, 31.36594831 ], [ 115.33584602, 31.36693167 ], [ 115.33561444, 31.36713009 ], [ 115.33514422, 31.36720472 ], [ 115.33477788, 31.36708286 ], [ 115.33440772, 31.36661814 ], [ 115.33285184, 31.36415812 ], [ 115.33250027, 31.36380271 ], [ 115.33180016, 31.36333386 ], [ 115.33091827, 31.36312241 ], [ 115.33007605, 31.36306009 ], [ 115.32978197, 31.36284822 ], [ 115.32970975, 31.36260042 ], [ 115.32973971, 31.36226037 ], [ 115.32995986, 31.36178444 ], [ 115.33058975, 31.36079446 ], [ 115.33063435, 31.36052799 ], [ 115.33059165, 31.36026055 ], [ 115.33042375, 31.3600053 ], [ 115.33010364, 31.35972234 ], [ 115.32880165, 31.35883485 ], [ 115.32800691, 31.35758419 ], [ 115.32780168, 31.35690386 ], [ 115.32748626, 31.35638768 ], [ 115.3271785, 31.35614035 ], [ 115.32688945, 31.35608085 ], [ 115.32609921, 31.35645533 ], [ 115.32534389, 31.35648508 ], [ 115.32501124, 31.3563384 ], [ 115.32442641, 31.35587347 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800122000000", "TRVCD": "AFA9800124000000", "INDCD": "QFA9800122000000", "ONDCD": "QFA9800123000000", "BWSCD": "WFA9800123000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 3993.0, "RVSLP": 0.0075, "IELV": 157.62, "OELV": 131.08, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15400496, 31.54968377 ], [ 115.15421321, 31.54876571 ], [ 115.15417986, 31.54780663 ], [ 115.1539298, 31.54703911 ], [ 115.15380728, 31.54641078 ], [ 115.15300168, 31.54414237 ], [ 115.15281513, 31.5405575 ], [ 115.15267024, 31.54000336 ], [ 115.15231763, 31.53964751 ], [ 115.15155226, 31.53907848 ], [ 115.15040425, 31.53861255 ], [ 115.14927536, 31.53835586 ], [ 115.14761972, 31.53837002 ], [ 115.14691571, 31.53814034 ], [ 115.14642019, 31.53781231 ], [ 115.14383883, 31.53574004 ], [ 115.14287051, 31.53429563 ], [ 115.14225247, 31.53288908 ], [ 115.14207598, 31.53167526 ], [ 115.14175389, 31.5307179 ], [ 115.14098832, 31.52896567 ], [ 115.1408763, 31.52725672 ], [ 115.14074834, 31.52684812 ], [ 115.14039405, 31.52649269 ], [ 115.13990234, 31.52614843 ], [ 115.13872046, 31.52577758 ], [ 115.13669525, 31.52484574 ], [ 115.13638036, 31.52458414 ], [ 115.13516412, 31.52322633 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125L00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124L00000", "TRVCD": "AFA9800126L00000", "INDCD": "QFA9800124L00000", "ONDCD": "QFA9800125L00000", "BWSCD": "WFA9800125L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 2567.0, "RVSLP": 0.0011, "IELV": 60.76, "OELV": 60.15, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07648455, 31.25627799 ], [ 115.07521362, 31.25593587 ], [ 115.07489595, 31.25590418 ], [ 115.0745218, 31.25603291 ], [ 115.07380847, 31.25663221 ], [ 115.07352366, 31.25677566 ], [ 115.07312779, 31.25677781 ], [ 115.07236399, 31.25651824 ], [ 115.0721363, 31.25649606 ], [ 115.07124771, 31.25684512 ], [ 115.07075375, 31.25690806 ], [ 115.07051044, 31.25686704 ], [ 115.07021263, 31.25671583 ], [ 115.06973602, 31.25634176 ], [ 115.0694736, 31.25602635 ], [ 115.06940821, 31.25576386 ], [ 115.06944917, 31.25542602 ], [ 115.0697863, 31.2548844 ], [ 115.06997564, 31.25443274 ], [ 115.07105909, 31.25335988 ], [ 115.07131792, 31.25296964 ], [ 115.07135841, 31.25254411 ], [ 115.07128933, 31.25074588 ], [ 115.07145937, 31.25003123 ], [ 115.07148218, 31.24967997 ], [ 115.0713575, 31.24920465 ], [ 115.07101548, 31.24875797 ], [ 115.07057245, 31.24793758 ], [ 115.07014416, 31.24744617 ], [ 115.06962511, 31.24663056 ], [ 115.06901235, 31.2452256 ], [ 115.06884305, 31.24384997 ], [ 115.06860575, 31.24315755 ], [ 115.06854629, 31.24211425 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800123TC0000,AFA9800124T00000", "TRVCD": "AFA9800126T00000", "INDCD": "QFA9800124T00000", "ONDCD": "QFA9800125T00000", "BWSCD": "WFA9800125T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 4240.0, "RVSLP": 0.0, "IELV": 40.0, "OELV": 40.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7327399, 31.13046271 ], [ 114.7331701, 31.12951841 ], [ 114.73336395, 31.12884527 ], [ 114.73326324, 31.12827255 ], [ 114.73345747, 31.1273882 ], [ 114.73361358, 31.12712357 ], [ 114.73420059, 31.12652004 ], [ 114.73435357, 31.12625307 ], [ 114.73439955, 31.12560121 ], [ 114.73430589, 31.12487563 ], [ 114.73395431, 31.1244403 ], [ 114.73325063, 31.12397374 ], [ 114.73292163, 31.12392407 ], [ 114.73154026, 31.1239262 ], [ 114.73066886, 31.12370216 ], [ 114.7302399, 31.12344376 ], [ 114.72936756, 31.12273603 ], [ 114.72910565, 31.12242344 ], [ 114.72853009, 31.12087447 ], [ 114.72859629, 31.12056598 ], [ 114.72898815, 31.12014808 ], [ 114.72946567, 31.11980944 ], [ 114.72994027, 31.11966266 ], [ 114.73127283, 31.11907624 ], [ 114.73207977, 31.11889756 ], [ 114.73361847, 31.11817217 ], [ 114.73465445, 31.11729551 ], [ 114.73532647, 31.11684006 ], [ 114.73550824, 31.11658638 ], [ 114.73565723, 31.11598644 ], [ 114.73589651, 31.11567528 ], [ 114.73704669, 31.11488201 ], [ 114.73792405, 31.11465754 ], [ 114.7383657, 31.11445573 ], [ 114.73891444, 31.11409833 ], [ 114.73986765, 31.11364889 ], [ 114.74126668, 31.11320901 ], [ 114.74177782, 31.11296243 ], [ 114.74295558, 31.11222089 ], [ 114.7435737, 31.1120119 ], [ 114.74422327, 31.11167192 ], [ 114.74498952, 31.11090557 ], [ 114.74607452, 31.10845128 ], [ 114.7466631, 31.10768214 ], [ 114.74684008, 31.10680342 ], [ 114.74721734, 31.10635164 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126P00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800125P00000,AFA9800125PD0000", "TRVCD": "AFA9800127P00000", "INDCD": "QFA9800125P00000", "ONDCD": "QFA9800126P00000", "BWSCD": "WFA9800126P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 3582.0, "RVSLP": 0.004, "IELV": 109.9, "OELV": 82.29, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21189491, 31.3014303 ], [ 115.21112167, 31.30167664 ], [ 115.21032965, 31.30170626 ], [ 115.20986222, 31.3015478 ], [ 115.20942048, 31.30116595 ], [ 115.20911156, 31.3003598 ], [ 115.20843336, 31.29918977 ], [ 115.20813431, 31.29829646 ], [ 115.20799838, 31.29760013 ], [ 115.20753552, 31.29651179 ], [ 115.20733986, 31.29567786 ], [ 115.20710982, 31.29529847 ], [ 115.20650037, 31.29457994 ], [ 115.20553551, 31.29366194 ], [ 115.2047277, 31.29216422 ], [ 115.20428911, 31.29111006 ], [ 115.20391157, 31.29053789 ], [ 115.20303804, 31.28986018 ], [ 115.20220204, 31.28951242 ], [ 115.20161966, 31.28919369 ], [ 115.19979042, 31.28846174 ], [ 115.19874011, 31.28775785 ], [ 115.19844041, 31.28773205 ], [ 115.19800332, 31.28790646 ], [ 115.19644161, 31.28880782 ], [ 115.19549387, 31.28966893 ], [ 115.19485827, 31.29047413 ], [ 115.19417752, 31.29111616 ], [ 115.19383951, 31.29135605 ], [ 115.19303725, 31.29175769 ], [ 115.19225624, 31.29240024 ], [ 115.19110034, 31.29320002 ], [ 115.19025586, 31.29349901 ], [ 115.18984054, 31.2935684 ], [ 115.18911841, 31.29356157 ], [ 115.18843117, 31.29338215 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800127J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800126J00000,AFA9800122JE0000", "TRVCD": "AFA980012G000000", "INDCD": "QFA9800126J00000", "ONDCD": "QFA980012F000000", "BWSCD": "WFA9800127J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 1894.0, "RVSLP": 0.0, "IELV": 60.05, "OELV": 60.05, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01732755, 31.29054002 ], [ 115.01759825, 31.2899004 ], [ 115.01799956, 31.28944879 ], [ 115.01868552, 31.28899784 ], [ 115.01952952, 31.28829943 ], [ 115.02028956, 31.28781776 ], [ 115.02087271, 31.28753844 ], [ 115.02164575, 31.28728715 ], [ 115.02205844, 31.28721898 ], [ 115.02665106, 31.28703037 ], [ 115.02784234, 31.2867203 ], [ 115.02831644, 31.28638568 ], [ 115.0288676, 31.28585054 ], [ 115.0290823, 31.28552555 ], [ 115.02933832, 31.28469342 ], [ 115.02926822, 31.28390646 ], [ 115.02903978, 31.2835898 ], [ 115.02843535, 31.28311236 ], [ 115.02740313, 31.28265255 ], [ 115.0268949, 31.28231431 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201C0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820500000000", "INDCD": "-1", "ONDCD": "QFA9820400000000", "BWSCD": "WFA98201C0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4183.0, "RVSLP": 0.0009, "IELV": 81.62, "OELV": 70.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87855961, 31.3525821 ], [ 114.87806916, 31.35250628 ], [ 114.87734381, 31.35207227 ], [ 114.87703032, 31.35197417 ], [ 114.87643429, 31.35198952 ], [ 114.87581385, 31.35214246 ], [ 114.87551613, 31.35207543 ], [ 114.87450621, 31.35128623 ], [ 114.87343819, 31.35001042 ], [ 114.87310432, 31.34975585 ], [ 114.87281909, 31.34965564 ], [ 114.87250427, 31.34979577 ], [ 114.87203856, 31.35052579 ], [ 114.87140617, 31.35100775 ], [ 114.87098608, 31.35155189 ], [ 114.87068037, 31.35179364 ], [ 114.87046241, 31.35184434 ], [ 114.8699138, 31.35174162 ], [ 114.86939585, 31.35172766 ], [ 114.8683517, 31.35190214 ], [ 114.8679377, 31.35169806 ], [ 114.86721981, 31.35085421 ], [ 114.86653221, 31.34979767 ], [ 114.86606374, 31.34924656 ], [ 114.86551194, 31.34835188 ], [ 114.86527211, 31.34763298 ], [ 114.86558161, 31.34649887 ], [ 114.8649378, 31.34436848 ], [ 114.86470772, 31.34414564 ], [ 114.86440998, 31.34401348 ], [ 114.86321481, 31.34392828 ], [ 114.86303787, 31.34380007 ], [ 114.86295757, 31.34362728 ], [ 114.86296557, 31.34337434 ], [ 114.86319193, 31.34290961 ], [ 114.86434564, 31.34124124 ], [ 114.8648002, 31.34039175 ], [ 114.86485682, 31.3399803 ], [ 114.86475192, 31.33964767 ], [ 114.86386414, 31.33847593 ], [ 114.86282136, 31.33758205 ], [ 114.86227314, 31.33691846 ], [ 114.86214369, 31.3366524 ], [ 114.86196613, 31.33565455 ], [ 114.86170562, 31.33505801 ], [ 114.8613617, 31.33471779 ], [ 114.86075781, 31.33445667 ], [ 114.86025461, 31.33438849 ], [ 114.8592168, 31.3344584 ], [ 114.85824218, 31.33480447 ], [ 114.85797043, 31.33478202 ], [ 114.85780631, 31.33468949 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201H0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98202H0000000", "INDCD": "-1", "ONDCD": "QFA98201H0000000", "BWSCD": "WFA98201H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 9121.0, "RVSLP": 0.0027, "IELV": 99.9, "OELV": 67.84, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90972395, 31.27323324 ], [ 114.90904734, 31.27270593 ], [ 114.90870377, 31.2723317 ], [ 114.90839162, 31.27159962 ], [ 114.90822672, 31.27045257 ], [ 114.90779611, 31.26974647 ], [ 114.90780082, 31.26948758 ], [ 114.90801486, 31.26887597 ], [ 114.9085523, 31.26818773 ], [ 114.90862796, 31.26793972 ], [ 114.90847406, 31.26740088 ], [ 114.90833985, 31.26639163 ], [ 114.90786935, 31.26545786 ], [ 114.90773023, 31.26438045 ], [ 114.9072625, 31.26352194 ], [ 114.90694024, 31.26264197 ], [ 114.90693836, 31.26221658 ], [ 114.90705694, 31.26174162 ], [ 114.90701722, 31.26130561 ], [ 114.90731962, 31.25992825 ], [ 114.907283, 31.25950363 ], [ 114.9070569, 31.25887722 ], [ 114.90702677, 31.25822785 ], [ 114.90742417, 31.25675162 ], [ 114.90744942, 31.25646953 ], [ 114.90739993, 31.25604676 ], [ 114.90706396, 31.25509165 ], [ 114.90685687, 31.25485012 ], [ 114.90658442, 31.25467084 ], [ 114.90528568, 31.25415154 ], [ 114.90469772, 31.25385012 ], [ 114.90403848, 31.25375241 ], [ 114.90268438, 31.25341398 ], [ 114.90007193, 31.25343559 ], [ 114.89940049, 31.25316818 ], [ 114.89925148, 31.25300202 ], [ 114.8991924, 31.25281598 ], [ 114.89919587, 31.25247486 ], [ 114.89935598, 31.25190213 ], [ 114.89933594, 31.25048148 ], [ 114.89943208, 31.25006974 ], [ 114.8997684, 31.24973551 ], [ 114.90057784, 31.24933849 ], [ 114.90104607, 31.24898806 ], [ 114.90237613, 31.24776184 ], [ 114.90257596, 31.24751023 ], [ 114.9027105, 31.24720596 ], [ 114.90272808, 31.24701752 ], [ 114.90258819, 31.24633184 ], [ 114.9025298, 31.24505727 ], [ 114.90254751, 31.24468862 ], [ 114.90270211, 31.2441205 ], [ 114.90274003, 31.24339793 ], [ 114.90295601, 31.24285416 ], [ 114.90324675, 31.24234208 ], [ 114.90386987, 31.24158568 ], [ 114.90411563, 31.240906 ], [ 114.90414043, 31.24041239 ], [ 114.90392421, 31.23971444 ], [ 114.90393636, 31.23939221 ], [ 114.90416232, 31.23907369 ], [ 114.90448601, 31.23881452 ], [ 114.90528923, 31.23859766 ], [ 114.90556988, 31.23844607 ], [ 114.90578248, 31.23821489 ], [ 114.90600457, 31.23769433 ], [ 114.90620667, 31.2374361 ], [ 114.90682869, 31.23684645 ], [ 114.90717414, 31.23662184 ], [ 114.90749658, 31.23655795 ], [ 114.90782896, 31.23657419 ], [ 114.90875981, 31.23690556 ], [ 114.90972212, 31.23714189 ], [ 114.91022099, 31.23711551 ], [ 114.91073846, 31.23689351 ], [ 114.91103102, 31.23664364 ], [ 114.91146544, 31.23601423 ], [ 114.91168102, 31.23548694 ], [ 114.91206887, 31.23506404 ], [ 114.91278577, 31.23467502 ], [ 114.91366832, 31.23445562 ], [ 114.91465099, 31.23363407 ], [ 114.91507078, 31.23312609 ], [ 114.91511609, 31.23285978 ], [ 114.91507198, 31.23259167 ], [ 114.91484226, 31.23227636 ], [ 114.91384891, 31.23143336 ], [ 114.91336021, 31.23083293 ], [ 114.91329533, 31.23054965 ], [ 114.91347339, 31.23036237 ], [ 114.91426057, 31.23014645 ], [ 114.91501728, 31.22963275 ], [ 114.91556246, 31.22945299 ], [ 114.91703414, 31.22876619 ], [ 114.91835558, 31.22794388 ], [ 114.91920817, 31.22766344 ], [ 114.91996791, 31.22756011 ], [ 114.92066364, 31.22738007 ], [ 114.92089134, 31.22741459 ], [ 114.92113976, 31.22758638 ], [ 114.92188867, 31.22840713 ], [ 114.9222134, 31.2292032 ], [ 114.92319563, 31.23001987 ], [ 114.92349715, 31.23015228 ], [ 114.92463875, 31.23036422 ], [ 114.92524051, 31.23037387 ], [ 114.92565856, 31.23031203 ], [ 114.92619828, 31.22994407 ], [ 114.92672224, 31.22925814 ], [ 114.92761746, 31.2283602 ], [ 114.9279659, 31.22777562 ], [ 114.92835199, 31.22684564 ], [ 114.92892423, 31.2262394 ], [ 114.92925972, 31.22599431 ], [ 114.92985527, 31.22573986 ], [ 114.93023746, 31.22573977 ], [ 114.93081392, 31.22590177 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98203F0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98202F0000000", "TRVCD": "AFA9820600000000", "INDCD": "QFA98202F0000000", "ONDCD": "QFA98203F0000000", "BWSCD": "WFA98203F0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 3882.0, "RVSLP": 0.0032, "IELV": 70.17, "OELV": 63.74, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81079811, 31.32540168 ], [ 114.81254166, 31.32532246 ], [ 114.81347363, 31.32500627 ], [ 114.81385924, 31.32461198 ], [ 114.81406741, 31.32394388 ], [ 114.81396364, 31.32336638 ], [ 114.81415359, 31.32270169 ], [ 114.81437405, 31.32238006 ], [ 114.8151722, 31.32160788 ], [ 114.81535033, 31.32120804 ], [ 114.81533603, 31.32078367 ], [ 114.81510972, 31.32015624 ], [ 114.8149924, 31.31936775 ], [ 114.81445293, 31.31784129 ], [ 114.81446273, 31.3172758 ], [ 114.81467104, 31.31696006 ], [ 114.81501511, 31.31675389 ], [ 114.81543716, 31.31670196 ], [ 114.81586555, 31.31673167 ], [ 114.81651597, 31.3168853 ], [ 114.817554, 31.31685958 ], [ 114.81786897, 31.31676397 ], [ 114.81835603, 31.31645742 ], [ 114.81895396, 31.31620022 ], [ 114.82085707, 31.3160649 ], [ 114.82132624, 31.31574808 ], [ 114.82175249, 31.31513234 ], [ 114.82180908, 31.31495808 ], [ 114.8216793, 31.31473226 ], [ 114.82027391, 31.31358179 ], [ 114.81956775, 31.31272841 ], [ 114.81929183, 31.31201272 ], [ 114.81940896, 31.31118646 ], [ 114.81923061, 31.31036632 ], [ 114.81930202, 31.31017597 ], [ 114.81950957, 31.30993642 ], [ 114.81999223, 31.30963972 ], [ 114.82031816, 31.30962493 ], [ 114.82088321, 31.30976154 ], [ 114.82208606, 31.30984836 ], [ 114.82238633, 31.30963501 ], [ 114.82287477, 31.3089461 ], [ 114.82298561, 31.30867194 ], [ 114.8232697, 31.30689894 ], [ 114.82363923, 31.30527106 ], [ 114.82361597, 31.30485917 ], [ 114.82339814, 31.30423636 ], [ 114.82334647, 31.30364179 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501F0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98502F0000000", "INDCD": "-1", "ONDCD": "QFA98501F0000000", "BWSCD": "WFA98501F0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6879.0, "RVSLP": 0.0025, "IELV": 60.0, "OELV": 43.47, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96625984, 31.00970616 ], [ 114.96583473, 31.00849455 ], [ 114.96584229, 31.00832982 ], [ 114.96714761, 31.00724849 ], [ 114.96733032, 31.00700061 ], [ 114.96734775, 31.00676598 ], [ 114.96711047, 31.00648553 ], [ 114.96645417, 31.00613159 ], [ 114.96568927, 31.00556192 ], [ 114.96510045, 31.00497635 ], [ 114.96501441, 31.00463698 ], [ 114.96489144, 31.00331989 ], [ 114.96426267, 31.00258568 ], [ 114.9641682, 31.00232412 ], [ 114.96420577, 31.00191978 ], [ 114.96450586, 31.00139371 ], [ 114.96446744, 31.00118375 ], [ 114.96424935, 31.00106631 ], [ 114.96359036, 31.00113991 ], [ 114.96331032, 31.00100281 ], [ 114.96263434, 31.00024314 ], [ 114.96250954, 30.99985321 ], [ 114.9627656, 30.99882119 ], [ 114.96330562, 30.99811432 ], [ 114.96353196, 30.99737428 ], [ 114.96451243, 30.9963439 ], [ 114.96481026, 30.99582417 ], [ 114.96540687, 30.99404955 ], [ 114.96573841, 30.99330772 ], [ 114.96575386, 30.99312043 ], [ 114.96566603, 30.99294038 ], [ 114.96543268, 30.99273177 ], [ 114.96475967, 30.99248258 ], [ 114.96445727, 30.99253357 ], [ 114.96397181, 30.9927895 ], [ 114.96375754, 30.992796 ], [ 114.96352026, 30.99264154 ], [ 114.96329148, 30.99228211 ], [ 114.96324651, 30.99188601 ], [ 114.96356984, 30.99123211 ], [ 114.96345784, 30.99064347 ], [ 114.96351591, 30.98999581 ], [ 114.96263093, 30.98905607 ], [ 114.96243055, 30.98785443 ], [ 114.96174005, 30.98699037 ], [ 114.96157649, 30.98630429 ], [ 114.96121372, 30.98567004 ], [ 114.96141497, 30.98514021 ], [ 114.96140153, 30.98504166 ], [ 114.96120132, 30.98490998 ], [ 114.96059568, 30.9848078 ], [ 114.96044486, 30.98465191 ], [ 114.96054796, 30.98443929 ], [ 114.96120734, 30.98379387 ], [ 114.96142189, 30.98347948 ], [ 114.9613541, 30.98291394 ], [ 114.96147893, 30.9821455 ], [ 114.96140053, 30.98157987 ], [ 114.96068769, 30.98072556 ], [ 114.96042174, 30.98012365 ], [ 114.96027154, 30.9793541 ], [ 114.95989373, 30.97835602 ], [ 114.95964028, 30.97820413 ], [ 114.9588993, 30.9781415 ], [ 114.95869069, 30.9780702 ], [ 114.95855449, 30.97792815 ], [ 114.95852379, 30.97752616 ], [ 114.95837781, 30.97729917 ], [ 114.95799216, 30.97699787 ], [ 114.95748059, 30.97673607 ], [ 114.95724331, 30.976486 ], [ 114.95723888, 30.97637631 ], [ 114.95734162, 30.97620748 ], [ 114.95800307, 30.97565099 ], [ 114.95822621, 30.9753062 ], [ 114.95829024, 30.97496982 ], [ 114.95821714, 30.97431794 ], [ 114.95861634, 30.97378015 ], [ 114.95868092, 30.97353965 ], [ 114.95855403, 30.97329938 ], [ 114.95805046, 30.97276381 ], [ 114.95749514, 30.97166871 ], [ 114.95748533, 30.97148525 ], [ 114.95776814, 30.9700757 ], [ 114.95771156, 30.96985354 ], [ 114.9574013, 30.96969287 ], [ 114.95611573, 30.96966275 ], [ 114.95591781, 30.96956383 ], [ 114.95580369, 30.96940034 ], [ 114.95577981, 30.96914955 ], [ 114.9560075, 30.96801515 ], [ 114.95653215, 30.96731198 ], [ 114.9566326, 30.96705276 ], [ 114.95640785, 30.96616622 ], [ 114.956376, 30.96550198 ], [ 114.95647533, 30.96486142 ], [ 114.95643583, 30.96465475 ], [ 114.95632554, 30.96451845 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122I00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121IA0000,AFA9900121I00000", "TRVCD": "AFA990012B000000", "INDCD": "QFA9900121I00000", "ONDCD": "QFA990012A000000", "BWSCD": "WFA9900122I00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 1821.0, "RVSLP": 0.0122, "IELV": 105.23, "OELV": 89.64, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37180496, 31.11763871 ], [ 115.37128989, 31.11764359 ], [ 115.37089774, 31.11753204 ], [ 115.3706428, 31.11732615 ], [ 115.37018809, 31.11679764 ], [ 115.36971378, 31.11644714 ], [ 115.36862602, 31.11582746 ], [ 115.3678989, 31.11569335 ], [ 115.36769053, 31.11559553 ], [ 115.36731165, 31.11505792 ], [ 115.36714039, 31.11406637 ], [ 115.36691586, 31.11374758 ], [ 115.36596551, 31.11302072 ], [ 115.3653399, 31.11282659 ], [ 115.3650476, 31.11267018 ], [ 115.36354573, 31.11151577 ], [ 115.36286626, 31.11123241 ], [ 115.36207027, 31.11104353 ], [ 115.36107226, 31.11094241 ], [ 115.35993989, 31.11022489 ], [ 115.35860518, 31.11010047 ], [ 115.35824223, 31.10983685 ], [ 115.35783625, 31.10932365 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012G000000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA990012F000000,AFA9900122M00000", "TRVCD": "AFA990012H000000", "INDCD": "QFA990012F000000", "ONDCD": "QFA990012G000000", "BWSCD": "WFA990012G000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 20.0, "RVLEN": 2019.0, "RVSLP": 0.0, "IELV": 71.69, "OELV": 70.14, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34388499, 30.96289332 ], [ 115.34380299, 30.9627664 ], [ 115.34377636, 30.9620257 ], [ 115.34349117, 30.96136209 ], [ 115.34304888, 30.96057216 ], [ 115.34274842, 30.95967996 ], [ 115.34260949, 30.95898398 ], [ 115.34243751, 30.95856426 ], [ 115.34230189, 30.95679393 ], [ 115.34219045, 30.95637813 ], [ 115.34165022, 30.95534179 ], [ 115.34124932, 30.95493234 ], [ 115.34089675, 30.95471244 ], [ 115.34006615, 30.95436806 ], [ 115.33916204, 30.95374368 ], [ 115.33831981, 30.95343758 ], [ 115.33784126, 30.95308284 ], [ 115.33749053, 30.95272999 ], [ 115.3366939, 30.95147121 ], [ 115.33633007, 30.95060087 ], [ 115.33623729, 30.9489398 ], [ 115.33631979, 30.94849786 ], [ 115.33645588, 30.94828259 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121F00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122F00000", "INDCD": "-1", "ONDCD": "QFA9800121F00000", "BWSCD": "WFA9800121F00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7899.0, "RVSLP": 0.0125, "IELV": 259.1, "OELV": 159.91, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9913995, 31.50506382 ], [ 114.99102652, 31.50472967 ], [ 114.99032171, 31.50389216 ], [ 114.99008757, 31.50350428 ], [ 114.98945282, 31.50196599 ], [ 114.98941769, 31.50145956 ], [ 114.98946777, 31.50111158 ], [ 114.99007902, 31.49983025 ], [ 114.99014217, 31.49838248 ], [ 114.99039647, 31.49784336 ], [ 114.99097781, 31.49693163 ], [ 114.99104089, 31.49658592 ], [ 114.9910281, 31.49599228 ], [ 114.99091425, 31.49543389 ], [ 114.99053029, 31.49492008 ], [ 114.98991577, 31.49352975 ], [ 114.98975963, 31.49215402 ], [ 114.98943796, 31.49142777 ], [ 114.98902938, 31.49085108 ], [ 114.98848539, 31.48871784 ], [ 114.98869492, 31.48800556 ], [ 114.98969262, 31.48697764 ], [ 114.9900063, 31.48646311 ], [ 114.99026236, 31.48592562 ], [ 114.99062028, 31.4848405 ], [ 114.99080663, 31.48457419 ], [ 114.99123144, 31.48417202 ], [ 114.99153576, 31.48402828 ], [ 114.99169599, 31.4841061 ], [ 114.99191369, 31.48447723 ], [ 114.99212385, 31.48461766 ], [ 114.9927764, 31.48447019 ], [ 114.99338042, 31.48419648 ], [ 114.9935518, 31.48426723 ], [ 114.99407524, 31.48476418 ], [ 114.99439401, 31.48482324 ], [ 114.99528217, 31.48455193 ], [ 114.99631795, 31.48366995 ], [ 114.99667041, 31.4835382 ], [ 114.99719571, 31.48369037 ], [ 114.99778177, 31.48400576 ], [ 114.99833155, 31.48417365 ], [ 114.99883973, 31.48441845 ], [ 114.99906115, 31.484444 ], [ 114.99927359, 31.4843725 ], [ 115.00048047, 31.48369838 ], [ 115.00176365, 31.48278423 ], [ 115.00244243, 31.48214003 ], [ 115.00313794, 31.48127343 ], [ 115.00447528, 31.48008807 ], [ 115.00491636, 31.47988077 ], [ 115.00523337, 31.47980612 ], [ 115.00564876, 31.47981674 ], [ 115.00620507, 31.47995212 ], [ 115.00670162, 31.47992594 ], [ 115.00825513, 31.47942434 ], [ 115.00853976, 31.47926691 ], [ 115.00899387, 31.47879554 ], [ 115.00919008, 31.4782629 ], [ 115.00967372, 31.47734229 ], [ 115.0103645, 31.47661163 ], [ 115.01094775, 31.47587398 ], [ 115.0112702, 31.47561285 ], [ 115.01246081, 31.47488956 ], [ 115.01348745, 31.47400347 ], [ 115.01490021, 31.4731916 ], [ 115.0154139, 31.47295222 ], [ 115.0161899, 31.47270232 ], [ 115.01710392, 31.47256376 ], [ 115.01764583, 31.47239409 ], [ 115.01954249, 31.47228017 ], [ 115.02025072, 31.47208329 ], [ 115.0214467, 31.47198199 ], [ 115.02172357, 31.47184917 ], [ 115.02205883, 31.47128715 ], [ 115.02229767, 31.47030204 ], [ 115.02232416, 31.46994636 ], [ 115.02225486, 31.46937442 ], [ 115.02173203, 31.46792603 ], [ 115.02167896, 31.46734049 ], [ 115.02171988, 31.46691559 ], [ 115.02181968, 31.46671216 ], [ 115.02209743, 31.46640298 ], [ 115.023882, 31.46479016 ], [ 115.02454558, 31.46449252 ], [ 115.02501856, 31.46453399 ], [ 115.02584753, 31.46513576 ], [ 115.0265362, 31.46581395 ], [ 115.02686029, 31.46595796 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121M00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012J000000", "INDCD": "-1", "ONDCD": "QFA980012I000000", "BWSCD": "WFA9800121M00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 7612.0, "RVSLP": 0.0034, "IELV": 79.88, "OELV": 50.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9934802, 31.24450428 ], [ 114.99461981, 31.24347578 ], [ 114.99658609, 31.2427155 ], [ 114.99770444, 31.24190249 ], [ 114.99798425, 31.24138571 ], [ 114.99802171, 31.24096601 ], [ 114.99796041, 31.2406158 ], [ 114.99757388, 31.23989378 ], [ 114.99753987, 31.23970809 ], [ 114.99764305, 31.23945437 ], [ 114.99815014, 31.23880107 ], [ 114.99908709, 31.23813006 ], [ 114.99946733, 31.23799835 ], [ 114.99987986, 31.23800234 ], [ 115.00060437, 31.23815238 ], [ 115.00316415, 31.23814953 ], [ 115.00331806, 31.23796377 ], [ 115.00341702, 31.23750623 ], [ 115.00356372, 31.23723583 ], [ 115.00503368, 31.23580518 ], [ 115.00551159, 31.23521301 ], [ 115.0064148, 31.23470624 ], [ 115.00708505, 31.23421577 ], [ 115.0076017, 31.23401019 ], [ 115.00777237, 31.23387153 ], [ 115.00798774, 31.23349578 ], [ 115.00852773, 31.23296189 ], [ 115.00882096, 31.23214572 ], [ 115.00878357, 31.23166956 ], [ 115.00840685, 31.2310447 ], [ 115.00843296, 31.23086378 ], [ 115.00868989, 31.23040854 ], [ 115.00871958, 31.23021655 ], [ 115.00850442, 31.22946259 ], [ 115.00852032, 31.22896984 ], [ 115.0087735, 31.2285756 ], [ 115.00953371, 31.22788222 ], [ 115.00990364, 31.22771551 ], [ 115.01039828, 31.22770803 ], [ 115.01177413, 31.22821955 ], [ 115.01218198, 31.2282857 ], [ 115.01346972, 31.22821619 ], [ 115.01451014, 31.22783319 ], [ 115.01473239, 31.22786535 ], [ 115.01540095, 31.2281478 ], [ 115.01616597, 31.22815005 ], [ 115.01662997, 31.22799418 ], [ 115.01755008, 31.22726997 ], [ 115.01831826, 31.22701026 ], [ 115.01904676, 31.22685085 ], [ 115.01945257, 31.22657171 ], [ 115.01992564, 31.22609335 ], [ 115.02033202, 31.22553031 ], [ 115.02171171, 31.22423471 ], [ 115.02197026, 31.22391811 ], [ 115.02204665, 31.22358421 ], [ 115.02197376, 31.22325479 ], [ 115.02140549, 31.22264881 ], [ 115.02126065, 31.22238832 ], [ 115.02119764, 31.22188667 ], [ 115.0212391, 31.22153611 ], [ 115.02150975, 31.22116415 ], [ 115.02205975, 31.22081331 ], [ 115.02228561, 31.22058841 ], [ 115.02240127, 31.2203237 ], [ 115.0224428, 31.21960044 ], [ 115.02252362, 31.21932579 ], [ 115.0228968, 31.21888588 ], [ 115.02342399, 31.21846644 ], [ 115.02394553, 31.21822718 ], [ 115.02443845, 31.21817185 ], [ 115.0247576, 31.21824218 ], [ 115.02517605, 31.21852242 ], [ 115.02546163, 31.2188211 ], [ 115.02568899, 31.21920477 ], [ 115.02590175, 31.22010764 ], [ 115.02643811, 31.22100149 ], [ 115.02721154, 31.22190373 ], [ 115.02774366, 31.22233206 ], [ 115.02803559, 31.22248415 ], [ 115.02836437, 31.22253622 ], [ 115.02922866, 31.22251187 ], [ 115.0297345, 31.22244606 ], [ 115.03044157, 31.22224914 ], [ 115.03260878, 31.22216184 ], [ 115.0331183, 31.22218799 ], [ 115.0342815, 31.22244232 ], [ 115.03462966, 31.22233395 ], [ 115.03488874, 31.22217172 ], [ 115.03519038, 31.22166952 ], [ 115.03523148, 31.22118219 ], [ 115.0350272, 31.2206226 ], [ 115.03498974, 31.22034795 ], [ 115.03503028, 31.22008038 ], [ 115.03520427, 31.21981714 ], [ 115.03571758, 31.21939817 ], [ 115.03696622, 31.21879779 ], [ 115.03751417, 31.21843977 ], [ 115.03896217, 31.2177044 ], [ 115.03939766, 31.21721929 ], [ 115.03951024, 31.21673755 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PDA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PDA000", "INDCD": "-1", "ONDCD": "QFA9800121PDA000", "BWSCD": "WFA9800121PDA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6380.0, "RVSLP": 0.0146, "IELV": 242.03, "OELV": 136.03, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2983481, 31.24707963 ], [ 115.29772026, 31.24763618 ], [ 115.29785754, 31.24842785 ], [ 115.29775575, 31.24858972 ], [ 115.29757573, 31.24859623 ], [ 115.29576438, 31.24813966 ], [ 115.29484171, 31.24806888 ], [ 115.29430206, 31.24788864 ], [ 115.29374397, 31.24752841 ], [ 115.29310844, 31.24681907 ], [ 115.29223429, 31.24611969 ], [ 115.29176955, 31.24596751 ], [ 115.29128233, 31.24603601 ], [ 115.29076153, 31.24644114 ], [ 115.29011172, 31.24733181 ], [ 115.2898508, 31.24786896 ], [ 115.28968771, 31.24877176 ], [ 115.28894989, 31.24963079 ], [ 115.28891848, 31.24987379 ], [ 115.28911439, 31.25064179 ], [ 115.28911997, 31.25130203 ], [ 115.28884005, 31.25220557 ], [ 115.28862987, 31.25258234 ], [ 115.28846826, 31.25273788 ], [ 115.28817444, 31.25284059 ], [ 115.28732384, 31.25292234 ], [ 115.28644572, 31.25313793 ], [ 115.28541098, 31.25316809 ], [ 115.2846047, 31.25300928 ], [ 115.28383278, 31.25300259 ], [ 115.28297187, 31.25306039 ], [ 115.28226076, 31.25327044 ], [ 115.28167479, 31.25330231 ], [ 115.28144782, 31.2532481 ], [ 115.28127168, 31.25311563 ], [ 115.28098823, 31.25240431 ], [ 115.28062525, 31.25209599 ], [ 115.28022575, 31.25201418 ], [ 115.27884755, 31.25200466 ], [ 115.27810787, 31.25164782 ], [ 115.27767649, 31.25154831 ], [ 115.27741872, 31.25166856 ], [ 115.27712021, 31.2519445 ], [ 115.2764008, 31.25287475 ], [ 115.27632962, 31.25305151 ], [ 115.276469, 31.25341225 ], [ 115.27697649, 31.25425857 ], [ 115.27705479, 31.25483436 ], [ 115.27698806, 31.25523882 ], [ 115.27671179, 31.25547472 ], [ 115.275502, 31.25571604 ], [ 115.27528861, 31.25570448 ], [ 115.27511358, 31.25559005 ], [ 115.27458417, 31.25464674 ], [ 115.27427327, 31.2543838 ], [ 115.27396832, 31.25427601 ], [ 115.27336963, 31.25426744 ], [ 115.27287452, 31.25436645 ], [ 115.27195235, 31.25509697 ], [ 115.27165878, 31.25521044 ], [ 115.27127062, 31.25516027 ], [ 115.27036209, 31.25452751 ], [ 115.26988976, 31.25441353 ], [ 115.26948317, 31.2544731 ], [ 115.26858818, 31.2548605 ], [ 115.26749105, 31.25509586 ], [ 115.26720211, 31.25498991 ], [ 115.26638562, 31.25436432 ], [ 115.26602382, 31.25416 ], [ 115.26466609, 31.25410827 ], [ 115.26339762, 31.25379564 ], [ 115.26273754, 31.25371367 ], [ 115.26074998, 31.2529742 ], [ 115.25979212, 31.25274632 ], [ 115.25948394, 31.2527642 ], [ 115.2593063, 31.25284698 ], [ 115.25894582, 31.25356239 ], [ 115.25875588, 31.25378831 ], [ 115.2573456, 31.25457216 ], [ 115.25633435, 31.25469222 ], [ 115.2556325, 31.25487133 ], [ 115.25421824, 31.25459822 ], [ 115.25395193, 31.25464121 ], [ 115.25379834, 31.25474197 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PE0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800127P00000", "INDCD": "-1", "ONDCD": "QFA9800126P00000", "BWSCD": "WFA9800121PE0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6395.0, "RVSLP": 0.0077, "IELV": 137.65, "OELV": 82.29, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19146177, 31.33204416 ], [ 115.19012601, 31.33159366 ], [ 115.18969139, 31.3312352 ], [ 115.18958561, 31.33083704 ], [ 115.1897765, 31.32991567 ], [ 115.18969034, 31.32843508 ], [ 115.18943407, 31.32805455 ], [ 115.18851439, 31.32727335 ], [ 115.18840887, 31.32708412 ], [ 115.18839007, 31.32689468 ], [ 115.18848867, 31.32663611 ], [ 115.18899646, 31.32599815 ], [ 115.18914587, 31.32539363 ], [ 115.189484, 31.32463627 ], [ 115.18950577, 31.32422758 ], [ 115.18928118, 31.32360098 ], [ 115.18924058, 31.32309866 ], [ 115.18933578, 31.32274621 ], [ 115.1896095, 31.32233413 ], [ 115.18980278, 31.32224541 ], [ 115.19009916, 31.32227989 ], [ 115.1910222, 31.3226459 ], [ 115.19161653, 31.32296647 ], [ 115.19241649, 31.32318002 ], [ 115.19270369, 31.32317384 ], [ 115.19283667, 31.32307296 ], [ 115.19287586, 31.32284684 ], [ 115.19282557, 31.32258804 ], [ 115.19204588, 31.32081873 ], [ 115.19196644, 31.31949284 ], [ 115.19223659, 31.318308 ], [ 115.19284381, 31.31709523 ], [ 115.19308489, 31.31621327 ], [ 115.19299553, 31.31596981 ], [ 115.19275558, 31.31578772 ], [ 115.19229344, 31.31561028 ], [ 115.19179445, 31.31559395 ], [ 115.19156839, 31.31566264 ], [ 115.19139798, 31.31580669 ], [ 115.19116558, 31.31631778 ], [ 115.19095601, 31.31655247 ], [ 115.19076048, 31.31666222 ], [ 115.19054198, 31.31667192 ], [ 115.1888187, 31.31561763 ], [ 115.18814561, 31.31508326 ], [ 115.1879458, 31.31479844 ], [ 115.18812208, 31.31408403 ], [ 115.18894753, 31.3127063 ], [ 115.18900969, 31.3121424 ], [ 115.18894646, 31.31156173 ], [ 115.18873385, 31.31100321 ], [ 115.18859577, 31.31015191 ], [ 115.18815171, 31.30935574 ], [ 115.18782882, 31.30861741 ], [ 115.18777407, 31.30826543 ], [ 115.18780637, 31.30791802 ], [ 115.18795994, 31.3076603 ], [ 115.18820958, 31.30746271 ], [ 115.18902399, 31.30725659 ], [ 115.189312, 31.30708711 ], [ 115.18981456, 31.30662604 ], [ 115.18997572, 31.30631238 ], [ 115.18983712, 31.30602272 ], [ 115.1895061, 31.30583325 ], [ 115.1887184, 31.30595365 ], [ 115.18832611, 31.30586124 ], [ 115.18804131, 31.30560459 ], [ 115.18800713, 31.30529494 ], [ 115.18823526, 31.30484112 ], [ 115.18866615, 31.30446477 ], [ 115.1892739, 31.30421376 ], [ 115.1901205, 31.30409965 ], [ 115.19054396, 31.30385217 ], [ 115.19096616, 31.30336807 ], [ 115.19115987, 31.30295965 ], [ 115.1912064, 31.30260867 ], [ 115.19116037, 31.30133173 ], [ 115.19107562, 31.30083507 ], [ 115.19084416, 31.30052016 ], [ 115.18982973, 31.29970396 ], [ 115.18956562, 31.29939408 ], [ 115.18947693, 31.29905459 ], [ 115.18936954, 31.29795963 ], [ 115.18892607, 31.29693802 ], [ 115.18874797, 31.29633752 ], [ 115.18829337, 31.29547253 ], [ 115.18820758, 31.29421714 ], [ 115.18825863, 31.29386388 ], [ 115.18843117, 31.29338215 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122JE0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121JE0000", "TRVCD": "AFA9800127J00000", "INDCD": "QFA9800121JE0000", "ONDCD": "QFA9800126J00000", "BWSCD": "WFA9800122JE0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4810.0, "RVSLP": 0.0033, "IELV": 70.0, "OELV": 60.05, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99120145, 31.31445213 ], [ 114.99228523, 31.31481077 ], [ 114.99334817, 31.31500589 ], [ 114.99367057, 31.31501329 ], [ 114.99396022, 31.31489933 ], [ 114.99417598, 31.3146865 ], [ 114.99424693, 31.3145019 ], [ 114.99407071, 31.31382336 ], [ 114.99403, 31.31308582 ], [ 114.99419601, 31.31237026 ], [ 114.99424581, 31.31157763 ], [ 114.99441172, 31.31125207 ], [ 114.99465566, 31.31104988 ], [ 114.99526535, 31.31081988 ], [ 114.99603811, 31.31035637 ], [ 114.99694762, 31.30961014 ], [ 114.99840952, 31.30870788 ], [ 114.99942667, 31.30838613 ], [ 114.99988735, 31.3079435 ], [ 114.99996019, 31.30769409 ], [ 114.99987173, 31.30718417 ], [ 115.00005102, 31.30672366 ], [ 115.00040538, 31.30613965 ], [ 115.00110384, 31.30540684 ], [ 115.00122281, 31.30507378 ], [ 115.00115378, 31.30467818 ], [ 115.00059212, 31.30407449 ], [ 115.00045127, 31.30381421 ], [ 115.00032219, 31.30264796 ], [ 115.00012039, 31.30202995 ], [ 115.00013562, 31.30177028 ], [ 115.00117044, 31.29971221 ], [ 115.00136811, 31.29896172 ], [ 115.00162316, 31.29864315 ], [ 115.00249854, 31.29781425 ], [ 115.0030334, 31.2974172 ], [ 115.00352449, 31.29733247 ], [ 115.00402416, 31.297376 ], [ 115.00511561, 31.29771952 ], [ 115.00615446, 31.29770767 ], [ 115.00672565, 31.29758202 ], [ 115.00737184, 31.29704199 ], [ 115.00762475, 31.29664696 ], [ 115.00764114, 31.29615439 ], [ 115.00736759, 31.29531379 ], [ 115.00733425, 31.29450375 ], [ 115.00750775, 31.29409667 ], [ 115.00793803, 31.29370994 ], [ 115.00840689, 31.29356192 ], [ 115.01022374, 31.29346844 ], [ 115.01141623, 31.2931677 ], [ 115.01448843, 31.29171403 ], [ 115.01596815, 31.29046436 ], [ 115.01626032, 31.29041165 ], [ 115.01710798, 31.2906145 ], [ 115.01732755, 31.29054002 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122TB0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121TB0000", "TRVCD": "AFA9800123TB0000", "INDCD": "QFA9800121TB0000", "ONDCD": "QFA9800122TB0000", "BWSCD": "WFA9800122TB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75509825, 31.15105992 ], [ 114.75473637, 31.15076165 ], [ 114.75471203, 31.15053167 ] ], [ [ 114.75509825, 31.15105992 ], [ 114.75484851, 31.15127117 ], [ 114.75473845, 31.15146134 ], [ 114.75470776, 31.15170975 ], [ 114.75476604, 31.15195393 ], [ 114.75470018, 31.1520986 ], [ 114.75385703, 31.15254222 ], [ 114.75356848, 31.1528198 ], [ 114.75358799, 31.15290624 ], [ 114.75367181, 31.15292244 ], [ 114.75454427, 31.15277238 ], [ 114.75475442, 31.15284938 ], [ 114.75486562, 31.15305724 ], [ 114.75473639, 31.15322272 ], [ 114.75431634, 31.15335018 ], [ 114.75398848, 31.15398976 ], [ 114.7540443, 31.15408891 ], [ 114.75419412, 31.15415357 ], [ 114.75471954, 31.15404063 ], [ 114.7547515, 31.15419973 ], [ 114.75459006, 31.15439358 ], [ 114.75376951, 31.15497001 ], [ 114.75366822, 31.15517392 ], [ 114.75365933, 31.15535576 ], [ 114.75379416, 31.15544811 ], [ 114.75434952, 31.15535789 ], [ 114.75454364, 31.15542161 ], [ 114.75464205, 31.15610007 ], [ 114.75522608, 31.1573344 ], [ 114.75594365, 31.15723334 ], [ 114.75631563, 31.1572489 ], [ 114.75695848, 31.15747665 ], [ 114.75743753, 31.15743679 ], [ 114.75764353, 31.1575937 ], [ 114.75764903, 31.15798159 ], [ 114.75789153, 31.15830645 ], [ 114.75791431, 31.1584719 ], [ 114.75764415, 31.15901632 ], [ 114.75771594, 31.15936843 ], [ 114.75743081, 31.15984338 ], [ 114.75740714, 31.16014955 ], [ 114.75751152, 31.16029586 ], [ 114.75772238, 31.16034615 ], [ 114.75821419, 31.16011396 ], [ 114.75836795, 31.16010007 ], [ 114.75851422, 31.16025943 ], [ 114.75860433, 31.1606685 ], [ 114.75855614, 31.16104066 ], [ 114.75830002, 31.16123949 ], [ 114.75824404, 31.16139013 ], [ 114.75839637, 31.16193354 ], [ 114.75842847, 31.16231449 ], [ 114.75814391, 31.163332 ], [ 114.75821103, 31.16340612 ], [ 114.75857366, 31.16327921 ], [ 114.75877179, 31.16333163 ], [ 114.75894208, 31.16365336 ], [ 114.75924092, 31.16463403 ], [ 114.75970371, 31.16508404 ], [ 114.75978044, 31.16527124 ], [ 114.75968677, 31.16557633 ], [ 114.75935823, 31.16598953 ], [ 114.75891833, 31.16635043 ], [ 114.75812007, 31.16684091 ], [ 114.75799598, 31.16703021 ], [ 114.75810362, 31.1670945 ], [ 114.75843002, 31.16705645 ], [ 114.76000622, 31.1665524 ], [ 114.76028725, 31.16658838 ], [ 114.76047667, 31.16679995 ], [ 114.76061436, 31.16726506 ], [ 114.76071039, 31.16834786 ], [ 114.76082924, 31.16894575 ], [ 114.76066711, 31.16951577 ], [ 114.76068538, 31.1697265 ], [ 114.7616829, 31.17112751 ], [ 114.76210356, 31.17200264 ], [ 114.76224134, 31.17249315 ], [ 114.7621741, 31.17322793 ], [ 114.76226356, 31.17421567 ], [ 114.76215172, 31.17467753 ], [ 114.76176847, 31.17568077 ], [ 114.76175196, 31.17614762 ], [ 114.76184272, 31.1766311 ], [ 114.76216199, 31.17709978 ], [ 114.76233567, 31.17770417 ], [ 114.76301158, 31.17864633 ], [ 114.76419432, 31.17946108 ], [ 114.76489898, 31.18012799 ], [ 114.76548503, 31.18033376 ], [ 114.76565587, 31.18029615 ], [ 114.76563863, 31.18018382 ] ], [ [ 114.7660962, 31.18017024 ], [ 114.76563863, 31.18018382 ] ], [ [ 114.76563863, 31.18018382 ], [ 114.76533229, 31.17996807 ], [ 114.76476839, 31.17892209 ], [ 114.76420227, 31.17834765 ], [ 114.76373554, 31.17764083 ], [ 114.76308768, 31.17682574 ], [ 114.76295443, 31.17651963 ], [ 114.76293628, 31.17619427 ], [ 114.76315559, 31.1752165 ], [ 114.76365979, 31.174407 ], [ 114.76405302, 31.17401528 ], [ 114.76413576, 31.17341499 ], [ 114.76431372, 31.17304418 ], [ 114.76548446, 31.17199951 ], [ 114.7658279, 31.17184845 ], [ 114.76642242, 31.17177426 ], [ 114.76649393, 31.1717005 ], [ 114.76632018, 31.17155758 ], [ 114.7658, 31.17150833 ], [ 114.76536361, 31.17160671 ], [ 114.76463403, 31.17190592 ], [ 114.76439828, 31.17192756 ], [ 114.76405682, 31.17176808 ], [ 114.76378028, 31.1714242 ], [ 114.76363644, 31.17097 ], [ 114.76367549, 31.17061099 ], [ 114.76332608, 31.17030422 ], [ 114.76280034, 31.16934009 ], [ 114.76279209, 31.16834029 ], [ 114.7626555, 31.16793216 ], [ 114.7623196, 31.16739565 ], [ 114.76225587, 31.16670192 ], [ 114.76171029, 31.16599569 ], [ 114.7616037, 31.16566866 ], [ 114.76155613, 31.16512952 ], [ 114.76110175, 31.16480513 ], [ 114.76091193, 31.16445876 ], [ 114.76072628, 31.16357606 ], [ 114.76068411, 31.16306567 ], [ 114.76093225, 31.16156177 ], [ 114.76030232, 31.16001034 ], [ 114.76003107, 31.15879408 ], [ 114.76016041, 31.15858233 ], [ 114.76058837, 31.15857764 ], [ 114.7615557, 31.15879764 ], [ 114.762972, 31.15938751 ], [ 114.76330822, 31.15942677 ], [ 114.76336989, 31.15931849 ], [ 114.76301838, 31.1590133 ], [ 114.76203432, 31.15854791 ], [ 114.76114222, 31.15796833 ], [ 114.76078413, 31.15761431 ], [ 114.7607064, 31.1574213 ], [ 114.76072156, 31.15717643 ], [ 114.76118412, 31.15622274 ], [ 114.76117604, 31.15598012 ], [ 114.76094445, 31.15609048 ], [ 114.76027536, 31.15683921 ], [ 114.75999444, 31.15694392 ], [ 114.75969576, 31.1569118 ], [ 114.75944492, 31.15668616 ], [ 114.75949952, 31.15610402 ], [ 114.75942093, 31.15598998 ], [ 114.7586705, 31.15625706 ], [ 114.75766402, 31.15619627 ], [ 114.75744195, 31.1561042 ], [ 114.75730598, 31.15590829 ], [ 114.75728824, 31.15567559 ], [ 114.75737184, 31.15548435 ], [ 114.75765747, 31.15515598 ], [ 114.75703434, 31.15494441 ], [ 114.75686398, 31.15475361 ], [ 114.75680103, 31.15450955 ], [ 114.75698808, 31.1536604 ], [ 114.75747906, 31.15323814 ], [ 114.75722404, 31.15268904 ], [ 114.7572816, 31.1525379 ], [ 114.75747869, 31.15248425 ], [ 114.75800805, 31.15260492 ], [ 114.75945517, 31.15331402 ], [ 114.75996201, 31.15347029 ], [ 114.76016022, 31.15361532 ], [ 114.7604007, 31.15394952 ], [ 114.76102929, 31.15371761 ], [ 114.76157394, 31.15363166 ], [ 114.7642131, 31.15436822 ], [ 114.76491809, 31.15440624 ], [ 114.76524008, 31.1543217 ], [ 114.76533633, 31.15422232 ], [ 114.76450621, 31.1538384 ], [ 114.76356609, 31.15355008 ], [ 114.76309737, 31.15320363 ], [ 114.76190448, 31.15255024 ], [ 114.76152402, 31.15253157 ], [ 114.76098997, 31.15274364 ], [ 114.76071593, 31.1527458 ], [ 114.75994394, 31.15202494 ], [ 114.75931233, 31.15176433 ], [ 114.75897573, 31.15154385 ], [ 114.75845234, 31.15136955 ], [ 114.75820122, 31.15120461 ], [ 114.75781407, 31.15116849 ], [ 114.75752189, 31.15075353 ], [ 114.75693992, 31.15045348 ], [ 114.75648772, 31.15045565 ], [ 114.75598186, 31.15056773 ], [ 114.75509825, 31.15105992 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800128Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800127Q00000,AFA9800121QE0000", "TRVCD": "AFA9800129Q00000", "INDCD": "QFA9800127Q00000", "ONDCD": "QFA9800128Q00000", "BWSCD": "WFA9800128Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 11.0, "RVLEN": 3882.0, "RVSLP": 0.0021, "IELV": 49.45, "OELV": 41.58, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99103169, 31.07352627 ], [ 114.99069463, 31.07388414 ], [ 114.99019049, 31.07458411 ], [ 114.98969782, 31.07539844 ], [ 114.98873243, 31.07614195 ], [ 114.98784918, 31.07704351 ], [ 114.98716564, 31.07835388 ], [ 114.98666962, 31.07957231 ], [ 114.98663991, 31.08110962 ], [ 114.98646731, 31.08151194 ], [ 114.98543294, 31.08252165 ], [ 114.98501157, 31.08305272 ], [ 114.9845844, 31.08337643 ], [ 114.98409846, 31.08394836 ], [ 114.98240952, 31.08492227 ], [ 114.98194971, 31.08528062 ], [ 114.98153579, 31.08569938 ], [ 114.98105512, 31.08640021 ], [ 114.98080259, 31.08721234 ], [ 114.98004732, 31.08830433 ], [ 114.97986588, 31.08875645 ], [ 114.97952559, 31.08928998 ], [ 114.97927465, 31.09004018 ], [ 114.97916402, 31.0908054 ], [ 114.97856381, 31.09164442 ], [ 114.97832015, 31.09261887 ], [ 114.97830436, 31.09416173 ], [ 114.9780766, 31.0947044 ], [ 114.97772587, 31.09528352 ], [ 114.97734571, 31.09557406 ], [ 114.97654443, 31.09576627 ], [ 114.97547022, 31.09633565 ], [ 114.97472353, 31.09644712 ], [ 114.97393381, 31.09665044 ], [ 114.97273434, 31.09655971 ], [ 114.9714176, 31.09713632 ], [ 114.97059843, 31.0973235 ], [ 114.96989981, 31.09770354 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501C0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9850600000000", "INDCD": "-1", "ONDCD": "QFA9850500000000", "BWSCD": "WFA98501C0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4069.0, "RVSLP": 0.0003, "IELV": 50.0, "OELV": 49.36, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00706177, 30.99610832 ], [ 115.00700231, 30.99499041 ], [ 115.00667959, 30.99418797 ], [ 115.00643366, 30.99388095 ], [ 115.00558969, 30.9931659 ], [ 115.00545501, 30.99286893 ], [ 115.00596181, 30.99183506 ], [ 115.006584, 30.99116449 ], [ 115.0067365, 30.99091185 ], [ 115.00674171, 30.99073439 ], [ 115.00657631, 30.99018386 ], [ 115.00655994, 30.98960623 ], [ 115.00664006, 30.98933403 ], [ 115.00695602, 30.98879448 ], [ 115.00717784, 30.9874678 ], [ 115.00705516, 30.98722019 ], [ 115.0068099, 30.98702199 ], [ 115.00592241, 30.98683626 ], [ 115.00547549, 30.98651002 ], [ 115.0050934, 30.98548719 ], [ 115.00506304, 30.9848542 ], [ 115.00522836, 30.98452215 ], [ 115.00599971, 30.98366515 ], [ 115.00619628, 30.98326042 ], [ 115.00633239, 30.98265123 ], [ 115.00666545, 30.98211152 ], [ 115.0070222, 30.98134402 ], [ 115.00703337, 30.981168 ], [ 115.00679173, 30.98075596 ], [ 115.00681369, 30.98054446 ], [ 115.00708573, 30.98040198 ], [ 115.00779568, 30.98051846 ], [ 115.00866223, 30.98049976 ], [ 115.0089859, 30.98042598 ], [ 115.00926416, 30.98025365 ], [ 115.00995592, 30.97961518 ], [ 115.01024588, 30.97923709 ], [ 115.01041749, 30.97878229 ], [ 115.01034595, 30.97821566 ], [ 115.01058623, 30.97776831 ], [ 115.01061216, 30.97758634 ], [ 115.01027077, 30.9770179 ], [ 115.01009378, 30.97650187 ], [ 115.00996597, 30.97633645 ], [ 115.0097679, 30.97623289 ], [ 115.0092007, 30.97615005 ], [ 115.00889696, 30.97602327 ], [ 115.00820658, 30.97551007 ], [ 115.00786519, 30.97515637 ], [ 115.00777995, 30.97483537 ], [ 115.00787007, 30.97436619 ], [ 115.0077939, 30.97379218 ], [ 115.00800333, 30.97333616 ], [ 115.00831038, 30.97288252 ], [ 115.00832582, 30.97264507 ], [ 115.00820833, 30.97247047 ], [ 115.00795366, 30.97229222 ], [ 115.00696806, 30.97210639 ], [ 115.00650838, 30.97192566 ], [ 115.00625589, 30.97173413 ], [ 115.00613845, 30.971556 ], [ 115.00613049, 30.9713838 ], [ 115.00657573, 30.97077425 ], [ 115.00661171, 30.97060079 ], [ 115.00646172, 30.97039646 ], [ 115.0059757, 30.97000482 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121D00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900126000000", "INDCD": "-1", "ONDCD": "QFA9900125000000", "BWSCD": "WFA9900121D00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1799.0, "RVSLP": -0.0092, "IELV": 120.0, "OELV": 129.95, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38204505, 31.19233582 ], [ 115.38254565, 31.1927299 ], [ 115.38278442, 31.19302003 ], [ 115.38282978, 31.19327168 ], [ 115.38278249, 31.19365748 ], [ 115.38291789, 31.19426458 ], [ 115.3829384, 31.19499994 ], [ 115.38262666, 31.19596028 ], [ 115.38230437, 31.19633584 ], [ 115.38166438, 31.1968964 ], [ 115.38137425, 31.19704291 ], [ 115.38038567, 31.19721522 ], [ 115.37946056, 31.19772837 ], [ 115.3791484, 31.1978236 ], [ 115.37855821, 31.19783443 ], [ 115.37766139, 31.19766729 ], [ 115.37679422, 31.19768794 ], [ 115.37629309, 31.19776386 ], [ 115.37500009, 31.19824179 ], [ 115.37215372, 31.1998059 ], [ 115.37173351, 31.19989251 ], [ 115.37087449, 31.19991581 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900123000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900122000000,AFA9900121A00000", "TRVCD": "AFA9900124000000", "INDCD": "QFA9900122000000", "ONDCD": "QFA9900123000000", "BWSCD": "WFA9900123000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 3149.0, "RVSLP": 0.0128, "IELV": 168.95, "OELV": 155.4, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.42313604, 31.27439765 ], [ 115.42280897, 31.27378197 ], [ 115.42149527, 31.27171554 ], [ 115.42118752, 31.27098034 ], [ 115.4210167, 31.26999168 ], [ 115.42000311, 31.26770232 ], [ 115.41983591, 31.26709523 ], [ 115.41956793, 31.26649183 ], [ 115.41938599, 31.2662412 ], [ 115.41803872, 31.26514399 ], [ 115.41740525, 31.26471158 ], [ 115.41625251, 31.26427927 ], [ 115.41545022, 31.26409217 ], [ 115.41445051, 31.26397568 ], [ 115.41322227, 31.26325615 ], [ 115.41184072, 31.26222366 ], [ 115.40972044, 31.26133974 ], [ 115.40896562, 31.26052836 ], [ 115.40863402, 31.26001989 ], [ 115.40843817, 31.25918562 ], [ 115.40812, 31.25822413 ], [ 115.40783318, 31.25755373 ], [ 115.40750624, 31.2570447 ], [ 115.40686451, 31.25647919 ], [ 115.40602902, 31.25586458 ], [ 115.4054249, 31.25564073 ], [ 115.40477832, 31.25562669 ], [ 115.40437808, 31.25538228 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900125000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900124000000,AFA9900122C00000", "TRVCD": "AFA9900126000000", "INDCD": "QFA9900124000000", "ONDCD": "QFA9900125000000", "BWSCD": "WFA9900125000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 5303.0, "RVSLP": 0.001, "IELV": 144.37, "OELV": 129.95, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.401536, 31.23384105 ], [ 115.40055608, 31.23300717 ], [ 115.40021416, 31.23227639 ], [ 115.39989147, 31.23131759 ], [ 115.39981397, 31.23074388 ], [ 115.39967116, 31.227668 ], [ 115.39961941, 31.22731049 ], [ 115.39937243, 31.22654399 ], [ 115.39922005, 31.22401088 ], [ 115.39886146, 31.22291784 ], [ 115.39825721, 31.22196398 ], [ 115.39712395, 31.22080157 ], [ 115.39603844, 31.22018411 ], [ 115.39486668, 31.21981378 ], [ 115.38938226, 31.21764597 ], [ 115.38823318, 31.21696012 ], [ 115.38665557, 31.21575425 ], [ 115.38577413, 31.21530155 ], [ 115.38522071, 31.21514631 ], [ 115.38485917, 31.21493983 ], [ 115.38234034, 31.21294577 ], [ 115.38133389, 31.21234977 ], [ 115.37956225, 31.21095239 ], [ 115.37911168, 31.21056026 ], [ 115.37845185, 31.20977792 ], [ 115.3779384, 31.20895953 ], [ 115.37775007, 31.2085064 ], [ 115.37747326, 31.20806081 ], [ 115.37677593, 31.20735243 ], [ 115.37548028, 31.20558382 ], [ 115.37348833, 31.20324623 ], [ 115.37298231, 31.20251164 ], [ 115.37209833, 31.20149021 ], [ 115.3715942, 31.20075573 ], [ 115.37087449, 31.19991581 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012C000000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA9900128J00000,AFA990012B000000", "TRVCD": "AFA990012D000000", "INDCD": "QFA990012B000000", "ONDCD": "QFA990012C000000", "BWSCD": "WFA990012C000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 13.0, "RVLEN": 3507.0, "RVSLP": 0.0034, "IELV": 87.47, "OELV": 80.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36571577, 31.05880678 ], [ 115.36568305, 31.05783558 ], [ 115.36587794, 31.05698434 ], [ 115.36584733, 31.05618246 ], [ 115.36572562, 31.05584685 ], [ 115.36535965, 31.05541159 ], [ 115.36506589, 31.05489949 ], [ 115.36492645, 31.05343628 ], [ 115.36456172, 31.05234813 ], [ 115.36429618, 31.05203894 ], [ 115.36266435, 31.05074604 ], [ 115.3623156, 31.05039231 ], [ 115.3622105, 31.05012617 ], [ 115.36209717, 31.04934002 ], [ 115.36178415, 31.04860874 ], [ 115.36086789, 31.04751751 ], [ 115.35969104, 31.04592047 ], [ 115.3588683, 31.04458772 ], [ 115.35871563, 31.04420447 ], [ 115.35805254, 31.04310796 ], [ 115.35703026, 31.04109724 ], [ 115.35617225, 31.03978181 ], [ 115.35549195, 31.03906605 ], [ 115.35515445, 31.03827082 ], [ 115.35505643, 31.03701599 ], [ 115.35494622, 31.03660008 ], [ 115.35386699, 31.03490195 ], [ 115.35266714, 31.03337245 ], [ 115.35223855, 31.03222689 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JD0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800126J00000", "INDCD": "-1", "ONDCD": "QFA9800125J00000", "BWSCD": "WFA9800121JD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7561.0, "RVSLP": 0.0056, "IELV": 135.0, "OELV": 80.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0075621, 31.3929662 ], [ 115.008626, 31.39195967 ], [ 115.00916809, 31.39129968 ], [ 115.00934849, 31.39117212 ], [ 115.00980936, 31.39113979 ], [ 115.01091205, 31.39142406 ], [ 115.01127726, 31.39134355 ], [ 115.01174565, 31.39089455 ], [ 115.01196643, 31.39014355 ], [ 115.01220723, 31.38983659 ], [ 115.01248127, 31.38967539 ], [ 115.01366404, 31.38930358 ], [ 115.01392845, 31.38912017 ], [ 115.01411357, 31.38886871 ], [ 115.01415581, 31.38853609 ], [ 115.01404647, 31.38820412 ], [ 115.01208083, 31.38631155 ], [ 115.01148072, 31.38536018 ], [ 115.01138967, 31.38486795 ], [ 115.01137782, 31.38412603 ], [ 115.01176822, 31.38286821 ], [ 115.01178242, 31.38260499 ], [ 115.01172198, 31.38240615 ], [ 115.01139195, 31.3819016 ], [ 115.01085887, 31.38148483 ], [ 115.01046448, 31.38137765 ], [ 115.00997029, 31.38143471 ], [ 115.00893227, 31.38192159 ], [ 115.0085755, 31.38224152 ], [ 115.00845235, 31.38258181 ], [ 115.00842801, 31.38354594 ], [ 115.00826828, 31.38386848 ], [ 115.00797647, 31.38403775 ], [ 115.00757184, 31.38385658 ], [ 115.00684133, 31.38324731 ], [ 115.00590811, 31.38224753 ], [ 115.00433564, 31.37981451 ], [ 115.00363983, 31.37910768 ], [ 115.00280693, 31.37778232 ], [ 115.00225651, 31.37638356 ], [ 115.00105163, 31.37518593 ], [ 114.99979769, 31.3745841 ], [ 114.99931397, 31.3742226 ], [ 114.99902831, 31.37392355 ], [ 114.99893414, 31.3736612 ], [ 114.99893848, 31.3733884 ], [ 114.99905503, 31.37311961 ], [ 114.99956374, 31.37247614 ], [ 114.9995882, 31.37222709 ], [ 114.99946591, 31.3719981 ], [ 114.99890239, 31.37172439 ], [ 114.99787202, 31.37143055 ], [ 114.99721697, 31.37107904 ], [ 114.99668294, 31.37087489 ], [ 114.99580287, 31.37068127 ], [ 114.99519754, 31.37073973 ], [ 114.99502131, 31.37069124 ], [ 114.99489116, 31.37048827 ], [ 114.99489941, 31.37009402 ], [ 114.99552982, 31.36917163 ], [ 114.99551964, 31.36892221 ], [ 114.99535151, 31.36871767 ], [ 114.99514159, 31.36865575 ], [ 114.99482817, 31.36870435 ], [ 114.99413962, 31.36918836 ], [ 114.99392583, 31.36926966 ], [ 114.99363542, 31.3692136 ], [ 114.9933902, 31.36901906 ], [ 114.99323446, 31.36869141 ], [ 114.9931998, 31.36817774 ], [ 114.99350795, 31.36677173 ], [ 114.9934616, 31.36653837 ], [ 114.99311209, 31.36630427 ], [ 114.99261086, 31.36632182 ], [ 114.99240362, 31.3662569 ], [ 114.9917441, 31.36575631 ], [ 114.99112377, 31.3648981 ], [ 114.99052981, 31.36431615 ], [ 114.98998823, 31.36365395 ], [ 114.98934227, 31.36235605 ], [ 114.98937957, 31.36202379 ], [ 114.98982276, 31.36117369 ], [ 114.99067117, 31.36025449 ], [ 114.99168141, 31.35879376 ], [ 114.99196397, 31.3576087 ], [ 114.99194849, 31.35671165 ], [ 114.99186537, 31.35621342 ], [ 114.99163695, 31.35589933 ], [ 114.99123315, 31.35560315 ], [ 114.99053024, 31.35537811 ], [ 114.98967243, 31.35486474 ], [ 114.98851575, 31.35447606 ], [ 114.98805514, 31.35406675 ], [ 114.98789409, 31.3537797 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PJ0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012CP00000", "INDCD": "-1", "ONDCD": "QFA980012BP00000", "BWSCD": "WFA9800121PJ0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6135.0, "RVSLP": 0.0012, "IELV": 67.57, "OELV": 60.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11633992, 31.23810571 ], [ 115.11675551, 31.23738807 ], [ 115.11686879, 31.23676244 ], [ 115.11710834, 31.23607835 ], [ 115.11735369, 31.23576037 ], [ 115.11789272, 31.23538788 ], [ 115.11940544, 31.23497835 ], [ 115.11993599, 31.23456635 ], [ 115.12052023, 31.23396209 ], [ 115.12116246, 31.23280158 ], [ 115.12175222, 31.23211835 ], [ 115.12205423, 31.23159965 ], [ 115.12226941, 31.23112979 ], [ 115.12239218, 31.23051646 ], [ 115.12273603, 31.2294769 ], [ 115.12270811, 31.2291503 ], [ 115.12200011, 31.22709221 ], [ 115.12211016, 31.2264204 ], [ 115.12207212, 31.22593037 ], [ 115.12193389, 31.22567077 ], [ 115.12141395, 31.22513359 ], [ 115.12130408, 31.22486999 ], [ 115.12114622, 31.22211152 ], [ 115.12089685, 31.22127684 ], [ 115.12099194, 31.2204676 ], [ 115.12084268, 31.21999624 ], [ 115.12077979, 31.21941608 ], [ 115.12036182, 31.20988494 ], [ 115.12037755, 31.20930181 ], [ 115.12055834, 31.20852174 ], [ 115.12050401, 31.20725835 ], [ 115.1202436, 31.20642019 ], [ 115.12012552, 31.205253 ], [ 115.11963207, 31.20387329 ], [ 115.11949386, 31.20317756 ], [ 115.11902868, 31.20208926 ], [ 115.11889211, 31.20139171 ], [ 115.11857029, 31.20043374 ], [ 115.11799178, 31.19932772 ], [ 115.11707634, 31.19823015 ], [ 115.11656975, 31.19749465 ], [ 115.11568754, 31.19647003 ], [ 115.11517953, 31.19573631 ], [ 115.11430228, 31.19479846 ], [ 115.11284396, 31.19358605 ], [ 115.11213967, 31.19282554 ], [ 115.11033966, 31.19135757 ], [ 115.1102795, 31.19122123 ], [ 115.11030551, 31.19107106 ], [ 115.11060868, 31.19073042 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QE0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800128Q00000", "INDCD": "-1", "ONDCD": "QFA9800127Q00000", "BWSCD": "WFA9800121QE0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5329.0, "RVSLP": 0.0005, "IELV": 54.96, "OELV": 49.45, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9837838, 31.04313033 ], [ 114.9844022, 31.04351636 ], [ 114.98514633, 31.0437165 ], [ 114.98541969, 31.04370625 ], [ 114.98551447, 31.04364648 ], [ 114.98555838, 31.0435058 ], [ 114.98544443, 31.04287564 ], [ 114.98576032, 31.04243103 ], [ 114.98635803, 31.0419702 ], [ 114.9867685, 31.04188601 ], [ 114.9871921, 31.04189644 ], [ 114.98750207, 31.04200243 ], [ 114.98790178, 31.04231156 ], [ 114.98810636, 31.04256618 ], [ 114.98832243, 31.04300651 ], [ 114.9886035, 31.04323663 ], [ 114.98879439, 31.04325481 ], [ 114.98926593, 31.04302593 ], [ 114.98949892, 31.04298231 ], [ 114.98973387, 31.04300452 ], [ 114.99029187, 31.0431998 ], [ 114.9908954, 31.0429643 ], [ 114.99141695, 31.04300692 ], [ 114.99202526, 31.04286135 ], [ 114.99250842, 31.04287031 ], [ 114.99277366, 31.04301531 ], [ 114.99331621, 31.04354249 ], [ 114.99400523, 31.04378045 ], [ 114.99472573, 31.04421001 ], [ 114.99526335, 31.04437781 ], [ 114.99543623, 31.04451027 ], [ 114.99551803, 31.04468359 ], [ 114.99548609, 31.04500748 ], [ 114.99519182, 31.04553448 ], [ 114.99456984, 31.04612003 ], [ 114.99387803, 31.04657022 ], [ 114.99365607, 31.04692033 ], [ 114.99369593, 31.04709926 ], [ 114.99420711, 31.04789648 ], [ 114.99475603, 31.04830968 ], [ 114.99491823, 31.04853836 ], [ 114.99514378, 31.04912022 ], [ 114.9950852, 31.04957646 ], [ 114.99515797, 31.05014032 ], [ 114.99464243, 31.050831 ], [ 114.99418553, 31.05181607 ], [ 114.99341587, 31.05268315 ], [ 114.99318354, 31.0533999 ], [ 114.99301806, 31.05354351 ], [ 114.99243562, 31.05379167 ], [ 114.99216158, 31.05407286 ], [ 114.99192216, 31.05525674 ], [ 114.99196021, 31.05550794 ], [ 114.99235556, 31.05629266 ], [ 114.99248314, 31.05730373 ], [ 114.99270404, 31.05792986 ], [ 114.99273778, 31.05850827 ], [ 114.99256193, 31.05921631 ], [ 114.99249247, 31.0598526 ], [ 114.9923564, 31.0602816 ], [ 114.99227661, 31.06098627 ], [ 114.9921436, 31.06141584 ], [ 114.99210228, 31.06243114 ], [ 114.99193555, 31.06306886 ], [ 114.99196387, 31.06507091 ], [ 114.99178198, 31.06584987 ], [ 114.99177807, 31.06754414 ], [ 114.99152173, 31.06829169 ], [ 114.99089652, 31.06926787 ], [ 114.99064173, 31.0699438 ], [ 114.99073403, 31.07248183 ], [ 114.99103169, 31.07352627 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121TGA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122TG0000", "INDCD": "-1", "ONDCD": "QFA9800121TG0000", "BWSCD": "WFA9800121TGA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 8375.0, "RVSLP": 0.0012, "IELV": 54.35, "OELV": 38.45, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81213041, 31.14999643 ], [ 114.81260419, 31.14961754 ], [ 114.81325601, 31.14932611 ], [ 114.81472224, 31.14902169 ], [ 114.8155017, 31.14902339 ], [ 114.81638554, 31.14916411 ], [ 114.81668404, 31.14906119 ], [ 114.81738797, 31.14863808 ], [ 114.81861819, 31.14756595 ], [ 114.8189962, 31.14713597 ], [ 114.81904148, 31.14674608 ], [ 114.81864377, 31.14580473 ], [ 114.81860956, 31.145552 ], [ 114.81886089, 31.14481278 ], [ 114.81938018, 31.14426504 ], [ 114.81978649, 31.14396598 ], [ 114.82038836, 31.14371602 ], [ 114.82088868, 31.14369529 ], [ 114.82169065, 31.1438338 ], [ 114.82262588, 31.14355952 ], [ 114.82308711, 31.14321223 ], [ 114.82361054, 31.14252771 ], [ 114.82404677, 31.1421456 ], [ 114.82519962, 31.14170571 ], [ 114.82581548, 31.14135249 ], [ 114.82595, 31.14097437 ], [ 114.82585784, 31.14056831 ], [ 114.82380465, 31.13731633 ], [ 114.8234762, 31.13657439 ], [ 114.82341603, 31.13587509 ], [ 114.82366574, 31.13527007 ], [ 114.82446571, 31.13383799 ], [ 114.82531556, 31.13292414 ], [ 114.8258948, 31.13160416 ], [ 114.82690405, 31.12969808 ], [ 114.82727385, 31.12913244 ], [ 114.82760091, 31.12890356 ], [ 114.82840423, 31.12870185 ], [ 114.82893848, 31.1282931 ], [ 114.82952951, 31.12769117 ], [ 114.83042485, 31.12630414 ], [ 114.830646, 31.12609343 ], [ 114.83174769, 31.1256044 ], [ 114.83207217, 31.12559793 ], [ 114.83280154, 31.12574758 ], [ 114.83347691, 31.12568713 ], [ 114.83420183, 31.12531559 ], [ 114.83442857, 31.12508179 ], [ 114.83464407, 31.1246935 ], [ 114.8347418, 31.12434244 ], [ 114.83471186, 31.12391602 ], [ 114.83460173, 31.12364669 ], [ 114.83426787, 31.12319601 ], [ 114.83423751, 31.12288885 ], [ 114.83438608, 31.1226619 ], [ 114.83486169, 31.12235642 ], [ 114.83524381, 31.12201811 ], [ 114.835522, 31.12152808 ], [ 114.83548363, 31.12129252 ], [ 114.83495997, 31.12070233 ], [ 114.83492591, 31.12032039 ], [ 114.83519412, 31.11979397 ], [ 114.83590392, 31.11906812 ], [ 114.83605104, 31.11880533 ], [ 114.83605695, 31.1183996 ], [ 114.8358314, 31.11777213 ], [ 114.83577608, 31.1171122 ], [ 114.83582176, 31.1166878 ], [ 114.83605305, 31.11600152 ], [ 114.83634206, 31.11547689 ], [ 114.83689873, 31.11486252 ], [ 114.83740938, 31.11410164 ], [ 114.8374232, 31.11378021 ], [ 114.83720347, 31.11308289 ], [ 114.83717031, 31.11219628 ], [ 114.83726028, 31.11185331 ], [ 114.83758427, 31.11132163 ], [ 114.83782434, 31.11041915 ], [ 114.83785342, 31.10983958 ], [ 114.83775376, 31.10827539 ], [ 114.83764695, 31.10800946 ], [ 114.83737009, 31.10763423 ], [ 114.83731958, 31.10745199 ], [ 114.83767258, 31.10629546 ], [ 114.83768981, 31.10586186 ], [ 114.83762568, 31.10543702 ], [ 114.83703601, 31.10425288 ], [ 114.83675426, 31.10382077 ], [ 114.83593966, 31.10329146 ], [ 114.83558571, 31.10294575 ], [ 114.83548051, 31.10261499 ], [ 114.83550595, 31.10196414 ], [ 114.83506557, 31.10145022 ], [ 114.83497985, 31.10126628 ], [ 114.83507721, 31.1006647 ], [ 114.83503206, 31.1003277 ], [ 114.8348628, 31.10007019 ], [ 114.83422528, 31.0994995 ], [ 114.83408704, 31.09919981 ], [ 114.83424632, 31.09889308 ], [ 114.83469519, 31.09853029 ], [ 114.83604152, 31.09811167 ], [ 114.83661337, 31.09782891 ], [ 114.83678848, 31.09751163 ], [ 114.83680419, 31.09701987 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123QB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122QB0000", "TRVCD": "AFA9800123Q00000", "INDCD": "QFA9800122QB0000", "ONDCD": "QFA9800122Q00000", "BWSCD": "WFA9800123QB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 2561.0, "RVSLP": 0.0, "IELV": 92.08, "OELV": 90.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14919178, 30.97366508 ], [ 115.14900706, 30.97423842 ], [ 115.14896634, 30.97530972 ], [ 115.14871646, 30.97635391 ], [ 115.14848465, 30.97703658 ], [ 115.14765968, 30.97892765 ], [ 115.14756402, 30.97969869 ], [ 115.14735184, 30.98053839 ], [ 115.14696377, 30.98127197 ], [ 115.14687516, 30.98197223 ], [ 115.14663684, 30.98294753 ], [ 115.14628931, 30.98369881 ], [ 115.14592393, 30.98476974 ], [ 115.14559205, 30.98530645 ], [ 115.14544015, 30.98590639 ], [ 115.14488291, 30.98682385 ], [ 115.14441445, 30.98796842 ], [ 115.14425682, 30.9888708 ], [ 115.14367504, 30.98986235 ], [ 115.14321648, 30.99174778 ], [ 115.14312356, 30.99273999 ], [ 115.14233982, 30.99368269 ], [ 115.1422309, 30.99393773 ], [ 115.14221541, 30.99415592 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123V00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122V00000", "TRVCD": "AFA9800124V00000", "INDCD": "QFA9800122V00000", "ONDCD": "QFA9800123V00000", "BWSCD": "WFA9800123V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 1958.0, "RVSLP": 0.0009, "IELV": 37.46, "OELV": 35.77, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85532984, 31.02235384 ], [ 114.85515597, 31.02209487 ], [ 114.85488939, 31.0219678 ], [ 114.85443513, 31.02193988 ], [ 114.85374391, 31.02204134 ], [ 114.85316767, 31.02182109 ], [ 114.8524552, 31.02168163 ], [ 114.85225796, 31.0215018 ], [ 114.85218044, 31.02097552 ], [ 114.8515785, 31.02042985 ], [ 114.85128328, 31.02028294 ], [ 114.85104388, 31.02025784 ], [ 114.85080767, 31.02030352 ], [ 114.85034009, 31.02053019 ], [ 114.85016046, 31.02050638 ], [ 114.84958213, 31.01993169 ], [ 114.84870212, 31.01921721 ], [ 114.84833991, 31.01900845 ], [ 114.84771393, 31.01880149 ], [ 114.84680643, 31.0181881 ], [ 114.84659353, 31.0181636 ], [ 114.84640341, 31.01825093 ], [ 114.84602859, 31.01870978 ], [ 114.84570155, 31.0189457 ], [ 114.84538426, 31.0189937 ], [ 114.84508064, 31.01890179 ], [ 114.84478955, 31.01863352 ], [ 114.84471002, 31.01837574 ], [ 114.84475752, 31.01810639 ], [ 114.84505038, 31.01743065 ], [ 114.84500713, 31.01719242 ], [ 114.84480036, 31.0169735 ], [ 114.84413353, 31.01653834 ], [ 114.84366847, 31.01587843 ], [ 114.84295223, 31.01503104 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125J00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124J00000,AFA9800122JC0000", "TRVCD": "AFA9800126J00000", "INDCD": "QFA9800124J00000", "ONDCD": "QFA9800125J00000", "BWSCD": "WFA9800125J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 3615.0, "RVSLP": 0.0016, "IELV": 85.85, "OELV": 80.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98152044, 31.37608737 ], [ 114.98279205, 31.37554785 ], [ 114.98321197, 31.37517197 ], [ 114.98372956, 31.37440151 ], [ 114.98419389, 31.37280611 ], [ 114.98423173, 31.37245801 ], [ 114.98418022, 31.3720368 ], [ 114.98383275, 31.3710881 ], [ 114.98350432, 31.37064131 ], [ 114.98343261, 31.37045 ], [ 114.98357573, 31.36955194 ], [ 114.98352789, 31.36913013 ], [ 114.98336009, 31.36865101 ], [ 114.98338235, 31.36807287 ], [ 114.98321348, 31.36770956 ], [ 114.9826454, 31.36683399 ], [ 114.98186981, 31.36593409 ], [ 114.98139046, 31.36560598 ], [ 114.98042562, 31.36539227 ], [ 114.9800826, 31.36515566 ], [ 114.97979626, 31.36486076 ], [ 114.97840883, 31.36264349 ], [ 114.97829196, 31.36177839 ], [ 114.97833219, 31.36090599 ], [ 114.97870817, 31.36024741 ], [ 114.9803219, 31.35871648 ], [ 114.98086135, 31.3579581 ], [ 114.98097802, 31.35761605 ], [ 114.98101075, 31.35659624 ], [ 114.9812964, 31.35600022 ], [ 114.98158441, 31.35571605 ], [ 114.98220509, 31.35531612 ], [ 114.98310376, 31.3545342 ], [ 114.98426168, 31.35393806 ], [ 114.98477429, 31.35373987 ], [ 114.98507109, 31.3537656 ], [ 114.98577558, 31.35419993 ], [ 114.98617403, 31.35428036 ], [ 114.9865036, 31.35425055 ], [ 114.98756007, 31.35395001 ], [ 114.98789409, 31.3537797 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125PH0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124PH0000", "TRVCD": "AFA980012AP00000", "INDCD": "QFA9800124PH0000", "ONDCD": "QFA9800129P00000", "BWSCD": "WFA9800125PH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 7232.0, "RVSLP": 0.0016, "IELV": 80.1, "OELV": 67.63, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18684643, 31.21613382 ], [ 115.18652448, 31.21649956 ], [ 115.18620826, 31.21716811 ], [ 115.18567084, 31.21771001 ], [ 115.18539836, 31.21789714 ], [ 115.18517012, 31.21796622 ], [ 115.18492953, 31.21796191 ], [ 115.18470215, 31.21787786 ], [ 115.18417207, 31.21745767 ], [ 115.18295833, 31.21600184 ], [ 115.18238388, 31.21512365 ], [ 115.18193441, 31.21421694 ], [ 115.18138594, 31.21332577 ], [ 115.18108709, 31.21289063 ], [ 115.18035621, 31.21205488 ], [ 115.17851171, 31.21062864 ], [ 115.17684052, 31.21017986 ], [ 115.176334, 31.21013803 ], [ 115.17584062, 31.21022136 ], [ 115.17545965, 31.21051359 ], [ 115.17413434, 31.21249109 ], [ 115.1736869, 31.21334035 ], [ 115.17361386, 31.21369031 ], [ 115.17363651, 31.21443079 ], [ 115.17371013, 31.21485832 ], [ 115.17393835, 31.21549111 ], [ 115.17397012, 31.21630223 ], [ 115.17379363, 31.21671363 ], [ 115.17329094, 31.21712967 ], [ 115.17306844, 31.21717353 ], [ 115.17284573, 31.21710968 ], [ 115.17249985, 31.21687249 ], [ 115.17220851, 31.21657151 ], [ 115.17194357, 31.21611183 ], [ 115.17178977, 31.21534159 ], [ 115.1715064, 31.21466535 ], [ 115.17132432, 31.21441417 ], [ 115.17100271, 31.21414209 ], [ 115.17071551, 31.21396956 ], [ 115.16910215, 31.21334843 ], [ 115.16825953, 31.21334016 ], [ 115.16654155, 31.21388164 ], [ 115.16517995, 31.21441511 ], [ 115.16427448, 31.21497808 ], [ 115.16331156, 31.21580973 ], [ 115.16138649, 31.21707995 ], [ 115.16009666, 31.21777963 ], [ 115.15880709, 31.21827673 ], [ 115.15768811, 31.21856021 ], [ 115.15639032, 31.2186478 ], [ 115.15571566, 31.21859181 ], [ 115.15535167, 31.21838815 ], [ 115.15411593, 31.21744255 ], [ 115.15296994, 31.2169916 ], [ 115.15167168, 31.21696178 ], [ 115.15090835, 31.21706097 ], [ 115.15062836, 31.21723278 ], [ 115.15026762, 31.217582 ], [ 115.14994388, 31.21824252 ], [ 115.14997435, 31.21856965 ], [ 115.15047906, 31.21980244 ], [ 115.15052013, 31.22046694 ], [ 115.1504229, 31.22088012 ], [ 115.15001699, 31.2212609 ], [ 115.14837801, 31.2219959 ], [ 115.14797614, 31.2219939 ], [ 115.14729222, 31.22171402 ], [ 115.14490419, 31.21982366 ], [ 115.1444086, 31.21949775 ], [ 115.14387205, 31.21929379 ], [ 115.14259156, 31.21898404 ], [ 115.14066406, 31.21803651 ], [ 115.13959369, 31.21762079 ], [ 115.13901745, 31.21748797 ], [ 115.13828067, 31.21715367 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800127T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800126T00000,AFA9800121TE0000", "TRVCD": "AFA9800128T00000", "INDCD": "QFA9800126T00000", "ONDCD": "QFA9800127T00000", "BWSCD": "WFA9800127T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 9.0, "RVLEN": 1035.0, "RVSLP": 0.0002, "IELV": 40.0, "OELV": 39.89, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76636828, 31.08774392 ], [ 114.76627557, 31.08736035 ], [ 114.76559196, 31.08615567 ], [ 114.76544776, 31.08561504 ], [ 114.76516772, 31.08494377 ], [ 114.76473162, 31.08414958 ], [ 114.76452181, 31.08287763 ], [ 114.76385378, 31.08215441 ], [ 114.763558, 31.08172026 ], [ 114.76330372, 31.08126419 ], [ 114.7631277, 31.0806646 ], [ 114.76271357, 31.08002684 ], [ 114.76264983, 31.07973849 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012S000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012R000000", "TRVCD": "AFA980012T000000", "INDCD": "QFA980012R000000", "ONDCD": "QFA980012S000000", "BWSCD": "WFA980012S000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 28.0, "RVLEN": 12030.0, "RVSLP": 0.0, "IELV": 29.11, "OELV": 29.48, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79291038, 31.03693243 ], [ 114.79290205, 31.03605198 ], [ 114.79306714, 31.03547893 ], [ 114.79309625, 31.03512192 ], [ 114.79298966, 31.03242437 ], [ 114.7926236, 31.03095363 ], [ 114.79231962, 31.03021577 ], [ 114.79176763, 31.02932634 ], [ 114.79105233, 31.02848336 ], [ 114.78768278, 31.02575578 ], [ 114.78682194, 31.0252442 ], [ 114.78599232, 31.02464686 ], [ 114.78397186, 31.02349102 ], [ 114.78237214, 31.02286707 ], [ 114.7810176, 31.02253587 ], [ 114.77706059, 31.02099221 ], [ 114.77459968, 31.02037002 ], [ 114.77226859, 31.02037377 ], [ 114.7713123, 31.02014377 ], [ 114.7704711, 31.01983243 ], [ 114.76967779, 31.0196313 ], [ 114.76823026, 31.01957628 ], [ 114.76694957, 31.01928847 ], [ 114.76573179, 31.01833639 ], [ 114.76501665, 31.01749171 ], [ 114.76466434, 31.01669147 ], [ 114.76455151, 31.01567721 ], [ 114.76434784, 31.01528487 ], [ 114.76301097, 31.01419633 ], [ 114.76200871, 31.01359754 ], [ 114.76005083, 31.01202451 ], [ 114.75972365, 31.01167104 ], [ 114.75921893, 31.01083566 ], [ 114.75912581, 31.01027009 ], [ 114.75906759, 31.00846951 ], [ 114.75914045, 31.00812016 ], [ 114.75943563, 31.00759759 ], [ 114.7598596, 31.00719987 ], [ 114.76062061, 31.00670372 ], [ 114.76189444, 31.00556423 ], [ 114.76258623, 31.00512048 ], [ 114.76404359, 31.00379957 ], [ 114.76486503, 31.00324824 ], [ 114.76620108, 31.00205294 ], [ 114.76829519, 31.00076982 ], [ 114.76906617, 31.0000978 ], [ 114.76959009, 30.99955365 ], [ 114.77072816, 30.99770619 ], [ 114.77185141, 30.99604059 ], [ 114.77254383, 30.99473627 ], [ 114.77293176, 30.99358849 ], [ 114.7732988, 30.99277044 ], [ 114.77333175, 30.99153021 ], [ 114.77349753, 30.99089138 ], [ 114.77353815, 30.98987478 ], [ 114.77369645, 30.98930767 ], [ 114.77374771, 30.98851753 ], [ 114.77390633, 30.98794955 ], [ 114.7739556, 30.98715842 ], [ 114.77411401, 30.98659234 ], [ 114.77415591, 30.98557599 ], [ 114.77430597, 30.98507711 ], [ 114.77433799, 30.98472162 ], [ 114.77423663, 30.98324754 ], [ 114.77350416, 30.98156035 ], [ 114.77336025, 30.98102048 ], [ 114.77291987, 30.97999994 ], [ 114.77276576, 30.97923513 ], [ 114.77244718, 30.97827617 ], [ 114.77178159, 30.97703875 ], [ 114.77096785, 30.9761599 ], [ 114.77010371, 30.97535637 ], [ 114.76982952, 30.97491238 ], [ 114.76954754, 30.97424072 ], [ 114.76923356, 30.97328006 ], [ 114.76909933, 30.97258233 ], [ 114.76893014, 30.97216204 ], [ 114.76881656, 30.97137639 ], [ 114.76859993, 30.9707504 ], [ 114.76847201, 30.96989545 ], [ 114.7679956, 30.9683581 ], [ 114.7678433, 30.96697973 ], [ 114.7675299, 30.96624892 ], [ 114.76712987, 30.96583135 ], [ 114.76543714, 30.96447479 ], [ 114.76429971, 30.96377155 ], [ 114.762964, 30.96268235 ], [ 114.76170578, 30.96117984 ], [ 114.76070213, 30.95959389 ], [ 114.76025559, 30.95899552 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98206H0000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA98205H0000000", "TRVCD": "AFA9820800000000", "INDCD": "QFA98205H0000000", "ONDCD": "QFA9820700000000", "BWSCD": "WFA98206H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 2642.0, "RVSLP": 0.0007, "IELV": 45.78, "OELV": 44.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92743645, 31.15681526 ], [ 114.92628501, 31.15612241 ], [ 114.9258254, 31.1557396 ], [ 114.92562833, 31.15548453 ], [ 114.92543001, 31.15466285 ], [ 114.92502406, 31.15386712 ], [ 114.92501348, 31.153605 ], [ 114.92514405, 31.15318005 ], [ 114.92517642, 31.15267452 ], [ 114.92510841, 31.15225066 ], [ 114.9249405, 31.1519921 ], [ 114.92461868, 31.15172354 ], [ 114.92432559, 31.15157163 ], [ 114.92331805, 31.15146904 ], [ 114.92193189, 31.15097384 ], [ 114.92119205, 31.15085935 ], [ 114.92091437, 31.1506987 ], [ 114.92067064, 31.15040341 ], [ 114.92025717, 31.14941149 ], [ 114.91960849, 31.14830623 ], [ 114.91940903, 31.14785625 ], [ 114.91906534, 31.14752625 ], [ 114.91867723, 31.14740824 ], [ 114.91781016, 31.14742629 ], [ 114.9173955, 31.14749884 ], [ 114.91607259, 31.14791958 ], [ 114.91390809, 31.1479758 ], [ 114.912558, 31.14763771 ], [ 114.91137649, 31.14755627 ], [ 114.91033351, 31.14707518 ], [ 114.90943677, 31.14690995 ], [ 114.90867812, 31.14635964 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121B00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900124000000", "INDCD": "-1", "ONDCD": "QFA9900123000000", "BWSCD": "WFA9900121B00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3032.0, "RVSLP": 0.0303, "IELV": 274.76, "OELV": 155.4, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38188794, 31.26264222 ], [ 115.38247526, 31.26251782 ], [ 115.38422722, 31.26172412 ], [ 115.38534013, 31.26144854 ], [ 115.3856627, 31.26144005 ], [ 115.38630355, 31.26157643 ], [ 115.38708019, 31.26157191 ], [ 115.38895366, 31.26118637 ], [ 115.38971416, 31.26052834 ], [ 115.39032402, 31.25962237 ], [ 115.39035375, 31.25905932 ], [ 115.39017613, 31.25844824 ], [ 115.39025572, 31.25823678 ], [ 115.39056786, 31.25814955 ], [ 115.39109829, 31.25833804 ], [ 115.39161209, 31.25860971 ], [ 115.39191015, 31.25862473 ], [ 115.39231023, 31.25836955 ], [ 115.39344888, 31.25730403 ], [ 115.39380257, 31.25710986 ], [ 115.39411971, 31.25709978 ], [ 115.39447055, 31.25727977 ], [ 115.39468328, 31.25752215 ], [ 115.39490556, 31.25796638 ], [ 115.39527582, 31.25827033 ], [ 115.39635031, 31.25842139 ], [ 115.39714021, 31.25890758 ], [ 115.39767262, 31.25912625 ], [ 115.39790956, 31.25916842 ], [ 115.3982249, 31.25912162 ], [ 115.39863059, 31.2588433 ], [ 115.40008146, 31.25749859 ], [ 115.40080385, 31.25712443 ], [ 115.40155976, 31.25706098 ], [ 115.40274179, 31.25742384 ], [ 115.40318959, 31.25734819 ], [ 115.40335215, 31.25719592 ], [ 115.40375393, 31.25650366 ], [ 115.40425919, 31.2558583 ], [ 115.40437808, 31.25538228 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121K00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122K00000", "INDCD": "-1", "ONDCD": "QFA9900121K00000", "BWSCD": "WFA9900121K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4137.0, "RVSLP": 0.0461, "IELV": 454.74, "OELV": 210.06, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24864947, 31.07486403 ], [ 115.24906475, 31.0736939 ], [ 115.24920532, 31.0731082 ], [ 115.24908244, 31.07251176 ], [ 115.2490955, 31.07201991 ], [ 115.24934208, 31.07148856 ], [ 115.24966626, 31.0710296 ], [ 115.24975831, 31.07068685 ], [ 115.24971362, 31.06988553 ], [ 115.24944649, 31.06904762 ], [ 115.24938188, 31.06748605 ], [ 115.24955409, 31.06677809 ], [ 115.24958203, 31.06583155 ], [ 115.24974412, 31.06519421 ], [ 115.24978974, 31.06410795 ], [ 115.25041308, 31.06217376 ], [ 115.25035802, 31.06076367 ], [ 115.25014176, 31.06006952 ], [ 115.2501281, 31.05980667 ], [ 115.25035615, 31.0588396 ], [ 115.25096236, 31.05778184 ], [ 115.25103032, 31.05692431 ], [ 115.25115967, 31.05636419 ], [ 115.25099421, 31.05576 ], [ 115.25099221, 31.05550234 ], [ 115.25112577, 31.05524188 ], [ 115.25160449, 31.05468121 ], [ 115.25183255, 31.05421547 ], [ 115.25188229, 31.05312585 ], [ 115.2519642, 31.05285152 ], [ 115.25228484, 31.05248467 ], [ 115.25262867, 31.05226944 ], [ 115.25294757, 31.05222147 ], [ 115.25331375, 31.0522561 ], [ 115.25347915, 31.05219973 ], [ 115.25357973, 31.05193757 ], [ 115.25337221, 31.05126109 ], [ 115.2533716, 31.05098982 ], [ 115.25344148, 31.0508019 ], [ 115.25413171, 31.05027107 ], [ 115.25515041, 31.04935605 ], [ 115.25579399, 31.04901481 ], [ 115.25618406, 31.0489495 ], [ 115.25669985, 31.04899373 ], [ 115.25722581, 31.04886525 ], [ 115.25870416, 31.04820841 ], [ 115.25919759, 31.04813414 ], [ 115.25969604, 31.04817629 ], [ 115.26070205, 31.04850553 ], [ 115.26191169, 31.04852766 ], [ 115.26221111, 31.04863025 ], [ 115.26262131, 31.04891841 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121XBA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122XB0000", "INDCD": "-1", "ONDCD": "QFA9900121XB0000", "BWSCD": "WFA9900121XBA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2419.0, "RVSLP": 0.0096, "IELV": 177.61, "OELV": 139.25, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23309766, 30.94154049 ], [ 115.23204604, 30.94138569 ], [ 115.2318128, 30.94144042 ], [ 115.23125351, 30.94176018 ], [ 115.23086286, 30.94178982 ], [ 115.23056846, 30.94166411 ], [ 115.22980503, 30.94111178 ], [ 115.22934209, 30.94101895 ], [ 115.22700982, 30.94192382 ], [ 115.22581728, 30.94203454 ], [ 115.22519371, 30.94221035 ], [ 115.22487411, 30.94221353 ], [ 115.22437569, 30.9419444 ], [ 115.22372241, 30.94127498 ], [ 115.22294211, 30.94083483 ], [ 115.22187798, 30.94041671 ], [ 115.22038586, 30.94000944 ], [ 115.21978225, 30.93942832 ], [ 115.2192288, 30.93910166 ], [ 115.21812762, 30.93828952 ], [ 115.21706479, 30.937868 ], [ 115.2159683, 30.93754834 ], [ 115.21485335, 30.93701806 ], [ 115.21380985, 30.93682556 ], [ 115.21359557, 30.93684546 ], [ 115.21338407, 30.93701988 ], [ 115.21311988, 30.93751385 ], [ 115.21282245, 30.93769276 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900123K00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900122K00000", "TRVCD": "AFA9900124K00000", "INDCD": "QFA9900122K00000", "ONDCD": "QFA9900123K00000", "BWSCD": "WFA9900123K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 4454.0, "RVSLP": 0.009, "IELV": 152.87, "OELV": 105.25, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27856802, 31.05601928 ], [ 115.27903599, 31.05671439 ], [ 115.27946856, 31.05754995 ], [ 115.27989887, 31.05792154 ], [ 115.28042715, 31.05812825 ], [ 115.28074597, 31.058164 ], [ 115.28163538, 31.05786374 ], [ 115.28183703, 31.05785247 ], [ 115.28347984, 31.05872829 ], [ 115.28493409, 31.05874953 ], [ 115.28525336, 31.05882567 ], [ 115.28576973, 31.05907811 ], [ 115.28623536, 31.05906286 ], [ 115.2865984, 31.05877173 ], [ 115.28703637, 31.05777356 ], [ 115.28747653, 31.05728607 ], [ 115.28858022, 31.05657396 ], [ 115.28909944, 31.05635187 ], [ 115.28951011, 31.05632038 ], [ 115.28982605, 31.05639007 ], [ 115.2903416, 31.05664412 ], [ 115.29115174, 31.05678959 ], [ 115.29219043, 31.05726306 ], [ 115.2935239, 31.0573756 ], [ 115.29450812, 31.05775986 ], [ 115.29527896, 31.05826253 ], [ 115.2958843, 31.05849857 ], [ 115.29740433, 31.05856238 ], [ 115.29846625, 31.05896848 ], [ 115.2990419, 31.05929129 ], [ 115.29957389, 31.05949438 ], [ 115.30203199, 31.0601179 ], [ 115.30278357, 31.06020367 ], [ 115.30299394, 31.06004968 ], [ 115.30306537, 31.05982672 ], [ 115.30270415, 31.05889554 ], [ 115.30266802, 31.05848219 ], [ 115.30304442, 31.05730014 ], [ 115.30308573, 31.05628379 ], [ 115.30319972, 31.05573613 ], [ 115.30303377, 31.05513399 ], [ 115.30288412, 31.05367094 ], [ 115.30271617, 31.05341522 ], [ 115.30232775, 31.05309746 ], [ 115.30093173, 31.05238225 ], [ 115.30030814, 31.05192572 ], [ 115.29964563, 31.05137159 ], [ 115.29944126, 31.0509861 ], [ 115.29944931, 31.05064559 ], [ 115.29959168, 31.05037791 ], [ 115.30065949, 31.04937244 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121QCA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122QC0000", "INDCD": "-1", "ONDCD": "QFA9800121QC0000", "BWSCD": "WFA9800121QCA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2639.0, "RVSLP": 0.0244, "IELV": 205.89, "OELV": 146.86, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18826632, 31.05789031 ], [ 115.18903136, 31.05631031 ], [ 115.18960063, 31.05539441 ], [ 115.1898292, 31.05467539 ], [ 115.19006729, 31.05450584 ], [ 115.19086387, 31.05427782 ], [ 115.19124364, 31.05396448 ], [ 115.1913918, 31.05369529 ], [ 115.19126931, 31.0535644 ], [ 115.19074012, 31.05345681 ], [ 115.19044983, 31.05330227 ], [ 115.18946946, 31.05255638 ], [ 115.18917406, 31.05220406 ], [ 115.18921749, 31.0514895 ], [ 115.18888451, 31.05092398 ], [ 115.1888458, 31.05074363 ], [ 115.1889142, 31.05055959 ], [ 115.18931385, 31.05006913 ], [ 115.18938786, 31.04982164 ], [ 115.18917563, 31.04938021 ], [ 115.18878986, 31.04889039 ], [ 115.1887603, 31.04866699 ], [ 115.18901062, 31.04845259 ], [ 115.18989826, 31.04829885 ], [ 115.1900209, 31.04819218 ], [ 115.19001855, 31.04811039 ], [ 115.18988979, 31.04800471 ], [ 115.18936805, 31.04784185 ], [ 115.18909928, 31.04765403 ], [ 115.18891834, 31.04740695 ], [ 115.18869859, 31.04681148 ], [ 115.18782051, 31.04592445 ], [ 115.18772239, 31.04551428 ], [ 115.18765811, 31.04385645 ], [ 115.18757364, 31.04336994 ], [ 115.18739359, 31.04314599 ], [ 115.18649553, 31.04255814 ], [ 115.18588863, 31.04184175 ], [ 115.18580816, 31.04153003 ], [ 115.18595447, 31.04106011 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121VB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800126V00000", "INDCD": "-1", "ONDCD": "QFA9800125V00000", "BWSCD": "WFA9800121VB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 14239.0, "RVSLP": 0.0012, "IELV": 52.71, "OELV": 28.07, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86028178, 31.06030791 ], [ 114.85986058, 31.06002899 ], [ 114.85922477, 31.05982821 ], [ 114.85895015, 31.05965659 ], [ 114.8587359, 31.05941747 ], [ 114.85855962, 31.05904389 ], [ 114.8582279, 31.05859194 ], [ 114.85817238, 31.05820439 ], [ 114.85845963, 31.05768591 ], [ 114.85847003, 31.05746226 ], [ 114.85827534, 31.05728626 ], [ 114.85756765, 31.057146 ], [ 114.85735984, 31.0569196 ], [ 114.85742454, 31.05668525 ], [ 114.85789816, 31.05606239 ], [ 114.85789667, 31.05588803 ], [ 114.85778431, 31.05570367 ], [ 114.85725287, 31.05530814 ], [ 114.85553019, 31.05470551 ], [ 114.85511999, 31.05433226 ], [ 114.85504222, 31.05406486 ], [ 114.8550222, 31.05362655 ], [ 114.85519164, 31.05271755 ], [ 114.85506927, 31.05225009 ], [ 114.85511762, 31.05173816 ], [ 114.85492434, 31.05143418 ], [ 114.8544539, 31.05108 ], [ 114.85384251, 31.05087015 ], [ 114.85354351, 31.05092171 ], [ 114.85295561, 31.05131969 ], [ 114.85277765, 31.05133987 ], [ 114.85262955, 31.05122909 ], [ 114.85209499, 31.05035381 ], [ 114.85207425, 31.04972585 ], [ 114.85196979, 31.04959045 ], [ 114.85153357, 31.04951963 ], [ 114.85064592, 31.04971971 ], [ 114.85029402, 31.04960893 ], [ 114.85017991, 31.04944364 ], [ 114.85015602, 31.04918983 ], [ 114.85041582, 31.04847035 ], [ 114.85061883, 31.04833554 ], [ 114.8511816, 31.04844537 ], [ 114.85126396, 31.04838177 ], [ 114.85129708, 31.04823996 ], [ 114.85116966, 31.04801164 ], [ 114.85046252, 31.047235 ], [ 114.8500175, 31.04684941 ], [ 114.84965656, 31.04670396 ], [ 114.84880812, 31.04681438 ], [ 114.84786259, 31.04630645 ], [ 114.84686487, 31.04617998 ], [ 114.84658218, 31.04602339 ], [ 114.84615225, 31.04563847 ], [ 114.84509273, 31.0450383 ], [ 114.84479159, 31.04476622 ], [ 114.84452385, 31.04426338 ], [ 114.84418366, 31.04380848 ], [ 114.84409876, 31.04325745 ], [ 114.84418775, 31.0429162 ], [ 114.84502978, 31.04169162 ], [ 114.84507126, 31.04103885 ], [ 114.8449624, 31.04047255 ], [ 114.8446964, 31.04016 ], [ 114.84428322, 31.03989393 ], [ 114.84398017, 31.03986954 ], [ 114.84317361, 31.04004102 ], [ 114.84248999, 31.04002103 ], [ 114.84151956, 31.03955435 ], [ 114.84102907, 31.03920788 ], [ 114.84065887, 31.03886102 ], [ 114.84051559, 31.03860054 ], [ 114.84024815, 31.0377079 ], [ 114.84036776, 31.03688947 ], [ 114.84029375, 31.03669933 ], [ 114.84007202, 31.03647813 ], [ 114.8396974, 31.03633241 ], [ 114.8388331, 31.03640888 ], [ 114.83829275, 31.03627018 ], [ 114.83751794, 31.03654753 ], [ 114.83681883, 31.03646573 ], [ 114.83628273, 31.03659622 ], [ 114.83595011, 31.03661062 ], [ 114.83514817, 31.03648015 ], [ 114.83452564, 31.03663293 ], [ 114.83420279, 31.03663621 ], [ 114.83397643, 31.0365563 ], [ 114.83363778, 31.03631201 ], [ 114.83341209, 31.03606889 ], [ 114.83309575, 31.03549969 ], [ 114.8323344, 31.03493429 ], [ 114.83208595, 31.03430784 ], [ 114.83187258, 31.0341359 ], [ 114.8299959, 31.03435976 ], [ 114.82953435, 31.03448473 ], [ 114.82923458, 31.03445599 ], [ 114.82882666, 31.03418643 ], [ 114.82823091, 31.0335884 ], [ 114.8273622, 31.03338604 ], [ 114.82659244, 31.03284371 ], [ 114.82614015, 31.03235838 ], [ 114.8259061, 31.03169464 ], [ 114.8254174, 31.03125072 ], [ 114.82464324, 31.03097399 ], [ 114.8239255, 31.03054018 ], [ 114.82310159, 31.03039204 ], [ 114.82244374, 31.03009768 ], [ 114.82217152, 31.02963936 ], [ 114.82233613, 31.02912398 ], [ 114.82219031, 31.02896044 ], [ 114.82181265, 31.02890552 ], [ 114.8213084, 31.02897022 ], [ 114.82042612, 31.02947982 ], [ 114.81907112, 31.02905432 ], [ 114.81814396, 31.02896827 ], [ 114.81777019, 31.02879444 ], [ 114.81702299, 31.02820076 ], [ 114.81672381, 31.02783015 ], [ 114.81654407, 31.02732017 ], [ 114.81652427, 31.02682998 ], [ 114.81620424, 31.02627147 ], [ 114.81630954, 31.02559639 ], [ 114.81619562, 31.02521797 ], [ 114.81586658, 31.02504647 ], [ 114.81474153, 31.02498781 ], [ 114.81428155, 31.024816 ], [ 114.81405949, 31.02464408 ], [ 114.81401768, 31.02448725 ], [ 114.81409795, 31.02433156 ], [ 114.81470613, 31.02403579 ], [ 114.81486358, 31.02377379 ], [ 114.81480011, 31.02305709 ], [ 114.81432784, 31.02267148 ], [ 114.81429364, 31.02253751 ], [ 114.81492601, 31.0220542 ], [ 114.81526241, 31.02169008 ], [ 114.81564299, 31.02083009 ], [ 114.81602563, 31.02023696 ], [ 114.81615584, 31.01969861 ], [ 114.8162634, 31.01950404 ], [ 114.81656588, 31.0192434 ], [ 114.81715641, 31.01900262 ], [ 114.81728892, 31.01884913 ], [ 114.81731752, 31.01868706 ], [ 114.8172228, 31.01849044 ], [ 114.81672991, 31.01810421 ], [ 114.8164267, 31.01777244 ], [ 114.81588175, 31.01744362 ], [ 114.81567663, 31.01724647 ], [ 114.81564352, 31.01708129 ], [ 114.81590404, 31.01657822 ], [ 114.81591197, 31.01616968 ], [ 114.81521142, 31.01504792 ], [ 114.81484951, 31.01491766 ], [ 114.81370153, 31.01478755 ], [ 114.81323172, 31.01479371 ], [ 114.81308316, 31.01467079 ], [ 114.81282318, 31.01419189 ], [ 114.81226785, 31.01355629 ], [ 114.81205824, 31.01345667 ], [ 114.81135197, 31.0133037 ], [ 114.81073595, 31.01273983 ], [ 114.81006029, 31.01248199 ], [ 114.80984341, 31.01224267 ], [ 114.80987128, 31.01199441 ], [ 114.81010767, 31.01142115 ], [ 114.81028476, 31.01127832 ], [ 114.81081019, 31.01107656 ], [ 114.81106863, 31.01083564 ], [ 114.81109199, 31.01067046 ], [ 114.81088248, 31.01032228 ], [ 114.81085908, 31.01009619 ], [ 114.81097036, 31.00993194 ], [ 114.81131845, 31.0096592 ], [ 114.81141464, 31.0094835 ], [ 114.81142026, 31.00930379 ], [ 114.81134409, 31.00913005 ], [ 114.81070351, 31.00869983 ], [ 114.81057046, 31.00848967 ], [ 114.81082964, 31.00793182 ], [ 114.81087888, 31.0074291 ], [ 114.81081282, 31.00630596 ], [ 114.81059389, 31.00567313 ], [ 114.81056245, 31.00540325 ], [ 114.81059383, 31.00521034 ], [ 114.81070394, 31.00503699 ], [ 114.81125274, 31.00477969 ], [ 114.8114013, 31.00464383 ], [ 114.81143087, 31.00442869 ], [ 114.81122613, 31.00408279 ], [ 114.81120746, 31.00392589 ], [ 114.81159002, 31.00357587 ], [ 114.81167094, 31.00335198 ], [ 114.81147951, 31.00291572 ], [ 114.81100595, 31.00213013 ], [ 114.81084432, 31.00120859 ], [ 114.81067513, 31.00072594 ], [ 114.81069594, 31.00040352 ], [ 114.81097798, 30.99994351 ], [ 114.81104001, 30.99968226 ], [ 114.81056215, 30.99824483 ], [ 114.81049864, 30.99781961 ], [ 114.81051405, 30.99738757 ], [ 114.81068579, 30.99674952 ], [ 114.81070641, 30.9956464 ], [ 114.81082299, 30.99503664 ], [ 114.81039976, 30.99396802 ], [ 114.80995391, 30.99215044 ], [ 114.80976552, 30.99166106 ], [ 114.80963739, 30.99080665 ], [ 114.80946664, 30.99038552 ], [ 114.80932821, 30.98968937 ], [ 114.80912576, 30.98913152 ], [ 114.80896399, 30.98568886 ], [ 114.80902832, 30.98515211 ], [ 114.8091921, 30.98485857 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125V00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121VA0000,AFA9800124V00000", "TRVCD": "AFA9800126V00000", "INDCD": "QFA9800124V00000", "ONDCD": "QFA9800125V00000", "BWSCD": "WFA9800125V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 60.0, "RVSLP": 0.0, "IELV": 28.07, "OELV": 28.07, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80972608, 30.98506911 ], [ 114.80946562, 30.98506887 ], [ 114.8091921, 30.98485857 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800128T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800127T00000,AFA9800121TF0000", "TRVCD": "AFA9800129T00000", "INDCD": "QFA9800127T00000", "ONDCD": "QFA9800128T00000", "BWSCD": "WFA9800128T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 10.0, "RVLEN": 2807.0, "RVSLP": 0.0016, "IELV": 39.89, "OELV": 36.38, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76264983, 31.07973849 ], [ 114.76270402, 31.07934609 ], [ 114.76292634, 31.07884786 ], [ 114.76369842, 31.07808486 ], [ 114.76526155, 31.07720165 ], [ 114.76570837, 31.07700941 ], [ 114.76651153, 31.0768158 ], [ 114.76703415, 31.07640241 ], [ 114.76773356, 31.07553783 ], [ 114.76901962, 31.07429793 ], [ 114.7694847, 31.07345704 ], [ 114.77052202, 31.07245132 ], [ 114.77110367, 31.07170841 ], [ 114.77180235, 31.07108879 ], [ 114.77209169, 31.0709422 ], [ 114.77281255, 31.07076431 ], [ 114.77414959, 31.06997965 ], [ 114.77542372, 31.06985772 ], [ 114.77614974, 31.06949538 ], [ 114.77647247, 31.06942175 ], [ 114.77733609, 31.06939959 ], [ 114.77805943, 31.06954613 ], [ 114.77838186, 31.06953762 ], [ 114.77979219, 31.06893408 ], [ 114.78052836, 31.06878629 ], [ 114.78097381, 31.06859249 ], [ 114.78146942, 31.06818606 ], [ 114.78250807, 31.0667355 ], [ 114.78274614, 31.06620443 ], [ 114.7827804, 31.06562376 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012M000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012L000000,AFA980012FP00000", "TRVCD": "AFA980012N000000", "INDCD": "QFA980012L000000", "ONDCD": "QFA980012M000000", "BWSCD": "WFA980012M000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 23.0, "RVLEN": 8775.0, "RVSLP": 0.0012, "IELV": 49.15, "OELV": 40.97, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01345814, 31.13674162 ], [ 115.01178994, 31.1353843 ], [ 115.00958402, 31.13299365 ], [ 115.00513361, 31.12946315 ], [ 115.00380628, 31.12882798 ], [ 115.00215015, 31.12841192 ], [ 115.0009378, 31.12819816 ], [ 114.99964856, 31.12820835 ], [ 114.99924125, 31.12814626 ], [ 114.99871375, 31.12793776 ], [ 114.99711759, 31.12708396 ], [ 114.99602215, 31.12627421 ], [ 114.99564292, 31.12612996 ], [ 114.99399631, 31.12593778 ], [ 114.9913944, 31.12602519 ], [ 114.99082334, 31.12613189 ], [ 114.98987469, 31.12658401 ], [ 114.98798616, 31.12770565 ], [ 114.98754369, 31.12789987 ], [ 114.98689508, 31.12803696 ], [ 114.9866764, 31.12814185 ], [ 114.98571595, 31.12896796 ], [ 114.98496446, 31.12947164 ], [ 114.98320819, 31.13110839 ], [ 114.98274776, 31.13146521 ], [ 114.98223536, 31.13170588 ], [ 114.98061182, 31.13222895 ], [ 114.97958819, 31.13231209 ], [ 114.97891429, 31.13226955 ], [ 114.97785106, 31.13186086 ], [ 114.97734778, 31.13157615 ], [ 114.9765177, 31.13123178 ], [ 114.97603287, 31.13090628 ], [ 114.97574619, 31.13061207 ], [ 114.9755101, 31.13023613 ], [ 114.97519591, 31.12949383 ], [ 114.97498599, 31.12799221 ], [ 114.97478645, 31.12774027 ], [ 114.97409467, 31.12712028 ], [ 114.97347064, 31.12618442 ], [ 114.9729177, 31.12506869 ], [ 114.97256797, 31.12412359 ], [ 114.97256576, 31.12317997 ], [ 114.97280947, 31.12220187 ], [ 114.97315022, 31.12122419 ], [ 114.97324707, 31.12045319 ], [ 114.97340231, 31.11988443 ], [ 114.97334578, 31.11809793 ], [ 114.97306734, 31.11711849 ], [ 114.97299223, 31.11570416 ], [ 114.97302477, 31.11527285 ], [ 114.97339388, 31.11403762 ], [ 114.97317597, 31.11328501 ], [ 114.97306445, 31.11180585 ], [ 114.97284577, 31.11118042 ], [ 114.97274767, 31.11046502 ], [ 114.97253241, 31.10983805 ], [ 114.97240453, 31.10898369 ], [ 114.97206671, 31.10840761 ], [ 114.97124765, 31.10767621 ], [ 114.97087681, 31.1071061 ], [ 114.97067118, 31.1053717 ], [ 114.97038781, 31.10470352 ], [ 114.96996778, 31.1039815 ], [ 114.969683, 31.10331201 ], [ 114.9695158, 31.10270965 ], [ 114.96926373, 31.10225324 ], [ 114.96858996, 31.10125374 ], [ 114.96724651, 31.10008185 ], [ 114.96650172, 31.09851766 ], [ 114.96577033, 31.0975658 ], [ 114.96543829, 31.09695642 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820700000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "AFA9820600000000", "TRVCD": "AFA9820800000000", "INDCD": "QFA9820600000000", "ONDCD": "QFA9820700000000", "BWSCD": "WFA9820700000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 15.0, "RVLEN": 4676.0, "RVSLP": 0.0015, "IELV": 63.32, "OELV": 44.17, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88233402, 31.1694526 ], [ 114.88251151, 31.16939807 ], [ 114.88272619, 31.16922748 ], [ 114.88330449, 31.16843058 ], [ 114.88355242, 31.16760503 ], [ 114.88350391, 31.16610632 ], [ 114.88354388, 31.1656758 ], [ 114.88380076, 31.16528468 ], [ 114.88419199, 31.16498589 ], [ 114.88458415, 31.16490993 ], [ 114.8853117, 31.16505969 ], [ 114.88609135, 31.16505921 ], [ 114.88651424, 31.1650054 ], [ 114.88705956, 31.16483481 ], [ 114.88774428, 31.16479169 ], [ 114.88864035, 31.16495423 ], [ 114.88940136, 31.16501261 ], [ 114.88996207, 31.16514976 ], [ 114.89073214, 31.16514565 ], [ 114.89202357, 31.16485101 ], [ 114.89287768, 31.16457413 ], [ 114.89385917, 31.16397846 ], [ 114.89473568, 31.16317217 ], [ 114.89508984, 31.16258982 ], [ 114.89537382, 31.16169384 ], [ 114.89536196, 31.16043355 ], [ 114.89541888, 31.16008669 ], [ 114.89593005, 31.15931249 ], [ 114.89629463, 31.15899383 ], [ 114.89669048, 31.15888629 ], [ 114.89728513, 31.15890358 ], [ 114.89875028, 31.15944124 ], [ 114.89941273, 31.15952987 ], [ 114.90060281, 31.15984192 ], [ 114.9018261, 31.16007148 ], [ 114.90239964, 31.16001067 ], [ 114.90287436, 31.15967634 ], [ 114.90368537, 31.15890784 ], [ 114.90390203, 31.1585118 ], [ 114.9038228, 31.15538009 ], [ 114.9038801, 31.15510773 ], [ 114.90422708, 31.15450245 ], [ 114.90427797, 31.15349081 ], [ 114.90434427, 31.15321215 ], [ 114.90503169, 31.15190585 ], [ 114.9068955, 31.14909045 ], [ 114.9074933, 31.14799979 ], [ 114.90867812, 31.14635964 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122H00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121H00000,AFA9900121HA0000", "TRVCD": "AFA990012A000000", "INDCD": "QFA9900121H00000", "ONDCD": "QFA9900129000000", "BWSCD": "WFA9900122H00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3599.0, "RVSLP": 0.0013, "IELV": 116.35, "OELV": 108.81, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31715438, 31.1035397 ], [ 115.31766173, 31.10402599 ], [ 115.31816585, 31.104873 ], [ 115.31804692, 31.1056885 ], [ 115.31807768, 31.10665741 ], [ 115.31813836, 31.10701148 ], [ 115.31847551, 31.10796181 ], [ 115.31887622, 31.10846431 ], [ 115.31989736, 31.1100126 ], [ 115.32049022, 31.11059551 ], [ 115.3215481, 31.11198247 ], [ 115.32214554, 31.11256216 ], [ 115.32355014, 31.114164 ], [ 115.32361439, 31.11463045 ], [ 115.3234351, 31.1154846 ], [ 115.32350561, 31.11697576 ], [ 115.32387453, 31.11814016 ], [ 115.32413154, 31.11859351 ], [ 115.32503284, 31.11997209 ], [ 115.32646604, 31.12155803 ], [ 115.3272105, 31.1222396 ], [ 115.3276324, 31.12292752 ], [ 115.32858221, 31.12376965 ], [ 115.32891431, 31.1245556 ], [ 115.32976808, 31.12535951 ], [ 115.33005341, 31.12579838 ], [ 115.3301582, 31.12614187 ], [ 115.33019986, 31.12688057 ], [ 115.33016584, 31.12731157 ], [ 115.3300008, 31.12795244 ], [ 115.33004687, 31.12929108 ], [ 115.33012995, 31.12963298 ], [ 115.33051024, 31.13017768 ], [ 115.33062311, 31.13055171 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012F000000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA990012E000000,AFA9910C00000000", "TRVCD": "AFA990012G000000", "INDCD": "QFA990012E000000", "ONDCD": "QFA990012F000000", "BWSCD": "WFA990012F000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 19.0, "RVLEN": 1364.0, "RVSLP": 0.009, "IELV": 80.0, "OELV": 71.69, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34205266, 30.97422256 ], [ 115.34182914, 30.97385232 ], [ 115.34176975, 30.97333959 ], [ 115.34238952, 30.97170177 ], [ 115.34248126, 30.97092962 ], [ 115.34262423, 30.97043008 ], [ 115.3426695, 30.96963899 ], [ 115.34283346, 30.96900184 ], [ 115.34272046, 30.96542284 ], [ 115.34280033, 30.96515025 ], [ 115.34309966, 30.96468473 ], [ 115.34324348, 30.96430195 ], [ 115.34358439, 30.96376957 ], [ 115.34375591, 30.96311198 ], [ 115.34388499, 30.96289332 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9700121Y00000", "RVNM": "刘元支渠", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA970012T000000", "INDCD": "-1", "ONDCD": "QFA970012S000000", "BWSCD": "WFA9700121Y00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6367.0, "RVSLP": 0.0007, "IELV": 41.6, "OELV": 30.01, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.69823947, 31.06233014 ], [ 114.69764294, 31.06269793 ], [ 114.69676195, 31.06341444 ], [ 114.69600041, 31.06366965 ], [ 114.69578626, 31.06368583 ], [ 114.69559596, 31.06359955 ], [ 114.69531825, 31.06314643 ], [ 114.69515793, 31.06299384 ], [ 114.69494781, 31.06292361 ], [ 114.69463686, 31.06294581 ], [ 114.69360663, 31.06322281 ], [ 114.69296388, 31.06356787 ], [ 114.69187193, 31.06369923 ], [ 114.69063678, 31.06409892 ], [ 114.68954626, 31.064234 ], [ 114.68882741, 31.06459176 ], [ 114.68851367, 31.06459993 ], [ 114.68792987, 31.06434364 ], [ 114.68763704, 31.0643299 ], [ 114.68682653, 31.06485161 ], [ 114.6860341, 31.06506971 ], [ 114.68536763, 31.06556554 ], [ 114.68452597, 31.06606761 ], [ 114.68275173, 31.06627962 ], [ 114.68258796, 31.06619237 ], [ 114.68233021, 31.06573213 ], [ 114.6821002, 31.06550966 ], [ 114.68127178, 31.06518364 ], [ 114.68031041, 31.06446177 ], [ 114.67994155, 31.06428389 ], [ 114.67928928, 31.06431805 ], [ 114.67803375, 31.06489986 ], [ 114.67763414, 31.06498597 ], [ 114.67714622, 31.06492971 ], [ 114.6766903, 31.06474751 ], [ 114.67611437, 31.06441246 ], [ 114.6755044, 31.06419988 ], [ 114.67518385, 31.06420981 ], [ 114.67377187, 31.06459007 ], [ 114.67349878, 31.06455039 ], [ 114.67331996, 31.06434979 ], [ 114.67306375, 31.06369337 ], [ 114.6717941, 31.06255996 ], [ 114.67146812, 31.06177182 ], [ 114.6706274, 31.0609584 ], [ 114.67034415, 31.06051825 ], [ 114.67014784, 31.06006976 ], [ 114.66994224, 31.05981873 ], [ 114.66900409, 31.05907735 ], [ 114.668029, 31.05865119 ], [ 114.66678966, 31.05799042 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121CA0000", "RVNM": "九里冲", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122C00000", "INDCD": "-1", "ONDCD": "QFA9800121C00000", "BWSCD": "WFA9800121CA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6286.0, "RVSLP": 0.02, "IELV": 288.14, "OELV": 132.97, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04534155, 31.51869933 ], [ 115.04525991, 31.51780872 ], [ 115.04493189, 31.51724247 ], [ 115.04494413, 31.517039 ], [ 115.04552378, 31.51672197 ], [ 115.04685735, 31.51628679 ], [ 115.04715198, 31.51601734 ], [ 115.04738562, 31.5155161 ], [ 115.04758796, 31.5153341 ], [ 115.04786354, 31.51533777 ], [ 115.04890636, 31.51580373 ], [ 115.04990951, 31.51592028 ], [ 115.05069314, 31.51637777 ], [ 115.05099237, 31.51640321 ], [ 115.05215577, 31.51587565 ], [ 115.05246742, 31.51566777 ], [ 115.05293249, 31.51519408 ], [ 115.05343113, 31.51493152 ], [ 115.05381686, 31.51483625 ], [ 115.05441447, 31.51487206 ], [ 115.05565675, 31.51435606 ], [ 115.05665401, 31.51419207 ], [ 115.05717436, 31.51395036 ], [ 115.05777448, 31.51349336 ], [ 115.05804669, 31.51337569 ], [ 115.05824555, 31.51341403 ], [ 115.05839582, 31.51355837 ], [ 115.05861718, 31.51422578 ], [ 115.05895377, 31.51474365 ], [ 115.05928042, 31.51497015 ], [ 115.05957387, 31.51498597 ], [ 115.05995015, 31.51471389 ], [ 115.06020936, 31.51425609 ], [ 115.06036778, 31.51333026 ], [ 115.06045958, 31.51312222 ], [ 115.06099994, 31.51236155 ], [ 115.06125451, 31.51216378 ], [ 115.06148224, 31.51208323 ], [ 115.06198171, 31.51207615 ], [ 115.06325606, 31.51241346 ], [ 115.06448264, 31.51262575 ], [ 115.06480764, 31.51259826 ], [ 115.0650209, 31.51250799 ], [ 115.0655735, 31.51188529 ], [ 115.06577366, 31.51176183 ], [ 115.06600481, 31.51171353 ], [ 115.06639004, 31.51180608 ], [ 115.06737811, 31.51246875 ], [ 115.06850995, 31.51268558 ], [ 115.06883361, 31.51267356 ], [ 115.06929487, 31.51252976 ], [ 115.07012998, 31.51239411 ], [ 115.07099989, 31.51189352 ], [ 115.07120019, 31.5119501 ], [ 115.0717524, 31.51227506 ], [ 115.07197375, 31.51230772 ], [ 115.07225411, 31.51219802 ], [ 115.07329947, 31.51154192 ], [ 115.07352819, 31.51147549 ], [ 115.07384633, 31.51150355 ], [ 115.07448045, 31.51187385 ], [ 115.07472784, 31.51191373 ], [ 115.07490825, 31.51174954 ], [ 115.07531806, 31.51082528 ], [ 115.07554768, 31.51060204 ], [ 115.07584135, 31.51047625 ], [ 115.076423, 31.51048309 ], [ 115.0772226, 31.51070617 ], [ 115.0781943, 31.51116987 ], [ 115.07854959, 31.51118244 ], [ 115.07875417, 31.51099798 ], [ 115.0789182, 31.51054582 ], [ 115.07921242, 31.51001299 ], [ 115.07944786, 31.50980271 ], [ 115.07973178, 31.50971415 ], [ 115.08034397, 31.50989091 ], [ 115.08125864, 31.5102679 ], [ 115.08169855, 31.51037153 ], [ 115.08220199, 31.51020617 ], [ 115.08319619, 31.50964296 ], [ 115.08347259, 31.50961967 ], [ 115.0837116, 31.50985088 ], [ 115.08384586, 31.51047158 ], [ 115.08394033, 31.51065706 ], [ 115.08418969, 31.5108204 ], [ 115.08451449, 31.51085945 ], [ 115.08517199, 31.51073438 ], [ 115.08642432, 31.50972037 ], [ 115.08699596, 31.50965964 ], [ 115.08730812, 31.50975765 ], [ 115.08921582, 31.51079579 ], [ 115.08968534, 31.51088248 ], [ 115.08998566, 31.51077813 ], [ 115.090422, 31.51038795 ], [ 115.09058197, 31.51002551 ], [ 115.09059442, 31.50952444 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JE0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122JE0000", "INDCD": "-1", "ONDCD": "QFA9800121JE0000", "BWSCD": "WFA9800121JE0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4232.0, "RVSLP": 0.0035, "IELV": 87.65, "OELV": 70.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95676152, 31.30888812 ], [ 114.95749813, 31.30926137 ], [ 114.95776227, 31.30956361 ], [ 114.95777794, 31.30995156 ], [ 114.95745469, 31.31092194 ], [ 114.95750448, 31.31116372 ], [ 114.95765208, 31.31133185 ], [ 114.95792564, 31.31149696 ], [ 114.95872248, 31.31170151 ], [ 114.95912367, 31.31168967 ], [ 114.95976591, 31.31135168 ], [ 114.96048568, 31.3111636 ], [ 114.96122886, 31.31064298 ], [ 114.96170791, 31.31052195 ], [ 114.96352168, 31.31049792 ], [ 114.96459029, 31.31089937 ], [ 114.96517362, 31.31120946 ], [ 114.96557231, 31.31128091 ], [ 114.96597959, 31.31122135 ], [ 114.96703694, 31.31080783 ], [ 114.96998162, 31.31071185 ], [ 114.97036359, 31.3108541 ], [ 114.97083738, 31.31121478 ], [ 114.97113594, 31.31151047 ], [ 114.97169072, 31.31231048 ], [ 114.97215973, 31.31262951 ], [ 114.97269931, 31.31280955 ], [ 114.97388034, 31.31288618 ], [ 114.97458992, 31.31330833 ], [ 114.97480714, 31.31337635 ], [ 114.97608363, 31.31314841 ], [ 114.97679242, 31.31293989 ], [ 114.97754242, 31.31296613 ], [ 114.97797188, 31.31321991 ], [ 114.97972649, 31.31462804 ], [ 114.98001745, 31.31478175 ], [ 114.98042967, 31.31483616 ], [ 114.98181435, 31.31477368 ], [ 114.98275206, 31.3144898 ], [ 114.9831024, 31.31427998 ], [ 114.98423419, 31.31323203 ], [ 114.98463977, 31.31295247 ], [ 114.98536558, 31.31278391 ], [ 114.98626055, 31.31241566 ], [ 114.98701183, 31.31230973 ], [ 114.98771974, 31.31210576 ], [ 114.98822597, 31.31208842 ], [ 114.98861966, 31.31219392 ], [ 114.9893541, 31.31257411 ], [ 114.98977038, 31.3128631 ], [ 114.99025934, 31.31332207 ], [ 114.99057388, 31.31390352 ], [ 114.99120145, 31.31445213 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121S00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012R000000", "INDCD": "-1", "ONDCD": "QFA980012Q000000", "BWSCD": "WFA9800121S00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7351.0, "RVSLP": 0.0014, "IELV": 48.62, "OELV": 38.33, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90830831, 31.06071993 ], [ 114.90842601, 31.06086221 ], [ 114.90849007, 31.06108471 ], [ 114.90838418, 31.06178242 ], [ 114.90847659, 31.06210178 ], [ 114.90970647, 31.06316187 ], [ 114.90993978, 31.06347434 ], [ 114.91024124, 31.06436605 ], [ 114.91068967, 31.06618352 ], [ 114.91086026, 31.06660303 ], [ 114.91086892, 31.06707739 ], [ 114.91051757, 31.06767863 ], [ 114.91009722, 31.06859381 ], [ 114.90899648, 31.06974023 ], [ 114.90854986, 31.07059003 ], [ 114.90837167, 31.07112625 ], [ 114.90788433, 31.0720426 ], [ 114.90727943, 31.07285793 ], [ 114.9063661, 31.07375177 ], [ 114.90611602, 31.07419398 ], [ 114.90609119, 31.07450557 ], [ 114.90646165, 31.07507997 ], [ 114.90666794, 31.07605776 ], [ 114.90749566, 31.07687704 ], [ 114.90756799, 31.07715961 ], [ 114.90745512, 31.07732198 ], [ 114.9067238, 31.07784049 ], [ 114.90631618, 31.07826292 ], [ 114.90621276, 31.07846424 ], [ 114.90610011, 31.07901044 ], [ 114.90591002, 31.07941954 ], [ 114.90532619, 31.08021626 ], [ 114.90506448, 31.08037572 ], [ 114.90423958, 31.080506 ], [ 114.9040195, 31.08066221 ], [ 114.90402075, 31.08094011 ], [ 114.90471633, 31.08187165 ], [ 114.90491156, 31.08225714 ], [ 114.90490969, 31.0824345 ], [ 114.90464121, 31.08280635 ], [ 114.90325474, 31.08409818 ], [ 114.90272563, 31.08476375 ], [ 114.90245912, 31.08493804 ], [ 114.90168535, 31.08515559 ], [ 114.90088593, 31.08599813 ], [ 114.90014016, 31.08633174 ], [ 114.89948326, 31.08675225 ], [ 114.8992188, 31.08670361 ], [ 114.89858577, 31.08632955 ], [ 114.89834768, 31.0862961 ], [ 114.89804138, 31.08637004 ], [ 114.89765248, 31.08667453 ], [ 114.89718243, 31.08729794 ], [ 114.8969455, 31.08750437 ], [ 114.89673781, 31.08758604 ], [ 114.89621147, 31.08752959 ], [ 114.89591362, 31.08759195 ], [ 114.89547561, 31.08779778 ], [ 114.8945744, 31.08847647 ], [ 114.89437618, 31.08846582 ], [ 114.89378837, 31.08824123 ], [ 114.89318608, 31.08821597 ], [ 114.89214443, 31.08826966 ], [ 114.8915265, 31.08841715 ], [ 114.89057204, 31.08832187 ], [ 114.88977971, 31.08852647 ], [ 114.88865375, 31.08857623 ], [ 114.8882363, 31.08852803 ], [ 114.88730821, 31.08820382 ], [ 114.88654024, 31.08818629 ], [ 114.88620365, 31.08823112 ], [ 114.88534596, 31.08850152 ], [ 114.88376975, 31.08935425 ], [ 114.88324903, 31.08958047 ], [ 114.88230817, 31.08986641 ], [ 114.88110763, 31.08989104 ], [ 114.88035423, 31.08957361 ], [ 114.88011595, 31.08954174 ], [ 114.87942904, 31.08966335 ], [ 114.87855022, 31.08956617 ], [ 114.87791784, 31.08973386 ], [ 114.87707693, 31.08985257 ], [ 114.87661734, 31.09016778 ], [ 114.87635769, 31.09061707 ], [ 114.87627072, 31.09089952 ], [ 114.87622685, 31.09169669 ], [ 114.87611405, 31.09196767 ], [ 114.87552625, 31.09257578 ], [ 114.87487591, 31.09311201 ], [ 114.87458571, 31.09319626 ], [ 114.87403935, 31.09308977 ], [ 114.87353013, 31.09308373 ], [ 114.87264816, 31.09329509 ], [ 114.8714475, 31.09339006 ], [ 114.87084727, 31.09363947 ], [ 114.86980728, 31.09430158 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122JB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121JB0000", "TRVCD": "AFA9800123JB0000", "INDCD": "QFA9800121JB0000", "ONDCD": "QFA9800122JB0000", "BWSCD": "WFA9800122JB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 4229.0, "RVSLP": 0.0017, "IELV": 107.85, "OELV": 98.28, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91964669, 31.38605494 ], [ 114.9196509, 31.38527038 ], [ 114.9199057, 31.38471833 ], [ 114.92095024, 31.38362397 ], [ 114.92124563, 31.38310016 ], [ 114.92148848, 31.38249848 ], [ 114.92203703, 31.3820031 ], [ 114.9223502, 31.38191246 ], [ 114.92276813, 31.38192031 ], [ 114.92369763, 31.3822496 ], [ 114.92482718, 31.38249578 ], [ 114.92559631, 31.382451 ], [ 114.92639223, 31.38224051 ], [ 114.92768472, 31.38215828 ], [ 114.92888517, 31.38186181 ], [ 114.92984782, 31.3814257 ], [ 114.93032617, 31.38108957 ], [ 114.93085986, 31.38054786 ], [ 114.93115249, 31.37994784 ], [ 114.93116623, 31.37967259 ], [ 114.93109648, 31.37941006 ], [ 114.93083254, 31.37909962 ], [ 114.92946319, 31.37801706 ], [ 114.92911211, 31.37766355 ], [ 114.92863169, 31.37639177 ], [ 114.92822165, 31.3756705 ], [ 114.92812849, 31.37539796 ], [ 114.92806561, 31.37458378 ], [ 114.92813242, 31.37408963 ], [ 114.92848727, 31.37363666 ], [ 114.92919989, 31.37303119 ], [ 114.92941201, 31.37295638 ], [ 114.92963394, 31.37298622 ], [ 114.93041131, 31.37347619 ], [ 114.93130408, 31.37390965 ], [ 114.93180047, 31.37390754 ], [ 114.93242553, 31.37373017 ], [ 114.93281698, 31.37378 ], [ 114.93324813, 31.37413553 ], [ 114.93382615, 31.37516032 ], [ 114.93502926, 31.37613025 ], [ 114.9353303, 31.37626044 ], [ 114.93599005, 31.37635591 ], [ 114.93683926, 31.37664925 ], [ 114.93743051, 31.37669743 ], [ 114.93803575, 31.37666591 ], [ 114.93843243, 31.37655603 ], [ 114.940625, 31.37506456 ], [ 114.94097974, 31.374706 ], [ 114.94112581, 31.37443961 ], [ 114.94114633, 31.3740997 ], [ 114.94104319, 31.3736421 ], [ 114.94108516, 31.3735122 ], [ 114.94163852, 31.37294405 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800123T00000,AFA9800123TB0000", "TRVCD": "AFA9800125T00000", "INDCD": "QFA9800123T00000", "ONDCD": "QFA9800124T00000", "BWSCD": "WFA9800124T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 1301.0, "RVSLP": 0.0003, "IELV": 41.17, "OELV": 40.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.73653018, 31.14048977 ], [ 114.73620413, 31.13987525 ], [ 114.73559162, 31.13912639 ], [ 114.73396207, 31.13774004 ], [ 114.73329812, 31.13695794 ], [ 114.73304612, 31.13651177 ], [ 114.73304704, 31.13612841 ], [ 114.73341185, 31.13545836 ], [ 114.73343119, 31.13457606 ], [ 114.73336585, 31.13399364 ], [ 114.73314571, 31.1333683 ], [ 114.73303187, 31.13220035 ], [ 114.73280879, 31.13157586 ], [ 114.7327399, 31.13046271 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121XB0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122XB0000", "INDCD": "-1", "ONDCD": "QFA9900121XB0000", "BWSCD": "WFA9900121XB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5148.0, "RVSLP": 0.011, "IELV": 206.18, "OELV": 139.25, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23246415, 30.96860002 ], [ 115.23173153, 30.96826986 ], [ 115.23108992, 30.96808859 ], [ 115.23022915, 30.96758576 ], [ 115.22943512, 30.96739 ], [ 115.22850196, 30.96736154 ], [ 115.22819985, 30.96727881 ], [ 115.22678359, 30.96593983 ], [ 115.22604429, 30.96543178 ], [ 115.22562939, 30.96502713 ], [ 115.22555841, 30.96483768 ], [ 115.22558388, 30.96458558 ], [ 115.22608333, 30.96394959 ], [ 115.22620657, 30.96361523 ], [ 115.22618036, 30.96327458 ], [ 115.22598011, 30.96271596 ], [ 115.2258421, 30.96170629 ], [ 115.22548646, 30.96128224 ], [ 115.224695, 30.96082749 ], [ 115.22444509, 30.96061968 ], [ 115.2241259, 30.96006053 ], [ 115.22382709, 30.95967834 ], [ 115.22371045, 30.95934175 ], [ 115.22369386, 30.95846628 ], [ 115.22385547, 30.95789705 ], [ 115.22390784, 30.95710183 ], [ 115.22407962, 30.95653182 ], [ 115.22416446, 30.95575999 ], [ 115.22402202, 30.95564414 ], [ 115.22372397, 30.95559191 ], [ 115.22144377, 30.95565858 ], [ 115.22112412, 30.95558235 ], [ 115.22085889, 30.95539801 ], [ 115.22066533, 30.95508267 ], [ 115.22063795, 30.95451611 ], [ 115.22148047, 30.95179416 ], [ 115.22148591, 30.95153803 ], [ 115.2214056, 30.95136586 ], [ 115.22108204, 30.95119759 ], [ 115.21987384, 30.95118218 ], [ 115.21880878, 30.95099969 ], [ 115.21828605, 30.9507576 ], [ 115.21803626, 30.95053617 ], [ 115.21787445, 30.95027757 ], [ 115.21784065, 30.94986678 ], [ 115.21794776, 30.94938765 ], [ 115.21780897, 30.949083 ], [ 115.21728768, 30.94868003 ], [ 115.21579379, 30.94804033 ], [ 115.21436962, 30.94646382 ], [ 115.21422249, 30.94591188 ], [ 115.21416597, 30.94410812 ], [ 115.21423237, 30.94376194 ], [ 115.21450849, 30.9433001 ], [ 115.21453187, 30.94312819 ], [ 115.21444095, 30.9429765 ], [ 115.21425143, 30.94288166 ], [ 115.21334231, 30.94278155 ], [ 115.21315845, 30.94265257 ], [ 115.21305958, 30.94247478 ], [ 115.21301378, 30.94205816 ], [ 115.21308779, 30.94170817 ], [ 115.21334429, 30.94124556 ], [ 115.21387411, 30.94062122 ], [ 115.21393577, 30.94029738 ], [ 115.21375011, 30.93975017 ], [ 115.2135903, 30.93882778 ], [ 115.21328084, 30.93828639 ], [ 115.21282245, 30.93769276 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900123X00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900122X00000", "TRVCD": "AFA9900124X00000", "INDCD": "QFA9900122X00000", "ONDCD": "QFA9900123X00000", "BWSCD": "WFA9900123X00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 929.0, "RVSLP": 0.0043, "IELV": 136.58, "OELV": 126.46, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19703203, 30.91746092 ], [ 115.19705177, 30.91725605 ], [ 115.19718021, 30.91705143 ], [ 115.19745472, 30.91680189 ], [ 115.19779449, 30.91661521 ], [ 115.19857366, 30.9167116 ], [ 115.19960978, 30.9167303 ], [ 115.20050751, 30.91689604 ], [ 115.20091169, 30.91682895 ], [ 115.20123081, 30.91659626 ], [ 115.20139608, 30.91634032 ], [ 115.20158626, 30.91579017 ], [ 115.20162696, 30.91530199 ], [ 115.20154361, 30.91503067 ], [ 115.20112823, 30.91430971 ], [ 115.20082888, 30.91358246 ], [ 115.20077245, 30.9132887 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900125K00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900124K00000", "TRVCD": "AFA990012D000000", "INDCD": "QFA9900124K00000", "ONDCD": "QFA990012C000000", "BWSCD": "WFA9900125K00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 5.0, "RVLEN": 2781.0, "RVSLP": 0.002, "IELV": 89.38, "OELV": 80.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32808568, 31.039831 ], [ 115.32870172, 31.03976768 ], [ 115.32921033, 31.03963835 ], [ 115.32983223, 31.03974993 ], [ 115.33016559, 31.03974604 ], [ 115.3308506, 31.03950207 ], [ 115.33111607, 31.03932038 ], [ 115.33131794, 31.03907574 ], [ 115.33153967, 31.03824744 ], [ 115.33175206, 31.03787392 ], [ 115.33198995, 31.03768349 ], [ 115.3331504, 31.03711372 ], [ 115.33370203, 31.03677238 ], [ 115.3344695, 31.03651189 ], [ 115.33527421, 31.03633428 ], [ 115.33797553, 31.03506301 ], [ 115.33933187, 31.03454232 ], [ 115.34006042, 31.03438755 ], [ 115.34137355, 31.03397429 ], [ 115.34178598, 31.03398244 ], [ 115.34250785, 31.03412834 ], [ 115.34450225, 31.03407516 ], [ 115.34517777, 31.0340064 ], [ 115.34665601, 31.03361827 ], [ 115.34735985, 31.03373033 ], [ 115.34820865, 31.03369354 ], [ 115.34995029, 31.03304237 ], [ 115.35127943, 31.03285319 ], [ 115.35177164, 31.03260972 ], [ 115.35223855, 31.03222689 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121H00000", "RVNM": "举水", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012C000000", "INDCD": "-1", "ONDCD": "QFA980012B000000", "BWSCD": "WFA9800121H00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5562.0, "RVSLP": 0.014, "IELV": 198.12, "OELV": 77.31, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11199965, 31.36150623 ], [ 115.11175813, 31.36163926 ], [ 115.1109855, 31.36182625 ], [ 115.11008628, 31.36219992 ], [ 115.1086398, 31.36234639 ], [ 115.10786106, 31.36259566 ], [ 115.10662051, 31.3631265 ], [ 115.10611423, 31.36303087 ], [ 115.10519569, 31.36268335 ], [ 115.10397239, 31.36245745 ], [ 115.10196449, 31.36249037 ], [ 115.10163942, 31.36254793 ], [ 115.10143904, 31.36265896 ], [ 115.10089643, 31.36339047 ], [ 115.10070371, 31.36392609 ], [ 115.10021578, 31.36484433 ], [ 115.09975047, 31.36532577 ], [ 115.0991183, 31.36581801 ], [ 115.09866185, 31.36639611 ], [ 115.09860165, 31.36687157 ], [ 115.09880598, 31.36742948 ], [ 115.09884353, 31.36777437 ], [ 115.09877225, 31.36804252 ], [ 115.09851384, 31.36835585 ], [ 115.09811395, 31.36865823 ], [ 115.09758993, 31.36888191 ], [ 115.0972687, 31.36892004 ], [ 115.09674376, 31.36887032 ], [ 115.09613414, 31.36902132 ], [ 115.09579238, 31.36923198 ], [ 115.09558563, 31.3694745 ], [ 115.09538632, 31.36986883 ], [ 115.09524705, 31.37056419 ], [ 115.0949761, 31.3713241 ], [ 115.0947096, 31.37163668 ], [ 115.09438018, 31.37188502 ], [ 115.0940655, 31.3719758 ], [ 115.09373177, 31.37197164 ], [ 115.09296829, 31.3716383 ], [ 115.09246243, 31.37157791 ], [ 115.09196352, 31.37165944 ], [ 115.09158999, 31.37196004 ], [ 115.09146893, 31.37229205 ], [ 115.09152754, 31.37270167 ], [ 115.0918584, 31.37321656 ], [ 115.09245958, 31.37381306 ], [ 115.09256997, 31.37407873 ], [ 115.09256583, 31.37464009 ], [ 115.09229928, 31.37501668 ], [ 115.09157633, 31.37539356 ], [ 115.09089614, 31.37547442 ], [ 115.08923705, 31.37550161 ], [ 115.08746608, 31.37519188 ], [ 115.08718593, 31.37531355 ], [ 115.08687967, 31.37558778 ], [ 115.08667687, 31.37591805 ], [ 115.08632789, 31.37745553 ], [ 115.08608085, 31.37791379 ], [ 115.08548857, 31.37859776 ], [ 115.08524919, 31.37905657 ], [ 115.0850044, 31.3798088 ], [ 115.08490593, 31.38035756 ], [ 115.08456795, 31.38133574 ], [ 115.08452181, 31.38183139 ], [ 115.08459624, 31.38363043 ], [ 115.08450171, 31.38404426 ], [ 115.0841204, 31.38447806 ], [ 115.08271397, 31.38573389 ], [ 115.08145258, 31.38650167 ], [ 115.08053968, 31.38724282 ], [ 115.07991209, 31.3875017 ], [ 115.07952228, 31.38755209 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PD0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PD0000", "INDCD": "-1", "ONDCD": "QFA9800121PD0000", "BWSCD": "WFA9800121PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5647.0, "RVSLP": 0.0252, "IELV": 399.63, "OELV": 264.88, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35380033, 31.28950164 ], [ 115.35347018, 31.28888765 ], [ 115.35279792, 31.28808017 ], [ 115.35118562, 31.28680148 ], [ 115.35081535, 31.28674952 ], [ 115.35000343, 31.28709111 ], [ 115.34950179, 31.28718183 ], [ 115.34890765, 31.28717382 ], [ 115.34858199, 31.28699833 ], [ 115.34828069, 31.286064 ], [ 115.3474844, 31.28530226 ], [ 115.34732774, 31.28491152 ], [ 115.34735189, 31.28465042 ], [ 115.34746127, 31.28447538 ], [ 115.34819159, 31.2841379 ], [ 115.34860631, 31.28376429 ], [ 115.34866184, 31.28353442 ], [ 115.34836815, 31.28321052 ], [ 115.34792364, 31.28298752 ], [ 115.34636555, 31.2829738 ], [ 115.34533626, 31.28270996 ], [ 115.34462784, 31.28225854 ], [ 115.343514, 31.28173962 ], [ 115.34167719, 31.28029671 ], [ 115.34067299, 31.279702 ], [ 115.34021782, 31.27931443 ], [ 115.33976248, 31.27878564 ], [ 115.33942165, 31.27858185 ], [ 115.33910771, 31.27855838 ], [ 115.33833223, 31.27872612 ], [ 115.33750446, 31.27840531 ], [ 115.33645318, 31.27820501 ], [ 115.33456571, 31.27818764 ], [ 115.33434246, 31.27809359 ], [ 115.33409432, 31.27788547 ], [ 115.33371363, 31.27728151 ], [ 115.33351599, 31.27718425 ], [ 115.33321603, 31.27719037 ], [ 115.33291762, 31.27740528 ], [ 115.33266841, 31.27793173 ], [ 115.33269273, 31.27841728 ], [ 115.3331415, 31.27971592 ], [ 115.33306429, 31.27996408 ], [ 115.33245757, 31.28062875 ], [ 115.33235844, 31.28081917 ], [ 115.3323903, 31.28105588 ], [ 115.33260527, 31.28140034 ], [ 115.3325424, 31.28159822 ], [ 115.33209124, 31.28184514 ], [ 115.3316843, 31.28193762 ], [ 115.33055245, 31.28196815 ], [ 115.3298381, 31.28185598 ], [ 115.32907449, 31.28199007 ], [ 115.3277319, 31.28167405 ], [ 115.32654395, 31.2816155 ], [ 115.32586709, 31.28134032 ], [ 115.32552794, 31.28100136 ], [ 115.32506923, 31.27995798 ], [ 115.32448874, 31.27922339 ], [ 115.32347709, 31.27817 ], [ 115.32319611, 31.27801291 ], [ 115.32288624, 31.27799384 ], [ 115.32268241, 31.27807372 ], [ 115.3225203, 31.27829831 ], [ 115.32247236, 31.27939195 ], [ 115.32225758, 31.27993994 ], [ 115.32164047, 31.28083484 ], [ 115.32122247, 31.28123121 ], [ 115.32087216, 31.28135445 ], [ 115.32005292, 31.28103894 ], [ 115.3195463, 31.28102228 ], [ 115.31889693, 31.28111392 ], [ 115.31867018, 31.2810503 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121VA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800125V00000", "INDCD": "-1", "ONDCD": "QFA9800124V00000", "BWSCD": "WFA9800121VA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2171.0, "RVSLP": 0.0007, "IELV": 29.58, "OELV": 28.07, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81701947, 30.97066728 ], [ 114.81589322, 30.97093839 ], [ 114.81562201, 30.97107765 ], [ 114.81532355, 30.97157199 ], [ 114.81518584, 30.97219167 ], [ 114.81508317, 30.97239394 ], [ 114.81419845, 30.97329456 ], [ 114.81367002, 30.97397395 ], [ 114.81320414, 30.97430812 ], [ 114.81246499, 30.97446177 ], [ 114.81193814, 30.9746885 ], [ 114.81153593, 30.97506364 ], [ 114.81147717, 30.97525596 ], [ 114.81151015, 30.97551384 ], [ 114.81191606, 30.97624885 ], [ 114.81198826, 30.9765216 ], [ 114.81213582, 30.97913157 ], [ 114.81224411, 30.9793945 ], [ 114.81287756, 30.98012814 ], [ 114.81302819, 30.98097972 ], [ 114.81320323, 30.98146474 ], [ 114.81320322, 30.98172555 ], [ 114.81306653, 30.98198427 ], [ 114.8127738, 30.98228213 ], [ 114.81170405, 30.98305925 ], [ 114.81134424, 30.98377017 ], [ 114.81080419, 30.98452448 ], [ 114.81047019, 30.98477195 ], [ 114.80972608, 30.98506911 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123L00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122L00000", "TRVCD": "AFA9800124L00000", "INDCD": "QFA9800122L00000", "ONDCD": "QFA9800123L00000", "BWSCD": "WFA9800123L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 5073.0, "RVSLP": 0.0056, "IELV": 114.41, "OELV": 67.62, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10471201, 31.30878032 ], [ 115.10463309, 31.30750973 ], [ 115.10435368, 31.30660171 ], [ 115.10440389, 31.30611814 ], [ 115.10476621, 31.30568292 ], [ 115.10560114, 31.30513589 ], [ 115.10626497, 31.30449259 ], [ 115.1065517, 31.30389288 ], [ 115.10658604, 31.30280193 ], [ 115.10680677, 31.30226089 ], [ 115.10704508, 31.30194809 ], [ 115.10784152, 31.3011801 ], [ 115.10866189, 31.30018819 ], [ 115.10896156, 31.29955046 ], [ 115.10890397, 31.29938834 ], [ 115.10873778, 31.29926305 ], [ 115.10720006, 31.29894379 ], [ 115.10596838, 31.29823845 ], [ 115.10412014, 31.29680127 ], [ 115.10371645, 31.29638554 ], [ 115.10341784, 31.29572226 ], [ 115.10333193, 31.29522822 ], [ 115.10292421, 31.28646578 ], [ 115.10259835, 31.28566307 ], [ 115.10203995, 31.28477644 ], [ 115.10137758, 31.28399572 ], [ 115.10028017, 31.28304452 ], [ 115.09991984, 31.28239839 ], [ 115.09980467, 31.28161022 ], [ 115.09965428, 31.28107556 ], [ 115.10009103, 31.2800997 ], [ 115.1004987, 31.27945439 ], [ 115.10276429, 31.27734841 ], [ 115.1029645, 31.27709274 ], [ 115.10303156, 31.27689338 ], [ 115.10298588, 31.27642058 ], [ 115.10251022, 31.27533152 ], [ 115.1023561, 31.27379765 ], [ 115.1020322, 31.2728401 ], [ 115.10156221, 31.27175569 ], [ 115.10148786, 31.27079788 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800127000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800122C00000,AFA9800126000000", "TRVCD": "AFA9800128000000", "INDCD": "QFA9800126000000", "ONDCD": "QFA9800127000000", "BWSCD": "WFA9800127000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 3974.0, "RVSLP": 0.0034, "IELV": 103.3, "OELV": 89.78, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0992834, 31.47973768 ], [ 115.09921882, 31.47772186 ], [ 115.09938989, 31.4770863 ], [ 115.09945492, 31.47645077 ], [ 115.0995903, 31.47602142 ], [ 115.09965445, 31.47538552 ], [ 115.09990224, 31.47478197 ], [ 115.10052236, 31.47380336 ], [ 115.10058597, 31.47323928 ], [ 115.1005061, 31.47189623 ], [ 115.10027036, 31.47120018 ], [ 115.1001477, 31.470572 ], [ 115.09909588, 31.46876246 ], [ 115.09900695, 31.46772765 ], [ 115.09907033, 31.46715957 ], [ 115.09942542, 31.46671198 ], [ 115.10002694, 31.46625831 ], [ 115.10193199, 31.46573199 ], [ 115.10285132, 31.46559641 ], [ 115.1039598, 31.46508224 ], [ 115.10517982, 31.46399826 ], [ 115.10535164, 31.46373796 ], [ 115.10535598, 31.46342774 ], [ 115.10518616, 31.4632061 ], [ 115.10439234, 31.4627658 ], [ 115.10323366, 31.46232595 ], [ 115.10248709, 31.46222476 ], [ 115.10129391, 31.46191803 ], [ 115.09956757, 31.46164636 ], [ 115.09876999, 31.46144992 ], [ 115.09823299, 31.46124513 ], [ 115.09631159, 31.46028721 ], [ 115.095015, 31.45976969 ], [ 115.09413442, 31.45930781 ], [ 115.09291247, 31.45857992 ], [ 115.09164424, 31.45762813 ], [ 115.09134573, 31.45750775 ], [ 115.09095361, 31.457475 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012E000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012D000000,AFA9800121I00000", "TRVCD": "AFA980012F000000", "INDCD": "QFA980012D000000", "ONDCD": "QFA980012E000000", "BWSCD": "WFA980012E000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 15.0, "RVLEN": 9011.0, "RVSLP": 0.0003, "IELV": 67.32, "OELV": 60.12, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03479648, 31.35775364 ], [ 115.03262806, 31.35603784 ], [ 115.03233763, 31.35588292 ], [ 115.03178443, 31.35572764 ], [ 115.03124192, 31.35534046 ], [ 115.03082493, 31.3547902 ], [ 115.03052634, 31.35426386 ], [ 115.03045378, 31.35392205 ], [ 115.03047398, 31.35349693 ], [ 115.03096629, 31.35250235 ], [ 115.03128873, 31.35212798 ], [ 115.03230636, 31.35121615 ], [ 115.03324332, 31.35072826 ], [ 115.03440004, 31.34993799 ], [ 115.03653211, 31.34794031 ], [ 115.03683703, 31.34743006 ], [ 115.03687336, 31.34711411 ], [ 115.03660038, 31.34660283 ], [ 115.03567568, 31.3453698 ], [ 115.0351097, 31.34425983 ], [ 115.03460593, 31.3426956 ], [ 115.03416042, 31.34167751 ], [ 115.03405775, 31.34027804 ], [ 115.03419017, 31.33937759 ], [ 115.03386477, 31.33814244 ], [ 115.03358762, 31.33769836 ], [ 115.03279379, 31.33681044 ], [ 115.03177849, 31.33601192 ], [ 115.03091048, 31.33551991 ], [ 115.03049071, 31.33512204 ], [ 115.03022551, 31.33467271 ], [ 115.03005135, 31.33407149 ], [ 115.02962393, 31.33327263 ], [ 115.02954825, 31.3327744 ], [ 115.02954174, 31.33203441 ], [ 115.02980164, 31.33091555 ], [ 115.02999592, 31.33050825 ], [ 115.03023144, 31.33019219 ], [ 115.03067551, 31.32981414 ], [ 115.03134428, 31.32951793 ], [ 115.03218161, 31.3294035 ], [ 115.03264293, 31.32925419 ], [ 115.03347725, 31.32913786 ], [ 115.03459221, 31.32885689 ], [ 115.0356207, 31.32838036 ], [ 115.03621135, 31.32790971 ], [ 115.03679842, 31.32730376 ], [ 115.03728321, 31.32638438 ], [ 115.0375702, 31.32526264 ], [ 115.03757375, 31.32468134 ], [ 115.03749715, 31.32433646 ], [ 115.03726865, 31.32394183 ], [ 115.03686742, 31.32355645 ], [ 115.03610564, 31.32326536 ], [ 115.03481873, 31.32325074 ], [ 115.03412216, 31.32302717 ], [ 115.03363077, 31.32270164 ], [ 115.03134827, 31.32085482 ], [ 115.03093585, 31.3203057 ], [ 115.0303615, 31.31934169 ], [ 115.03018975, 31.3187397 ], [ 115.02974163, 31.31771844 ], [ 115.02968028, 31.31693179 ], [ 115.02991808, 31.31631953 ], [ 115.03059439, 31.31528859 ], [ 115.03096354, 31.31435619 ], [ 115.0314502, 31.31343862 ], [ 115.03214162, 31.31271018 ], [ 115.03272406, 31.31197033 ], [ 115.03529473, 31.30956834 ], [ 115.03562864, 31.30932447 ], [ 115.03606981, 31.30912016 ], [ 115.03687721, 31.30894183 ], [ 115.0373939, 31.3087101 ], [ 115.03863358, 31.30791422 ], [ 115.03957027, 31.30742262 ], [ 115.04134953, 31.30583591 ], [ 115.04165036, 31.30571624 ], [ 115.04274437, 31.30557849 ], [ 115.04315004, 31.30529872 ], [ 115.04347417, 31.30492753 ], [ 115.04396592, 31.303928 ], [ 115.04397019, 31.30358419 ], [ 115.04382259, 31.30325753 ], [ 115.04296789, 31.30254422 ], [ 115.04216829, 31.3020966 ], [ 115.04140926, 31.30154758 ], [ 115.04021914, 31.30100175 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122PF0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PF0000", "TRVCD": "AFA9800128P00000", "INDCD": "QFA9800121PF0000", "ONDCD": "QFA9800127P00000", "BWSCD": "WFA9800122PF0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6521.0, "RVSLP": 0.0119, "IELV": 152.29, "OELV": 80.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16473762, 31.32835563 ], [ 115.16475022, 31.32786582 ], [ 115.16487334, 31.32750043 ], [ 115.16589105, 31.32604092 ], [ 115.16626027, 31.32519404 ], [ 115.16662473, 31.3246686 ], [ 115.16685276, 31.32420357 ], [ 115.16690422, 31.32378196 ], [ 115.16686566, 31.32303022 ], [ 115.1666504, 31.32211637 ], [ 115.16677003, 31.32181035 ], [ 115.16707915, 31.32158553 ], [ 115.16739585, 31.32154567 ], [ 115.16770636, 31.32164022 ], [ 115.16851196, 31.32210814 ], [ 115.17007838, 31.32211805 ], [ 115.17063952, 31.32196163 ], [ 115.17116811, 31.32143967 ], [ 115.1712528, 31.32116394 ], [ 115.17126067, 31.32079797 ], [ 115.17111163, 31.32024452 ], [ 115.17073585, 31.31992834 ], [ 115.16966463, 31.31944971 ], [ 115.1694545, 31.31923386 ], [ 115.16942604, 31.31901592 ], [ 115.16960919, 31.31882949 ], [ 115.17024471, 31.31867188 ], [ 115.17048133, 31.318506 ], [ 115.17054575, 31.31833044 ], [ 115.17052798, 31.31814637 ], [ 115.17019163, 31.3176395 ], [ 115.17013405, 31.31745396 ], [ 115.17034404, 31.3167416 ], [ 115.17048933, 31.31656997 ], [ 115.17122639, 31.31604594 ], [ 115.17189779, 31.31539779 ], [ 115.17263224, 31.31410828 ], [ 115.17418029, 31.31219812 ], [ 115.17493198, 31.31141073 ], [ 115.17521238, 31.31088432 ], [ 115.17592568, 31.30876441 ], [ 115.17612605, 31.30792593 ], [ 115.17613368, 31.30766445 ], [ 115.17567951, 31.30674045 ], [ 115.17546991, 31.30568179 ], [ 115.17518822, 31.30523953 ], [ 115.17429666, 31.30430379 ], [ 115.17316039, 31.30336362 ], [ 115.17298162, 31.30309907 ], [ 115.17306043, 31.30296388 ], [ 115.17324582, 31.30287322 ], [ 115.17394835, 31.30264779 ], [ 115.17491552, 31.30243901 ], [ 115.17587833, 31.30255566 ], [ 115.17646198, 31.30247568 ], [ 115.1767316, 31.30230016 ], [ 115.17694227, 31.30205837 ], [ 115.17714434, 31.30166297 ], [ 115.17721204, 31.30138202 ], [ 115.17718436, 31.30056981 ], [ 115.1770394, 31.3001541 ], [ 115.17684253, 31.29984264 ], [ 115.1765498, 31.29955016 ], [ 115.17553368, 31.29894997 ], [ 115.1750366, 31.29850169 ], [ 115.17479204, 31.2980019 ], [ 115.17492022, 31.29724688 ], [ 115.17483128, 31.29676787 ], [ 115.17414376, 31.29604488 ], [ 115.17368124, 31.29540415 ], [ 115.17383638, 31.29454623 ], [ 115.1748559, 31.2927784 ], [ 115.17504534, 31.29180407 ], [ 115.17563507, 31.29081465 ], [ 115.17633382, 31.28847486 ], [ 115.1763162, 31.28821631 ], [ 115.17621588, 31.28802308 ], [ 115.17543573, 31.28700156 ], [ 115.17498807, 31.28658378 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122QC0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121QCA000,AFA9800121QC0000", "TRVCD": "AFA9800124Q00000", "INDCD": "QFA9800121QC0000", "ONDCD": "QFA9800122QC0000", "BWSCD": "WFA9800122QC0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 6412.0, "RVSLP": 0.0103, "IELV": 146.86, "OELV": 85.8, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18595447, 31.04106011 ], [ 115.18590792, 31.0402554 ], [ 115.18595242, 31.03980663 ], [ 115.18673981, 31.03865744 ], [ 115.18686025, 31.03831796 ], [ 115.18677961, 31.03575788 ], [ 115.18666095, 31.03520688 ], [ 115.18650813, 31.03506162 ], [ 115.18630768, 31.03502284 ], [ 115.18593028, 31.03525247 ], [ 115.18577956, 31.03551642 ], [ 115.18568132, 31.03622789 ], [ 115.18553759, 31.03649853 ], [ 115.18499154, 31.03702357 ], [ 115.1842221, 31.03751831 ], [ 115.1838406, 31.03794223 ], [ 115.18376816, 31.03834997 ], [ 115.18386537, 31.03888092 ], [ 115.18378808, 31.03905504 ], [ 115.18341953, 31.03930212 ], [ 115.18294562, 31.0392637 ], [ 115.18249895, 31.03890355 ], [ 115.18226897, 31.03852176 ], [ 115.18220263, 31.03825454 ], [ 115.18234628, 31.03762489 ], [ 115.1824141, 31.03675818 ], [ 115.18277191, 31.03571352 ], [ 115.18275248, 31.03542241 ], [ 115.18256377, 31.03525905 ], [ 115.1822007, 31.03512952 ], [ 115.18187365, 31.03514435 ], [ 115.18079203, 31.03546159 ], [ 115.18059038, 31.03542919 ], [ 115.18035248, 31.03525152 ], [ 115.18023591, 31.03506408 ], [ 115.18017577, 31.03478825 ], [ 115.18003762, 31.0323817 ], [ 115.17978777, 31.03199438 ], [ 115.17931188, 31.03166837 ], [ 115.17908807, 31.03164081 ], [ 115.1788737, 31.03171786 ], [ 115.17791222, 31.03256574 ], [ 115.17753372, 31.03300407 ], [ 115.17684934, 31.0342417 ], [ 115.17649446, 31.03459642 ], [ 115.17614246, 31.03478847 ], [ 115.17582436, 31.03479785 ], [ 115.17552586, 31.03467221 ], [ 115.17361115, 31.03314951 ], [ 115.17334224, 31.0330179 ], [ 115.1731456, 31.03304562 ], [ 115.17262067, 31.03352415 ], [ 115.17198571, 31.03469867 ], [ 115.17178398, 31.03495426 ], [ 115.17072426, 31.03595994 ], [ 115.17027578, 31.03622052 ], [ 115.17007392, 31.03617217 ], [ 115.16890831, 31.03556578 ], [ 115.1675523, 31.03522459 ], [ 115.16634047, 31.03471584 ], [ 115.16555983, 31.03405889 ], [ 115.16482052, 31.03270845 ], [ 115.1643197, 31.03229514 ], [ 115.16353242, 31.03205853 ], [ 115.16266398, 31.03208143 ], [ 115.16196402, 31.03220499 ], [ 115.16109866, 31.03210387 ], [ 115.16088291, 31.03202265 ], [ 115.16068757, 31.0318137 ], [ 115.16028358, 31.03105173 ], [ 115.15968654, 31.03031764 ], [ 115.15911391, 31.02980553 ], [ 115.15867849, 31.02954775 ], [ 115.15809243, 31.029498 ], [ 115.15760994, 31.02961461 ], [ 115.15556439, 31.03144516 ], [ 115.15493371, 31.0317385 ], [ 115.15466819, 31.03167358 ], [ 115.1544317, 31.03147369 ], [ 115.15390828, 31.03050207 ], [ 115.15354388, 31.03018816 ], [ 115.15311815, 31.03013228 ], [ 115.15244364, 31.03035564 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124QD0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800123QD0000", "TRVCD": "AFA9800127Q00000", "INDCD": "QFA9800123QD0000", "ONDCD": "QFA9800126Q00000", "BWSCD": "WFA9800124QD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 4152.0, "RVSLP": 0.0022, "IELV": 59.08, "OELV": 47.89, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03362142, 31.07112424 ], [ 115.0327737, 31.07113802 ], [ 115.03214358, 31.0709364 ], [ 115.03068231, 31.06994435 ], [ 115.03036799, 31.06992189 ], [ 115.02974993, 31.07009645 ], [ 115.02925484, 31.07010836 ], [ 115.02807342, 31.06980367 ], [ 115.02733593, 31.06970427 ], [ 115.02071179, 31.0680279 ], [ 115.02038171, 31.0679898 ], [ 115.01865226, 31.06804498 ], [ 115.01753014, 31.06829574 ], [ 115.01494383, 31.06842257 ], [ 115.01452578, 31.0686498 ], [ 115.01389248, 31.06945328 ], [ 115.0132431, 31.06997023 ], [ 115.0128363, 31.07005201 ], [ 115.01171833, 31.07011365 ], [ 115.0110949, 31.07029542 ], [ 115.01059232, 31.07035597 ], [ 115.00781994, 31.07044919 ], [ 115.00694216, 31.07033593 ], [ 115.0061816, 31.07046812 ], [ 115.00546685, 31.07033448 ], [ 115.00409668, 31.07033005 ], [ 115.0033781, 31.0701821 ], [ 115.00209165, 31.07018613 ], [ 115.00128916, 31.07002846 ], [ 114.99956847, 31.07005731 ], [ 114.99851213, 31.06988864 ], [ 114.99661453, 31.06993245 ], [ 114.99597844, 31.06979228 ], [ 114.99522251, 31.06974622 ], [ 114.99425113, 31.06958236 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800125000000,AFA9800123B00000", "TRVCD": "AFA9800127000000", "INDCD": "QFA9800125000000", "ONDCD": "QFA9800126000000", "BWSCD": "WFA9800126000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 3310.0, "RVSLP": 0.0021, "IELV": 115.4, "OELV": 103.3, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12457225, 31.49223933 ], [ 115.12407686, 31.49184579 ], [ 115.12373199, 31.49165615 ], [ 115.12306708, 31.49156556 ], [ 115.12170957, 31.49122617 ], [ 115.1175137, 31.49131996 ], [ 115.11503486, 31.49095955 ], [ 115.11461432, 31.49100828 ], [ 115.11345311, 31.49139833 ], [ 115.11313153, 31.49143365 ], [ 115.11243023, 31.49122938 ], [ 115.11128644, 31.49076021 ], [ 115.11025795, 31.48998048 ], [ 115.10980129, 31.48935796 ], [ 115.10956016, 31.48861306 ], [ 115.10899192, 31.48750225 ], [ 115.10835646, 31.48647548 ], [ 115.10803161, 31.48573649 ], [ 115.10785457, 31.48429267 ], [ 115.10756969, 31.48362096 ], [ 115.10732635, 31.48331435 ], [ 115.10684931, 31.48296418 ], [ 115.10454045, 31.4818428 ], [ 115.10141273, 31.48085637 ], [ 115.10005558, 31.48051772 ], [ 115.09969247, 31.48024838 ], [ 115.0992834, 31.47973768 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012G000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800127J00000,AFA980012F000000", "TRVCD": "AFA980012H000000", "INDCD": "QFA980012F000000", "ONDCD": "QFA980012G000000", "BWSCD": "WFA980012G000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 17.0, "RVLEN": 2109.0, "RVSLP": 0.0, "IELV": 60.05, "OELV": 60.09, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0268949, 31.28231431 ], [ 115.02627687, 31.28229396 ], [ 115.02549309, 31.28214622 ], [ 115.02272376, 31.2822168 ], [ 115.02200129, 31.28206832 ], [ 115.02072171, 31.28204493 ], [ 115.02018027, 31.28186389 ], [ 115.01982125, 31.28165994 ], [ 115.01938371, 31.28127137 ], [ 115.0171883, 31.27840695 ], [ 115.0170382, 31.2777803 ], [ 115.01707246, 31.27683266 ], [ 115.01781365, 31.27493203 ], [ 115.01837991, 31.27379383 ], [ 115.01875429, 31.27263896 ], [ 115.01911199, 31.27208839 ], [ 115.02017629, 31.27150785 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501I0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA98502I0000000", "INDCD": "-1", "ONDCD": "QFA98501I0000000", "BWSCD": "WFA98501I0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4155.0, "RVSLP": 0.002, "IELV": 52.5, "OELV": 45.67, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91856824, 31.01735569 ], [ 114.91923058, 31.01656025 ], [ 114.91985941, 31.01608808 ], [ 114.91996383, 31.01592362 ], [ 114.91996026, 31.0157622 ], [ 114.91967709, 31.01533571 ], [ 114.91963374, 31.01515584 ], [ 114.91994048, 31.01457614 ], [ 114.92018208, 31.01389057 ], [ 114.92020254, 31.01347971 ], [ 114.92005901, 31.01288516 ], [ 114.92038182, 31.01217978 ], [ 114.92016034, 31.01128899 ], [ 114.92014619, 31.01018975 ], [ 114.92044501, 31.00914967 ], [ 114.92112437, 31.00841598 ], [ 114.9212714, 31.00809328 ], [ 114.92124307, 31.00783576 ], [ 114.92079208, 31.00681536 ], [ 114.92077979, 31.00634049 ], [ 114.92103455, 31.00595371 ], [ 114.92223035, 31.00484065 ], [ 114.9223758, 31.00464727 ], [ 114.92245934, 31.00437751 ], [ 114.92234757, 31.00138806 ], [ 114.92197848, 30.99999421 ], [ 114.92180618, 30.99974635 ], [ 114.92133973, 30.99936408 ], [ 114.92113039, 30.99882403 ], [ 114.92085157, 30.99838977 ], [ 114.92029058, 30.99798243 ], [ 114.92016816, 30.99775562 ], [ 114.92017355, 30.99757555 ], [ 114.92027173, 30.99740099 ], [ 114.92078378, 30.99703656 ], [ 114.92100791, 30.99674246 ], [ 114.92094383, 30.99617804 ], [ 114.92103028, 30.99564168 ], [ 114.92092576, 30.99531016 ], [ 114.9200246, 30.99383413 ], [ 114.91979016, 30.99236441 ], [ 114.9200135, 30.99180936 ], [ 114.92003558, 30.99135364 ], [ 114.92043447, 30.99099041 ], [ 114.92052994, 30.99081165 ], [ 114.92051833, 30.9902163 ], [ 114.92071608, 30.99006712 ], [ 114.92132575, 30.98991601 ], [ 114.92152611, 30.9896731 ], [ 114.92150595, 30.98949378 ], [ 114.92128103, 30.98897955 ], [ 114.92114212, 30.98880397 ], [ 114.92065263, 30.98845357 ], [ 114.92062616, 30.98819027 ], [ 114.92092437, 30.98799975 ], [ 114.92180558, 30.98795407 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850200000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850100000000", "TRVCD": "AFA9850300000000", "INDCD": "QFA9850100000000", "ONDCD": "QFA9850200000000", "BWSCD": "WFA9850200000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2505.0, "RVSLP": 0.0083, "IELV": 99.71, "OELV": 79.18, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08532755, 30.91884586 ], [ 115.08499408, 30.91901555 ], [ 115.08446727, 30.91910195 ], [ 115.08351593, 30.91910806 ], [ 115.08253811, 30.91893227 ], [ 115.08211771, 30.91896809 ], [ 115.0818175, 30.9190908 ], [ 115.08133005, 30.91953977 ], [ 115.08102169, 30.92005923 ], [ 115.08033024, 30.92180946 ], [ 115.07997202, 30.9221283 ], [ 115.07920621, 30.92260658 ], [ 115.07876617, 30.92280679 ], [ 115.07837381, 30.92286781 ], [ 115.07739989, 30.92271551 ], [ 115.07487931, 30.92279026 ], [ 115.07419794, 30.92284666 ], [ 115.07349879, 30.92302549 ], [ 115.07182832, 30.92267338 ], [ 115.07088386, 30.92271848 ], [ 115.07000783, 30.9229439 ], [ 115.06967987, 30.92292573 ], [ 115.06945857, 30.92283554 ], [ 115.06912597, 30.92249988 ], [ 115.06894229, 30.92190188 ], [ 115.0687041, 30.92154624 ], [ 115.06807697, 30.9210949 ], [ 115.06774248, 30.92073991 ], [ 115.06744734, 30.92007181 ], [ 115.06729893, 30.9195384 ], [ 115.0671799, 30.91935973 ], [ 115.06663709, 30.91909995 ], [ 115.06602959, 30.91902708 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900126J00000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA9900125J00000,AFA9900121JD0000", "TRVCD": "AFA9900127J00000", "INDCD": "QFA9900125J00000", "ONDCD": "QFA9900126J00000", "BWSCD": "WFA9900126J00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 4760.0, "RVSLP": 0.0031, "IELV": 100.04, "OELV": 89.52, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4160874, 31.12342503 ], [ 115.41506453, 31.12287123 ], [ 115.41369512, 31.12231842 ], [ 115.4131142, 31.12199587 ], [ 115.41211625, 31.12161339 ], [ 115.41155786, 31.12147275 ], [ 115.41127686, 31.12131049 ], [ 115.41104667, 31.12108249 ], [ 115.41023586, 31.1199659 ], [ 115.41005197, 31.11936786 ], [ 115.40947881, 31.11802558 ], [ 115.40898, 31.11733612 ], [ 115.40829895, 31.11681474 ], [ 115.40769581, 31.11654823 ], [ 115.40707664, 31.11633411 ], [ 115.40625365, 31.11620939 ], [ 115.40518248, 31.11579357 ], [ 115.40436775, 31.11517213 ], [ 115.40396355, 31.11461152 ], [ 115.4035937, 31.11373574 ], [ 115.40352839, 31.11307788 ], [ 115.40356981, 31.11265181 ], [ 115.40382858, 31.11226216 ], [ 115.40486044, 31.11125426 ], [ 115.40496179, 31.11105405 ], [ 115.4050721, 31.11051163 ], [ 115.40528274, 31.11003991 ], [ 115.40554027, 31.10958833 ], [ 115.40614798, 31.10882738 ], [ 115.40621257, 31.10826328 ], [ 115.40612199, 31.10723072 ], [ 115.40592838, 31.10674162 ], [ 115.40576362, 31.10598013 ], [ 115.40503298, 31.10451838 ], [ 115.40489224, 31.10343844 ], [ 115.40454, 31.10241847 ], [ 115.40415568, 31.10190415 ], [ 115.40393631, 31.10146579 ], [ 115.40300917, 31.10037575 ], [ 115.40216408, 31.09881802 ], [ 115.40207828, 31.09840106 ], [ 115.40200605, 31.0969803 ], [ 115.40191645, 31.09664104 ], [ 115.40165294, 31.09633219 ], [ 115.40049555, 31.09541072 ], [ 115.40014239, 31.09505775 ], [ 115.39965527, 31.09417182 ], [ 115.39905024, 31.09350219 ], [ 115.39887444, 31.09274823 ], [ 115.39854838, 31.09179195 ], [ 115.39829869, 31.0914959 ], [ 115.39780616, 31.09110391 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121D00000", "RVNM": "举水", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800128000000", "INDCD": "-1", "ONDCD": "QFA9800127000000", "BWSCD": "WFA9800121D00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 13969.0, "RVSLP": 0.0086, "IELV": 255.12, "OELV": 89.78, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02662412, 31.50944385 ], [ 115.02715162, 31.50917018 ], [ 115.02758565, 31.50871022 ], [ 115.02831007, 31.50732753 ], [ 115.02853408, 31.50664039 ], [ 115.0285481, 31.50637615 ], [ 115.02828756, 31.50571199 ], [ 115.02812038, 31.50549116 ], [ 115.02783778, 31.50537639 ], [ 115.02698835, 31.50531397 ], [ 115.02643989, 31.50512184 ], [ 115.02606269, 31.50483588 ], [ 115.02598373, 31.50454202 ], [ 115.02646975, 31.50377628 ], [ 115.02701894, 31.50326497 ], [ 115.02769984, 31.50298609 ], [ 115.02844629, 31.50246877 ], [ 115.02953167, 31.5021162 ], [ 115.02979368, 31.50196825 ], [ 115.03059588, 31.50056029 ], [ 115.03067409, 31.50006427 ], [ 115.03061274, 31.49902522 ], [ 115.03039447, 31.49839649 ], [ 115.03025715, 31.49754581 ], [ 115.03006258, 31.49705501 ], [ 115.02999204, 31.4966267 ], [ 115.02999951, 31.49597045 ], [ 115.03016775, 31.49564273 ], [ 115.03040893, 31.49543024 ], [ 115.03091761, 31.4951699 ], [ 115.03251049, 31.49453154 ], [ 115.03282539, 31.49427177 ], [ 115.03313574, 31.49388415 ], [ 115.03329676, 31.49380285 ], [ 115.03353977, 31.49389316 ], [ 115.03376026, 31.49410811 ], [ 115.03477629, 31.49569492 ], [ 115.0350072, 31.49588664 ], [ 115.03523871, 31.49592176 ], [ 115.03537353, 31.49579958 ], [ 115.03552802, 31.49545601 ], [ 115.03567821, 31.49529373 ], [ 115.03652398, 31.49502672 ], [ 115.03686446, 31.49470212 ], [ 115.03695357, 31.49436182 ], [ 115.03695639, 31.4932481 ], [ 115.03702631, 31.49304602 ], [ 115.03723004, 31.4928035 ], [ 115.03749816, 31.49262404 ], [ 115.03802601, 31.49240657 ], [ 115.03967715, 31.49231409 ], [ 115.04004537, 31.49219356 ], [ 115.04020597, 31.49196573 ], [ 115.04027397, 31.49111204 ], [ 115.04039846, 31.49086902 ], [ 115.04058444, 31.49075246 ], [ 115.040906, 31.49069863 ], [ 115.04179224, 31.49076026 ], [ 115.04211778, 31.4905921 ], [ 115.04239383, 31.49029828 ], [ 115.04249746, 31.49002769 ], [ 115.04248202, 31.48967928 ], [ 115.0423076, 31.48920412 ], [ 115.04231821, 31.48898375 ], [ 115.04243799, 31.48886434 ], [ 115.0430941, 31.48861729 ], [ 115.04361057, 31.48855822 ], [ 115.04421376, 31.48858579 ], [ 115.04479158, 31.48891823 ], [ 115.04501096, 31.48915995 ], [ 115.04510632, 31.48942453 ], [ 115.04509689, 31.48977155 ], [ 115.04492445, 31.49049383 ], [ 115.04496246, 31.49084978 ], [ 115.04505111, 31.49104708 ], [ 115.0452824, 31.49127353 ], [ 115.04558005, 31.49140959 ], [ 115.04599398, 31.49142007 ], [ 115.04628655, 31.49131589 ], [ 115.04646657, 31.49109282 ], [ 115.04668169, 31.49047292 ], [ 115.04678424, 31.48962462 ], [ 115.04725077, 31.48825504 ], [ 115.04802562, 31.48705303 ], [ 115.0482066, 31.48691604 ], [ 115.04873248, 31.4867156 ], [ 115.04906945, 31.48638816 ], [ 115.04915821, 31.48604739 ], [ 115.04917575, 31.48516367 ], [ 115.04939184, 31.48477846 ], [ 115.04981072, 31.48455417 ], [ 115.05085028, 31.48448281 ], [ 115.0512496, 31.48437601 ], [ 115.05171035, 31.48401163 ], [ 115.05228717, 31.48338389 ], [ 115.05265744, 31.48320245 ], [ 115.05291173, 31.48326735 ], [ 115.05313182, 31.48347769 ], [ 115.05337016, 31.48414844 ], [ 115.05362988, 31.48442666 ], [ 115.05389058, 31.48449468 ], [ 115.05431799, 31.48433844 ], [ 115.05472199, 31.48403589 ], [ 115.05539752, 31.48337829 ], [ 115.05618629, 31.48201982 ], [ 115.05721693, 31.48093022 ], [ 115.05724788, 31.48074807 ], [ 115.05716761, 31.48056624 ], [ 115.0565837, 31.48011413 ], [ 115.05561892, 31.4798655 ], [ 115.05442426, 31.47980128 ], [ 115.0540615, 31.47960156 ], [ 115.05370755, 31.47925586 ], [ 115.05357183, 31.47877416 ], [ 115.05349359, 31.476887 ], [ 115.05355408, 31.47654226 ], [ 115.05379835, 31.47623788 ], [ 115.05424144, 31.47605222 ], [ 115.05544895, 31.47596031 ], [ 115.05656424, 31.47546359 ], [ 115.05713212, 31.47498243 ], [ 115.05828385, 31.47347766 ], [ 115.05866709, 31.47325231 ], [ 115.0589943, 31.47336802 ], [ 115.05952955, 31.47393229 ], [ 115.0614857, 31.47552157 ], [ 115.06170972, 31.47576377 ], [ 115.06192801, 31.47620489 ], [ 115.06213998, 31.47644337 ], [ 115.06241617, 31.47660548 ], [ 115.06273973, 31.47665051 ], [ 115.06315195, 31.47659363 ], [ 115.06400708, 31.47630614 ], [ 115.06547989, 31.47561018 ], [ 115.06581665, 31.47536815 ], [ 115.06645094, 31.47470396 ], [ 115.06689017, 31.47384792 ], [ 115.06703542, 31.47337777 ], [ 115.06726867, 31.47290813 ], [ 115.06747574, 31.472664 ], [ 115.06774018, 31.47249171 ], [ 115.06821131, 31.47247721 ], [ 115.06887571, 31.47281664 ], [ 115.06958404, 31.47302973 ], [ 115.07291224, 31.4729441 ], [ 115.07350205, 31.47284968 ], [ 115.07385714, 31.47255982 ], [ 115.07390997, 31.47226325 ], [ 115.07325296, 31.4713144 ], [ 115.07291359, 31.47035197 ], [ 115.07283683, 31.46984449 ], [ 115.07283431, 31.46940033 ], [ 115.07289737, 31.4691378 ], [ 115.07303957, 31.46897206 ], [ 115.07324926, 31.46888281 ], [ 115.07382265, 31.46890373 ], [ 115.07531179, 31.46965591 ], [ 115.07670228, 31.46981559 ], [ 115.07697204, 31.46968701 ], [ 115.07720889, 31.46938386 ], [ 115.07729228, 31.46844317 ], [ 115.07740553, 31.46817226 ], [ 115.07769828, 31.46790988 ], [ 115.07808478, 31.46782597 ], [ 115.07886066, 31.46808539 ], [ 115.08031034, 31.4691783 ], [ 115.08099038, 31.46946389 ], [ 115.0818705, 31.46967828 ], [ 115.08220407, 31.46969113 ], [ 115.08253156, 31.46963569 ], [ 115.08312756, 31.46937611 ], [ 115.08363275, 31.46911034 ], [ 115.08429473, 31.4686008 ], [ 115.0869538, 31.46697181 ], [ 115.08761461, 31.46646178 ], [ 115.08837992, 31.46598222 ], [ 115.08905073, 31.46568985 ], [ 115.09005221, 31.46553201 ], [ 115.09056607, 31.4652875 ], [ 115.09090202, 31.46494986 ], [ 115.09118556, 31.46390628 ], [ 115.09123985, 31.46304282 ], [ 115.0913985, 31.46247559 ], [ 115.09134403, 31.46009541 ], [ 115.0915457, 31.45902899 ], [ 115.09146219, 31.45839215 ], [ 115.09111834, 31.45768039 ], [ 115.09095361, 31.457475 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122F00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121F00000", "TRVCD": "AFA9800123F00000", "INDCD": "QFA9800121F00000", "ONDCD": "QFA9800122F00000", "BWSCD": "WFA9800122F00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 7410.0, "RVSLP": 0.0065, "IELV": 159.91, "OELV": 98.12, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02686029, 31.46595796 ], [ 115.02713002, 31.46568017 ], [ 115.02727616, 31.46542116 ], [ 115.0273882, 31.46439385 ], [ 115.02761995, 31.46392756 ], [ 115.02799388, 31.46340016 ], [ 115.02821188, 31.46267446 ], [ 115.02815839, 31.46249302 ], [ 115.02795204, 31.46225845 ], [ 115.02626856, 31.4608993 ], [ 115.02592806, 31.46039572 ], [ 115.02582338, 31.46004858 ], [ 115.02580702, 31.45945823 ], [ 115.02587526, 31.45917555 ], [ 115.02607874, 31.45880591 ], [ 115.02628777, 31.45867618 ], [ 115.02647848, 31.45872757 ], [ 115.02750616, 31.45949132 ], [ 115.02819176, 31.45978196 ], [ 115.02878178, 31.45981723 ], [ 115.02924394, 31.4596919 ], [ 115.02940581, 31.45953568 ], [ 115.02961482, 31.45915391 ], [ 115.02998845, 31.4577658 ], [ 115.03022252, 31.45743968 ], [ 115.03053961, 31.45717445 ], [ 115.03084145, 31.45705205 ], [ 115.03267038, 31.45696581 ], [ 115.03299387, 31.45689146 ], [ 115.03319757, 31.45676608 ], [ 115.03344893, 31.45646493 ], [ 115.03369993, 31.45571044 ], [ 115.03369009, 31.45436823 ], [ 115.03379249, 31.45397234 ], [ 115.03402802, 31.45380198 ], [ 115.03443068, 31.45376362 ], [ 115.03475585, 31.45384042 ], [ 115.03534983, 31.45411756 ], [ 115.03568679, 31.45406376 ], [ 115.03594846, 31.45367791 ], [ 115.03634239, 31.45250777 ], [ 115.03679443, 31.45205129 ], [ 115.03704993, 31.45199 ], [ 115.03734768, 31.4521884 ], [ 115.03748366, 31.45244604 ], [ 115.03764259, 31.45314816 ], [ 115.0378433, 31.45339774 ], [ 115.03811152, 31.4535758 ], [ 115.0386253, 31.45370957 ], [ 115.03949815, 31.45357443 ], [ 115.03996245, 31.45366367 ], [ 115.04012367, 31.45381517 ], [ 115.04032604, 31.45424997 ], [ 115.04072038, 31.45481639 ], [ 115.04219402, 31.45602962 ], [ 115.04259827, 31.45625526 ], [ 115.04279215, 31.45622625 ], [ 115.04298384, 31.45610399 ], [ 115.04493979, 31.45428779 ], [ 115.04513197, 31.45418771 ], [ 115.04532599, 31.45420393 ], [ 115.04565754, 31.45449962 ], [ 115.04592181, 31.45509978 ], [ 115.04610822, 31.45617642 ], [ 115.04651805, 31.45704039 ], [ 115.04676798, 31.45724375 ], [ 115.04707452, 31.45735024 ], [ 115.04810155, 31.45730188 ], [ 115.04891385, 31.45690182 ], [ 115.04947518, 31.45638224 ], [ 115.04966206, 31.456057 ], [ 115.04964379, 31.45573383 ], [ 115.0493576, 31.45490603 ], [ 115.04890036, 31.45404641 ], [ 115.04889875, 31.45379779 ], [ 115.0490476, 31.45357045 ], [ 115.05010229, 31.45296642 ], [ 115.05100088, 31.45195385 ], [ 115.05121621, 31.45184621 ], [ 115.05154422, 31.45180148 ], [ 115.05194645, 31.45187567 ], [ 115.05236376, 31.45215999 ], [ 115.05265059, 31.45246238 ], [ 115.05310753, 31.45315167 ], [ 115.05354767, 31.45354393 ], [ 115.05391048, 31.45368917 ], [ 115.05426902, 31.45356622 ], [ 115.05466977, 31.45316649 ], [ 115.05473753, 31.45285221 ], [ 115.05443491, 31.45212006 ], [ 115.05372567, 31.45110385 ], [ 115.05366834, 31.45045729 ], [ 115.05381395, 31.45007064 ], [ 115.05435396, 31.4497404 ], [ 115.05496012, 31.44947847 ], [ 115.05538047, 31.44940731 ], [ 115.05579968, 31.44942145 ], [ 115.05601378, 31.44950174 ], [ 115.05616762, 31.44966045 ], [ 115.05633632, 31.45057194 ], [ 115.05654043, 31.45085579 ], [ 115.0570057, 31.45095766 ], [ 115.05743166, 31.45091824 ], [ 115.05766353, 31.45083179 ], [ 115.05802623, 31.45050951 ], [ 115.05829669, 31.4499716 ], [ 115.05837777, 31.44896831 ], [ 115.05852006, 31.44846707 ], [ 115.05853596, 31.44758798 ], [ 115.05861691, 31.4472439 ], [ 115.0587742, 31.44705204 ], [ 115.05903726, 31.44688956 ], [ 115.05953589, 31.44680016 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123TB0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122TB0000", "TRVCD": "AFA9800124T00000", "INDCD": "QFA9800122TB0000", "ONDCD": "QFA9800123T00000", "BWSCD": "WFA9800123TB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 3243.0, "RVSLP": 0.0046, "IELV": 50.31, "OELV": 41.17, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75471203, 31.15053167 ], [ 114.75425117, 31.15011421 ], [ 114.75401499, 31.1497597 ], [ 114.75392552, 31.14949132 ], [ 114.75395041, 31.14922923 ], [ 114.75438399, 31.14836579 ], [ 114.75444968, 31.14800249 ], [ 114.75413401, 31.14770991 ], [ 114.75314382, 31.14728229 ], [ 114.75297157, 31.14713997 ], [ 114.75289142, 31.14698026 ], [ 114.75305638, 31.14671447 ], [ 114.75374414, 31.14626764 ], [ 114.75444824, 31.14563627 ], [ 114.7552529, 31.14456985 ], [ 114.75547032, 31.14409285 ], [ 114.75548441, 31.14359599 ], [ 114.75536806, 31.14325974 ], [ 114.75500098, 31.14293766 ], [ 114.75446713, 31.14272403 ], [ 114.75414758, 31.14268325 ], [ 114.75383179, 31.14275006 ], [ 114.75308732, 31.14307474 ], [ 114.75275985, 31.14314031 ], [ 114.74832598, 31.14326203 ], [ 114.74809016, 31.14319573 ], [ 114.74780881, 31.14301816 ], [ 114.74698158, 31.14213191 ], [ 114.74664448, 31.14189322 ], [ 114.7464279, 31.14183082 ], [ 114.74607555, 31.14195393 ], [ 114.74522508, 31.14264614 ], [ 114.74419649, 31.14312847 ], [ 114.74361031, 31.14320874 ], [ 114.74178804, 31.14323771 ], [ 114.74109227, 31.14300468 ], [ 114.74031561, 31.14251247 ], [ 114.73969246, 31.14231596 ], [ 114.73864507, 31.14160518 ], [ 114.73709197, 31.1410947 ], [ 114.73669191, 31.14077353 ], [ 114.73653018, 31.14048977 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800128P00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800127P00000,AFA9800122PF0000", "TRVCD": "AFA9800129P00000", "INDCD": "QFA9800127P00000", "ONDCD": "QFA9800128P00000", "BWSCD": "WFA9800128P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 10.0, "RVLEN": 8353.0, "RVSLP": 0.001, "IELV": 80.0, "OELV": 68.27, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17498807, 31.28658378 ], [ 115.17453017, 31.28641051 ], [ 115.17384112, 31.28639217 ], [ 115.17342713, 31.28646374 ], [ 115.17218632, 31.28687113 ], [ 115.17097816, 31.28691368 ], [ 115.1701196, 31.28660584 ], [ 115.16971394, 31.28629523 ], [ 115.16948154, 31.28597795 ], [ 115.1694057, 31.28555418 ], [ 115.16941963, 31.28511755 ], [ 115.16973027, 31.2844483 ], [ 115.17241254, 31.28192791 ], [ 115.17261636, 31.28167323 ], [ 115.17286837, 31.28114379 ], [ 115.17307962, 31.28023675 ], [ 115.17301702, 31.27984029 ], [ 115.17239571, 31.27889365 ], [ 115.17152222, 31.27820892 ], [ 115.17074376, 31.27794351 ], [ 115.16943745, 31.27796009 ], [ 115.16892996, 31.27802036 ], [ 115.16838403, 31.27818966 ], [ 115.16718236, 31.27829178 ], [ 115.16655611, 31.2784747 ], [ 115.16597594, 31.27846461 ], [ 115.16517766, 31.27826285 ], [ 115.16379557, 31.27774228 ], [ 115.16060187, 31.27694179 ], [ 115.15967734, 31.27685519 ], [ 115.15892583, 31.27652447 ], [ 115.15605064, 31.27580293 ], [ 115.15390982, 31.27496208 ], [ 115.15286599, 31.2741902 ], [ 115.15244478, 31.27377803 ], [ 115.1523239, 31.27344222 ], [ 115.15228925, 31.27292992 ], [ 115.15232445, 31.27249775 ], [ 115.15249035, 31.27185631 ], [ 115.15247681, 31.2703761 ], [ 115.15255835, 31.27010443 ], [ 115.15287244, 31.26957025 ], [ 115.15294563, 31.26871753 ], [ 115.15312034, 31.2679364 ], [ 115.15298575, 31.26448353 ], [ 115.1529096, 31.26390627 ], [ 115.15261663, 31.26339155 ], [ 115.15238231, 31.26316796 ], [ 115.15209249, 31.26301159 ], [ 115.15135766, 31.26287978 ], [ 115.15117566, 31.26275221 ], [ 115.1510842, 31.26257575 ], [ 115.15110636, 31.26211377 ], [ 115.15150958, 31.26151986 ], [ 115.15173396, 31.26104351 ], [ 115.15175025, 31.26054983 ], [ 115.15163013, 31.26021791 ], [ 115.15133199, 31.25994399 ], [ 115.15046652, 31.25943096 ], [ 115.14962042, 31.25857195 ], [ 115.14876979, 31.25806072 ], [ 115.14856612, 31.257818 ], [ 115.14839187, 31.25730012 ], [ 115.1482092, 31.25707661 ], [ 115.14724898, 31.25663824 ], [ 115.14650973, 31.25605943 ], [ 115.14632168, 31.25573429 ], [ 115.14622419, 31.25486157 ], [ 115.14611197, 31.25452422 ], [ 115.14557231, 31.25385615 ], [ 115.14496418, 31.25327589 ], [ 115.14436187, 31.25232235 ], [ 115.14420419, 31.25102132 ], [ 115.1439477, 31.25018418 ], [ 115.14376023, 31.246904 ], [ 115.14342689, 31.24610372 ], [ 115.14300754, 31.24537596 ], [ 115.14292794, 31.24503281 ], [ 115.14260015, 31.23775629 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012D000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012C000000", "TRVCD": "AFA980012E000000", "INDCD": "QFA980012C000000", "ONDCD": "QFA980012D000000", "BWSCD": "WFA980012D000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 14.0, "RVLEN": 2020.0, "RVSLP": 0.0012, "IELV": 68.84, "OELV": 67.32, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05074796, 31.35787483 ], [ 115.05009568, 31.35812402 ], [ 115.04978593, 31.35831445 ], [ 115.04923037, 31.3588335 ], [ 115.04864812, 31.35955983 ], [ 115.04803395, 31.35996015 ], [ 115.04706988, 31.36079045 ], [ 115.0464475, 31.36119005 ], [ 115.04511617, 31.36239961 ], [ 115.04474815, 31.36257211 ], [ 115.04432795, 31.36261119 ], [ 115.04391161, 31.36256961 ], [ 115.04345115, 31.36239807 ], [ 115.04189644, 31.36165052 ], [ 115.03978618, 31.36001616 ], [ 115.03881279, 31.35958641 ], [ 115.03846165, 31.35936447 ], [ 115.03781243, 31.3586748 ], [ 115.03748584, 31.35843581 ], [ 115.03614365, 31.35808503 ], [ 115.03541038, 31.3576767 ], [ 115.03514025, 31.35765942 ], [ 115.03479648, 31.35775364 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125P00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124P00000", "TRVCD": "AFA9800126P00000", "INDCD": "QFA9800124P00000", "ONDCD": "QFA9800125P00000", "BWSCD": "WFA9800125P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 7004.0, "RVSLP": 0.005, "IELV": 145.05, "OELV": 109.9, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24846966, 31.33423987 ], [ 115.24823626, 31.33387802 ], [ 115.24771409, 31.33342296 ], [ 115.24617816, 31.33260683 ], [ 115.24556393, 31.33214427 ], [ 115.24524105, 31.33178805 ], [ 115.24469764, 31.3308291 ], [ 115.24349363, 31.32986031 ], [ 115.24194198, 31.32909708 ], [ 115.23988261, 31.32830551 ], [ 115.23892591, 31.3280594 ], [ 115.23833242, 31.32804835 ], [ 115.23793193, 31.32815568 ], [ 115.23734015, 31.32863673 ], [ 115.23705538, 31.32902361 ], [ 115.23703137, 31.32928158 ], [ 115.23709209, 31.32947941 ], [ 115.23807217, 31.33108976 ], [ 115.23806017, 31.33141292 ], [ 115.23783384, 31.33173583 ], [ 115.23744108, 31.33204153 ], [ 115.23712447, 31.33213972 ], [ 115.23554982, 31.33220776 ], [ 115.23504978, 31.33215168 ], [ 115.23468774, 31.33194957 ], [ 115.23359595, 31.33110161 ], [ 115.23300828, 31.33079575 ], [ 115.23245433, 31.33039202 ], [ 115.23172807, 31.3297856 ], [ 115.2310852, 31.32908335 ], [ 115.22803272, 31.32664705 ], [ 115.2277395, 31.32627553 ], [ 115.22720252, 31.32486206 ], [ 115.22721253, 31.32455156 ], [ 115.22751431, 31.32418581 ], [ 115.22928287, 31.32254761 ], [ 115.22980617, 31.32186753 ], [ 115.23076012, 31.32090962 ], [ 115.23100802, 31.32044879 ], [ 115.23107702, 31.32017022 ], [ 115.23105774, 31.31958831 ], [ 115.23093567, 31.31925205 ], [ 115.23064668, 31.31895189 ], [ 115.22995986, 31.31842199 ], [ 115.22893829, 31.31786079 ], [ 115.22805025, 31.31742709 ], [ 115.22705145, 31.3173158 ], [ 115.22661762, 31.31706624 ], [ 115.22545015, 31.31606259 ], [ 115.22494238, 31.31523921 ], [ 115.22472398, 31.31457232 ], [ 115.22446178, 31.31426086 ], [ 115.22310229, 31.31319397 ], [ 115.22156447, 31.31237609 ], [ 115.22027536, 31.31135396 ], [ 115.22001337, 31.31104329 ], [ 115.21977181, 31.3103877 ], [ 115.21919355, 31.30979415 ], [ 115.21891231, 31.30935215 ], [ 115.21873179, 31.30858841 ], [ 115.21859611, 31.30832553 ], [ 115.21802061, 31.30782652 ], [ 115.2169457, 31.30717807 ], [ 115.21636223, 31.30653758 ], [ 115.21534608, 31.30563379 ], [ 115.21520771, 31.30515573 ], [ 115.21513217, 31.30365904 ], [ 115.21496554, 31.30325947 ], [ 115.21301109, 31.30170637 ], [ 115.21239159, 31.3014793 ], [ 115.21189491, 31.3014303 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012BP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA980012AP00000,AFA9800121PI0000", "TRVCD": "AFA980012CP00000", "INDCD": "QFA980012AP00000", "ONDCD": "QFA980012BP00000", "BWSCD": "WFA980012BP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 13.0, "RVLEN": 1885.0, "RVSLP": 0.0017, "IELV": 64.96, "OELV": 60.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12420392, 31.20158024 ], [ 115.12377249, 31.20097159 ], [ 115.12346388, 31.20037788 ], [ 115.12270955, 31.19969548 ], [ 115.12231029, 31.19922415 ], [ 115.12118844, 31.19828494 ], [ 115.12098014, 31.19803562 ], [ 115.12071019, 31.19753562 ], [ 115.12000214, 31.19691638 ], [ 115.11910756, 31.1962366 ], [ 115.11815431, 31.19573159 ], [ 115.11580512, 31.19501083 ], [ 115.11551367, 31.19485252 ], [ 115.11361846, 31.19333781 ], [ 115.11202674, 31.19164337 ], [ 115.11115553, 31.19097199 ], [ 115.11060868, 31.19073042 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012C000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012B000000,AFA9800121H00000", "TRVCD": "AFA980012D000000", "INDCD": "QFA980012B000000", "ONDCD": "QFA980012C000000", "BWSCD": "WFA980012C000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 13.0, "RVLEN": 5256.0, "RVSLP": 0.0027, "IELV": 77.31, "OELV": 68.84, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07952228, 31.38755209 ], [ 115.07901415, 31.38720296 ], [ 115.07789123, 31.38676407 ], [ 115.0769663, 31.38668964 ], [ 115.07485128, 31.38631355 ], [ 115.07159245, 31.38549644 ], [ 115.07109153, 31.38518973 ], [ 115.07009847, 31.38436371 ], [ 115.06972019, 31.38379371 ], [ 115.06923547, 31.38244684 ], [ 115.06829267, 31.38090785 ], [ 115.06772166, 31.37980057 ], [ 115.06714179, 31.37846687 ], [ 115.0668215, 31.37751023 ], [ 115.06668454, 31.37681281 ], [ 115.06651352, 31.37639199 ], [ 115.0663845, 31.37553972 ], [ 115.06588423, 31.37393442 ], [ 115.06544045, 31.37212021 ], [ 115.06509746, 31.37131643 ], [ 115.06433976, 31.37011389 ], [ 115.06394754, 31.36970406 ], [ 115.06285533, 31.3688635 ], [ 115.06190628, 31.36836228 ], [ 115.05954844, 31.367437 ], [ 115.05866827, 31.36698028 ], [ 115.05783658, 31.36637211 ], [ 115.05744429, 31.36594804 ], [ 115.05732422, 31.36523808 ], [ 115.0573604, 31.36421384 ], [ 115.05763544, 31.36368279 ], [ 115.05853815, 31.36278829 ], [ 115.0587595, 31.36239234 ], [ 115.0587385, 31.36113601 ], [ 115.05856415, 31.36065925 ], [ 115.05807019, 31.36005967 ], [ 115.05775585, 31.35979842 ], [ 115.05627299, 31.3590905 ], [ 115.05521303, 31.35866181 ], [ 115.05451187, 31.35844807 ], [ 115.05322713, 31.3584251 ], [ 115.05235202, 31.35821426 ], [ 115.05147544, 31.3579077 ], [ 115.05074796, 31.35787483 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820100000000", "RVNM": "浮桥河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820200000000", "INDCD": "-1", "ONDCD": "QFA9820100000000", "BWSCD": "WFA9820100000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 5847.0, "RVSLP": 0.0084, "IELV": 152.77, "OELV": 93.62, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83105733, 31.43480851 ], [ 114.83222209, 31.43571951 ], [ 114.83393015, 31.43673447 ], [ 114.83427756, 31.43721663 ], [ 114.83491604, 31.43845691 ], [ 114.83524991, 31.43879365 ], [ 114.83546758, 31.43890566 ], [ 114.83579995, 31.43895782 ], [ 114.83659623, 31.4389281 ], [ 114.83721307, 31.43882737 ], [ 114.8373757, 31.43887222 ], [ 114.83746143, 31.43900853 ], [ 114.83741335, 31.43942997 ], [ 114.83747212, 31.4395963 ], [ 114.83763272, 31.43972614 ], [ 114.83824163, 31.43993551 ], [ 114.83871232, 31.44029196 ], [ 114.83957575, 31.44176562 ], [ 114.84019848, 31.44233799 ], [ 114.84047158, 31.4424961 ], [ 114.84067767, 31.44252189 ], [ 114.8415163, 31.44212398 ], [ 114.84177408, 31.4421201 ], [ 114.84206072, 31.44235154 ], [ 114.84227857, 31.44279181 ], [ 114.84254842, 31.4431098 ], [ 114.8430903, 31.44353755 ], [ 114.84347948, 31.44368787 ], [ 114.84443457, 31.443663 ], [ 114.84473585, 31.44353579 ], [ 114.84496429, 31.44331615 ], [ 114.84506018, 31.44311789 ], [ 114.8450781, 31.44284215 ], [ 114.8448609, 31.44201214 ], [ 114.84491779, 31.44181719 ], [ 114.84512167, 31.4415823 ], [ 114.84556967, 31.44139187 ], [ 114.84644452, 31.44138021 ], [ 114.84675445, 31.44148982 ], [ 114.8470003, 31.44169916 ], [ 114.84713755, 31.44196039 ], [ 114.8472936, 31.44265349 ], [ 114.8476934, 31.44304475 ], [ 114.84885236, 31.44372804 ], [ 114.84992792, 31.44414228 ], [ 114.85129381, 31.44447221 ], [ 114.85182648, 31.44469337 ], [ 114.85261448, 31.44518008 ], [ 114.85375633, 31.44540333 ], [ 114.85460493, 31.44546676 ], [ 114.85604201, 31.44580037 ], [ 114.85724636, 31.44553354 ], [ 114.85841205, 31.44514971 ], [ 114.85954018, 31.44486388 ], [ 114.86029635, 31.44483422 ], [ 114.86058416, 31.44495171 ], [ 114.86112437, 31.44549148 ], [ 114.86177422, 31.44585801 ], [ 114.86308772, 31.4468645 ], [ 114.86383659, 31.44713021 ], [ 114.86415381, 31.44698238 ], [ 114.86466656, 31.44619375 ], [ 114.86529132, 31.44585029 ], [ 114.86615831, 31.44558952 ], [ 114.86708162, 31.44545629 ], [ 114.8679079, 31.44511597 ], [ 114.86864396, 31.4449637 ], [ 114.86998597, 31.44437756 ], [ 114.87072241, 31.44422637 ], [ 114.87154617, 31.44387942 ], [ 114.87280338, 31.44349664 ], [ 114.87485953, 31.44268318 ], [ 114.87568679, 31.44257433 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98202H0000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA98201HA000000,AFA98201H0000000", "TRVCD": "AFA98203H0000000", "INDCD": "QFA98201H0000000", "ONDCD": "QFA98202H0000000", "BWSCD": "WFA98202H0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 3817.0, "RVSLP": 0.0042, "IELV": 67.84, "OELV": 57.17, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93081392, 31.22590177 ], [ 114.93182728, 31.22558781 ], [ 114.93325352, 31.22500672 ], [ 114.93525555, 31.22315242 ], [ 114.93555217, 31.22241274 ], [ 114.93558801, 31.22214381 ], [ 114.93551594, 31.22188027 ], [ 114.93511758, 31.22115562 ], [ 114.93508905, 31.22074841 ], [ 114.93544291, 31.22006969 ], [ 114.93563393, 31.21939167 ], [ 114.93604505, 31.21902658 ], [ 114.93644881, 31.21895778 ], [ 114.93685355, 31.21903125 ], [ 114.93773611, 31.2195003 ], [ 114.93857353, 31.22009041 ], [ 114.93918581, 31.2202937 ], [ 114.93937649, 31.22042013 ], [ 114.93970628, 31.22090392 ], [ 114.9399861, 31.22157824 ], [ 114.94015246, 31.2221842 ], [ 114.94040258, 31.22264132 ], [ 114.94102098, 31.22359002 ], [ 114.94145918, 31.22397993 ], [ 114.94175188, 31.22413562 ], [ 114.94199597, 31.22418194 ], [ 114.94311562, 31.22413246 ], [ 114.94348399, 31.22396023 ], [ 114.94385134, 31.22361986 ], [ 114.94470751, 31.2225599 ], [ 114.94521347, 31.22179178 ], [ 114.94519618, 31.22141439 ], [ 114.94475839, 31.22077802 ], [ 114.94448081, 31.22017396 ], [ 114.94423077, 31.21935617 ], [ 114.94426219, 31.2191125 ], [ 114.94456356, 31.21874568 ], [ 114.94578038, 31.21765412 ], [ 114.94659613, 31.21728995 ], [ 114.94779403, 31.21725506 ], [ 114.94914408, 31.21759999 ], [ 114.95028537, 31.2177105 ], [ 114.95078223, 31.21757577 ], [ 114.95122749, 31.21723291 ], [ 114.9515217, 31.2167016 ], [ 114.95151185, 31.21627399 ], [ 114.9513236, 31.21598761 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122000000", "INDCD": "-1", "ONDCD": "QFA9900121000000", "BWSCD": "WFA9900121000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 2904.0, "RVSLP": 0.0439, "IELV": 365.8, "OELV": 205.02, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40723252, 31.32220888 ], [ 115.40761512, 31.32189381 ], [ 115.40790806, 31.32176756 ], [ 115.40948774, 31.32168265 ], [ 115.41008033, 31.32173196 ], [ 115.41100119, 31.32208257 ], [ 115.41143475, 31.3221743 ], [ 115.411694, 31.3220524 ], [ 115.41247094, 31.3214226 ], [ 115.41298819, 31.32118436 ], [ 115.41340301, 31.32111386 ], [ 115.41558606, 31.32106464 ], [ 115.41590634, 31.32114164 ], [ 115.41642586, 31.32139818 ], [ 115.41675574, 31.32145175 ], [ 115.41789658, 31.32143747 ], [ 115.41840468, 31.32137248 ], [ 115.41868252, 31.32121782 ], [ 115.41888701, 31.32098198 ], [ 115.41903351, 31.32014416 ], [ 115.41913027, 31.31994179 ], [ 115.42006523, 31.31897417 ], [ 115.42066264, 31.31802397 ], [ 115.42098599, 31.31779373 ], [ 115.42172001, 31.31763648 ], [ 115.42242278, 31.31741444 ], [ 115.42271031, 31.31725865 ], [ 115.42360718, 31.3163744 ], [ 115.42441175, 31.31569926 ], [ 115.42494155, 31.31504361 ], [ 115.42581187, 31.31424451 ], [ 115.42676954, 31.31379559 ], [ 115.42726148, 31.31369565 ], [ 115.4284758, 31.31368942 ], [ 115.42923347, 31.31401528 ], [ 115.42964711, 31.31407673 ], [ 115.43033371, 31.3140164 ], [ 115.43077586, 31.31381575 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012D000000", "RVNM": "巴河(巴水)", "GB": "210101", "FRVCD": "AFA990012C000000,AFA9900125K00000", "TRVCD": "AFA990012E000000", "INDCD": "QFA990012C000000", "ONDCD": "QFA990012D000000", "BWSCD": "WFA990012D000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 14.0, "RVLEN": 5602.0, "RVSLP": 0.0, "IELV": 80.0, "OELV": 80.0, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35223855, 31.03222689 ], [ 115.35228635, 31.03193411 ], [ 115.35264893, 31.03127725 ], [ 115.35266425, 31.03101971 ], [ 115.35160064, 31.02892962 ], [ 115.35144869, 31.02624377 ], [ 115.3513576, 31.02575408 ], [ 115.35070425, 31.02474003 ], [ 115.35024576, 31.02437015 ], [ 115.34959624, 31.02401741 ], [ 115.34936429, 31.02379649 ], [ 115.34859038, 31.02224475 ], [ 115.34804952, 31.02135167 ], [ 115.34742189, 31.02041513 ], [ 115.34677355, 31.01977382 ], [ 115.34648168, 31.01926041 ], [ 115.34634152, 31.01779751 ], [ 115.34613752, 31.01724 ], [ 115.34599242, 31.01654558 ], [ 115.34581528, 31.01612399 ], [ 115.34574626, 31.01555444 ], [ 115.34580867, 31.01513782 ], [ 115.34636634, 31.01421832 ], [ 115.34639796, 31.01382201 ], [ 115.34579811, 31.01242839 ], [ 115.34536182, 31.0116355 ], [ 115.34521862, 31.01094206 ], [ 115.34503096, 31.01045248 ], [ 115.34491437, 31.00928512 ], [ 115.34469476, 31.00865898 ], [ 115.34456403, 31.00780581 ], [ 115.34425395, 31.00707262 ], [ 115.34383713, 31.00634782 ], [ 115.34350786, 31.00539203 ], [ 115.34342352, 31.0043705 ], [ 115.34358384, 31.00358806 ], [ 115.34355435, 31.00326369 ], [ 115.3432441, 31.0027584 ], [ 115.34258837, 31.00211811 ], [ 115.34227441, 31.00153625 ], [ 115.3420707, 30.99992554 ], [ 115.34216563, 30.99978595 ], [ 115.34263837, 30.99958396 ], [ 115.34284363, 30.99938019 ], [ 115.34290982, 30.99898418 ], [ 115.34283944, 30.99856637 ], [ 115.3425477, 30.99773827 ], [ 115.34242606, 30.99754598 ], [ 115.34085032, 30.99622383 ], [ 115.34043415, 30.99552009 ], [ 115.34036595, 30.99486116 ], [ 115.3403835, 30.99427572 ], [ 115.3410237, 30.9928611 ], [ 115.34102401, 30.99168425 ], [ 115.34093384, 30.99119241 ], [ 115.34064402, 30.99052427 ], [ 115.34021894, 30.98980182 ], [ 115.33989818, 30.98901231 ], [ 115.33984247, 30.98871973 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PA0000", "RVNM": "张广河", "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PA0000", "INDCD": "-1", "ONDCD": "QFA9800121PA0000", "BWSCD": "WFA9800121PA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 3360.0, "RVSLP": 0.0584, "IELV": 556.29, "OELV": 336.52, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36161052, 31.38521115 ], [ 115.36026038, 31.38486912 ], [ 115.35951159, 31.38477956 ], [ 115.35879187, 31.38460109 ], [ 115.3583764, 31.38435785 ], [ 115.35816792, 31.38397357 ], [ 115.35808604, 31.38278157 ], [ 115.35797844, 31.38236436 ], [ 115.35757572, 31.38181294 ], [ 115.35679557, 31.38135837 ], [ 115.35649899, 31.38107908 ], [ 115.3562355, 31.38062777 ], [ 115.35606647, 31.37987254 ], [ 115.35588765, 31.37964695 ], [ 115.35530355, 31.37940294 ], [ 115.35445414, 31.37934406 ], [ 115.35407043, 31.37920311 ], [ 115.35367353, 31.37889213 ], [ 115.35256168, 31.37766299 ], [ 115.35231428, 31.37749321 ], [ 115.35192977, 31.37747789 ], [ 115.35098425, 31.37779018 ], [ 115.35000364, 31.37746006 ], [ 115.34961654, 31.37716559 ], [ 115.34946222, 31.37683846 ], [ 115.34930809, 31.37553238 ], [ 115.34839364, 31.37405673 ], [ 115.34829638, 31.37379237 ], [ 115.34832376, 31.37353622 ], [ 115.34849721, 31.37327716 ], [ 115.34888113, 31.37295564 ], [ 115.34936193, 31.37272203 ], [ 115.34947237, 31.37252848 ], [ 115.3494545, 31.37221173 ], [ 115.34916974, 31.3713843 ], [ 115.34890387, 31.37101786 ], [ 115.34862584, 31.37085289 ], [ 115.34733605, 31.37055643 ], [ 115.34675358, 31.37030398 ], [ 115.34655394, 31.37001237 ], [ 115.34641212, 31.3691683 ], [ 115.34629019, 31.36899617 ], [ 115.34609355, 31.36888932 ], [ 115.34559593, 31.36885014 ], [ 115.34481709, 31.3689118 ], [ 115.3438057, 31.36931982 ], [ 115.34308228, 31.36940638 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121V00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122V00000", "INDCD": "-1", "ONDCD": "QFA9800121V00000", "BWSCD": "WFA9800121V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1884.0, "RVSLP": 0.0034, "IELV": 42.6, "OELV": 36.8, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89148664, 31.02741275 ], [ 114.89061804, 31.02781498 ], [ 114.89039621, 31.02777191 ], [ 114.8897858, 31.027409 ], [ 114.88960989, 31.02740346 ], [ 114.88947393, 31.02752215 ], [ 114.88930807, 31.02782818 ], [ 114.88894204, 31.02806851 ], [ 114.88749007, 31.02828326 ], [ 114.88737241, 31.02847582 ], [ 114.88727202, 31.02905025 ], [ 114.88708927, 31.02920538 ], [ 114.8851779, 31.02917563 ], [ 114.88466464, 31.02921915 ], [ 114.88412989, 31.02935646 ], [ 114.88360265, 31.02929634 ], [ 114.8830066, 31.02938962 ], [ 114.88149922, 31.02912827 ], [ 114.88121078, 31.02921663 ], [ 114.88053601, 31.02968973 ], [ 114.8800497, 31.02976024 ], [ 114.879732, 31.02968591 ], [ 114.87902207, 31.02922315 ], [ 114.87842001, 31.02895225 ], [ 114.87788139, 31.02876207 ], [ 114.87764048, 31.02873753 ], [ 114.87740113, 31.02877032 ], [ 114.87687641, 31.02898969 ], [ 114.87609375, 31.02943414 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122TG0000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800121TGA000,AFA9800121TG0000", "TRVCD": "AFA9800129T00000", "INDCD": "QFA9800121TG0000", "ONDCD": "QFA9800128T00000", "BWSCD": "WFA9800122TG0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 9911.0, "RVSLP": 0.0004, "IELV": 38.45, "OELV": 36.38, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83680419, 31.09701987 ], [ 114.8368854, 31.09673374 ], [ 114.83685577, 31.09649025 ], [ 114.83610977, 31.09543328 ], [ 114.83576002, 31.09527275 ], [ 114.83463685, 31.09525792 ], [ 114.8342382, 31.09514842 ], [ 114.8331538, 31.09442786 ], [ 114.83307489, 31.09424905 ], [ 114.83309325, 31.09381694 ], [ 114.83303054, 31.09366823 ], [ 114.83285934, 31.09357608 ], [ 114.83223769, 31.09346047 ], [ 114.83205556, 31.09333167 ], [ 114.83167309, 31.09233246 ], [ 114.83150432, 31.09157171 ], [ 114.83058239, 31.09015966 ], [ 114.83056013, 31.08954201 ], [ 114.83050376, 31.08944777 ], [ 114.83025775, 31.08934203 ], [ 114.82958796, 31.08929807 ], [ 114.82927846, 31.08919418 ], [ 114.82898184, 31.08892572 ], [ 114.82874563, 31.08826279 ], [ 114.82847728, 31.08797214 ], [ 114.82810623, 31.08782053 ], [ 114.8272577, 31.08775425 ], [ 114.82664392, 31.0875203 ], [ 114.82364553, 31.08513984 ], [ 114.82315565, 31.0848578 ], [ 114.82286279, 31.08489507 ], [ 114.82226505, 31.08531588 ], [ 114.82205319, 31.08539387 ], [ 114.82183142, 31.08536845 ], [ 114.82123978, 31.08510357 ], [ 114.82058185, 31.08512246 ], [ 114.81972392, 31.08539793 ], [ 114.81928039, 31.08560483 ], [ 114.81894161, 31.08584667 ], [ 114.81805304, 31.0866593 ], [ 114.81781666, 31.08698638 ], [ 114.81776807, 31.08762108 ], [ 114.81783347, 31.08797589 ], [ 114.81804949, 31.0885398 ], [ 114.81804397, 31.08910554 ], [ 114.81772637, 31.08955603 ], [ 114.81739159, 31.08980319 ], [ 114.81715598, 31.08988434 ], [ 114.81664295, 31.08991969 ], [ 114.81622931, 31.08984936 ], [ 114.81562201, 31.08957982 ], [ 114.81478012, 31.08896597 ], [ 114.81455157, 31.08888173 ], [ 114.81431848, 31.08887856 ], [ 114.81411373, 31.08895825 ], [ 114.81395224, 31.08918361 ], [ 114.81392417, 31.0896021 ], [ 114.81403608, 31.09019791 ], [ 114.81394557, 31.09033802 ], [ 114.81245503, 31.09068401 ], [ 114.81187346, 31.090667 ], [ 114.81037406, 31.08999369 ], [ 114.81014788, 31.08994425 ], [ 114.80971996, 31.08997565 ], [ 114.80945865, 31.08986381 ], [ 114.80923572, 31.08964891 ], [ 114.80896408, 31.08920207 ], [ 114.80846144, 31.08787121 ], [ 114.80696592, 31.08680006 ], [ 114.80660288, 31.08665014 ], [ 114.80637954, 31.08668047 ], [ 114.80595633, 31.08688531 ], [ 114.80550375, 31.08736645 ], [ 114.80523388, 31.08748405 ], [ 114.80486705, 31.08742314 ], [ 114.80443662, 31.08702476 ], [ 114.80422441, 31.08692167 ], [ 114.80381945, 31.08689562 ], [ 114.80347374, 31.08704276 ], [ 114.80332213, 31.08742268 ], [ 114.80335566, 31.08816571 ], [ 114.80385286, 31.08968268 ], [ 114.80380734, 31.08985062 ], [ 114.80365513, 31.08998411 ], [ 114.80326406, 31.09006997 ], [ 114.80230166, 31.09006905 ], [ 114.80115761, 31.08985139 ], [ 114.80085734, 31.08971765 ], [ 114.79903247, 31.0884895 ], [ 114.79874624, 31.08819034 ], [ 114.79837558, 31.08757002 ], [ 114.79748468, 31.08699594 ], [ 114.79675028, 31.08602741 ], [ 114.79550632, 31.08497157 ], [ 114.7940952, 31.08336167 ], [ 114.7938431, 31.08247967 ], [ 114.79340376, 31.08183674 ], [ 114.79318154, 31.0811882 ], [ 114.79353001, 31.08009442 ], [ 114.79354794, 31.0792146 ], [ 114.79345747, 31.07871792 ], [ 114.79311244, 31.07820993 ], [ 114.79307587, 31.07797247 ], [ 114.79372395, 31.07703186 ], [ 114.79437362, 31.07648394 ], [ 114.7950399, 31.07620085 ], [ 114.795182, 31.07603693 ], [ 114.79523266, 31.07578613 ], [ 114.79519235, 31.07551953 ], [ 114.79502937, 31.07525714 ], [ 114.79457007, 31.07473418 ], [ 114.79411624, 31.07443305 ], [ 114.79396766, 31.07426315 ], [ 114.79371644, 31.07339029 ], [ 114.79335751, 31.07309845 ], [ 114.79313763, 31.07306026 ], [ 114.79254185, 31.07312815 ], [ 114.79169145, 31.07267506 ], [ 114.79146494, 31.07266939 ], [ 114.79075424, 31.07282608 ], [ 114.79006948, 31.0728222 ], [ 114.78923441, 31.07248238 ], [ 114.78813168, 31.07241329 ], [ 114.78768716, 31.0721916 ], [ 114.78684574, 31.07146698 ], [ 114.78673212, 31.07126962 ], [ 114.78655196, 31.07051768 ], [ 114.78595419, 31.06984413 ], [ 114.78513181, 31.0684551 ], [ 114.78454996, 31.06786331 ], [ 114.78344269, 31.06654637 ], [ 114.7827804, 31.06562376 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800125PD0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800124PD0000", "TRVCD": "AFA9800126P00000", "INDCD": "QFA9800124PD0000", "ONDCD": "QFA9800125P00000", "BWSCD": "WFA9800125PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 6.0, "RVLEN": 699.0, "RVSLP": 0.0217, "IELV": 125.08, "OELV": 109.9, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21671197, 31.29766968 ], [ 115.21589085, 31.29842463 ], [ 115.21531607, 31.29872996 ], [ 115.21492188, 31.29883786 ], [ 115.21379978, 31.29891598 ], [ 115.21336374, 31.29913156 ], [ 115.21291407, 31.29961066 ], [ 115.21247182, 31.30046604 ], [ 115.21227745, 31.30098024 ], [ 115.21189491, 31.3014303 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126T00000", "RVNM": "干沙河", "GB": "210101", "FRVCD": "AFA9800125T00000,AFA9800121TD0000", "TRVCD": "AFA9800127T00000", "INDCD": "QFA9800125T00000", "ONDCD": "QFA9800126T00000", "BWSCD": "WFA9800126T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 3263.0, "RVSLP": 0.0, "IELV": 40.0, "OELV": 40.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74721734, 31.10635164 ], [ 114.74793582, 31.10625719 ], [ 114.74861293, 31.10590806 ], [ 114.7495444, 31.10581441 ], [ 114.74992817, 31.10567856 ], [ 114.75189126, 31.10389539 ], [ 114.7525502, 31.10313578 ], [ 114.75365637, 31.10245726 ], [ 114.75404194, 31.10214168 ], [ 114.75501033, 31.1009698 ], [ 114.7555399, 31.09998441 ], [ 114.75576429, 31.09923516 ], [ 114.75563643, 31.09857613 ], [ 114.75570989, 31.09832849 ], [ 114.75618045, 31.09777554 ], [ 114.75693239, 31.09670978 ], [ 114.75760542, 31.09607221 ], [ 114.75789211, 31.09591441 ], [ 114.75858958, 31.09568719 ], [ 114.75898961, 31.09567251 ], [ 114.75935752, 31.09584804 ], [ 114.76017204, 31.09648119 ], [ 114.76050226, 31.09656801 ], [ 114.76094618, 31.09626165 ], [ 114.76309277, 31.09426481 ], [ 114.7634121, 31.09389069 ], [ 114.76381939, 31.09297415 ], [ 114.76439412, 31.0922825 ], [ 114.76484292, 31.09143523 ], [ 114.76521643, 31.0905037 ], [ 114.7658377, 31.08952791 ], [ 114.76633042, 31.08832164 ], [ 114.76636828, 31.08774392 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800128000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800127000000,AFA9800121D00000", "TRVCD": "AFA9800129000000", "INDCD": "QFA9800127000000", "ONDCD": "QFA9800128000000", "BWSCD": "WFA9800128000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 8.0, "RVLEN": 3089.0, "RVSLP": 0.0002, "IELV": 89.78, "OELV": 88.05, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09095361, 31.457475 ], [ 115.09068318, 31.45739796 ], [ 115.09026294, 31.45709221 ], [ 115.08935428, 31.4558529 ], [ 115.08848343, 31.45385089 ], [ 115.08836831, 31.45306676 ], [ 115.08814788, 31.45243942 ], [ 115.08803025, 31.45165274 ], [ 115.08764641, 31.45065884 ], [ 115.08775753, 31.45022098 ], [ 115.0880402, 31.44971202 ], [ 115.08863822, 31.44902609 ], [ 115.08964567, 31.44764434 ], [ 115.08989021, 31.44718553 ], [ 115.08995006, 31.44691226 ], [ 115.08987742, 31.44651166 ], [ 115.0894928, 31.44599551 ], [ 115.08903453, 31.44494776 ], [ 115.08876028, 31.4445039 ], [ 115.08846473, 31.44422504 ], [ 115.08780692, 31.44387307 ], [ 115.08704483, 31.44329952 ], [ 115.08675597, 31.4430001 ], [ 115.08663557, 31.44266467 ], [ 115.08665824, 31.44187803 ], [ 115.08724272, 31.4402153 ], [ 115.08759024, 31.4386936 ], [ 115.08796431, 31.43780403 ], [ 115.08795448, 31.43731015 ], [ 115.0877262, 31.43668537 ], [ 115.08764089, 31.43580469 ], [ 115.08765195, 31.43521825 ], [ 115.08782979, 31.43451432 ], [ 115.0878284, 31.43392025 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800129P00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800128P00000,AFA9800122PG0000", "TRVCD": "AFA980012AP00000", "INDCD": "QFA9800128P00000", "ONDCD": "QFA9800129P00000", "BWSCD": "WFA9800129P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 11.0, "RVLEN": 2476.0, "RVSLP": 0.0023, "IELV": 68.27, "OELV": 67.63, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14260015, 31.23775629 ], [ 115.14251793, 31.23626423 ], [ 115.14229458, 31.23563838 ], [ 115.14223386, 31.23528568 ], [ 115.14204884, 31.23169853 ], [ 115.14124997, 31.22981093 ], [ 115.14109146, 31.22827842 ], [ 115.14061485, 31.22728928 ], [ 115.14062549, 31.22702881 ], [ 115.141007, 31.22578023 ], [ 115.14086798, 31.22271952 ], [ 115.14020295, 31.2213382 ], [ 115.13925602, 31.21979629 ], [ 115.13878638, 31.21829822 ], [ 115.1383776, 31.21753581 ], [ 115.13828067, 31.21715367 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98201E0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9820600000000", "INDCD": "-1", "ONDCD": "QFA98201E0000000", "BWSCD": "WFA98201E0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 266.0, "RVSLP": 0.0134, "IELV": 69.85, "OELV": 67.45, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79987173, 31.2438837 ], [ 114.80011785, 31.24383529 ], [ 114.8002994, 31.24370391 ], [ 114.80068376, 31.24293598 ], [ 114.80098165, 31.24262809 ], [ 114.80123065, 31.24250042 ], [ 114.80165547, 31.24248088 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900121000000", "TRVCD": "AFA9900123000000", "INDCD": "QFA9900121000000", "ONDCD": "QFA9900122000000", "BWSCD": "WFA9900122000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 5290.0, "RVSLP": 0.0045, "IELV": 205.02, "OELV": 168.95, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43077586, 31.31381575 ], [ 115.43081002, 31.31352173 ], [ 115.43115847, 31.31271768 ], [ 115.43121959, 31.31243813 ], [ 115.43119444, 31.31185915 ], [ 115.43100797, 31.31118753 ], [ 115.43113218, 31.31042384 ], [ 115.43106775, 31.30848251 ], [ 115.43123644, 31.30777361 ], [ 115.43128905, 31.30661545 ], [ 115.43152411, 31.30593033 ], [ 115.43184122, 31.30558354 ], [ 115.43222173, 31.30544658 ], [ 115.43344844, 31.30539247 ], [ 115.43384458, 31.30528536 ], [ 115.43415394, 31.30503113 ], [ 115.43522503, 31.30372952 ], [ 115.43526795, 31.30346265 ], [ 115.43522696, 31.30319151 ], [ 115.43483828, 31.30247185 ], [ 115.43479828, 31.30228475 ], [ 115.43514409, 31.30134972 ], [ 115.43519404, 31.30055794 ], [ 115.43534775, 31.29999006 ], [ 115.43540391, 31.29913018 ], [ 115.43554814, 31.29863057 ], [ 115.43558047, 31.29768276 ], [ 115.43573353, 31.29711567 ], [ 115.43573629, 31.296774 ], [ 115.43559443, 31.29644574 ], [ 115.43413959, 31.29476386 ], [ 115.43384493, 31.29424778 ], [ 115.43376755, 31.29374845 ], [ 115.43376362, 31.29300832 ], [ 115.43414817, 31.29182471 ], [ 115.43417976, 31.29155432 ], [ 115.43414407, 31.29128 ], [ 115.43377805, 31.29025259 ], [ 115.43292042, 31.28892839 ], [ 115.43120363, 31.28711631 ], [ 115.42856162, 31.28499014 ], [ 115.42820454, 31.284638 ], [ 115.4277323, 31.2837437 ], [ 115.42703302, 31.28280006 ], [ 115.42658976, 31.28159606 ], [ 115.4252448, 31.27857997 ], [ 115.42509822, 31.27804014 ], [ 115.42478394, 31.27730767 ], [ 115.42435988, 31.27658202 ], [ 115.42387562, 31.27546058 ], [ 115.42313604, 31.27439765 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA990012A000000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9900129000000,AFA9900122H00000", "TRVCD": "AFA990012B000000", "INDCD": "QFA9900129000000", "ONDCD": "QFA990012A000000", "BWSCD": "WFA990012A000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 11.0, "RVLEN": 5758.0, "RVSLP": 0.004, "IELV": 108.81, "OELV": 89.64, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33062311, 31.13055171 ], [ 115.33106357, 31.13096756 ], [ 115.33187568, 31.13205294 ], [ 115.33239999, 31.13300842 ], [ 115.33283292, 31.13340751 ], [ 115.33332017, 31.13375038 ], [ 115.33420632, 31.13419412 ], [ 115.33528696, 31.1342995 ], [ 115.33552565, 31.13413445 ], [ 115.33583546, 31.13373754 ], [ 115.33601572, 31.13360171 ], [ 115.33705466, 31.13337159 ], [ 115.3375381, 31.1330697 ], [ 115.3393704, 31.13218179 ], [ 115.33969584, 31.13192186 ], [ 115.33993972, 31.13161586 ], [ 115.33995225, 31.13130201 ], [ 115.33964708, 31.13067017 ], [ 115.33854186, 31.12993993 ], [ 115.33794557, 31.12935759 ], [ 115.33784048, 31.12887236 ], [ 115.33775752, 31.12706558 ], [ 115.33779641, 31.12656572 ], [ 115.33794222, 31.12629961 ], [ 115.33877806, 31.12546165 ], [ 115.33924004, 31.12483975 ], [ 115.33974797, 31.1244182 ], [ 115.34085448, 31.12391431 ], [ 115.34179248, 31.12384054 ], [ 115.34228985, 31.12390229 ], [ 115.3431524, 31.12440801 ], [ 115.34372357, 31.12443705 ], [ 115.3446549, 31.12414448 ], [ 115.34546399, 31.12377983 ], [ 115.3462357, 31.12352784 ], [ 115.34784887, 31.12337561 ], [ 115.34849447, 31.12304204 ], [ 115.34879993, 31.12296372 ], [ 115.34982896, 31.1231723 ], [ 115.35067133, 31.12348256 ], [ 115.351465, 31.12368556 ], [ 115.35230154, 31.12368895 ], [ 115.35298211, 31.12342233 ], [ 115.35655796, 31.12171565 ], [ 115.35754823, 31.12115996 ], [ 115.35808715, 31.12096612 ], [ 115.35836561, 31.12078979 ], [ 115.35880208, 31.12039163 ], [ 115.35903534, 31.12006338 ], [ 115.3592263, 31.11894816 ], [ 115.35917446, 31.11870597 ], [ 115.35882661, 31.11820013 ], [ 115.3587323, 31.11755808 ], [ 115.35874846, 31.11712411 ], [ 115.35892407, 31.11641305 ], [ 115.35889607, 31.11470571 ], [ 115.35905242, 31.11413809 ], [ 115.35907451, 31.11378564 ], [ 115.35900047, 31.11337354 ], [ 115.35855185, 31.11235371 ], [ 115.35838369, 31.1112103 ], [ 115.35792959, 31.11050378 ], [ 115.35783625, 31.10932365 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JBA000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800123JB0000", "INDCD": "-1", "ONDCD": "QFA9800122JB0000", "BWSCD": "WFA9800121JBA000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 5100.0, "RVSLP": 0.0042, "IELV": 124.69, "OELV": 98.28, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91029169, 31.36944453 ], [ 114.911069, 31.3678664 ], [ 114.91165748, 31.36703813 ], [ 114.91201518, 31.3666899 ], [ 114.91229263, 31.36651973 ], [ 114.91253436, 31.36645825 ], [ 114.91419203, 31.36637374 ], [ 114.91441974, 31.36629205 ], [ 114.91466464, 31.36609199 ], [ 114.91482767, 31.36576437 ], [ 114.91486762, 31.36503889 ], [ 114.91495036, 31.36476581 ], [ 114.91592194, 31.36373036 ], [ 114.91622745, 31.36285424 ], [ 114.91682222, 31.36226673 ], [ 114.91757219, 31.36176629 ], [ 114.91828078, 31.36068693 ], [ 114.91885686, 31.36022931 ], [ 114.9193355, 31.36020068 ], [ 114.92121358, 31.36074192 ], [ 114.92321325, 31.36070586 ], [ 114.9241065, 31.36087202 ], [ 114.92549788, 31.36085135 ], [ 114.92627148, 31.36079442 ], [ 114.9268161, 31.36062617 ], [ 114.92757164, 31.36052423 ], [ 114.92811571, 31.36035627 ], [ 114.92895406, 31.36023777 ], [ 114.92941347, 31.36009777 ], [ 114.93034639, 31.36015635 ], [ 114.93140216, 31.35976992 ], [ 114.93252359, 31.3597376 ], [ 114.93330012, 31.36000217 ], [ 114.93371424, 31.36029537 ], [ 114.93400027, 31.36059363 ], [ 114.93428424, 31.36111193 ], [ 114.93447453, 31.36194763 ], [ 114.93470401, 31.36232816 ], [ 114.93516962, 31.36287592 ], [ 114.93626736, 31.36457838 ], [ 114.93684315, 31.36576243 ], [ 114.93718168, 31.3668025 ], [ 114.93719635, 31.36722628 ], [ 114.93710403, 31.36747653 ], [ 114.93678782, 31.36766677 ], [ 114.93549445, 31.36778399 ], [ 114.93530631, 31.367897 ], [ 114.93520431, 31.36806699 ], [ 114.93525094, 31.36844954 ], [ 114.93605458, 31.36972221 ], [ 114.93640778, 31.37007665 ], [ 114.93702902, 31.37052618 ], [ 114.93861359, 31.37119829 ], [ 114.94052648, 31.37266726 ], [ 114.94114365, 31.37289431 ], [ 114.94163852, 31.37294405 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PH0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122PH0000", "INDCD": "-1", "ONDCD": "QFA9800121PH0000", "BWSCD": "WFA9800121PH0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1689.0, "RVSLP": 0.0483, "IELV": 300.07, "OELV": 194.75, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22955247, 31.11539233 ], [ 115.22952766, 31.11587788 ], [ 115.2293579, 31.11653786 ], [ 115.22937409, 31.11735027 ], [ 115.2294439, 31.1177758 ], [ 115.22996226, 31.11906628 ], [ 115.23010236, 31.12235048 ], [ 115.23003413, 31.122628 ], [ 115.22947273, 31.12376642 ], [ 115.22921904, 31.12480807 ], [ 115.22928518, 31.1271181 ], [ 115.22924252, 31.12754244 ], [ 115.22900929, 31.1284462 ], [ 115.22863977, 31.12900127 ], [ 115.22835448, 31.12962905 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121PL0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012FP00000", "INDCD": "-1", "ONDCD": "QFA980012EP00000", "BWSCD": "WFA9800121PL0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 7543.0, "RVSLP": 0.0224, "IELV": 248.24, "OELV": 50.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10797824, 31.10562323 ], [ 115.10659595, 31.10691595 ], [ 115.10618795, 31.1071917 ], [ 115.10577839, 31.10727006 ], [ 115.10422327, 31.10735783 ], [ 115.10362774, 31.10761489 ], [ 115.10307446, 31.10796212 ], [ 115.10214377, 31.10826002 ], [ 115.10040493, 31.10833648 ], [ 115.09999427, 31.10841672 ], [ 115.09965516, 31.10864348 ], [ 115.09937607, 31.10894793 ], [ 115.09913618, 31.10955442 ], [ 115.09882841, 31.11003164 ], [ 115.09856799, 31.11011839 ], [ 115.09808533, 31.10995366 ], [ 115.09790823, 31.10995224 ], [ 115.09777213, 31.1100732 ], [ 115.09758365, 31.11045386 ], [ 115.09742718, 31.11055222 ], [ 115.09693594, 31.11043947 ], [ 115.09645074, 31.11010648 ], [ 115.09617817, 31.10973182 ], [ 115.09618243, 31.10914986 ], [ 115.09609214, 31.10897373 ], [ 115.09558997, 31.10856613 ], [ 115.09500769, 31.10840624 ], [ 115.09470151, 31.10858596 ], [ 115.09434211, 31.10906805 ], [ 115.09409829, 31.10928397 ], [ 115.09388071, 31.10939188 ], [ 115.09332159, 31.10951958 ], [ 115.09313964, 31.10963571 ], [ 115.09302876, 31.10993164 ], [ 115.09315763, 31.11051191 ], [ 115.09307762, 31.11067591 ], [ 115.09290213, 31.11079027 ], [ 115.09241159, 31.11086097 ], [ 115.09171408, 31.11085302 ], [ 115.09139217, 31.11077351 ], [ 115.09087488, 31.11052031 ], [ 115.09047777, 31.11050235 ], [ 115.08936629, 31.11077775 ], [ 115.08833806, 31.11125893 ], [ 115.08778233, 31.11159836 ], [ 115.08667084, 31.1118897 ], [ 115.08557402, 31.11201365 ], [ 115.08443456, 31.11243857 ], [ 115.08384232, 31.11244327 ], [ 115.08312417, 31.11230231 ], [ 115.08288366, 31.11233642 ], [ 115.08244042, 31.11252597 ], [ 115.08217014, 31.11270572 ], [ 115.08190641, 31.11300638 ], [ 115.08168278, 31.11347612 ], [ 115.08157552, 31.11402634 ], [ 115.08142858, 31.11429516 ], [ 115.08095163, 31.1147703 ], [ 115.08052974, 31.11502266 ], [ 115.07950173, 31.11524202 ], [ 115.07873433, 31.1150518 ], [ 115.07790241, 31.11567524 ], [ 115.07760294, 31.11580185 ], [ 115.07588455, 31.11591769 ], [ 115.0747497, 31.11634779 ], [ 115.07381736, 31.11644139 ], [ 115.07311017, 31.11663762 ], [ 115.07181837, 31.11672953 ], [ 115.07120462, 31.11687543 ], [ 115.07084089, 31.11676816 ], [ 115.06993431, 31.11615207 ], [ 115.06914778, 31.11594 ], [ 115.06874609, 31.11594016 ], [ 115.0678933, 31.11620518 ], [ 115.06737584, 31.1164359 ], [ 115.06547463, 31.11754155 ], [ 115.06385806, 31.11768345 ], [ 115.06245979, 31.11827992 ], [ 115.06153001, 31.11822158 ], [ 115.05986486, 31.11883755 ], [ 115.05894577, 31.11896982 ], [ 115.05841605, 31.11918642 ], [ 115.05803348, 31.11947937 ], [ 115.05787471, 31.11980534 ], [ 115.05788364, 31.1201496 ], [ 115.05807002, 31.12069835 ], [ 115.05807031, 31.12127122 ], [ 115.05835026, 31.12170013 ], [ 115.05856974, 31.12223156 ], [ 115.05932575, 31.12281315 ], [ 115.05972424, 31.12337232 ], [ 115.05982335, 31.12371599 ], [ 115.05994756, 31.12511165 ], [ 115.0606347, 31.12627726 ], [ 115.06073205, 31.12668479 ], [ 115.06067167, 31.12702847 ], [ 115.06037804, 31.12755214 ], [ 115.05850638, 31.12931597 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122V00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121V00000", "TRVCD": "AFA9800123V00000", "INDCD": "QFA9800121V00000", "ONDCD": "QFA9800122V00000", "BWSCD": "WFA9800122V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 2.0, "RVLEN": 2944.0, "RVSLP": -0.0003, "IELV": 36.8, "OELV": 37.46, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87609375, 31.02943414 ], [ 114.8758057, 31.02941821 ], [ 114.87553794, 31.02930574 ], [ 114.87539847, 31.02917761 ], [ 114.87516992, 31.0287417 ], [ 114.87479388, 31.0284423 ], [ 114.87349661, 31.02818216 ], [ 114.87255593, 31.02814987 ], [ 114.87174405, 31.02799008 ], [ 114.86991571, 31.02803613 ], [ 114.868274, 31.02835787 ], [ 114.8674176, 31.02863928 ], [ 114.86721165, 31.02850437 ], [ 114.86687821, 31.02799985 ], [ 114.86613361, 31.02770845 ], [ 114.86421683, 31.02771377 ], [ 114.86341203, 31.02745933 ], [ 114.86254161, 31.0279598 ], [ 114.86090621, 31.02821568 ], [ 114.86069262, 31.02814553 ], [ 114.860452, 31.02794406 ], [ 114.86016425, 31.02722819 ], [ 114.86000956, 31.02706599 ], [ 114.85979982, 31.02697432 ], [ 114.85916785, 31.02680151 ], [ 114.85875171, 31.02678038 ], [ 114.85842787, 31.02684881 ], [ 114.85778177, 31.02718969 ], [ 114.85730779, 31.02716229 ], [ 114.85621669, 31.02668527 ], [ 114.85611803, 31.02646825 ], [ 114.85620506, 31.02600663 ], [ 114.8561262, 31.02568342 ], [ 114.85578387, 31.02532768 ], [ 114.85462258, 31.02439756 ], [ 114.85438815, 31.02408049 ], [ 114.8543235, 31.02359381 ], [ 114.85440771, 31.02324867 ], [ 114.85468399, 31.02292007 ], [ 114.85532984, 31.02235384 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123PK0000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121PKA000,AFA9800122PK0000", "TRVCD": "AFA980012DP00000", "INDCD": "QFA9800122PK0000", "ONDCD": "QFA980012CP00000", "BWSCD": "WFA9800123PK0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 9831.0, "RVSLP": 0.0014, "IELV": 76.99, "OELV": 60.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14978366, 31.14378997 ], [ 115.14962595, 31.14358237 ], [ 115.14950811, 31.14314793 ], [ 115.14941382, 31.14132177 ], [ 115.14933389, 31.14090357 ], [ 115.14898649, 31.14017418 ], [ 115.14812408, 31.13936958 ], [ 115.14783668, 31.13893005 ], [ 115.1476358, 31.13848164 ], [ 115.14736795, 31.13817384 ], [ 115.14607648, 31.13715185 ], [ 115.14541802, 31.13679621 ], [ 115.144112, 31.1358073 ], [ 115.14281656, 31.13503654 ], [ 115.14166395, 31.13460573 ], [ 115.14042593, 31.13438419 ], [ 115.13975623, 31.13443892 ], [ 115.13956631, 31.13455562 ], [ 115.13945462, 31.13473368 ], [ 115.13945642, 31.13535952 ], [ 115.14017819, 31.13660123 ], [ 115.14050832, 31.13733954 ], [ 115.14083533, 31.13829977 ], [ 115.14089485, 31.13865286 ], [ 115.14086199, 31.13929612 ], [ 115.14060382, 31.14006028 ], [ 115.14030233, 31.14057841 ], [ 115.13999354, 31.14083358 ], [ 115.13959827, 31.14094196 ], [ 115.13504959, 31.14107313 ], [ 115.13457201, 31.14094994 ], [ 115.13358427, 31.14028446 ], [ 115.13291622, 31.14023958 ], [ 115.13244651, 31.14038607 ], [ 115.13077965, 31.14144141 ], [ 115.12927081, 31.14283503 ], [ 115.12837446, 31.14395176 ], [ 115.12808287, 31.14476764 ], [ 115.12800562, 31.14598849 ], [ 115.12739209, 31.14688476 ], [ 115.12664724, 31.14758358 ], [ 115.1258886, 31.14808193 ], [ 115.12517592, 31.14867592 ], [ 115.12384386, 31.14948991 ], [ 115.12285487, 31.15042455 ], [ 115.12258836, 31.15095594 ], [ 115.12261825, 31.15133607 ], [ 115.12288286, 31.15162553 ], [ 115.12362391, 31.15202863 ], [ 115.12423338, 31.15252036 ], [ 115.12442387, 31.15284391 ], [ 115.12439989, 31.15330617 ], [ 115.12420169, 31.15352824 ], [ 115.12369898, 31.15374557 ], [ 115.12237634, 31.15362559 ], [ 115.12195441, 31.15368191 ], [ 115.12167307, 31.15383423 ], [ 115.12146606, 31.15407043 ], [ 115.1213956, 31.15427206 ], [ 115.12139795, 31.1553141 ], [ 115.12134192, 31.15566087 ], [ 115.12104888, 31.15604483 ], [ 115.12057972, 31.15638623 ], [ 115.11968754, 31.15679642 ], [ 115.11929376, 31.15685045 ], [ 115.11898777, 31.15675617 ], [ 115.11835239, 31.15633383 ], [ 115.11782041, 31.15610798 ], [ 115.11687733, 31.15589363 ], [ 115.11428477, 31.15657759 ], [ 115.10870444, 31.15676554 ], [ 115.10837648, 31.15682804 ], [ 115.10785367, 31.1570504 ], [ 115.10550562, 31.15815978 ], [ 115.10449075, 31.15844052 ], [ 115.10410644, 31.15834391 ], [ 115.10319642, 31.15771794 ], [ 115.10257044, 31.1575236 ], [ 115.10036583, 31.15639037 ], [ 115.09854049, 31.15617445 ], [ 115.09802884, 31.15621676 ], [ 115.09740102, 31.15639988 ], [ 115.09646471, 31.15649269 ], [ 115.09616228, 31.15661376 ], [ 115.09589637, 31.15681607 ], [ 115.09532792, 31.15742496 ], [ 115.09509416, 31.15788942 ], [ 115.09452388, 31.15965672 ], [ 115.09414408, 31.16031167 ], [ 115.09295161, 31.16140173 ], [ 115.09135155, 31.16239969 ], [ 115.0903278, 31.16289127 ], [ 115.08947706, 31.16317376 ], [ 115.08845534, 31.16326935 ], [ 115.088033, 31.16323845 ], [ 115.0878028, 31.16315409 ], [ 115.08684748, 31.16240937 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800126V00000", "RVNM": "小河", "GB": "210101", "FRVCD": "AFA9800125V00000,AFA9800121VB0000", "TRVCD": "AFA9800127V00000", "INDCD": "QFA9800125V00000", "ONDCD": "QFA9800126V00000", "BWSCD": "WFA9800126V00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 11023.0, "RVSLP": 0.0006, "IELV": 28.07, "OELV": 24.97, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8091921, 30.98485857 ], [ 114.80864997, 30.98459417 ], [ 114.80827085, 30.98431239 ], [ 114.80787549, 30.98375246 ], [ 114.80759764, 30.98322967 ], [ 114.80729981, 30.98233369 ], [ 114.8072364, 30.98190615 ], [ 114.80725005, 30.9812491 ], [ 114.8074251, 30.98061185 ], [ 114.80741274, 30.98018591 ], [ 114.80700946, 30.97902444 ], [ 114.80645686, 30.97850203 ], [ 114.80575228, 30.97801461 ], [ 114.80513988, 30.97783613 ], [ 114.80455038, 30.97792614 ], [ 114.80430987, 30.97779812 ], [ 114.80417629, 30.97741947 ], [ 114.80409558, 30.97529992 ], [ 114.80396033, 30.97482005 ], [ 114.8037342, 30.97460426 ], [ 114.80352626, 30.97450975 ], [ 114.80276977, 30.97458803 ], [ 114.80205841, 30.97443205 ], [ 114.80177015, 30.97428772 ], [ 114.80153842, 30.97406539 ], [ 114.8011677, 30.97343547 ], [ 114.80020199, 30.97258445 ], [ 114.80008304, 30.97233015 ], [ 114.8001361, 30.97200843 ], [ 114.80087146, 30.97120913 ], [ 114.80118208, 30.97077987 ], [ 114.80156382, 30.97049098 ], [ 114.80229333, 30.97033232 ], [ 114.80345847, 30.9699659 ], [ 114.80437003, 30.96981871 ], [ 114.8051142, 30.96929573 ], [ 114.80723109, 30.96809875 ], [ 114.80826101, 30.96818157 ], [ 114.80889998, 30.96801513 ], [ 114.80965607, 30.9679139 ], [ 114.80988609, 30.96779613 ], [ 114.80991422, 30.96765615 ], [ 114.80979551, 30.96750801 ], [ 114.80915593, 30.96714371 ], [ 114.80884805, 30.96686463 ], [ 114.80872445, 30.96653011 ], [ 114.80874616, 30.96604482 ], [ 114.80891026, 30.96580943 ], [ 114.80933246, 30.96558758 ], [ 114.81037784, 30.96530227 ], [ 114.81070183, 30.96504164 ], [ 114.81089561, 30.96479231 ], [ 114.81095016, 30.96446544 ], [ 114.81079247, 30.96398833 ], [ 114.81079426, 30.96366108 ], [ 114.81112045, 30.96290816 ], [ 114.81122671, 30.96213991 ], [ 114.81158634, 30.96131814 ], [ 114.81192151, 30.95986195 ], [ 114.81224414, 30.95941994 ], [ 114.81295445, 30.95889321 ], [ 114.81320166, 30.958417 ], [ 114.81335192, 30.95825761 ], [ 114.81363957, 30.9581523 ], [ 114.81415221, 30.95811777 ], [ 114.81545376, 30.95822252 ], [ 114.81633249, 30.95762957 ], [ 114.81677761, 30.9574257 ], [ 114.81718611, 30.95736965 ], [ 114.8176613, 30.95748342 ], [ 114.81903573, 30.95853821 ], [ 114.81972434, 30.95882853 ], [ 114.82023222, 30.95887353 ], [ 114.82071354, 30.95878356 ], [ 114.82091847, 30.95857961 ], [ 114.82098755, 30.95824585 ], [ 114.82095401, 30.95718795 ], [ 114.82086448, 30.95668889 ], [ 114.82068888, 30.95643193 ], [ 114.82005515, 30.95586693 ], [ 114.81991163, 30.95556773 ], [ 114.82007111, 30.9551165 ], [ 114.82100022, 30.95333246 ], [ 114.82103164, 30.95275441 ], [ 114.82096248, 30.95132421 ], [ 114.82076566, 30.95036205 ], [ 114.82088581, 30.95011352 ], [ 114.82151017, 30.94945584 ], [ 114.8215858, 30.94926908 ], [ 114.82155785, 30.94908461 ], [ 114.82129445, 30.94865152 ], [ 114.82068213, 30.94806782 ], [ 114.82010218, 30.94733173 ], [ 114.82001764, 30.94699013 ], [ 114.8199339, 30.94596029 ], [ 114.81966755, 30.94543387 ], [ 114.81940256, 30.9451364 ], [ 114.81849171, 30.94435552 ], [ 114.81809717, 30.9435605 ], [ 114.81794818, 30.94301737 ], [ 114.81761437, 30.94225538 ], [ 114.81769274, 30.94208077 ], [ 114.81820455, 30.94155355 ], [ 114.81836791, 30.9413016 ], [ 114.81835222, 30.94105738 ], [ 114.81814031, 30.94068897 ], [ 114.81783885, 30.94040975 ], [ 114.81718824, 30.94004754 ], [ 114.81696165, 30.9398202 ], [ 114.81685565, 30.93955752 ], [ 114.81673608, 30.93877353 ], [ 114.81650755, 30.93846724 ], [ 114.81565491, 30.9379604 ], [ 114.81401203, 30.93668268 ], [ 114.81378826, 30.93657574 ], [ 114.81313558, 30.93646773 ], [ 114.81292577, 30.93637011 ], [ 114.81257648, 30.93590367 ], [ 114.81248213, 30.93555771 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA98501A0000000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9850400000000", "INDCD": "-1", "ONDCD": "QFA9850300000000", "BWSCD": "WFA98501A0000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6992.0, "RVSLP": 0.0117, "IELV": 151.62, "OELV": 59.21, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08392845, 30.94120009 ], [ 115.08328605, 30.94163934 ], [ 115.08227395, 30.94294639 ], [ 115.08192002, 30.94316421 ], [ 115.08166487, 30.94306605 ], [ 115.08140112, 30.94279175 ], [ 115.08095379, 30.94201026 ], [ 115.08091621, 30.94152974 ], [ 115.08075842, 30.94138187 ], [ 115.08056008, 30.94137374 ], [ 115.07953842, 30.94163651 ], [ 115.07855806, 30.94235777 ], [ 115.07771602, 30.94241782 ], [ 115.07713438, 30.94223375 ], [ 115.07542678, 30.94116008 ], [ 115.07506252, 30.94111361 ], [ 115.07464165, 30.94144462 ], [ 115.07436242, 30.94197969 ], [ 115.07413002, 30.94274436 ], [ 115.07408635, 30.94354235 ], [ 115.07400396, 30.94381322 ], [ 115.07367425, 30.94415394 ], [ 115.07316385, 30.9444 ], [ 115.07164947, 30.9445804 ], [ 115.07093589, 30.94495967 ], [ 115.07016367, 30.94521117 ], [ 115.06925253, 30.94534972 ], [ 115.06843943, 30.94570153 ], [ 115.06759013, 30.9459764 ], [ 115.06647478, 30.94624912 ], [ 115.06520133, 30.94636564 ], [ 115.0640559, 30.9467319 ], [ 115.06375362, 30.94671774 ], [ 115.06291026, 30.94643786 ], [ 115.06251414, 30.94647453 ], [ 115.06217627, 30.94669555 ], [ 115.06186021, 30.94707019 ], [ 115.06178225, 30.94735011 ], [ 115.06172427, 30.94814034 ], [ 115.06156393, 30.94836231 ], [ 115.06136191, 30.94844282 ], [ 115.06057173, 30.94834044 ], [ 115.05988244, 30.94845851 ], [ 115.05968151, 30.94841045 ], [ 115.05950636, 30.94820649 ], [ 115.05937206, 30.94757976 ], [ 115.05923501, 30.94731627 ], [ 115.05892564, 30.94708023 ], [ 115.05856846, 30.94709151 ], [ 115.05817034, 30.94746525 ], [ 115.05781232, 30.94811159 ], [ 115.05743551, 30.94863458 ], [ 115.05656352, 30.95026684 ], [ 115.05615983, 30.95068679 ], [ 115.05580404, 30.95088915 ], [ 115.05522894, 30.95091004 ], [ 115.05474606, 30.95061623 ], [ 115.05441502, 30.95010412 ], [ 115.0542142, 30.94926391 ], [ 115.05403032, 30.94904615 ], [ 115.05365364, 30.94895626 ], [ 115.05324966, 30.94902595 ], [ 115.05298608, 30.94920831 ], [ 115.0528033, 30.94946538 ], [ 115.05274637, 30.94981557 ], [ 115.05274807, 30.95086234 ], [ 115.05267611, 30.95106427 ], [ 115.05247085, 30.95130166 ], [ 115.05203076, 30.95148776 ], [ 115.05063539, 30.95154609 ], [ 115.05022171, 30.95162818 ], [ 115.04980568, 30.95191221 ], [ 115.04938172, 30.95237434 ], [ 115.04937218, 30.95252592 ], [ 115.04957239, 30.95265817 ], [ 115.05060002, 30.95270239 ], [ 115.0509821, 30.95284818 ], [ 115.05115359, 30.95300358 ], [ 115.05123695, 30.95318179 ], [ 115.05112993, 30.95349037 ], [ 115.05070794, 30.95388769 ], [ 115.05019437, 30.95415187 ], [ 115.04892794, 30.95449502 ], [ 115.04764075, 30.95458775 ], [ 115.04697184, 30.95453385 ], [ 115.04668172, 30.95438019 ], [ 115.04565736, 30.95361024 ], [ 115.04478777, 30.95314641 ], [ 115.04433229, 30.9529737 ], [ 115.04272403, 30.95266079 ], [ 115.04109508, 30.95216385 ], [ 115.04010195, 30.95205981 ], [ 115.03834382, 30.95126478 ], [ 115.03810572, 30.95123071 ], [ 115.03796237, 30.95130567 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900121IA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9900122I00000", "INDCD": "-1", "ONDCD": "QFA9900121I00000", "BWSCD": "WFA9900121IA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 4053.0, "RVSLP": 0.0057, "IELV": 128.51, "OELV": 105.23, "VR": "0", "LEVEL": 8, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38240691, 31.14905959 ], [ 115.38280042, 31.1486096 ], [ 115.38284173, 31.14823778 ], [ 115.38211963, 31.14700969 ], [ 115.38167832, 31.14595791 ], [ 115.38144115, 31.14557028 ], [ 115.38053627, 31.14471352 ], [ 115.38013751, 31.14424245 ], [ 115.37943826, 31.14362241 ], [ 115.37904106, 31.14315208 ], [ 115.37709675, 31.14156963 ], [ 115.37636211, 31.14073815 ], [ 115.3760276, 31.14015816 ], [ 115.37586021, 31.1391701 ], [ 115.37557615, 31.13849861 ], [ 115.37498998, 31.13739817 ], [ 115.37407525, 31.13630383 ], [ 115.3735678, 31.13557006 ], [ 115.37267748, 31.13455215 ], [ 115.3723381, 31.13397374 ], [ 115.37225899, 31.13339992 ], [ 115.37218155, 31.13137423 ], [ 115.37221162, 31.13101822 ], [ 115.37235994, 31.13052007 ], [ 115.37237415, 31.13001221 ], [ 115.37231219, 31.129508 ], [ 115.37212204, 31.12902089 ], [ 115.37208447, 31.12874849 ], [ 115.37225268, 31.12797764 ], [ 115.3722514, 31.12739226 ], [ 115.37218443, 31.12696637 ], [ 115.37199167, 31.12647656 ], [ 115.37187252, 31.12553582 ], [ 115.37167091, 31.1249802 ], [ 115.37163509, 31.12470794 ], [ 115.37180717, 31.12386561 ], [ 115.37177236, 31.12186189 ], [ 115.37214405, 31.12045716 ], [ 115.37237215, 31.11904946 ], [ 115.37199617, 31.11792391 ], [ 115.37180496, 31.11763871 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9700121b00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9700122b00000", "INDCD": "-1", "ONDCD": "QFA9700121b00000", "BWSCD": "WFA9700121b00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 1226.0, "RVSLP": 0.0063, "IELV": 40.0, "OELV": 30.93, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.70398762, 30.98821718 ], [ 114.70369136, 30.98795792 ], [ 114.703516, 30.98770994 ], [ 114.7031601, 30.98658401 ], [ 114.7032501, 30.98617952 ], [ 114.7037676, 30.98554392 ], [ 114.70380863, 30.98516245 ], [ 114.70352579, 30.9848202 ], [ 114.70284077, 30.98451166 ], [ 114.70259389, 30.98417005 ], [ 114.70250834, 30.98353623 ], [ 114.70264752, 30.9826994 ], [ 114.70247341, 30.98232397 ], [ 114.70222506, 30.98207206 ], [ 114.70157158, 30.98181922 ], [ 114.70097817, 30.98121011 ], [ 114.70036442, 30.98076036 ], [ 114.70001012, 30.98067939 ], [ 114.69926468, 30.98069989 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012F000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA980012E000000", "TRVCD": "AFA980012G000000", "INDCD": "QFA980012E000000", "ONDCD": "QFA980012F000000", "BWSCD": "WFA980012F000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 16.0, "RVLEN": 3598.0, "RVSLP": 0.0, "IELV": 60.12, "OELV": 60.05, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04021914, 31.30100175 ], [ 115.03901705, 31.30108082 ], [ 115.03816623, 31.30135793 ], [ 115.03727508, 31.30173773 ], [ 115.03520875, 31.30226413 ], [ 115.03479041, 31.30231964 ], [ 115.03374623, 31.30236218 ], [ 115.03324164, 31.30232159 ], [ 115.0325576, 31.30204607 ], [ 115.03200009, 31.30155428 ], [ 115.03189508, 31.3012866 ], [ 115.0317903, 31.3003418 ], [ 115.03158575, 31.29978449 ], [ 115.03152608, 31.29927806 ], [ 115.03147377, 31.29756008 ], [ 115.0316686, 31.29656596 ], [ 115.03156756, 31.29455573 ], [ 115.03136557, 31.29399799 ], [ 115.03120115, 31.29323787 ], [ 115.03021982, 31.29163138 ], [ 115.02990751, 31.29089638 ], [ 115.02985416, 31.29047508 ], [ 115.02989842, 31.29012979 ], [ 115.03008532, 31.28971978 ], [ 115.03171198, 31.28662158 ], [ 115.03219772, 31.28518157 ], [ 115.03222822, 31.28474979 ], [ 115.03217417, 31.28432179 ], [ 115.03208468, 31.28412383 ], [ 115.03186251, 31.28387922 ], [ 115.03109548, 31.28335763 ], [ 115.0305381, 31.28321878 ], [ 115.02863081, 31.28250993 ], [ 115.0277424, 31.28230589 ], [ 115.0268949, 31.28231431 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA98201D0000000,AFA98201E0000000,AFA98203F0000000,AFA9820500000000,AFA98202G0000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA98201D0000000,QFA98201E0000000,QFA98203F0000000,QFA9820500000000,QFA98202G0000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 14.0, "RVLEN": 0.0, "RVSLP": 0.0, "IELV": 0.0, "OELV": 0.0, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88181049, 31.16993375 ], [ 114.88233402, 31.1694526 ] ], [ [ 114.88181049, 31.16993375 ], [ 114.88143233, 31.16967753 ], [ 114.88117427, 31.16958967 ], [ 114.88101044, 31.16965067 ], [ 114.88105755, 31.16996824 ], [ 114.88100891, 31.17002394 ], [ 114.88004799, 31.16960493 ], [ 114.87888114, 31.16971361 ], [ 114.87871444, 31.16984406 ], [ 114.87895991, 31.17031206 ], [ 114.87885736, 31.17047052 ], [ 114.87736788, 31.17093437 ], [ 114.87642701, 31.17107975 ], [ 114.87585999, 31.17099803 ], [ 114.8756407, 31.17086083 ], [ 114.87517047, 31.17038972 ], [ 114.87480084, 31.17032992 ], [ 114.8747539, 31.17041365 ], [ 114.87487725, 31.17139375 ], [ 114.87481567, 31.17165371 ], [ 114.87451243, 31.17191581 ], [ 114.87391643, 31.17202302 ], [ 114.87377847, 31.17240892 ], [ 114.87337034, 31.17257418 ], [ 114.87286553, 31.17252162 ], [ 114.87243772, 31.17225865 ], [ 114.87221668, 31.17193803 ], [ 114.87211778, 31.17145882 ], [ 114.87181936, 31.17120768 ], [ 114.87160657, 31.17115216 ], [ 114.87127128, 31.1712614 ], [ 114.87119636, 31.17136426 ], [ 114.87120801, 31.17180378 ], [ 114.87106375, 31.1719882 ], [ 114.87063522, 31.17210195 ], [ 114.86981543, 31.17215038 ], [ 114.8697299, 31.17226609 ], [ 114.86987473, 31.17249301 ], [ 114.87008102, 31.17265651 ], [ 114.87175035, 31.17317166 ], [ 114.87215758, 31.17346974 ], [ 114.87262147, 31.17363731 ], [ 114.8728718, 31.17387035 ], [ 114.87268491, 31.1749196 ], [ 114.87253818, 31.17528515 ], [ 114.87146485, 31.17652608 ], [ 114.8712961, 31.17681494 ], [ 114.87140598, 31.17692429 ], [ 114.87178767, 31.17685879 ], [ 114.87251848, 31.17658796 ], [ 114.87332996, 31.1761262 ], [ 114.87352634, 31.17611788 ], [ 114.873538, 31.17636583 ], [ 114.87331438, 31.17691817 ], [ 114.87276417, 31.17771012 ], [ 114.87227741, 31.1781063 ], [ 114.87127325, 31.17833236 ], [ 114.87073161, 31.17827398 ], [ 114.87032589, 31.17797986 ], [ 114.87013821, 31.17791802 ], [ 114.8693616, 31.17814211 ], [ 114.86878562, 31.17802842 ], [ 114.8678162, 31.17826801 ], [ 114.86720132, 31.17822678 ], [ 114.8669445, 31.17807344 ], [ 114.86674444, 31.17782637 ], [ 114.86666387, 31.17760911 ], [ 114.86667314, 31.17731989 ], [ 114.86684654, 31.17703497 ], [ 114.86764975, 31.17650814 ], [ 114.8677543, 31.17636227 ], [ 114.86750637, 31.17633982 ], [ 114.86635009, 31.17660095 ], [ 114.86613794, 31.17659194 ], [ 114.86520824, 31.17617186 ], [ 114.86497174, 31.17585091 ], [ 114.86478435, 31.1753656 ], [ 114.86463131, 31.17530167 ], [ 114.86456232, 31.17535957 ], [ 114.86447023, 31.17581333 ], [ 114.86431794, 31.17598765 ], [ 114.86330825, 31.17624357 ], [ 114.86316809, 31.17634239 ], [ 114.86457406, 31.17679822 ], [ 114.86529975, 31.17713825 ], [ 114.86547174, 31.17732562 ], [ 114.86585284, 31.17798993 ], [ 114.86607178, 31.17876206 ], [ 114.86602576, 31.17883847 ], [ 114.86592407, 31.17884569 ], [ 114.86537642, 31.17860479 ], [ 114.86520738, 31.1785904 ], [ 114.86481501, 31.17899757 ], [ 114.86460602, 31.17904622 ], [ 114.86424142, 31.17872214 ], [ 114.86392776, 31.1779982 ], [ 114.86352375, 31.17747877 ], [ 114.86334645, 31.17743957 ], [ 114.86309188, 31.17751987 ], [ 114.86295753, 31.17766197 ], [ 114.86298427, 31.17781234 ], [ 114.86386901, 31.17961669 ], [ 114.86384962, 31.17984409 ], [ 114.86368181, 31.17993043 ], [ 114.86350597, 31.17986695 ], [ 114.86297562, 31.17937191 ], [ 114.86255601, 31.17876987 ], [ 114.86201861, 31.17829321 ], [ 114.8617341, 31.17791248 ], [ 114.86051167, 31.17790436 ], [ 114.86011154, 31.1777736 ], [ 114.85999192, 31.1775543 ], [ 114.85993433, 31.17724696 ], [ 114.86006648, 31.17656635 ], [ 114.86006689, 31.17602317 ], [ 114.85998796, 31.17591359 ], [ 114.85958754, 31.17566711 ], [ 114.85944733, 31.17540147 ], [ 114.85952571, 31.17509969 ], [ 114.8598782, 31.17466535 ], [ 114.86032798, 31.17432829 ], [ 114.86085013, 31.1742702 ], [ 114.86093991, 31.17380636 ], [ 114.86107546, 31.1735443 ], [ 114.86177212, 31.17294796 ], [ 114.86215444, 31.17274642 ], [ 114.86255043, 31.17226563 ], [ 114.86294219, 31.17145156 ], [ 114.86295646, 31.17104725 ], [ 114.8628447, 31.17078647 ], [ 114.8626596, 31.17071165 ], [ 114.86241594, 31.17080877 ], [ 114.86164898, 31.17150556 ], [ 114.86101188, 31.17194991 ], [ 114.8607941, 31.17198835 ], [ 114.86049065, 31.17188915 ], [ 114.86030799, 31.17195246 ], [ 114.86015024, 31.17211418 ], [ 114.85988038, 31.17263028 ], [ 114.85941861, 31.17293846 ], [ 114.85869334, 31.17369608 ], [ 114.85846931, 31.17381744 ], [ 114.85827673, 31.17382995 ], [ 114.85811591, 31.17375429 ], [ 114.85782382, 31.17345125 ], [ 114.85733221, 31.17339382 ], [ 114.85701287, 31.17326632 ], [ 114.85640844, 31.17274402 ], [ 114.85628991, 31.17242489 ], [ 114.85613768, 31.17152403 ], [ 114.85625955, 31.17057361 ], [ 114.85611628, 31.17021468 ], [ 114.85586687, 31.16991409 ], [ 114.85572366, 31.1698734 ], [ 114.8555918, 31.17001879 ], [ 114.85515221, 31.17184567 ], [ 114.85493237, 31.17203387 ], [ 114.85459246, 31.17204763 ], [ 114.85422064, 31.17189467 ], [ 114.8538224, 31.1716106 ], [ 114.85180549, 31.16938621 ], [ 114.85120061, 31.16889361 ], [ 114.8509456, 31.16884543 ], [ 114.85089189, 31.16896951 ], [ 114.85094809, 31.16911009 ], [ 114.85167757, 31.1698843 ], [ 114.8526148, 31.17137424 ], [ 114.85313832, 31.17205579 ], [ 114.85340013, 31.17259193 ], [ 114.85357816, 31.17269696 ], [ 114.85401348, 31.17277799 ], [ 114.85480471, 31.17305335 ], [ 114.85510954, 31.17330007 ], [ 114.85514647, 31.17357449 ], [ 114.85502718, 31.17379043 ], [ 114.8547285, 31.17402752 ], [ 114.85409904, 31.17432802 ], [ 114.85405543, 31.17442572 ], [ 114.85486396, 31.17468727 ], [ 114.85576021, 31.17431836 ], [ 114.85611635, 31.17433391 ], [ 114.8564003, 31.1745336 ], [ 114.85677795, 31.17495995 ], [ 114.85760826, 31.17544931 ], [ 114.85779812, 31.17566236 ], [ 114.85767012, 31.17581504 ], [ 114.85734156, 31.17587454 ], [ 114.85660948, 31.17553235 ], [ 114.85632816, 31.17546081 ], [ 114.85597618, 31.17573228 ], [ 114.85544224, 31.17568045 ], [ 114.85516613, 31.1757144 ], [ 114.85500705, 31.17585034 ], [ 114.85502035, 31.17602558 ], [ 114.85667718, 31.17631775 ], [ 114.85703977, 31.17662813 ], [ 114.85713953, 31.17707113 ], [ 114.85789371, 31.17721822 ], [ 114.85801936, 31.17734425 ], [ 114.85804522, 31.17751022 ], [ 114.85795192, 31.17767889 ], [ 114.85754377, 31.17795835 ], [ 114.85760049, 31.17854428 ], [ 114.857413, 31.17888794 ], [ 114.85705372, 31.17912804 ], [ 114.85650448, 31.17919759 ], [ 114.85679835, 31.17961363 ], [ 114.85660636, 31.18031558 ], [ 114.85666647, 31.18042281 ], [ 114.85696234, 31.18060643 ], [ 114.85676953, 31.18081643 ], [ 114.85621709, 31.18107226 ], [ 114.85582123, 31.1808876 ], [ 114.8552448, 31.18115406 ], [ 114.85493206, 31.18115359 ], [ 114.85469829, 31.1809064 ], [ 114.85447063, 31.18018386 ], [ 114.85423493, 31.17982633 ], [ 114.85412619, 31.17975794 ], [ 114.85402368, 31.17998159 ], [ 114.85404819, 31.181318 ], [ 114.85398171, 31.18154951 ], [ 114.85386629, 31.18169304 ], [ 114.85350235, 31.18181247 ], [ 114.85291188, 31.18164411 ], [ 114.85270001, 31.18164798 ], [ 114.8517402, 31.18234412 ], [ 114.85096442, 31.18259444 ], [ 114.8502127, 31.18270797 ], [ 114.85004453, 31.18266638 ], [ 114.84996171, 31.18253593 ], [ 114.84999954, 31.18238769 ], [ 114.85014848, 31.18220821 ], [ 114.8505258, 31.18204615 ], [ 114.85097042, 31.18208586 ], [ 114.85119967, 31.18200025 ], [ 114.85169197, 31.18158201 ], [ 114.85208105, 31.18106029 ], [ 114.852028, 31.18087974 ], [ 114.85159984, 31.18061126 ], [ 114.85089794, 31.18067392 ], [ 114.85145977, 31.17949965 ], [ 114.85147267, 31.17939393 ], [ 114.85138797, 31.17928116 ], [ 114.85117184, 31.17909227 ], [ 114.85102428, 31.17908415 ], [ 114.85078213, 31.179772 ], [ 114.85064332, 31.17997228 ], [ 114.85045483, 31.18005165 ], [ 114.84999439, 31.17998431 ], [ 114.84980356, 31.18037631 ], [ 114.84963991, 31.1804886 ], [ 114.84948044, 31.18038172 ], [ 114.84880775, 31.17913224 ], [ 114.84862453, 31.17905262 ], [ 114.84842685, 31.17936755 ], [ 114.84837394, 31.18018446 ], [ 114.84831431, 31.18027636 ], [ 114.84820506, 31.1802852 ], [ 114.84799444, 31.18010963 ], [ 114.84795048, 31.17988312 ], [ 114.84834756, 31.17877758 ], [ 114.84835799, 31.17851794 ], [ 114.84824388, 31.17847215 ], [ 114.84782535, 31.17870813 ], [ 114.84734204, 31.17927515 ], [ 114.84714403, 31.17931182 ], [ 114.84691763, 31.17869933 ], [ 114.84664624, 31.17823136 ], [ 114.84662943, 31.17777847 ], [ 114.84652553, 31.17767938 ], [ 114.84639211, 31.17766173 ], [ 114.84589719, 31.17777001 ], [ 114.84574774, 31.17793192 ], [ 114.84603018, 31.17917018 ], [ 114.84599375, 31.17946322 ], [ 114.84587375, 31.17948457 ], [ 114.84569891, 31.17889708 ], [ 114.84557808, 31.17869043 ], [ 114.84511027, 31.17837819 ], [ 114.84449771, 31.17816399 ], [ 114.84411426, 31.17755846 ], [ 114.8437335, 31.177164 ], [ 114.84384287, 31.17698185 ], [ 114.84481502, 31.1762932 ], [ 114.84491618, 31.1754986 ], [ 114.8448477, 31.17526936 ], [ 114.84468568, 31.17518774 ], [ 114.84452838, 31.17522656 ], [ 114.84386575, 31.17597964 ], [ 114.84314235, 31.17640066 ], [ 114.84285733, 31.1764823 ], [ 114.8425783, 31.17638369 ], [ 114.8423422, 31.17611786 ], [ 114.84223029, 31.17580937 ], [ 114.84219968, 31.17537794 ], [ 114.8421323, 31.17527649 ], [ 114.84200251, 31.17528367 ], [ 114.84143876, 31.17560617 ], [ 114.84121287, 31.17558592 ], [ 114.8408107, 31.1754266 ], [ 114.84075753, 31.1753398 ], [ 114.84080927, 31.17522431 ], [ 114.84147455, 31.17478176 ], [ 114.84160448, 31.17463566 ], [ 114.8416034, 31.17451633 ], [ 114.84142979, 31.17449257 ], [ 114.84063932, 31.17467114 ], [ 114.84031607, 31.1746386 ], [ 114.8401818, 31.17443758 ], [ 114.84038793, 31.17379374 ], [ 114.8403118, 31.17360535 ], [ 114.84010606, 31.17361424 ], [ 114.83952766, 31.17393976 ], [ 114.83926629, 31.17398039 ], [ 114.83904487, 31.17385226 ], [ 114.83869609, 31.17332975 ], [ 114.8379576, 31.17321395 ], [ 114.83769729, 31.17304418 ], [ 114.83769673, 31.17281229 ], [ 114.83796981, 31.17231788 ], [ 114.83803993, 31.17198024 ], [ 114.83796409, 31.17183382 ], [ 114.83785223, 31.17179809 ], [ 114.83737181, 31.17210993 ], [ 114.83718245, 31.17200244 ], [ 114.83715359, 31.17179047 ], [ 114.83731005, 31.17116772 ], [ 114.83702456, 31.17029083 ], [ 114.83722545, 31.16985133 ], [ 114.83711804, 31.16963202 ], [ 114.83694041, 31.16952633 ], [ 114.83672631, 31.16950971 ], [ 114.8364271, 31.16960018 ], [ 114.83588892, 31.17001676 ], [ 114.83574037, 31.17039608 ], [ 114.83565881, 31.17115239 ], [ 114.83554355, 31.1713038 ], [ 114.83525639, 31.17142643 ], [ 114.83528487, 31.17172014 ], [ 114.83595584, 31.17255846 ], [ 114.83631642, 31.17329643 ], [ 114.83645072, 31.17373446 ], [ 114.83665363, 31.17401113 ], [ 114.836852, 31.17413022 ], [ 114.8371964, 31.17406365 ], [ 114.83743912, 31.1741419 ], [ 114.83818643, 31.17477376 ], [ 114.83877613, 31.17548014 ], [ 114.83952201, 31.17596834 ], [ 114.84014207, 31.17661142 ], [ 114.84067463, 31.17694443 ], [ 114.84086223, 31.17724835 ], [ 114.8408408, 31.17774567 ], [ 114.84090581, 31.17793843 ], [ 114.84119842, 31.17818168 ], [ 114.84143634, 31.17864232 ], [ 114.84213826, 31.17904018 ], [ 114.84223501, 31.1791895 ], [ 114.84179407, 31.1792221 ], [ 114.84104913, 31.17948613 ], [ 114.84080154, 31.17945462 ], [ 114.83954759, 31.17794425 ], [ 114.83947024, 31.17774038 ], [ 114.8394959, 31.17724455 ], [ 114.83940098, 31.17709205 ], [ 114.83912812, 31.17697406 ], [ 114.83891758, 31.17697376 ], [ 114.83880095, 31.17703198 ], [ 114.83847865, 31.1774423 ], [ 114.83830041, 31.17749471 ], [ 114.83815385, 31.1774621 ], [ 114.83758204, 31.1769935 ], [ 114.83720387, 31.17617997 ], [ 114.83698015, 31.17602695 ], [ 114.83681579, 31.17605742 ], [ 114.83672044, 31.17615594 ], [ 114.83638173, 31.17689376 ], [ 114.83587173, 31.17714161 ], [ 114.83593553, 31.17770617 ], [ 114.83584467, 31.17786752 ], [ 114.83561606, 31.17800005 ], [ 114.83530222, 31.17799211 ], [ 114.8347876, 31.17755958 ], [ 114.83468536, 31.17739558 ], [ 114.8346341, 31.17701655 ], [ 114.83454565, 31.17685869 ], [ 114.83437793, 31.17684124 ], [ 114.834049, 31.17698984 ], [ 114.83387794, 31.17698211 ], [ 114.83328919, 31.17646848 ], [ 114.8331675, 31.17648717 ], [ 114.83307114, 31.17662382 ], [ 114.8329595, 31.17731773 ], [ 114.83284293, 31.17737821 ], [ 114.83265973, 31.17732 ], [ 114.83225562, 31.17695829 ], [ 114.83212576, 31.17670968 ], [ 114.83221394, 31.17582979 ], [ 114.8320851, 31.17458021 ], [ 114.83214815, 31.17418827 ], [ 114.83241012, 31.17348131 ], [ 114.83300495, 31.17279813 ], [ 114.83295812, 31.17249556 ], [ 114.83269417, 31.17229197 ], [ 114.83251819, 31.1722905 ], [ 114.83181212, 31.17249781 ], [ 114.83159029, 31.17237029 ], [ 114.83123124, 31.1719665 ], [ 114.83105237, 31.17199649 ], [ 114.83059353, 31.17282231 ], [ 114.83051229, 31.17312187 ], [ 114.83055403, 31.17329742 ], [ 114.83086546, 31.17360513 ], [ 114.83098642, 31.17387481 ], [ 114.8310021, 31.17482472 ], [ 114.83091155, 31.17527069 ], [ 114.83081658, 31.17539022 ], [ 114.83065694, 31.17545564 ], [ 114.83005768, 31.17533807 ], [ 114.82970807, 31.17545219 ], [ 114.82952615, 31.17544826 ], [ 114.82918374, 31.17536429 ], [ 114.82903064, 31.17526367 ], [ 114.82866825, 31.17431391 ], [ 114.82849644, 31.17405045 ], [ 114.82832844, 31.17395193 ], [ 114.82802642, 31.17400733 ], [ 114.82742834, 31.17444941 ], [ 114.82710425, 31.17451951 ], [ 114.82681695, 31.17437618 ], [ 114.8264375, 31.17400023 ], [ 114.82603694, 31.17424767 ], [ 114.82584257, 31.17421696 ], [ 114.82565971, 31.17397954 ], [ 114.82572, 31.17359442 ], [ 114.82568589, 31.1734639 ], [ 114.82454796, 31.17308503 ], [ 114.82345056, 31.17300219 ], [ 114.82200329, 31.17323407 ], [ 114.82019225, 31.17289394 ], [ 114.81924568, 31.17298837 ], [ 114.81798962, 31.17286492 ], [ 114.81750995, 31.17270799 ], [ 114.81671229, 31.17210558 ], [ 114.81596817, 31.17183516 ], [ 114.81540724, 31.17179219 ], [ 114.81427853, 31.17195389 ], [ 114.81376572, 31.17193567 ], [ 114.81341442, 31.17174214 ], [ 114.81308994, 31.17123272 ], [ 114.81274624, 31.17100047 ], [ 114.81194991, 31.17086854 ], [ 114.81092954, 31.17087234 ], [ 114.81045472, 31.17073355 ], [ 114.81020533, 31.17051195 ], [ 114.8095884, 31.16951829 ], [ 114.80908674, 31.16915393 ], [ 114.80864292, 31.16901802 ], [ 114.80784961, 31.16891367 ], [ 114.80740986, 31.16893759 ], [ 114.80718817, 31.16903129 ], [ 114.80716951, 31.16918417 ], [ 114.80735381, 31.1692871 ], [ 114.80889151, 31.16963038 ], [ 114.80915212, 31.16974011 ], [ 114.80928283, 31.1699265 ], [ 114.80944487, 31.17058589 ], [ 114.80959608, 31.17093379 ], [ 114.80984996, 31.17122728 ], [ 114.81016784, 31.17143092 ], [ 114.81056435, 31.17154386 ], [ 114.81130043, 31.17141159 ], [ 114.81182379, 31.17155161 ], [ 114.8122689, 31.17180688 ], [ 114.8129024, 31.1725217 ], [ 114.8132915, 31.17275156 ], [ 114.81380551, 31.17294588 ], [ 114.81450754, 31.17306804 ], [ 114.81545212, 31.17297965 ], [ 114.81564717, 31.17303636 ], [ 114.81587226, 31.17346366 ], [ 114.81640046, 31.1739863 ], [ 114.81660594, 31.17432551 ], [ 114.81654784, 31.17444257 ], [ 114.81609959, 31.17471371 ], [ 114.81574005, 31.17514635 ], [ 114.81564652, 31.17544359 ], [ 114.81582116, 31.17558784 ], [ 114.81636365, 31.17556624 ], [ 114.81684121, 31.17570645 ], [ 114.81762619, 31.17521811 ], [ 114.81938575, 31.17482459 ], [ 114.81956646, 31.17487053 ], [ 114.82008751, 31.17528418 ], [ 114.82041154, 31.17538646 ], [ 114.82066756, 31.17538766 ], [ 114.82085018, 31.17530973 ], [ 114.82142186, 31.1748259 ], [ 114.82204121, 31.17469352 ], [ 114.82218032, 31.174724 ], [ 114.82227486, 31.17483339 ], [ 114.82228343, 31.17574427 ], [ 114.82235808, 31.1759338 ], [ 114.8224565, 31.17601201 ], [ 114.82270835, 31.17602123 ], [ 114.82325599, 31.17573215 ], [ 114.82363805, 31.17568127 ], [ 114.82383734, 31.17574843 ], [ 114.8242515, 31.176106 ], [ 114.8248288, 31.17622969 ], [ 114.82507317, 31.1763781 ], [ 114.82512754, 31.17656354 ], [ 114.82503293, 31.17673028 ], [ 114.82421624, 31.17723143 ], [ 114.82411019, 31.17737449 ], [ 114.82414418, 31.17748315 ], [ 114.82466937, 31.17791378 ], [ 114.82489674, 31.17830157 ], [ 114.8249104, 31.1786951 ], [ 114.82468843, 31.17903677 ], [ 114.82416158, 31.17939827 ], [ 114.82333961, 31.17969592 ], [ 114.82302338, 31.17967488 ], [ 114.82225497, 31.17941442 ], [ 114.82183476, 31.17948807 ], [ 114.82059803, 31.18030154 ], [ 114.8204347, 31.18054612 ], [ 114.82036565, 31.18106087 ], [ 114.82180739, 31.18087933 ], [ 114.82258971, 31.18069665 ], [ 114.82354186, 31.18074762 ], [ 114.8242754, 31.18058809 ], [ 114.82470628, 31.18069771 ], [ 114.8251959, 31.18120786 ], [ 114.82548096, 31.18127917 ], [ 114.82559555, 31.18113029 ], [ 114.82589652, 31.18000185 ], [ 114.82631815, 31.1791044 ], [ 114.82648828, 31.17899368 ], [ 114.82691597, 31.17930787 ], [ 114.82717188, 31.17923678 ], [ 114.82726076, 31.17901938 ], [ 114.82721779, 31.17837177 ], [ 114.82729596, 31.17803432 ], [ 114.82760088, 31.17769488 ], [ 114.82830599, 31.17719756 ], [ 114.82850967, 31.1773037 ], [ 114.8287238, 31.17812048 ], [ 114.82901367, 31.1784311 ], [ 114.82942338, 31.17851357 ], [ 114.83020224, 31.17839838 ], [ 114.83047699, 31.17841657 ], [ 114.83078153, 31.17857353 ], [ 114.83146978, 31.17911368 ], [ 114.83172025, 31.17922956 ], [ 114.83336997, 31.179406 ], [ 114.83380897, 31.17956815 ], [ 114.8339501, 31.17972995 ], [ 114.8340485, 31.18004614 ], [ 114.83398964, 31.18075414 ], [ 114.83404348, 31.18129197 ], [ 114.83397591, 31.18143266 ], [ 114.83360456, 31.18176761 ], [ 114.83342543, 31.18244239 ], [ 114.83331152, 31.18266018 ], [ 114.83310201, 31.18279195 ], [ 114.83224562, 31.18296554 ], [ 114.83031403, 31.18393381 ], [ 114.82929544, 31.1847342 ], [ 114.82902263, 31.1850819 ], [ 114.82893631, 31.18554234 ], [ 114.82929969, 31.18647185 ], [ 114.82961578, 31.18692356 ], [ 114.82995188, 31.18711392 ], [ 114.83015248, 31.18712782 ], [ 114.83027259, 31.18705911 ], [ 114.83042007, 31.18671755 ], [ 114.83038794, 31.18648357 ], [ 114.8300042, 31.18601082 ], [ 114.82988838, 31.18573981 ], [ 114.82996207, 31.18548897 ], [ 114.83028613, 31.1851963 ], [ 114.83167684, 31.18443503 ], [ 114.83206725, 31.18428399 ], [ 114.83235589, 31.1842882 ], [ 114.83284629, 31.18443449 ], [ 114.83323372, 31.18426655 ], [ 114.83378048, 31.18441709 ], [ 114.83389223, 31.1843321 ], [ 114.83402225, 31.18396217 ], [ 114.83411176, 31.18386815 ], [ 114.83428514, 31.18383611 ], [ 114.83465503, 31.18390385 ], [ 114.83488829, 31.18375196 ], [ 114.83491827, 31.18352819 ], [ 114.83462672, 31.18311221 ], [ 114.8346587, 31.18296825 ], [ 114.83480126, 31.18297785 ], [ 114.83524765, 31.18320017 ], [ 114.83549655, 31.18315984 ], [ 114.83552398, 31.18298848 ], [ 114.83537616, 31.18235036 ], [ 114.83540954, 31.18205269 ], [ 114.83556625, 31.18186817 ], [ 114.83601304, 31.18182815 ], [ 114.83611611, 31.18169035 ], [ 114.83614167, 31.18116169 ], [ 114.83587246, 31.18034379 ], [ 114.83590225, 31.18019415 ], [ 114.83600321, 31.18012027 ], [ 114.8363801, 31.18012769 ], [ 114.83710807, 31.18040535 ], [ 114.83731796, 31.18054992 ], [ 114.83765666, 31.18102165 ], [ 114.83813002, 31.18117215 ], [ 114.83836204, 31.18137236 ], [ 114.83830367, 31.18163934 ], [ 114.83785643, 31.18208842 ], [ 114.83723388, 31.18291646 ], [ 114.83729223, 31.1830851 ], [ 114.83765737, 31.18341354 ], [ 114.83773848, 31.18358391 ], [ 114.83763992, 31.18454647 ], [ 114.83739361, 31.1852908 ], [ 114.83742592, 31.18542529 ], [ 114.83756996, 31.18551982 ], [ 114.83781894, 31.18549031 ], [ 114.83802461, 31.18535223 ], [ 114.83894439, 31.18431794 ], [ 114.83937, 31.18369168 ], [ 114.83965574, 31.18345484 ], [ 114.83972822, 31.18329172 ], [ 114.83967744, 31.18283088 ], [ 114.83975041, 31.18251648 ], [ 114.84022938, 31.18184827 ], [ 114.84052215, 31.18165093 ], [ 114.84084194, 31.181699 ], [ 114.84144183, 31.18205948 ], [ 114.84157014, 31.18236369 ], [ 114.84162373, 31.18300001 ], [ 114.8418581, 31.18331787 ], [ 114.84227427, 31.18347944 ], [ 114.84277588, 31.18328002 ], [ 114.84293801, 31.18327648 ], [ 114.84345023, 31.18386267 ], [ 114.84371373, 31.18400995 ], [ 114.84386773, 31.18398167 ], [ 114.84398042, 31.18382219 ], [ 114.84414759, 31.18289887 ], [ 114.84427736, 31.18271966 ], [ 114.84507273, 31.18284786 ], [ 114.84637981, 31.18281382 ], [ 114.84718222, 31.18289894 ], [ 114.8473079, 31.18308565 ], [ 114.84713782, 31.18328026 ], [ 114.84606938, 31.18368114 ], [ 114.84539586, 31.18356023 ], [ 114.84496794, 31.18393991 ], [ 114.84428661, 31.1841417 ], [ 114.84402491, 31.18430839 ], [ 114.84337565, 31.18601616 ], [ 114.84335957, 31.18625669 ], [ 114.84348924, 31.18695587 ], [ 114.84331245, 31.18748679 ], [ 114.84331596, 31.18765024 ], [ 114.84353801, 31.18785818 ], [ 114.84392632, 31.18784091 ], [ 114.84445367, 31.18734181 ], [ 114.84520976, 31.18689165 ], [ 114.84581279, 31.18636015 ], [ 114.84602569, 31.18629208 ], [ 114.84629959, 31.18637991 ], [ 114.84704092, 31.18687294 ], [ 114.84794759, 31.18712015 ], [ 114.848308, 31.18740015 ], [ 114.84890027, 31.18803537 ], [ 114.8491397, 31.18807738 ], [ 114.84953426, 31.1879965 ], [ 114.84969564, 31.18803522 ], [ 114.84971359, 31.18819172 ], [ 114.84915165, 31.18899984 ], [ 114.8487582, 31.19009147 ], [ 114.84816967, 31.19107661 ], [ 114.84806156, 31.19189487 ], [ 114.84773807, 31.19287923 ], [ 114.84772972, 31.19321526 ], [ 114.84790592, 31.19340025 ], [ 114.84823011, 31.19344735 ], [ 114.84890599, 31.19338366 ], [ 114.84958828, 31.19319218 ], [ 114.84963247, 31.19333004 ], [ 114.84955428, 31.19360877 ], [ 114.84914011, 31.19416387 ], [ 114.84918967, 31.19435595 ], [ 114.84929654, 31.19444106 ], [ 114.84950798, 31.19447186 ], [ 114.85017821, 31.19438442 ], [ 114.8507636, 31.19416248 ], [ 114.85100727, 31.19419371 ], [ 114.85116986, 31.19444596 ], [ 114.85116976, 31.19476576 ], [ 114.85105428, 31.19487065 ], [ 114.85050639, 31.19499834 ], [ 114.85041427, 31.19511555 ], [ 114.85041792, 31.19529947 ], [ 114.8506931, 31.19568186 ], [ 114.85089272, 31.19610616 ], [ 114.85102732, 31.19623331 ], [ 114.85129968, 31.19625949 ], [ 114.85176048, 31.19604398 ], [ 114.85184555, 31.19607012 ], [ 114.85176372, 31.19625556 ], [ 114.85156803, 31.19642521 ], [ 114.85080511, 31.19661007 ], [ 114.85060642, 31.19653355 ], [ 114.85050236, 31.19641886 ], [ 114.85011359, 31.19567069 ], [ 114.84974248, 31.1955497 ], [ 114.84934763, 31.19564192 ], [ 114.84920825, 31.19584093 ], [ 114.84927287, 31.19652009 ], [ 114.84902823, 31.19731844 ], [ 114.84825677, 31.19817203 ], [ 114.84819631, 31.1969062 ], [ 114.84795387, 31.1960931 ], [ 114.84779828, 31.19601539 ], [ 114.84764635, 31.19612044 ], [ 114.84737774, 31.19711044 ], [ 114.84722141, 31.19730821 ], [ 114.84701811, 31.19736754 ], [ 114.84675825, 31.19719593 ], [ 114.84657244, 31.19690821 ], [ 114.84649334, 31.19660207 ], [ 114.84648585, 31.19598782 ], [ 114.84640044, 31.19581478 ], [ 114.84623896, 31.19574165 ], [ 114.84601826, 31.19577016 ], [ 114.84570552, 31.1959205 ], [ 114.84529035, 31.19629777 ], [ 114.8452351, 31.19665487 ], [ 114.84547881, 31.19741771 ], [ 114.84539581, 31.19766004 ], [ 114.84522077, 31.19765491 ], [ 114.84468107, 31.19732955 ], [ 114.84433156, 31.19722689 ], [ 114.84392242, 31.19723372 ], [ 114.84337638, 31.19738249 ], [ 114.84275607, 31.19739219 ], [ 114.8426654, 31.19747238 ], [ 114.84269832, 31.19757819 ], [ 114.84315849, 31.1978198 ], [ 114.84337575, 31.19803402 ], [ 114.84340494, 31.1982138 ], [ 114.84332197, 31.19854028 ], [ 114.84339189, 31.19870441 ], [ 114.84457797, 31.19947109 ], [ 114.84488036, 31.19984212 ], [ 114.84487243, 31.20005606 ], [ 114.84471972, 31.20020593 ], [ 114.84419619, 31.20017425 ], [ 114.84366061, 31.20029477 ], [ 114.84222673, 31.19996571 ], [ 114.84130151, 31.19948697 ], [ 114.84063252, 31.19933378 ], [ 114.84006952, 31.19900307 ], [ 114.83842197, 31.19836381 ], [ 114.83698596, 31.19789302 ], [ 114.83614605, 31.19745924 ], [ 114.83487691, 31.19728526 ], [ 114.83473755, 31.19731991 ], [ 114.83475598, 31.19750375 ], [ 114.83504231, 31.19774559 ], [ 114.83598642, 31.19804963 ], [ 114.83781652, 31.19907496 ], [ 114.83825841, 31.19922476 ], [ 114.83902902, 31.19930791 ], [ 114.83924273, 31.19940013 ], [ 114.83943239, 31.1997784 ], [ 114.83943334, 31.20022533 ], [ 114.83919199, 31.2005538 ], [ 114.83853759, 31.20111598 ], [ 114.83850436, 31.20123921 ], [ 114.83874602, 31.20127967 ], [ 114.83944253, 31.20090807 ], [ 114.83980598, 31.20087532 ], [ 114.84093618, 31.20142937 ], [ 114.84126838, 31.20176378 ], [ 114.84165756, 31.20196208 ], [ 114.84184445, 31.20219213 ], [ 114.84196625, 31.20252008 ], [ 114.841964, 31.20289056 ], [ 114.84178573, 31.2036369 ], [ 114.84185854, 31.2038139 ], [ 114.84201719, 31.20389618 ], [ 114.84246441, 31.20391848 ], [ 114.84274587, 31.20383212 ], [ 114.84347854, 31.20301708 ], [ 114.84378555, 31.20283292 ], [ 114.84413222, 31.20274003 ], [ 114.84422685, 31.20276421 ], [ 114.84429728, 31.20287582 ], [ 114.8442681, 31.20333584 ], [ 114.84433023, 31.20352422 ], [ 114.84478398, 31.20381155 ], [ 114.84510782, 31.20421592 ], [ 114.84540537, 31.20374007 ], [ 114.84594174, 31.20261043 ], [ 114.84612156, 31.20244997 ], [ 114.8464955, 31.20228276 ], [ 114.84672601, 31.2022526 ], [ 114.84684661, 31.20235048 ], [ 114.84678831, 31.20314006 ], [ 114.84687816, 31.20325454 ], [ 114.84709889, 31.20331584 ], [ 114.84734415, 31.2032453 ], [ 114.84833169, 31.2026614 ], [ 114.84856172, 31.20216153 ], [ 114.84872378, 31.20199437 ], [ 114.84925101, 31.20207544 ], [ 114.85037179, 31.20189199 ], [ 114.85054769, 31.20196605 ], [ 114.85065254, 31.20211757 ], [ 114.85065629, 31.20224071 ], [ 114.85054788, 31.20242303 ], [ 114.84952444, 31.20325713 ], [ 114.84912794, 31.20369799 ], [ 114.84857754, 31.20445415 ], [ 114.8481479, 31.20528942 ], [ 114.84771814, 31.20588849 ], [ 114.84657381, 31.20713171 ], [ 114.84601626, 31.20761431 ], [ 114.84595638, 31.20786581 ], [ 114.84617832, 31.20813753 ], [ 114.8461845, 31.20834953 ], [ 114.84594778, 31.20899997 ], [ 114.84569009, 31.20921692 ], [ 114.84544147, 31.20920033 ], [ 114.84520308, 31.20905715 ], [ 114.84511846, 31.20886873 ], [ 114.84511179, 31.20860334 ], [ 114.84529501, 31.20800171 ], [ 114.84580679, 31.20723782 ], [ 114.8458973, 31.20691414 ], [ 114.84561737, 31.20647604 ], [ 114.84548587, 31.20586119 ], [ 114.84499173, 31.20483203 ], [ 114.84478635, 31.20486838 ], [ 114.8444211, 31.2052909 ], [ 114.84446941, 31.20671642 ], [ 114.84400598, 31.20774639 ], [ 114.84381523, 31.20796771 ], [ 114.84368005, 31.20801938 ], [ 114.84352563, 31.20792204 ], [ 114.84341907, 31.207479 ], [ 114.84257017, 31.20708201 ], [ 114.84223205, 31.20676153 ], [ 114.84171168, 31.20584478 ], [ 114.84156044, 31.20511163 ], [ 114.84147323, 31.2049482 ], [ 114.84126601, 31.20490833 ], [ 114.84005445, 31.20517421 ], [ 114.84006259, 31.205336 ], [ 114.84050429, 31.2057179 ], [ 114.84066034, 31.20596225 ], [ 114.84095163, 31.20703056 ], [ 114.84090605, 31.20714798 ], [ 114.84079372, 31.20718966 ], [ 114.84007835, 31.20698394 ], [ 114.83918953, 31.20703609 ], [ 114.83921325, 31.20717435 ], [ 114.83967253, 31.20755782 ], [ 114.8398145, 31.20779596 ], [ 114.83980043, 31.20796411 ], [ 114.83958427, 31.20825294 ], [ 114.83958233, 31.20837823 ], [ 114.83977821, 31.20854965 ], [ 114.84009356, 31.20865042 ], [ 114.84104547, 31.20855045 ], [ 114.84151564, 31.20860685 ], [ 114.84182298, 31.20871359 ], [ 114.84196373, 31.20891758 ], [ 114.84180978, 31.20917032 ], [ 114.84125277, 31.2093482 ], [ 114.84071953, 31.21045281 ], [ 114.84025552, 31.21095646 ], [ 114.83992567, 31.21118001 ], [ 114.83974811, 31.21117011 ], [ 114.83960098, 31.21103725 ], [ 114.83920035, 31.21022909 ], [ 114.83892582, 31.20998848 ], [ 114.83843179, 31.20994034 ], [ 114.83787241, 31.21014969 ], [ 114.83761047, 31.21014425 ], [ 114.83723949, 31.20987153 ], [ 114.83682103, 31.20921026 ], [ 114.83657244, 31.20899188 ], [ 114.83629674, 31.208944 ], [ 114.83581273, 31.20907664 ], [ 114.83562102, 31.20906798 ], [ 114.83545884, 31.20896803 ], [ 114.83517379, 31.20853588 ], [ 114.83502046, 31.20841615 ], [ 114.8342936, 31.20838838 ], [ 114.83324331, 31.20821643 ], [ 114.83234596, 31.20781022 ], [ 114.83214042, 31.20760272 ], [ 114.83204398, 31.2073878 ], [ 114.83202983, 31.20678189 ], [ 114.83191636, 31.20634581 ], [ 114.83175831, 31.20614408 ], [ 114.83128107, 31.2058442 ], [ 114.83105215, 31.20556756 ], [ 114.8304708, 31.20426038 ], [ 114.83038557, 31.20370641 ], [ 114.83013565, 31.20339593 ], [ 114.82993586, 31.20337643 ], [ 114.82937588, 31.20356638 ], [ 114.82910787, 31.20357021 ], [ 114.82876406, 31.20340042 ], [ 114.8282843, 31.20291583 ], [ 114.82817791, 31.20288844 ], [ 114.82822593, 31.20312988 ], [ 114.82844846, 31.2034845 ], [ 114.82930649, 31.20422376 ], [ 114.82938042, 31.20450432 ], [ 114.82936163, 31.20478449 ], [ 114.8290716, 31.20533634 ], [ 114.82876578, 31.20566043 ], [ 114.8277885, 31.20617416 ], [ 114.82739823, 31.20628784 ], [ 114.82709954, 31.20627786 ], [ 114.82689331, 31.20619426 ], [ 114.82633353, 31.20557986 ], [ 114.82602504, 31.20540291 ], [ 114.82562948, 31.20533352 ], [ 114.82524858, 31.20544763 ], [ 114.82513614, 31.20521908 ], [ 114.82497003, 31.20512366 ], [ 114.82362809, 31.20476152 ], [ 114.82300797, 31.20447488 ], [ 114.82287496, 31.20453839 ], [ 114.82297246, 31.20492 ], [ 114.82330431, 31.20525303 ], [ 114.82373167, 31.20545733 ], [ 114.82444066, 31.20554992 ], [ 114.82484966, 31.20568985 ], [ 114.82619779, 31.20672834 ], [ 114.82645084, 31.20685854 ], [ 114.82731999, 31.20701633 ], [ 114.82824965, 31.20680145 ], [ 114.82857802, 31.20678419 ], [ 114.82921039, 31.2070595 ], [ 114.82998169, 31.20725033 ], [ 114.83071823, 31.20820203 ], [ 114.83077202, 31.20839197 ], [ 114.8307144, 31.208706 ], [ 114.83141155, 31.20886265 ], [ 114.83173377, 31.20932023 ], [ 114.8323603, 31.20957181 ], [ 114.83244277, 31.20978775 ], [ 114.83244188, 31.21040029 ], [ 114.83320426, 31.21140325 ], [ 114.83341606, 31.21149666 ], [ 114.8337824, 31.21147478 ], [ 114.83448384, 31.21159564 ], [ 114.83494392, 31.2115124 ], [ 114.83516622, 31.21162705 ], [ 114.83557448, 31.21200669 ], [ 114.83630578, 31.21205034 ], [ 114.83646097, 31.21225017 ], [ 114.83667843, 31.21297577 ], [ 114.8371543, 31.21369074 ], [ 114.83715784, 31.21404957 ], [ 114.83706692, 31.21418774 ], [ 114.83696807, 31.21420069 ], [ 114.8362521, 31.21349967 ], [ 114.83612217, 31.21287436 ], [ 114.83590216, 31.21266537 ], [ 114.83559037, 31.212651 ], [ 114.83525472, 31.21274834 ], [ 114.83504506, 31.21288557 ], [ 114.83474794, 31.21323934 ], [ 114.83461823, 31.21329634 ], [ 114.83443379, 31.21324098 ], [ 114.83391849, 31.21284544 ], [ 114.83365701, 31.21278993 ], [ 114.8335116, 31.21288208 ], [ 114.83342814, 31.21303044 ], [ 114.83307469, 31.21394445 ], [ 114.8329918, 31.21440004 ], [ 114.83284913, 31.21462538 ], [ 114.83259372, 31.21468732 ], [ 114.83191978, 31.21453845 ], [ 114.8317575, 31.21461995 ], [ 114.83156204, 31.2149498 ], [ 114.83140133, 31.21509445 ], [ 114.83064508, 31.21530418 ], [ 114.83031556, 31.21532376 ], [ 114.82996754, 31.21524744 ], [ 114.82960463, 31.21506091 ], [ 114.82935178, 31.21477975 ], [ 114.82918833, 31.21438843 ], [ 114.82907202, 31.21428084 ], [ 114.82844945, 31.21426507 ], [ 114.82810614, 31.21410243 ], [ 114.8267077, 31.21225775 ], [ 114.82632763, 31.21193226 ], [ 114.8261545, 31.21192007 ], [ 114.82602866, 31.21205821 ], [ 114.82590752, 31.21281361 ], [ 114.82582502, 31.2129141 ], [ 114.82541123, 31.21251402 ], [ 114.82477968, 31.21228163 ], [ 114.8232782, 31.21218636 ], [ 114.82221862, 31.21218802 ], [ 114.82204302, 31.21223708 ], [ 114.82199228, 31.21232606 ], [ 114.82204942, 31.21253427 ], [ 114.82223907, 31.21264066 ], [ 114.82475621, 31.21289752 ], [ 114.8249578, 31.21303556 ], [ 114.82502076, 31.21332579 ], [ 114.8251685, 31.2134485 ], [ 114.82549841, 31.21353168 ], [ 114.82588464, 31.21340069 ], [ 114.82645909, 31.21371426 ], [ 114.82661956, 31.21387188 ], [ 114.82677829, 31.21423199 ], [ 114.82690555, 31.21478969 ], [ 114.82718996, 31.21528567 ], [ 114.82713601, 31.21545307 ], [ 114.82681963, 31.21586304 ], [ 114.82677799, 31.21688772 ], [ 114.82692396, 31.21692037 ], [ 114.82711615, 31.21682767 ], [ 114.82754952, 31.21632397 ], [ 114.82798606, 31.21630986 ], [ 114.82828863, 31.216489 ], [ 114.82876386, 31.21711785 ], [ 114.82898005, 31.21771003 ], [ 114.82898157, 31.21802484 ], [ 114.82885911, 31.21830616 ], [ 114.82869173, 31.21846412 ], [ 114.82810606, 31.21873036 ], [ 114.82776209, 31.21897767 ], [ 114.82752158, 31.21932999 ], [ 114.82758354, 31.21948459 ], [ 114.82776583, 31.21947467 ], [ 114.82860228, 31.21919379 ], [ 114.82893034, 31.21922998 ], [ 114.82938604, 31.21942689 ], [ 114.82986963, 31.21937026 ], [ 114.83003068, 31.21920259 ], [ 114.83020618, 31.21842097 ], [ 114.83071954, 31.2177342 ], [ 114.83148226, 31.21744095 ], [ 114.83260407, 31.21742029 ], [ 114.83305297, 31.21701943 ], [ 114.83331825, 31.21689207 ], [ 114.83354379, 31.21692176 ], [ 114.83397647, 31.21728346 ], [ 114.83418566, 31.21734177 ], [ 114.83443228, 31.2172041 ], [ 114.83484667, 31.21676389 ], [ 114.83503725, 31.21669432 ], [ 114.83523934, 31.21670798 ], [ 114.83547572, 31.21685253 ], [ 114.83562359, 31.2172493 ], [ 114.83596767, 31.21769377 ], [ 114.8359918, 31.2179518 ], [ 114.83586052, 31.21810173 ], [ 114.8349198, 31.21814644 ], [ 114.83392785, 31.21854599 ], [ 114.83311375, 31.21862176 ], [ 114.83284526, 31.21875353 ], [ 114.83279177, 31.2189402 ], [ 114.83289037, 31.21904658 ], [ 114.83380841, 31.21936 ], [ 114.83402542, 31.21955557 ], [ 114.83399649, 31.22014394 ], [ 114.83376012, 31.22049133 ], [ 114.83338234, 31.22059184 ], [ 114.83278831, 31.2205024 ], [ 114.83182435, 31.2209601 ], [ 114.83159643, 31.22098427 ], [ 114.83082229, 31.22088729 ], [ 114.8304854, 31.22098634 ], [ 114.83034758, 31.22112963 ], [ 114.83038046, 31.22124191 ], [ 114.83052959, 31.22132649 ], [ 114.83151222, 31.22169998 ], [ 114.8320481, 31.22182876 ], [ 114.83231767, 31.221816 ], [ 114.83285146, 31.22165852 ], [ 114.83387616, 31.22185 ], [ 114.83451846, 31.22153764 ], [ 114.83479976, 31.22148537 ], [ 114.83481526, 31.2215539 ], [ 114.83448492, 31.22209886 ], [ 114.83419399, 31.22319951 ], [ 114.8340319, 31.22354555 ], [ 114.83385278, 31.22353804 ], [ 114.83369996, 31.22335205 ], [ 114.83333196, 31.22247618 ], [ 114.83314002, 31.22234969 ], [ 114.83291609, 31.22239021 ], [ 114.83265258, 31.222695 ], [ 114.83247358, 31.22336225 ], [ 114.83235964, 31.22353385 ], [ 114.83219446, 31.22361249 ], [ 114.83150008, 31.22371577 ], [ 114.83050153, 31.22425353 ], [ 114.83046468, 31.22454587 ], [ 114.83062303, 31.22511015 ], [ 114.83056568, 31.22526012 ], [ 114.83029479, 31.22523594 ], [ 114.82957415, 31.22482559 ], [ 114.82937213, 31.22482883 ], [ 114.82933213, 31.22501404 ], [ 114.8294388, 31.22561153 ], [ 114.82940669, 31.22580082 ], [ 114.82926378, 31.22589111 ], [ 114.8288558, 31.2258844 ], [ 114.82869178, 31.22594792 ], [ 114.82838232, 31.22647914 ], [ 114.82788408, 31.22686978 ], [ 114.82775993, 31.22707867 ], [ 114.82782307, 31.22721755 ], [ 114.82803812, 31.22726867 ], [ 114.82898364, 31.22704059 ], [ 114.82945917, 31.22705873 ], [ 114.82971397, 31.22723869 ], [ 114.82979625, 31.22765625 ], [ 114.82992589, 31.22775164 ], [ 114.83012802, 31.22771169 ], [ 114.83073776, 31.22731044 ], [ 114.83087515, 31.22731631 ], [ 114.83098246, 31.22740855 ], [ 114.83105233, 31.22776018 ], [ 114.83093784, 31.2287625 ], [ 114.83092805, 31.22972238 ], [ 114.8306411, 31.23093623 ], [ 114.83029, 31.23179374 ], [ 114.83031991, 31.23203367 ], [ 114.83047352, 31.23233364 ], [ 114.83083252, 31.23259766 ], [ 114.8318153, 31.23273238 ], [ 114.83230363, 31.23273416 ], [ 114.83259396, 31.23266408 ], [ 114.83270221, 31.23253565 ], [ 114.83297585, 31.23162847 ], [ 114.83384455, 31.23034193 ], [ 114.83447161, 31.22964582 ], [ 114.83465724, 31.22961573 ], [ 114.83477786, 31.22972567 ], [ 114.83484706, 31.22992582 ], [ 114.83485059, 31.23046518 ], [ 114.83497188, 31.23122191 ], [ 114.83488784, 31.23212365 ], [ 114.83468599, 31.23241342 ], [ 114.83414774, 31.23258584 ], [ 114.83354613, 31.23315215 ], [ 114.83340857, 31.23337622 ], [ 114.83331152, 31.2338526 ], [ 114.83332561, 31.23394576 ], [ 114.83344385, 31.23403525 ], [ 114.83399618, 31.23405896 ], [ 114.83420277, 31.23412378 ], [ 114.83435822, 31.23427436 ], [ 114.83438197, 31.23447175 ], [ 114.83387184, 31.23527372 ], [ 114.83355383, 31.23592801 ], [ 114.83337422, 31.23614555 ], [ 114.83317634, 31.2362661 ], [ 114.83266783, 31.23630382 ], [ 114.83223001, 31.23603567 ], [ 114.83202906, 31.23598392 ], [ 114.83161444, 31.23626971 ], [ 114.83066307, 31.23658031 ], [ 114.83045979, 31.23657634 ], [ 114.8297342, 31.23631575 ], [ 114.82952592, 31.23629652 ], [ 114.82894959, 31.2367204 ], [ 114.82882635, 31.23650191 ], [ 114.82881839, 31.23572794 ], [ 114.82871021, 31.23546849 ], [ 114.82834839, 31.23534159 ], [ 114.82773834, 31.23547929 ], [ 114.82762132, 31.23544063 ], [ 114.82765886, 31.23527044 ], [ 114.82801849, 31.23487406 ], [ 114.82793648, 31.23464647 ], [ 114.82766017, 31.23460389 ], [ 114.8271416, 31.23468546 ], [ 114.82667052, 31.23460576 ], [ 114.8263503, 31.23462324 ], [ 114.82598632, 31.23475978 ], [ 114.82555386, 31.2351316 ], [ 114.82534961, 31.2351462 ], [ 114.82505337, 31.23494972 ], [ 114.8243884, 31.23401482 ], [ 114.82403005, 31.2336565 ], [ 114.82372201, 31.23355182 ], [ 114.82301493, 31.23363125 ], [ 114.82262691, 31.23341129 ], [ 114.82240065, 31.23312997 ], [ 114.82233183, 31.23282724 ], [ 114.82266614, 31.23195559 ], [ 114.82280648, 31.23180041 ], [ 114.82332354, 31.23179753 ], [ 114.8234653, 31.23173595 ], [ 114.82348139, 31.23165689 ], [ 114.82280074, 31.2309157 ], [ 114.82269953, 31.23028486 ], [ 114.82232236, 31.2293957 ], [ 114.82196161, 31.22770828 ], [ 114.82169823, 31.22711184 ], [ 114.82156968, 31.22642082 ], [ 114.82134815, 31.22605898 ], [ 114.82101841, 31.22577423 ], [ 114.82066929, 31.2257985 ], [ 114.82026226, 31.22604976 ], [ 114.81986025, 31.22618445 ], [ 114.81976841, 31.22629365 ], [ 114.81981484, 31.22654993 ], [ 114.8201923, 31.22694594 ], [ 114.82034377, 31.22733844 ], [ 114.82031027, 31.22803155 ], [ 114.82010962, 31.22843067 ], [ 114.81801266, 31.22888845 ], [ 114.81696757, 31.22928804 ], [ 114.8165416, 31.22936189 ], [ 114.81598783, 31.22930421 ], [ 114.81514215, 31.22901201 ], [ 114.81492624, 31.22901921 ], [ 114.81456173, 31.22915361 ], [ 114.81410777, 31.22909351 ], [ 114.81382849, 31.22884219 ], [ 114.81339799, 31.22809029 ], [ 114.81256643, 31.22770162 ], [ 114.81183501, 31.22685332 ], [ 114.81160584, 31.22667212 ], [ 114.81090024, 31.22654189 ], [ 114.81042229, 31.22625388 ], [ 114.80911039, 31.22625655 ], [ 114.80881175, 31.22616766 ], [ 114.80865874, 31.22601749 ], [ 114.80857837, 31.22578598 ], [ 114.80874604, 31.22527944 ], [ 114.80869336, 31.22502193 ], [ 114.80733163, 31.22403469 ], [ 114.80712555, 31.2237778 ], [ 114.80701468, 31.22341565 ], [ 114.80707543, 31.22312991 ], [ 114.807556, 31.22256162 ], [ 114.80776967, 31.22218247 ], [ 114.80782401, 31.22191976 ], [ 114.80776838, 31.22122356 ], [ 114.80808017, 31.22077386 ], [ 114.80821395, 31.22027946 ], [ 114.8080287, 31.22027793 ], [ 114.80766154, 31.2205057 ], [ 114.80749221, 31.22052199 ], [ 114.80737042, 31.2202299 ], [ 114.80745251, 31.21940113 ], [ 114.80728489, 31.21910978 ], [ 114.8058197, 31.21855794 ], [ 114.80508969, 31.21845541 ], [ 114.80426641, 31.21816571 ], [ 114.80408916, 31.21802903 ], [ 114.80380644, 31.21746948 ], [ 114.80345324, 31.21705416 ], [ 114.80320813, 31.21686444 ], [ 114.80301724, 31.21687133 ], [ 114.80258588, 31.21747498 ], [ 114.80254836, 31.21761221 ], [ 114.80259399, 31.21771804 ], [ 114.80305082, 31.21802973 ], [ 114.80350977, 31.21853807 ], [ 114.80429239, 31.21897248 ], [ 114.80459378, 31.21908263 ], [ 114.80516384, 31.21906155 ], [ 114.80544594, 31.2191123 ], [ 114.80601039, 31.21941446 ], [ 114.80617799, 31.21961087 ], [ 114.8063223, 31.21992625 ], [ 114.80666044, 31.22130982 ], [ 114.8071701, 31.22191407 ], [ 114.80721725, 31.2220518 ], [ 114.80708783, 31.22211791 ], [ 114.80652988, 31.22216372 ], [ 114.80615834, 31.22233423 ], [ 114.805657, 31.22244202 ], [ 114.80486712, 31.22241536 ], [ 114.80435589, 31.22247333 ], [ 114.80383019, 31.22241041 ], [ 114.80299195, 31.22267188 ], [ 114.80225487, 31.22257605 ], [ 114.80137024, 31.22225882 ], [ 114.80074633, 31.22223829 ], [ 114.800138, 31.22248472 ], [ 114.79968244, 31.2228046 ], [ 114.79956968, 31.22297236 ], [ 114.79975221, 31.22300325 ], [ 114.80047126, 31.22266197 ], [ 114.80115428, 31.22258615 ], [ 114.80177247, 31.22273595 ], [ 114.80272045, 31.22319152 ], [ 114.80396953, 31.22311201 ], [ 114.80505726, 31.22336216 ], [ 114.80535765, 31.22349105 ], [ 114.80544316, 31.22374815 ], [ 114.80537168, 31.22396647 ], [ 114.80509491, 31.22439041 ], [ 114.80514806, 31.22461932 ], [ 114.80533586, 31.22480847 ], [ 114.80577446, 31.22501412 ], [ 114.80590824, 31.22557395 ], [ 114.80627195, 31.22637374 ], [ 114.80726219, 31.226822 ], [ 114.80758848, 31.22735438 ], [ 114.80742898, 31.22760371 ], [ 114.80609468, 31.22859215 ], [ 114.80592163, 31.2288246 ], [ 114.80592218, 31.22896567 ], [ 114.80613998, 31.2290283 ], [ 114.80727146, 31.22894586 ], [ 114.8074474, 31.22884306 ], [ 114.80768871, 31.22844452 ], [ 114.80782436, 31.22832753 ], [ 114.8089316, 31.22793423 ], [ 114.8091817, 31.22794798 ], [ 114.80974044, 31.22816986 ], [ 114.81061866, 31.22836567 ], [ 114.81089477, 31.22863377 ], [ 114.810992, 31.22885756 ], [ 114.81096984, 31.22903483 ], [ 114.81082917, 31.2292827 ], [ 114.81051965, 31.22957361 ], [ 114.80947477, 31.2299803 ], [ 114.80922211, 31.23021985 ], [ 114.8091322, 31.23044706 ], [ 114.80929537, 31.23077828 ], [ 114.81002361, 31.2310682 ], [ 114.81036232, 31.23156419 ], [ 114.81090977, 31.23198819 ], [ 114.81073431, 31.23219399 ], [ 114.81031192, 31.23230632 ], [ 114.81013026, 31.23223577 ], [ 114.80971637, 31.23188691 ], [ 114.80946971, 31.23186534 ], [ 114.80869568, 31.23277181 ], [ 114.80857165, 31.23316754 ], [ 114.8085476, 31.23408447 ], [ 114.80819566, 31.23504471 ], [ 114.80817797, 31.23644112 ], [ 114.80841314, 31.2373099 ], [ 114.80840371, 31.23778976 ], [ 114.80817178, 31.23814951 ], [ 114.80717181, 31.23890362 ], [ 114.8067715, 31.23935962 ], [ 114.80630005, 31.24025846 ], [ 114.80607368, 31.24120097 ], [ 114.80566605, 31.24211372 ], [ 114.80478165, 31.24248996 ], [ 114.80405911, 31.24326951 ], [ 114.80359966, 31.24355387 ], [ 114.8031984, 31.24370599 ], [ 114.80285871, 31.2435903 ], [ 114.80261799, 31.24309838 ], [ 114.80237754, 31.24280784 ], [ 114.80211217, 31.24266683 ], [ 114.80192812, 31.24269861 ] ], [ [ 114.87774412, 31.20684205 ], [ 114.87789333, 31.20662371 ], [ 114.87793249, 31.2059817 ], [ 114.87853228, 31.2054807 ], [ 114.87874981, 31.20512991 ], [ 114.8788967, 31.20453639 ], [ 114.87888926, 31.20426881 ], [ 114.8787218, 31.20399163 ], [ 114.8783579, 31.20377356 ], [ 114.87806791, 31.20372352 ], [ 114.87758028, 31.20380833 ], [ 114.87745412, 31.20375049 ], [ 114.87710187, 31.20324218 ], [ 114.87665087, 31.20276591 ], [ 114.87655436, 31.20233964 ], [ 114.87671357, 31.2019302 ], [ 114.87739419, 31.20089139 ], [ 114.87770606, 31.20078399 ], [ 114.87835612, 31.20089524 ], [ 114.8785036, 31.20075849 ], [ 114.87849601, 31.2004289 ], [ 114.87823687, 31.19955569 ], [ 114.87821663, 31.19922057 ], [ 114.87839439, 31.19861457 ], [ 114.87855222, 31.19832399 ], [ 114.8787744, 31.19815156 ], [ 114.87916361, 31.19803831 ], [ 114.87928939, 31.19781378 ], [ 114.87927381, 31.19755598 ], [ 114.87907989, 31.19690977 ], [ 114.87901684, 31.19559848 ], [ 114.87910175, 31.19458828 ], [ 114.87921706, 31.19443496 ], [ 114.88013759, 31.1950199 ], [ 114.88075373, 31.19555435 ], [ 114.88109408, 31.19612168 ], [ 114.88110961, 31.19633573 ], [ 114.88102327, 31.19666113 ], [ 114.88107664, 31.19686172 ], [ 114.88174569, 31.19732825 ], [ 114.88252381, 31.19762349 ], [ 114.88259415, 31.19773626 ], [ 114.88263704, 31.1981482 ], [ 114.88274364, 31.19834036 ], [ 114.8829583, 31.19840977 ], [ 114.88336217, 31.19819048 ], [ 114.88362433, 31.19819831 ], [ 114.88403534, 31.19848852 ], [ 114.88450036, 31.19899404 ], [ 114.88466796, 31.19934783 ], [ 114.88467567, 31.19982475 ], [ 114.88458232, 31.20019826 ], [ 114.88431206, 31.20059962 ], [ 114.88435241, 31.20071225 ], [ 114.88457005, 31.20074001 ], [ 114.88486442, 31.20059421 ], [ 114.88536229, 31.19981054 ], [ 114.88548545, 31.1998068 ], [ 114.88558789, 31.19989009 ], [ 114.88570971, 31.20009316 ], [ 114.88574397, 31.20031021 ], [ 114.88536372, 31.20132034 ], [ 114.8853376, 31.20214176 ], [ 114.88546093, 31.20244397 ], [ 114.88561277, 31.20249138 ], [ 114.8857695, 31.20240774 ], [ 114.88602132, 31.20157409 ], [ 114.88622161, 31.20121225 ], [ 114.88654392, 31.20094233 ], [ 114.88684448, 31.20084611 ], [ 114.88776605, 31.20101561 ], [ 114.88834429, 31.20104923 ], [ 114.88846104, 31.2012433 ], [ 114.88863765, 31.20220895 ], [ 114.88872361, 31.20232182 ], [ 114.88885556, 31.20233439 ], [ 114.88902307, 31.20202563 ], [ 114.88907914, 31.20129358 ], [ 114.88920125, 31.20069847 ], [ 114.88930767, 31.20056819 ], [ 114.88948449, 31.20055779 ], [ 114.88980168, 31.20073792 ], [ 114.89048406, 31.201635 ], [ 114.89133961, 31.20241537 ], [ 114.89222254, 31.20441907 ], [ 114.89242227, 31.20472578 ], [ 114.89270552, 31.2049823 ], [ 114.89297414, 31.20510779 ], [ 114.89334206, 31.20515996 ], [ 114.89396169, 31.20515151 ], [ 114.89431444, 31.2050332 ], [ 114.8945916, 31.20478392 ], [ 114.89498594, 31.20422475 ], [ 114.89511005, 31.2036293 ], [ 114.89517373, 31.20357048 ], [ 114.89533366, 31.20369877 ], [ 114.8959463, 31.20453195 ], [ 114.896136, 31.20511415 ], [ 114.89622021, 31.20513839 ], [ 114.89631175, 31.20506941 ], [ 114.89644077, 31.20474168 ], [ 114.89639395, 31.20442222 ], [ 114.89602968, 31.20404555 ], [ 114.89589802, 31.20378354 ], [ 114.89593049, 31.20348015 ], [ 114.89616845, 31.2031298 ], [ 114.89611392, 31.20301411 ], [ 114.895629, 31.20292624 ], [ 114.89510009, 31.20270608 ], [ 114.89482682, 31.20272388 ], [ 114.89464976, 31.20285275 ], [ 114.8945264, 31.20304205 ], [ 114.89439819, 31.20343377 ], [ 114.8943683, 31.20385027 ], [ 114.89422888, 31.20389833 ], [ 114.89360962, 31.20325833 ], [ 114.89276023, 31.20206794 ], [ 114.89165517, 31.20140835 ], [ 114.89111842, 31.20084373 ], [ 114.89102627, 31.20039629 ], [ 114.89108966, 31.20016986 ], [ 114.89122624, 31.20000013 ], [ 114.89151588, 31.19989753 ], [ 114.89255423, 31.19989263 ], [ 114.8930064, 31.19980016 ], [ 114.89316621, 31.19968993 ], [ 114.89322337, 31.19954408 ], [ 114.89322193, 31.19936003 ], [ 114.89313573, 31.19925365 ], [ 114.89245869, 31.19933388 ], [ 114.89155982, 31.19919228 ], [ 114.89122199, 31.19921244 ], [ 114.89091981, 31.19936218 ], [ 114.89043845, 31.19988141 ], [ 114.89020656, 31.19997374 ], [ 114.88855606, 31.19952421 ], [ 114.88831193, 31.19939954 ], [ 114.88796621, 31.19909151 ], [ 114.88739232, 31.19897232 ], [ 114.88683962, 31.19872629 ], [ 114.88646665, 31.19846932 ], [ 114.88605936, 31.19795228 ], [ 114.88602257, 31.19773959 ], [ 114.8861443, 31.19761893 ], [ 114.88673642, 31.19764289 ], [ 114.88762105, 31.19795618 ], [ 114.8867997, 31.19731433 ], [ 114.88592623, 31.19699176 ], [ 114.88545946, 31.19649045 ], [ 114.88495393, 31.19635044 ], [ 114.88434833, 31.19577589 ], [ 114.88416633, 31.19567265 ], [ 114.88390955, 31.19572586 ], [ 114.88367416, 31.19590564 ], [ 114.88269381, 31.19736045 ], [ 114.8825536, 31.19737625 ], [ 114.88255399, 31.19720778 ], [ 114.88316441, 31.19640141 ], [ 114.88336769, 31.19587385 ], [ 114.88328777, 31.19569805 ], [ 114.88280281, 31.19529137 ], [ 114.88224453, 31.19467393 ], [ 114.882138, 31.19435579 ], [ 114.88222807, 31.19411207 ], [ 114.88257151, 31.19388692 ], [ 114.88329799, 31.1937881 ], [ 114.8843844, 31.19399021 ], [ 114.88460305, 31.19397553 ], [ 114.88517211, 31.19368857 ], [ 114.88530557, 31.19346044 ], [ 114.88531631, 31.19324097 ], [ 114.88516194, 31.19311017 ], [ 114.88448701, 31.19303139 ], [ 114.8838918, 31.19266391 ], [ 114.88337403, 31.19264838 ], [ 114.88309374, 31.19255628 ], [ 114.88288173, 31.19229979 ], [ 114.88275243, 31.1916966 ], [ 114.88263565, 31.1915221 ], [ 114.88243237, 31.19141135 ], [ 114.88182736, 31.19128975 ], [ 114.88151243, 31.19115191 ], [ 114.88078827, 31.19029518 ], [ 114.88015981, 31.18985469 ], [ 114.87942829, 31.18947246 ], [ 114.87925902, 31.18922514 ], [ 114.87930199, 31.18882935 ], [ 114.87925504, 31.18868118 ], [ 114.87853553, 31.18837802 ], [ 114.87830041, 31.18811804 ], [ 114.87819971, 31.18790226 ], [ 114.87812563, 31.18734847 ], [ 114.87818155, 31.18693013 ], [ 114.87781725, 31.18621069 ], [ 114.87772038, 31.18553228 ], [ 114.87774044, 31.1850896 ], [ 114.87781481, 31.18499231 ], [ 114.87795958, 31.18497762 ], [ 114.878738, 31.18537767 ], [ 114.87889286, 31.18539044 ], [ 114.87909278, 31.18530153 ], [ 114.87919185, 31.18519214 ], [ 114.87923654, 31.18499598 ], [ 114.87892392, 31.18423618 ], [ 114.87892183, 31.18400135 ], [ 114.87909851, 31.18392239 ], [ 114.87959994, 31.18410409 ], [ 114.87982748, 31.1841 ], [ 114.87991965, 31.18396963 ], [ 114.87999373, 31.18344991 ], [ 114.88016788, 31.18332207 ], [ 114.88056568, 31.1833656 ], [ 114.88089695, 31.18358848 ], [ 114.88102226, 31.18385203 ], [ 114.88109985, 31.1845657 ], [ 114.88127165, 31.18478757 ], [ 114.88171163, 31.18491967 ], [ 114.88218391, 31.18516194 ], [ 114.88268894, 31.18509344 ], [ 114.88427667, 31.1852656 ], [ 114.88534389, 31.18572353 ], [ 114.88557045, 31.18570568 ], [ 114.8863282, 31.18530807 ], [ 114.88769844, 31.18487012 ], [ 114.88786083, 31.18476034 ], [ 114.88783898, 31.18465454 ], [ 114.88757037, 31.18460073 ], [ 114.88535177, 31.18473757 ], [ 114.88427728, 31.18461802 ], [ 114.883899, 31.18451763 ], [ 114.88299646, 31.1840548 ], [ 114.8823983, 31.18396569 ], [ 114.88215382, 31.18309503 ], [ 114.88174438, 31.18285892 ], [ 114.88163342, 31.18269393 ], [ 114.88153568, 31.18182593 ], [ 114.88164316, 31.18107302 ], [ 114.88158205, 31.18087194 ], [ 114.88140424, 31.18078981 ], [ 114.88105412, 31.18091783 ], [ 114.88038412, 31.18134995 ], [ 114.87965037, 31.18120762 ], [ 114.87889762, 31.18150794 ], [ 114.87824839, 31.18185966 ], [ 114.87752828, 31.18203942 ], [ 114.87705348, 31.18205365 ], [ 114.87693827, 31.18216595 ], [ 114.87680807, 31.18250229 ], [ 114.87669972, 31.18257593 ], [ 114.87654835, 31.18256834 ], [ 114.87616626, 31.18228657 ], [ 114.87590614, 31.18222171 ], [ 114.87556362, 31.1823124 ], [ 114.87530972, 31.18273823 ], [ 114.87481301, 31.1825075 ], [ 114.87461638, 31.18251363 ], [ 114.87404387, 31.18299371 ], [ 114.87353612, 31.18318421 ], [ 114.87311406, 31.18345059 ], [ 114.87293405, 31.18347753 ], [ 114.87253416, 31.18333398 ], [ 114.87236619, 31.18338422 ], [ 114.87195561, 31.18383443 ], [ 114.8714561, 31.18407451 ], [ 114.87096041, 31.18455185 ], [ 114.87064349, 31.18473562 ], [ 114.87019757, 31.18477153 ], [ 114.86995972, 31.1846767 ], [ 114.86982268, 31.18452209 ], [ 114.86983521, 31.18438594 ], [ 114.87002935, 31.18423364 ], [ 114.87062611, 31.18417612 ], [ 114.87082145, 31.18408542 ], [ 114.87089055, 31.18394969 ], [ 114.8707944, 31.1835958 ], [ 114.87085183, 31.18347724 ], [ 114.87142365, 31.18341344 ], [ 114.87172992, 31.18318232 ], [ 114.87178412, 31.18300089 ], [ 114.87176351, 31.18271971 ], [ 114.87148666, 31.18178979 ], [ 114.87155979, 31.18148734 ], [ 114.87222081, 31.18128388 ], [ 114.87229754, 31.18104283 ], [ 114.87245016, 31.18085718 ], [ 114.87298203, 31.18041622 ], [ 114.87343668, 31.18019959 ], [ 114.87344871, 31.179948 ], [ 114.87354002, 31.17984594 ], [ 114.87436566, 31.17985991 ], [ 114.87473364, 31.17976196 ], [ 114.87471818, 31.17964082 ], [ 114.8741241, 31.17923165 ], [ 114.87404541, 31.17896015 ], [ 114.87420984, 31.17875811 ], [ 114.87491775, 31.17830211 ], [ 114.87531616, 31.17761172 ], [ 114.87590161, 31.17727087 ], [ 114.87561974, 31.17684222 ], [ 114.87558376, 31.17623409 ], [ 114.87588638, 31.1757237 ], [ 114.87605709, 31.17559386 ], [ 114.87642822, 31.17547965 ], [ 114.87686222, 31.17496182 ], [ 114.87682575, 31.1747518 ], [ 114.87649002, 31.17440401 ], [ 114.87640294, 31.17410427 ], [ 114.8764828, 31.17354791 ], [ 114.87669176, 31.17316216 ], [ 114.87694987, 31.17295621 ], [ 114.8772485, 31.17283314 ], [ 114.87762355, 31.17278786 ], [ 114.87797021, 31.17282796 ], [ 114.87826294, 31.17298382 ], [ 114.87843387, 31.17322142 ], [ 114.87846222, 31.17339647 ], [ 114.87835432, 31.17384099 ], [ 114.87844274, 31.17422005 ], [ 114.87858382, 31.1742329 ], [ 114.87916978, 31.17400902 ], [ 114.87962785, 31.17406157 ], [ 114.87976173, 31.17401711 ], [ 114.88021452, 31.17353605 ], [ 114.88114611, 31.17306751 ], [ 114.88133815, 31.17289191 ], [ 114.88148247, 31.1722876 ], [ 114.88152782, 31.17085903 ], [ 114.88186837, 31.17018563 ], [ 114.88181049, 31.16993375 ] ], [ [ 114.87757436, 31.20723062 ], [ 114.87757202, 31.20700834 ], [ 114.87774412, 31.20684205 ] ], [ [ 114.80165547, 31.24248088 ], [ 114.80192812, 31.24269861 ] ], [ [ 114.80192812, 31.24269861 ], [ 114.80188649, 31.24279213 ], [ 114.80194777, 31.2429276 ], [ 114.80225918, 31.24293956 ], [ 114.80239998, 31.24337221 ], [ 114.8029858, 31.24396022 ], [ 114.80312646, 31.24399377 ], [ 114.80376037, 31.24377394 ], [ 114.80480154, 31.2430005 ], [ 114.8061283, 31.24243463 ], [ 114.80659606, 31.24214802 ], [ 114.80698606, 31.24181735 ], [ 114.80762161, 31.24109908 ], [ 114.80757601, 31.24048531 ], [ 114.80783738, 31.23962501 ], [ 114.80824297, 31.23933793 ], [ 114.80915953, 31.239116 ], [ 114.80934391, 31.23898587 ], [ 114.80944602, 31.23881578 ], [ 114.80975224, 31.23802998 ], [ 114.80969001, 31.23746334 ], [ 114.80971358, 31.23679978 ], [ 114.80985478, 31.23617964 ], [ 114.8099721, 31.23494644 ], [ 114.81020415, 31.23460015 ], [ 114.81097433, 31.23426789 ], [ 114.81079442, 31.23400969 ], [ 114.81084741, 31.23387348 ], [ 114.81124638, 31.23380079 ], [ 114.81159763, 31.23411171 ], [ 114.81183695, 31.23413009 ], [ 114.81202332, 31.23394958 ], [ 114.81223169, 31.23327395 ], [ 114.81272765, 31.23296552 ], [ 114.8131781, 31.23248253 ], [ 114.81412209, 31.23191834 ], [ 114.81425672, 31.23193404 ], [ 114.81451846, 31.23211608 ], [ 114.81467377, 31.23212213 ], [ 114.81521472, 31.23163025 ], [ 114.81532003, 31.23166854 ], [ 114.81539575, 31.2318045 ], [ 114.81546945, 31.23236769 ], [ 114.81542161, 31.23267366 ], [ 114.81507255, 31.23368024 ], [ 114.81508488, 31.23386107 ], [ 114.81521888, 31.23395998 ], [ 114.81601077, 31.23381341 ], [ 114.81645968, 31.23403154 ], [ 114.81664991, 31.23398177 ], [ 114.8167435, 31.23381393 ], [ 114.8167836, 31.2335443 ], [ 114.8166344, 31.23245321 ], [ 114.81667989, 31.23231215 ], [ 114.81681989, 31.23217421 ], [ 114.81732792, 31.23210368 ], [ 114.81802251, 31.23226227 ], [ 114.81823839, 31.23236616 ], [ 114.81841031, 31.23253392 ], [ 114.81858849, 31.23285807 ], [ 114.81862259, 31.23332556 ], [ 114.81843916, 31.23359823 ], [ 114.81761557, 31.23412015 ], [ 114.81750631, 31.23432449 ], [ 114.8175039, 31.23450036 ], [ 114.81765057, 31.23460224 ], [ 114.81841131, 31.23474368 ], [ 114.8187244, 31.23462444 ], [ 114.81918011, 31.23424893 ], [ 114.81929498, 31.23424591 ], [ 114.8192987, 31.23439824 ], [ 114.81906268, 31.23491031 ], [ 114.81953171, 31.23540979 ], [ 114.82004218, 31.23567946 ], [ 114.82085669, 31.23569783 ], [ 114.82116623, 31.23593802 ], [ 114.82133596, 31.23640216 ], [ 114.82142248, 31.23759956 ], [ 114.82148954, 31.23776765 ], [ 114.82165202, 31.23777828 ], [ 114.8218142, 31.23765246 ], [ 114.82213797, 31.23702221 ], [ 114.82231391, 31.23681828 ], [ 114.82258793, 31.23665165 ], [ 114.82281635, 31.23661265 ], [ 114.82307735, 31.23674026 ], [ 114.82356638, 31.23719443 ], [ 114.82413774, 31.23804521 ], [ 114.82445489, 31.23810163 ], [ 114.82500403, 31.23780743 ], [ 114.82520402, 31.23778989 ], [ 114.82574211, 31.23806563 ], [ 114.82595586, 31.23837837 ], [ 114.82584003, 31.23872363 ], [ 114.82518784, 31.23961428 ], [ 114.82483605, 31.23980637 ], [ 114.82412801, 31.23995042 ], [ 114.82391234, 31.24012366 ], [ 114.82384727, 31.24048675 ], [ 114.82396411, 31.24104452 ], [ 114.82420258, 31.24156969 ], [ 114.82420861, 31.24175613 ], [ 114.82398239, 31.24193963 ], [ 114.82333423, 31.24205113 ], [ 114.82297227, 31.24249366 ], [ 114.82300742, 31.24257757 ], [ 114.82310375, 31.24260048 ], [ 114.82390188, 31.24249245 ], [ 114.82411612, 31.24254776 ], [ 114.82423214, 31.24265794 ], [ 114.82425965, 31.24286416 ], [ 114.82409216, 31.24346922 ], [ 114.82415597, 31.24416423 ], [ 114.8237859, 31.24461452 ], [ 114.82384028, 31.24469773 ], [ 114.82400442, 31.24474625 ], [ 114.82485523, 31.24453954 ], [ 114.82521024, 31.24461676 ], [ 114.82530968, 31.24472583 ], [ 114.82536792, 31.24497431 ], [ 114.82526359, 31.24567547 ], [ 114.82505987, 31.24605943 ], [ 114.82465894, 31.24653828 ], [ 114.82398985, 31.24688116 ], [ 114.82271177, 31.24780174 ], [ 114.82266096, 31.2479496 ], [ 114.8226975, 31.24856632 ], [ 114.8229342, 31.24921918 ], [ 114.82281117, 31.24997966 ], [ 114.82261156, 31.25032792 ], [ 114.82235632, 31.25055772 ], [ 114.82205851, 31.25069542 ], [ 114.8215039, 31.25080033 ], [ 114.82183107, 31.25140107 ], [ 114.82181444, 31.2517183 ], [ 114.82166032, 31.25197155 ], [ 114.82130161, 31.25223913 ], [ 114.82047474, 31.25263121 ], [ 114.82020914, 31.25288662 ], [ 114.8201144, 31.25312399 ], [ 114.81990592, 31.25457642 ], [ 114.81995814, 31.25472371 ], [ 114.82017215, 31.25476048 ], [ 114.82039402, 31.2546408 ], [ 114.82055841, 31.25439953 ], [ 114.82079199, 31.25344264 ], [ 114.8209504, 31.25309549 ], [ 114.82165609, 31.2525716 ], [ 114.82218611, 31.25203346 ], [ 114.82282242, 31.25069726 ], [ 114.82339351, 31.25020885 ], [ 114.82384627, 31.24959227 ], [ 114.8240025, 31.24923104 ], [ 114.82419389, 31.24822318 ], [ 114.82446313, 31.24772782 ], [ 114.82526104, 31.24714974 ], [ 114.82629975, 31.24679408 ], [ 114.82736591, 31.24571625 ], [ 114.82745574, 31.24549817 ], [ 114.8274754, 31.24517173 ], [ 114.82738164, 31.24362943 ], [ 114.82717835, 31.24279362 ], [ 114.82722143, 31.24254015 ], [ 114.8273801, 31.24244263 ], [ 114.82785093, 31.24240313 ], [ 114.82845498, 31.24225569 ], [ 114.8285456, 31.24208215 ], [ 114.82846724, 31.24133629 ], [ 114.82867542, 31.24093001 ], [ 114.8294638, 31.24045035 ], [ 114.83058202, 31.2400077 ], [ 114.83098412, 31.23973352 ], [ 114.83106685, 31.2394932 ], [ 114.8309255, 31.23894449 ], [ 114.83091811, 31.23862127 ], [ 114.83102586, 31.23822811 ], [ 114.83121, 31.23792355 ], [ 114.83225449, 31.23744506 ], [ 114.83256982, 31.23743079 ], [ 114.83311831, 31.23752197 ], [ 114.83366627, 31.23786609 ], [ 114.83377419, 31.23809372 ], [ 114.8337619, 31.23854992 ], [ 114.83359789, 31.2391043 ], [ 114.83372767, 31.23950162 ], [ 114.83375153, 31.24095437 ], [ 114.83386194, 31.24166864 ], [ 114.83378639, 31.24197207 ], [ 114.83321284, 31.2429521 ], [ 114.83283764, 31.24334556 ], [ 114.83281833, 31.24350177 ], [ 114.83315616, 31.24395635 ], [ 114.83344148, 31.24520344 ], [ 114.83366124, 31.24541816 ], [ 114.83397822, 31.24539635 ], [ 114.83425375, 31.24519162 ], [ 114.83439047, 31.24492793 ], [ 114.83454627, 31.24421156 ], [ 114.83464281, 31.2440569 ], [ 114.83473225, 31.24403888 ], [ 114.83479955, 31.24446294 ], [ 114.83496817, 31.24488487 ], [ 114.83575203, 31.24600607 ], [ 114.83599638, 31.24649088 ], [ 114.83607047, 31.24679048 ], [ 114.83603238, 31.24714358 ], [ 114.83580604, 31.24795408 ], [ 114.83554561, 31.24811619 ], [ 114.83522211, 31.24818766 ], [ 114.83516205, 31.24827692 ], [ 114.835224, 31.24840147 ], [ 114.8357259, 31.24882054 ], [ 114.83587608, 31.2488426 ], [ 114.83611815, 31.24871999 ], [ 114.8361924, 31.24876015 ], [ 114.83601117, 31.24970649 ], [ 114.83601526, 31.25079998 ], [ 114.83638575, 31.25203231 ], [ 114.83643461, 31.25333234 ], [ 114.83618806, 31.25415757 ], [ 114.83640001, 31.25497971 ], [ 114.83633361, 31.2549922 ], [ 114.83590996, 31.25462627 ], [ 114.83552784, 31.25444466 ], [ 114.8351524, 31.25444431 ], [ 114.83509936, 31.25462805 ], [ 114.83560668, 31.25512554 ], [ 114.83598792, 31.25573635 ], [ 114.83612178, 31.25611178 ], [ 114.83605793, 31.25650236 ], [ 114.83620161, 31.25653965 ], [ 114.83671649, 31.25647887 ], [ 114.83736174, 31.25697597 ], [ 114.83781507, 31.2574959 ], [ 114.83846467, 31.25866489 ], [ 114.83908152, 31.25914592 ], [ 114.83908736, 31.25941075 ], [ 114.83896793, 31.25970425 ], [ 114.83884723, 31.25979768 ], [ 114.83784952, 31.25954171 ], [ 114.83763558, 31.25963138 ], [ 114.83764661, 31.25980262 ], [ 114.83797434, 31.26024146 ], [ 114.83802764, 31.26078566 ], [ 114.83812391, 31.26093431 ], [ 114.83834794, 31.26101201 ], [ 114.83873783, 31.26095771 ], [ 114.84000441, 31.26043441 ], [ 114.84026688, 31.2604137 ], [ 114.8405757, 31.26061522 ], [ 114.84154645, 31.2619623 ], [ 114.84168463, 31.26202896 ], [ 114.84179624, 31.26194628 ], [ 114.8418069, 31.26173601 ], [ 114.84170153, 31.26144089 ], [ 114.84128465, 31.2607259 ], [ 114.84061767, 31.2597755 ], [ 114.84044853, 31.25922382 ], [ 114.83998245, 31.25879417 ], [ 114.83941437, 31.25809146 ], [ 114.8393562, 31.25781438 ], [ 114.83942572, 31.25760818 ], [ 114.83953211, 31.25754211 ], [ 114.8407162, 31.25842772 ], [ 114.8421997, 31.25985688 ], [ 114.84272047, 31.26050018 ], [ 114.8432098, 31.26066892 ], [ 114.84349587, 31.26084827 ], [ 114.84381657, 31.26112601 ], [ 114.84399754, 31.26142988 ], [ 114.84401705, 31.26180026 ], [ 114.8438917, 31.26219249 ], [ 114.84320583, 31.26326046 ], [ 114.84271427, 31.2641621 ], [ 114.84163495, 31.26522913 ], [ 114.84079406, 31.26562292 ], [ 114.84052243, 31.26565475 ], [ 114.84005829, 31.26547482 ], [ 114.83969936, 31.26547202 ], [ 114.83895978, 31.26568084 ], [ 114.8384757, 31.2660945 ], [ 114.8381724, 31.26621975 ], [ 114.83771784, 31.26629959 ], [ 114.83684729, 31.26627147 ], [ 114.83656827, 31.26641287 ], [ 114.83611446, 31.26677846 ], [ 114.83500934, 31.26738959 ], [ 114.83458249, 31.26751775 ], [ 114.83411834, 31.2674942 ], [ 114.83313597, 31.26715188 ], [ 114.83264156, 31.26693203 ], [ 114.83182805, 31.26636223 ], [ 114.83147911, 31.26625699 ], [ 114.83132416, 31.26629347 ], [ 114.83143006, 31.26656182 ], [ 114.83209443, 31.26715421 ], [ 114.83337635, 31.26774171 ], [ 114.83382619, 31.26817193 ], [ 114.83408224, 31.2682509 ], [ 114.83447204, 31.26818405 ], [ 114.8355383, 31.26782799 ], [ 114.83623343, 31.26748485 ], [ 114.8372318, 31.26714962 ], [ 114.83817838, 31.2667156 ], [ 114.83889219, 31.2665164 ], [ 114.83911201, 31.26654605 ], [ 114.8392423, 31.26677798 ], [ 114.83935638, 31.26729263 ], [ 114.83972992, 31.26834841 ], [ 114.83987335, 31.26916954 ], [ 114.84017577, 31.27030761 ], [ 114.84016835, 31.27150169 ], [ 114.84024597, 31.27202316 ], [ 114.84037789, 31.27235155 ], [ 114.84083876, 31.27298231 ], [ 114.84095014, 31.2732655 ], [ 114.84085299, 31.27352158 ], [ 114.84062923, 31.2736493 ], [ 114.8402441, 31.27364617 ], [ 114.83950363, 31.27344195 ], [ 114.83937035, 31.2735378 ], [ 114.83937805, 31.27372367 ], [ 114.83957038, 31.27383172 ], [ 114.84014204, 31.27391154 ], [ 114.84097993, 31.27425772 ], [ 114.84119962, 31.27424088 ], [ 114.84155419, 31.27405255 ], [ 114.84176967, 31.27406455 ], [ 114.84295403, 31.27465877 ], [ 114.84320316, 31.2748757 ], [ 114.84338578, 31.2751619 ], [ 114.84390407, 31.27638027 ], [ 114.84395621, 31.27692159 ], [ 114.84374185, 31.27742685 ], [ 114.84306843, 31.27827129 ], [ 114.84262382, 31.27873596 ], [ 114.84217592, 31.27903176 ], [ 114.84133787, 31.27937237 ], [ 114.8383784, 31.27998603 ], [ 114.83794624, 31.27994813 ], [ 114.83710351, 31.27938183 ], [ 114.83629805, 31.27912357 ], [ 114.83572836, 31.27886778 ], [ 114.83382082, 31.27867434 ], [ 114.83285936, 31.27886427 ], [ 114.83156783, 31.27858825 ], [ 114.83113226, 31.27827653 ], [ 114.83065437, 31.27742116 ], [ 114.83035604, 31.27728304 ], [ 114.83005672, 31.27734246 ], [ 114.8297979, 31.27753815 ], [ 114.82914015, 31.27836965 ], [ 114.82838202, 31.27919235 ], [ 114.82808632, 31.27933368 ], [ 114.82726461, 31.27952447 ], [ 114.82713757, 31.27960656 ], [ 114.82714984, 31.27978841 ], [ 114.82740791, 31.27998796 ], [ 114.8276786, 31.28001773 ], [ 114.82800997, 31.27991394 ], [ 114.829037, 31.27921846 ], [ 114.82960854, 31.2783423 ], [ 114.83015797, 31.27809623 ], [ 114.83027635, 31.27815558 ], [ 114.83063839, 31.27867384 ], [ 114.83121608, 31.27897755 ], [ 114.83193983, 31.27915352 ], [ 114.83286837, 31.27920655 ], [ 114.83398152, 31.27910814 ], [ 114.83450363, 31.27934049 ], [ 114.83461473, 31.27962617 ], [ 114.83453401, 31.2803096 ], [ 114.83459819, 31.28053233 ], [ 114.83483667, 31.28060594 ], [ 114.8352819, 31.28047722 ], [ 114.83538023, 31.28056008 ], [ 114.83532975, 31.28069955 ], [ 114.83454979, 31.28189576 ], [ 114.83410152, 31.28232965 ], [ 114.83382121, 31.28239828 ], [ 114.83291989, 31.28228752 ], [ 114.832678, 31.2823522 ], [ 114.83248156, 31.28248432 ], [ 114.83232781, 31.28268873 ], [ 114.83221917, 31.28302528 ], [ 114.83221964, 31.28333421 ], [ 114.83233627, 31.28388614 ], [ 114.83230628, 31.2840844 ], [ 114.83179773, 31.28461195 ], [ 114.83121485, 31.28500995 ], [ 114.83112249, 31.28518034 ], [ 114.83125716, 31.28532001 ], [ 114.8316638, 31.28524682 ], [ 114.8324645, 31.28465395 ], [ 114.83270376, 31.28457351 ], [ 114.8333036, 31.28475782 ], [ 114.83370219, 31.28499787 ], [ 114.83423657, 31.28564845 ], [ 114.83450446, 31.28611169 ], [ 114.83451156, 31.28634994 ], [ 114.83422899, 31.28684628 ], [ 114.83418188, 31.28713964 ], [ 114.83426755, 31.28737978 ], [ 114.83462838, 31.28787267 ], [ 114.83465831, 31.28801762 ], [ 114.83453385, 31.28816816 ], [ 114.83413168, 31.28832151 ], [ 114.83401967, 31.28842209 ], [ 114.83406275, 31.28853559 ], [ 114.83436381, 31.28869379 ], [ 114.83429568, 31.28888715 ], [ 114.83408781, 31.28910213 ], [ 114.8337701, 31.28926005 ], [ 114.83279365, 31.28953617 ], [ 114.83227012, 31.28992212 ], [ 114.832126, 31.29023483 ], [ 114.83208132, 31.29105533 ], [ 114.8318339, 31.29134768 ], [ 114.83144614, 31.2914003 ], [ 114.83112836, 31.29126147 ], [ 114.83072577, 31.29076432 ], [ 114.83047157, 31.2902062 ], [ 114.83032627, 31.29012392 ], [ 114.83017443, 31.29014351 ], [ 114.82870235, 31.29083108 ], [ 114.82845404, 31.29110617 ], [ 114.82820941, 31.29170426 ], [ 114.8276991, 31.29237245 ], [ 114.82766644, 31.29263773 ], [ 114.8278403, 31.29316752 ], [ 114.82766158, 31.29347909 ], [ 114.82745786, 31.29358599 ], [ 114.82631817, 31.29378784 ], [ 114.82516803, 31.29443744 ], [ 114.82374566, 31.29537625 ], [ 114.82359216, 31.29562914 ], [ 114.82347438, 31.29605073 ], [ 114.82321988, 31.29633032 ], [ 114.82244429, 31.29668911 ], [ 114.82212631, 31.29694809 ], [ 114.82205436, 31.29707625 ], [ 114.82207481, 31.2972352 ], [ 114.82267266, 31.2977104 ], [ 114.82282102, 31.2979298 ], [ 114.82269629, 31.29831195 ], [ 114.82216824, 31.29899764 ], [ 114.82208032, 31.29937807 ], [ 114.82226, 31.29997239 ], [ 114.8228927, 31.30123719 ], [ 114.82306832, 31.30330234 ] ], [ [ 114.86823319, 31.27424574 ], [ 114.86835015, 31.27406997 ], [ 114.86835393, 31.27375957 ], [ 114.86825982, 31.27339412 ], [ 114.86797784, 31.27278796 ], [ 114.86782656, 31.27156447 ], [ 114.86792038, 31.27023552 ], [ 114.86782325, 31.26981786 ], [ 114.86762228, 31.26950971 ], [ 114.86713394, 31.2692183 ], [ 114.8666474, 31.269047 ], [ 114.86421455, 31.2687602 ], [ 114.8634769, 31.26861589 ], [ 114.86301476, 31.26842202 ], [ 114.86194379, 31.26781956 ], [ 114.86016382, 31.26722479 ], [ 114.85974248, 31.26690154 ], [ 114.85921305, 31.26627161 ], [ 114.85885945, 31.26572634 ], [ 114.85850623, 31.26497964 ], [ 114.85826782, 31.26465125 ], [ 114.857956, 31.26435804 ], [ 114.85712372, 31.26387721 ], [ 114.85670573, 31.26341166 ], [ 114.8564453, 31.26292557 ], [ 114.85641275, 31.26201014 ], [ 114.85622972, 31.26172404 ], [ 114.85599581, 31.26161708 ], [ 114.85521576, 31.26151222 ], [ 114.8524189, 31.26064881 ], [ 114.85135151, 31.26010762 ], [ 114.85111576, 31.2598919 ], [ 114.85091564, 31.25954951 ], [ 114.85077042, 31.25905562 ], [ 114.85070845, 31.25848228 ], [ 114.85080957, 31.25820762 ], [ 114.85105132, 31.25804487 ], [ 114.85123367, 31.2580631 ], [ 114.85144775, 31.25818959 ], [ 114.85234599, 31.25904921 ], [ 114.85279578, 31.25921259 ], [ 114.85293571, 31.25916752 ], [ 114.85301401, 31.25902052 ], [ 114.85298793, 31.25885031 ], [ 114.85283719, 31.25860324 ], [ 114.85202598, 31.25784785 ], [ 114.85204228, 31.25773401 ], [ 114.85228133, 31.25750646 ], [ 114.85248349, 31.25709079 ], [ 114.85252352, 31.25690764 ], [ 114.8524824, 31.2567983 ], [ 114.85223042, 31.2567023 ], [ 114.85148014, 31.25699449 ], [ 114.85094, 31.25704683 ], [ 114.85070249, 31.25683095 ], [ 114.85037846, 31.25603065 ], [ 114.85045331, 31.25571801 ], [ 114.85088381, 31.25516808 ], [ 114.85134772, 31.25492168 ], [ 114.85149886, 31.25474003 ], [ 114.85161503, 31.25403963 ], [ 114.85178616, 31.25346842 ], [ 114.85192987, 31.25324024 ], [ 114.85226485, 31.25296973 ], [ 114.85234385, 31.25283509 ], [ 114.85229793, 31.25241209 ], [ 114.85234981, 31.25224412 ], [ 114.85262182, 31.25201186 ], [ 114.85306921, 31.25189393 ], [ 114.85355179, 31.25188883 ], [ 114.85416802, 31.25202481 ], [ 114.85442848, 31.25201715 ], [ 114.85568189, 31.25154404 ], [ 114.85586151, 31.2512744 ], [ 114.85575554, 31.2505196 ], [ 114.85583632, 31.25028676 ], [ 114.8562342, 31.24998195 ], [ 114.85717788, 31.24957761 ], [ 114.85746191, 31.24938986 ], [ 114.85790249, 31.24873364 ], [ 114.85794157, 31.24855814 ], [ 114.85788048, 31.24843877 ], [ 114.85762939, 31.24847181 ], [ 114.85710842, 31.24892556 ], [ 114.85612797, 31.24947743 ], [ 114.85568146, 31.24979816 ], [ 114.85540863, 31.25007436 ], [ 114.85512415, 31.25069826 ], [ 114.85493243, 31.25086456 ], [ 114.85463103, 31.25089895 ], [ 114.85436364, 31.25083494 ], [ 114.85417781, 31.25071186 ], [ 114.85386902, 31.25034041 ], [ 114.85367316, 31.25029597 ], [ 114.85343968, 31.25041678 ], [ 114.85311176, 31.25076798 ], [ 114.85239839, 31.25107511 ], [ 114.85228916, 31.2510627 ], [ 114.85209319, 31.25081271 ], [ 114.85189467, 31.25077818 ], [ 114.85112557, 31.25115588 ], [ 114.85097151, 31.25137032 ], [ 114.85089705, 31.25169004 ], [ 114.85085978, 31.25220027 ], [ 114.85094835, 31.252685 ], [ 114.85054597, 31.25299159 ], [ 114.8504323, 31.25320935 ], [ 114.85064147, 31.25384127 ], [ 114.85064361, 31.25401773 ], [ 114.8505719, 31.25415166 ], [ 114.85036189, 31.25409175 ], [ 114.84960014, 31.25356207 ], [ 114.84923253, 31.25342854 ], [ 114.84824729, 31.25331992 ], [ 114.84671382, 31.25339246 ], [ 114.84649145, 31.25321682 ], [ 114.84578811, 31.25215647 ], [ 114.84565644, 31.25210164 ], [ 114.84558626, 31.25220876 ], [ 114.84558849, 31.25242517 ], [ 114.84583487, 31.25324989 ], [ 114.84585613, 31.25352195 ], [ 114.84576973, 31.25374214 ], [ 114.84540327, 31.25423058 ], [ 114.84527333, 31.25466469 ], [ 114.84538391, 31.25555971 ], [ 114.84566246, 31.25613817 ], [ 114.84571579, 31.25654012 ], [ 114.8455196, 31.25707099 ], [ 114.8451356, 31.25742493 ], [ 114.84502601, 31.25743279 ], [ 114.84498032, 31.25733165 ], [ 114.84522485, 31.25673812 ], [ 114.84526633, 31.25644401 ], [ 114.84520354, 31.25619354 ], [ 114.84504188, 31.25603672 ], [ 114.84472596, 31.2559584 ], [ 114.84379788, 31.25601542 ], [ 114.84326363, 31.25593432 ], [ 114.84271164, 31.2557055 ], [ 114.84237595, 31.2553039 ], [ 114.84219183, 31.25518211 ], [ 114.84180154, 31.25508065 ], [ 114.84119754, 31.25512178 ], [ 114.84074813, 31.25475361 ], [ 114.84054619, 31.25437786 ], [ 114.84057199, 31.25419751 ], [ 114.84077391, 31.25379834 ], [ 114.84059557, 31.25313381 ], [ 114.84059618, 31.25238595 ], [ 114.84051821, 31.25221354 ], [ 114.84029094, 31.2522446 ], [ 114.83990968, 31.25271769 ], [ 114.83874559, 31.25370629 ], [ 114.83854832, 31.25373578 ], [ 114.83838798, 31.25358422 ], [ 114.83813583, 31.25306566 ], [ 114.83804342, 31.2525644 ], [ 114.83796551, 31.24847927 ], [ 114.83784942, 31.24753002 ], [ 114.83787641, 31.24687959 ], [ 114.83798785, 31.24650354 ], [ 114.83844315, 31.24614966 ], [ 114.83876366, 31.24613224 ], [ 114.84001532, 31.24725161 ], [ 114.84011181, 31.24742774 ], [ 114.84010192, 31.24760044 ], [ 114.83968781, 31.24837811 ], [ 114.83972435, 31.24852962 ], [ 114.83989602, 31.24866187 ], [ 114.84018178, 31.24862754 ], [ 114.84045693, 31.2482167 ], [ 114.84064212, 31.24807354 ], [ 114.84085674, 31.2480228 ], [ 114.84128724, 31.24809168 ], [ 114.84149966, 31.24806568 ], [ 114.84168692, 31.24795009 ], [ 114.84177419, 31.24773842 ], [ 114.84170238, 31.24743893 ], [ 114.84134386, 31.24688665 ], [ 114.84063291, 31.24627355 ], [ 114.83974449, 31.24534216 ], [ 114.83941767, 31.24462342 ], [ 114.83928789, 31.24415833 ], [ 114.83925255, 31.24368424 ], [ 114.83950386, 31.24277802 ], [ 114.83960825, 31.2412854 ], [ 114.8397017, 31.24119162 ], [ 114.83990757, 31.24120426 ], [ 114.84119982, 31.2417684 ], [ 114.84315359, 31.24352583 ], [ 114.84350354, 31.24370193 ], [ 114.84364168, 31.24369502 ], [ 114.84368066, 31.24363705 ], [ 114.8425195, 31.24217584 ], [ 114.84231804, 31.24181278 ], [ 114.84236599, 31.24156589 ], [ 114.84284593, 31.24117634 ], [ 114.84285439, 31.24096649 ], [ 114.84266768, 31.24091241 ], [ 114.84192805, 31.24111443 ], [ 114.84158038, 31.24111163 ], [ 114.84127859, 31.2409822 ], [ 114.8403523, 31.24033627 ], [ 114.8401117, 31.24008752 ], [ 114.84001782, 31.23987676 ], [ 114.84007846, 31.23929044 ], [ 114.8400331, 31.23913194 ], [ 114.83987534, 31.23901705 ], [ 114.83944086, 31.23904466 ], [ 114.8393083, 31.23894409 ], [ 114.83922775, 31.23866441 ], [ 114.83919018, 31.23806555 ], [ 114.83911183, 31.23789004 ], [ 114.83759577, 31.23667914 ], [ 114.8372693, 31.23629122 ], [ 114.83722962, 31.23605206 ], [ 114.83735001, 31.23595185 ], [ 114.83816812, 31.23613414 ], [ 114.83848629, 31.23611597 ], [ 114.83866274, 31.23603736 ], [ 114.83877151, 31.23586169 ], [ 114.83887199, 31.23526656 ], [ 114.83939796, 31.23487252 ], [ 114.83970611, 31.23413951 ], [ 114.83968327, 31.23397845 ], [ 114.8395498, 31.2338557 ], [ 114.83895419, 31.23369293 ], [ 114.83865739, 31.23372981 ], [ 114.83818001, 31.23399396 ], [ 114.8378942, 31.23397573 ], [ 114.83757178, 31.23365516 ], [ 114.83749271, 31.23341967 ], [ 114.83749083, 31.23315175 ], [ 114.83758357, 31.23281972 ], [ 114.83787849, 31.2322751 ], [ 114.83834603, 31.23177842 ], [ 114.83864588, 31.23160608 ], [ 114.83998782, 31.23115575 ], [ 114.84000019, 31.23019403 ], [ 114.84022934, 31.22952821 ], [ 114.84037975, 31.22936811 ], [ 114.84077416, 31.22916357 ], [ 114.8410899, 31.22870581 ], [ 114.84137212, 31.22868365 ], [ 114.8416585, 31.22882104 ], [ 114.84178008, 31.22908662 ], [ 114.84175006, 31.22936168 ], [ 114.84140784, 31.23011235 ], [ 114.84137752, 31.23049479 ], [ 114.84146257, 31.23103529 ], [ 114.8418082, 31.23193045 ], [ 114.84191584, 31.23253759 ], [ 114.84207291, 31.23294192 ], [ 114.84257409, 31.23352385 ], [ 114.84337779, 31.23397443 ], [ 114.8440547, 31.234458 ], [ 114.84489356, 31.23488258 ], [ 114.84506972, 31.23490423 ], [ 114.84518226, 31.23484775 ], [ 114.84524192, 31.23470043 ], [ 114.84514957, 31.23450249 ], [ 114.84388102, 31.23333194 ], [ 114.84354956, 31.23281551 ], [ 114.84326538, 31.2319404 ], [ 114.84323387, 31.23158434 ], [ 114.8433261, 31.2313358 ], [ 114.84373616, 31.23081665 ], [ 114.84378, 31.23054006 ], [ 114.84359566, 31.23039584 ], [ 114.84287232, 31.23032163 ], [ 114.84272384, 31.2302004 ], [ 114.84262724, 31.23001335 ], [ 114.84260337, 31.22961356 ], [ 114.84284978, 31.22870834 ], [ 114.84290214, 31.22803679 ], [ 114.84276625, 31.22760147 ], [ 114.84228344, 31.22685815 ], [ 114.84225012, 31.22615213 ], [ 114.84209457, 31.22602166 ], [ 114.8417902, 31.22596165 ], [ 114.84092038, 31.22597965 ], [ 114.84015792, 31.22607437 ], [ 114.83978368, 31.22599405 ], [ 114.83959829, 31.22584355 ], [ 114.839457, 31.22553816 ], [ 114.83943581, 31.22524493 ], [ 114.83954174, 31.22488533 ], [ 114.83981873, 31.22455804 ], [ 114.84006599, 31.22449241 ], [ 114.84038191, 31.22450417 ], [ 114.8406472, 31.22460422 ], [ 114.84115625, 31.22520505 ], [ 114.84143338, 31.22537416 ], [ 114.84246577, 31.2252639 ], [ 114.8430452, 31.22531992 ], [ 114.84363823, 31.22548627 ], [ 114.84383617, 31.22545916 ], [ 114.84391033, 31.22534385 ], [ 114.8440021, 31.22460522 ], [ 114.84376824, 31.2244476 ], [ 114.84300969, 31.22434575 ], [ 114.84279578, 31.22424951 ], [ 114.84250197, 31.22380254 ], [ 114.84247234, 31.22359411 ], [ 114.84253823, 31.2234484 ], [ 114.84272015, 31.22334956 ], [ 114.8429903, 31.22336965 ], [ 114.8438501, 31.22386598 ], [ 114.84476006, 31.22410385 ], [ 114.84496375, 31.22405129 ], [ 114.84506622, 31.22387074 ], [ 114.84504821, 31.22358843 ], [ 114.84488702, 31.22315754 ], [ 114.84502017, 31.22301412 ], [ 114.84572766, 31.22289055 ], [ 114.84616366, 31.2230292 ], [ 114.84656581, 31.22332628 ], [ 114.84680667, 31.22333826 ], [ 114.84704052, 31.22326935 ], [ 114.84721417, 31.22314189 ], [ 114.84738416, 31.22278585 ], [ 114.84786435, 31.22227738 ], [ 114.84806449, 31.22156006 ], [ 114.84845246, 31.22138151 ], [ 114.84860992, 31.22123906 ], [ 114.84893397, 31.22044913 ], [ 114.84906346, 31.22036213 ], [ 114.84935977, 31.2205302 ], [ 114.84951184, 31.22089782 ], [ 114.84952568, 31.22124118 ], [ 114.8493896, 31.2218059 ], [ 114.849434, 31.22192802 ], [ 114.84993204, 31.22193644 ], [ 114.85021268, 31.22202462 ], [ 114.85049436, 31.22222205 ], [ 114.85121007, 31.22291994 ], [ 114.85149472, 31.22309259 ], [ 114.85169971, 31.22310411 ], [ 114.85176566, 31.22296582 ], [ 114.85173351, 31.2227515 ], [ 114.85130814, 31.22177814 ], [ 114.85124311, 31.22146857 ], [ 114.85138791, 31.22067067 ], [ 114.85173026, 31.21994975 ], [ 114.8515905, 31.21935429 ], [ 114.8516386, 31.21884334 ], [ 114.85153969, 31.21843418 ], [ 114.85165862, 31.21829643 ], [ 114.85219042, 31.21823218 ], [ 114.85253795, 31.2181138 ], [ 114.85273995, 31.21793796 ], [ 114.85270212, 31.21780942 ], [ 114.85230779, 31.21739003 ], [ 114.85196199, 31.21690015 ], [ 114.85186303, 31.21665138 ], [ 114.85186638, 31.21644042 ], [ 114.8519436, 31.21633151 ], [ 114.85208503, 31.21633048 ], [ 114.85249302, 31.21675595 ], [ 114.85271188, 31.21681812 ], [ 114.85288927, 31.21670799 ], [ 114.85313225, 31.21625618 ], [ 114.85327524, 31.21611187 ], [ 114.85338203, 31.21624515 ], [ 114.85344105, 31.2170165 ], [ 114.85362062, 31.21740887 ], [ 114.85423996, 31.21774766 ], [ 114.85465692, 31.21813008 ], [ 114.85515179, 31.21840327 ], [ 114.85527867, 31.21856151 ], [ 114.85528919, 31.21884325 ], [ 114.85502359, 31.21930802 ], [ 114.85497751, 31.21954444 ], [ 114.85516751, 31.22064592 ], [ 114.85515196, 31.22178961 ], [ 114.85533, 31.22215816 ], [ 114.85551249, 31.22224457 ], [ 114.85568471, 31.22214047 ], [ 114.85570445, 31.22139026 ], [ 114.85585279, 31.22081332 ], [ 114.85621927, 31.22020695 ], [ 114.85636567, 31.22009345 ], [ 114.85656635, 31.22005248 ], [ 114.85671178, 31.22011775 ], [ 114.85702882, 31.22045005 ], [ 114.85758966, 31.22064661 ], [ 114.85786878, 31.22086123 ], [ 114.85799155, 31.22117581 ], [ 114.85809571, 31.2219343 ], [ 114.85825002, 31.22217375 ], [ 114.85874602, 31.22211824 ], [ 114.85896421, 31.22216357 ], [ 114.85910995, 31.22229123 ], [ 114.85927985, 31.22265518 ], [ 114.85968091, 31.22271615 ], [ 114.86028584, 31.22297414 ], [ 114.86103519, 31.22305681 ], [ 114.86122188, 31.22301636 ], [ 114.86178836, 31.22270393 ], [ 114.86224371, 31.22279189 ], [ 114.86241302, 31.22294026 ], [ 114.86257373, 31.22322288 ], [ 114.86262854, 31.2234448 ], [ 114.8625965, 31.22374428 ], [ 114.86219164, 31.22488208 ], [ 114.86140521, 31.22579037 ], [ 114.86129379, 31.2260535 ], [ 114.86133007, 31.22617585 ], [ 114.8615703, 31.22625154 ], [ 114.86242632, 31.22621619 ], [ 114.86253965, 31.22610189 ], [ 114.86281424, 31.22549848 ], [ 114.86354432, 31.22463912 ], [ 114.86399214, 31.22442086 ], [ 114.86422748, 31.22446094 ], [ 114.86447573, 31.22459379 ], [ 114.86518615, 31.22514187 ], [ 114.86535644, 31.22537558 ], [ 114.86537176, 31.22558422 ], [ 114.86522356, 31.22639643 ], [ 114.86529081, 31.22665681 ], [ 114.86544177, 31.22687176 ], [ 114.86600014, 31.22743736 ], [ 114.86699155, 31.22811013 ], [ 114.867902, 31.22890226 ], [ 114.86814767, 31.22900741 ], [ 114.86868478, 31.2290492 ], [ 114.8689459, 31.22921318 ], [ 114.8690757, 31.22941299 ], [ 114.86916165, 31.22972821 ], [ 114.86916378, 31.22997019 ], [ 114.86901991, 31.23053563 ], [ 114.86907693, 31.23077018 ], [ 114.8696762, 31.23146323 ], [ 114.86990164, 31.23155013 ], [ 114.87002918, 31.23147216 ], [ 114.87009155, 31.23096778 ], [ 114.86991156, 31.23034417 ], [ 114.86997038, 31.23006194 ], [ 114.87018392, 31.22958818 ], [ 114.87008904, 31.22900829 ], [ 114.86928151, 31.2282465 ], [ 114.86756978, 31.22734415 ], [ 114.86741605, 31.22716438 ], [ 114.86726303, 31.22668313 ], [ 114.86677842, 31.22634796 ], [ 114.86671976, 31.22615375 ], [ 114.86691613, 31.22562905 ], [ 114.86688297, 31.22538991 ], [ 114.86671773, 31.22513633 ], [ 114.86616024, 31.22457973 ], [ 114.8660672, 31.22438817 ], [ 114.86609704, 31.22418563 ], [ 114.86634364, 31.2238553 ], [ 114.86585773, 31.22353616 ], [ 114.86548345, 31.22285392 ], [ 114.86519398, 31.22271419 ], [ 114.86445723, 31.2226564 ], [ 114.86414615, 31.22254006 ], [ 114.86286069, 31.22168301 ], [ 114.86215779, 31.22097779 ], [ 114.86164253, 31.22102335 ], [ 114.86119579, 31.22132432 ], [ 114.86096209, 31.22139008 ], [ 114.86082191, 31.22135969 ], [ 114.86061004, 31.22117404 ], [ 114.86015764, 31.2210041 ], [ 114.85988051, 31.22067116 ], [ 114.85956002, 31.21978964 ], [ 114.85947395, 31.2182831 ], [ 114.85899427, 31.21749247 ], [ 114.85873625, 31.21725933 ], [ 114.85840948, 31.2171096 ], [ 114.85738649, 31.21698987 ], [ 114.85684619, 31.21683978 ], [ 114.85660856, 31.21665243 ], [ 114.85650369, 31.21643492 ], [ 114.85651165, 31.21620798 ], [ 114.85673047, 31.21589267 ], [ 114.85668416, 31.2155221 ], [ 114.85677374, 31.21501088 ], [ 114.85667245, 31.21476636 ], [ 114.8561737, 31.21421878 ], [ 114.85613425, 31.21401404 ], [ 114.85625713, 31.21390621 ], [ 114.85651788, 31.21401044 ], [ 114.85722547, 31.21458757 ], [ 114.85796848, 31.21566706 ], [ 114.85882946, 31.21644993 ], [ 114.85919596, 31.21661653 ], [ 114.86029015, 31.21686067 ], [ 114.86061914, 31.21687028 ], [ 114.86072186, 31.21676439 ], [ 114.86055183, 31.21661561 ], [ 114.85924629, 31.2161425 ], [ 114.85889337, 31.21588108 ], [ 114.85865961, 31.21559568 ], [ 114.85850582, 31.21526136 ], [ 114.8584681, 31.21492774 ], [ 114.85852965, 31.21478221 ], [ 114.85883864, 31.21454776 ], [ 114.85888406, 31.21436563 ], [ 114.85880675, 31.21428337 ], [ 114.85838781, 31.2141597 ], [ 114.85807347, 31.21397955 ], [ 114.85764468, 31.2134283 ], [ 114.85730195, 31.21317987 ], [ 114.85714364, 31.21297789 ], [ 114.85691608, 31.21251235 ], [ 114.85687179, 31.21226197 ], [ 114.85691209, 31.21170224 ], [ 114.85709393, 31.21148713 ], [ 114.85722777, 31.21147507 ], [ 114.85744326, 31.21160727 ], [ 114.85758591, 31.21160954 ], [ 114.85792775, 31.21121548 ], [ 114.85825555, 31.21106894 ], [ 114.85957234, 31.21126522 ], [ 114.85990439, 31.21145885 ], [ 114.86059226, 31.21210044 ], [ 114.86133045, 31.21261414 ], [ 114.86231423, 31.21286412 ], [ 114.86327734, 31.21327213 ], [ 114.8645241, 31.21365946 ], [ 114.86491555, 31.21389335 ], [ 114.8658647, 31.21463947 ], [ 114.86674235, 31.2149383 ], [ 114.86697234, 31.21494824 ], [ 114.86699229, 31.21487785 ], [ 114.8669061, 31.21477405 ], [ 114.86626563, 31.21440502 ], [ 114.86518426, 31.21362752 ], [ 114.8649276, 31.21337018 ], [ 114.8648702, 31.21308825 ], [ 114.86520469, 31.21247435 ], [ 114.86519382, 31.21232441 ], [ 114.86501267, 31.21231629 ], [ 114.86447273, 31.21267157 ], [ 114.8641315, 31.21280657 ], [ 114.8638982, 31.21281145 ], [ 114.86354594, 31.21269454 ], [ 114.8615959, 31.21153622 ], [ 114.8614175, 31.21133987 ], [ 114.86109011, 31.21069451 ], [ 114.86076216, 31.21022666 ], [ 114.85950985, 31.20937806 ], [ 114.85887372, 31.20906122 ], [ 114.8586228, 31.20906335 ], [ 114.85817226, 31.20930173 ], [ 114.85714608, 31.20964189 ], [ 114.85660028, 31.20993179 ], [ 114.85638247, 31.20992978 ], [ 114.85623886, 31.20983533 ], [ 114.85622209, 31.20962509 ], [ 114.85635413, 31.20941366 ], [ 114.85700378, 31.20877374 ], [ 114.85747507, 31.20840933 ], [ 114.85785335, 31.20793958 ], [ 114.85941378, 31.20748077 ], [ 114.85956161, 31.20733014 ], [ 114.85936776, 31.20721154 ], [ 114.85794989, 31.20713991 ], [ 114.85738247, 31.20724274 ], [ 114.8569343, 31.20757999 ], [ 114.85597447, 31.20809393 ], [ 114.85508218, 31.20839005 ], [ 114.85456982, 31.20918639 ], [ 114.85430383, 31.20936369 ], [ 114.85390165, 31.20934195 ], [ 114.85314818, 31.20891198 ], [ 114.85283436, 31.20886287 ], [ 114.85257843, 31.20898633 ], [ 114.85205241, 31.20953018 ], [ 114.85182127, 31.20966413 ], [ 114.85172395, 31.20955233 ], [ 114.85175758, 31.2091418 ], [ 114.85166424, 31.20898351 ], [ 114.85142078, 31.20890552 ], [ 114.85088444, 31.20892615 ], [ 114.85075796, 31.20879403 ], [ 114.85084133, 31.20848667 ], [ 114.85112361, 31.20828737 ], [ 114.85142447, 31.20823323 ], [ 114.85200529, 31.20830823 ], [ 114.85224493, 31.20824065 ], [ 114.85238832, 31.20810995 ], [ 114.85257422, 31.20765064 ], [ 114.85270185, 31.2075397 ], [ 114.85287482, 31.20753771 ], [ 114.85342806, 31.2077541 ], [ 114.85365696, 31.20771354 ], [ 114.85378447, 31.20757204 ], [ 114.85395358, 31.20709082 ], [ 114.85417195, 31.20682584 ], [ 114.85452646, 31.2065661 ], [ 114.85513609, 31.20630567 ], [ 114.85543003, 31.20595162 ], [ 114.85578037, 31.20569273 ], [ 114.85584878, 31.20551369 ], [ 114.8557338, 31.20524115 ], [ 114.85552421, 31.2051017 ], [ 114.85528138, 31.20508619 ], [ 114.8549856, 31.20520157 ], [ 114.85406885, 31.20581474 ], [ 114.8533583, 31.20615951 ], [ 114.85298568, 31.20622991 ], [ 114.85284788, 31.20617213 ], [ 114.85278961, 31.20606939 ], [ 114.85281711, 31.20581119 ], [ 114.85298018, 31.20558592 ], [ 114.85376639, 31.20517154 ], [ 114.85471637, 31.20428458 ], [ 114.85482668, 31.20390234 ], [ 114.85478637, 31.20303057 ], [ 114.85504544, 31.20252384 ], [ 114.8551558, 31.20251357 ], [ 114.85536647, 31.20291442 ], [ 114.85567087, 31.20307228 ], [ 114.85628182, 31.20296625 ], [ 114.85736164, 31.20330806 ], [ 114.85763785, 31.20329132 ], [ 114.8577598, 31.2032018 ], [ 114.85775574, 31.20299024 ], [ 114.85741037, 31.20238798 ], [ 114.85684279, 31.20190848 ], [ 114.85616997, 31.20112771 ], [ 114.85618782, 31.20099181 ], [ 114.85630385, 31.20090435 ], [ 114.85714395, 31.20074017 ], [ 114.85722128, 31.20064698 ], [ 114.85719022, 31.20051424 ], [ 114.85616806, 31.1995881 ], [ 114.85533587, 31.19848247 ], [ 114.85538045, 31.19836625 ], [ 114.85564076, 31.19838419 ], [ 114.85597018, 31.19852641 ], [ 114.85682742, 31.19907218 ], [ 114.85729735, 31.19922485 ], [ 114.85749669, 31.1991981 ], [ 114.85741044, 31.19899754 ], [ 114.8561936, 31.19776784 ], [ 114.85593814, 31.19733441 ], [ 114.85594963, 31.19715399 ], [ 114.85605776, 31.19708184 ], [ 114.85664652, 31.19721603 ], [ 114.85688542, 31.19716845 ], [ 114.85717604, 31.19688384 ], [ 114.85726267, 31.19648095 ], [ 114.8575424, 31.19616755 ], [ 114.85744918, 31.19609236 ], [ 114.85684176, 31.19599756 ], [ 114.85639216, 31.19584483 ], [ 114.85616974, 31.19569562 ], [ 114.85597643, 31.19542699 ], [ 114.85591184, 31.19520285 ], [ 114.8559364, 31.19488625 ], [ 114.85619449, 31.19441685 ], [ 114.85618965, 31.19333985 ], [ 114.85631247, 31.19316361 ], [ 114.85672993, 31.19312224 ], [ 114.85682969, 31.19305906 ], [ 114.8569538, 31.19251391 ], [ 114.85706563, 31.19235788 ], [ 114.85765574, 31.19222836 ], [ 114.85782967, 31.19209231 ], [ 114.85784994, 31.19182525 ], [ 114.85708717, 31.19135046 ], [ 114.8569817, 31.19103795 ], [ 114.85704723, 31.19085444 ], [ 114.85726155, 31.19061053 ], [ 114.85785649, 31.1902863 ], [ 114.85814045, 31.19003125 ], [ 114.85828351, 31.1901519 ], [ 114.85858229, 31.1909423 ], [ 114.85897389, 31.19129369 ], [ 114.85905518, 31.19144549 ], [ 114.85898213, 31.19193607 ], [ 114.85861309, 31.19261795 ], [ 114.85869448, 31.19274788 ], [ 114.85925564, 31.19294154 ], [ 114.85965534, 31.19292566 ], [ 114.8599757, 31.19273755 ], [ 114.86015406, 31.19229294 ], [ 114.86029792, 31.1921383 ], [ 114.86049081, 31.19208891 ], [ 114.86130356, 31.1921084 ], [ 114.86164183, 31.19187936 ], [ 114.86188492, 31.19147453 ], [ 114.86189635, 31.19128162 ], [ 114.86182558, 31.19112357 ], [ 114.86158573, 31.19100404 ], [ 114.86070197, 31.19095048 ], [ 114.86047124, 31.19079202 ], [ 114.86037575, 31.1905997 ], [ 114.86040723, 31.1904394 ], [ 114.86062717, 31.19021536 ], [ 114.86066786, 31.1900924 ], [ 114.86039421, 31.18977185 ], [ 114.86037174, 31.18964429 ], [ 114.86053571, 31.18953152 ], [ 114.86142851, 31.18928322 ], [ 114.8616702, 31.18911388 ], [ 114.86174357, 31.18896422 ], [ 114.86172025, 31.18886892 ], [ 114.86156625, 31.1887462 ], [ 114.86089918, 31.18862789 ], [ 114.86069391, 31.18843958 ], [ 114.86070574, 31.18810642 ], [ 114.86102781, 31.18778195 ], [ 114.86131821, 31.18767191 ], [ 114.8617596, 31.18779176 ], [ 114.86198982, 31.18778618 ], [ 114.86256621, 31.1875662 ], [ 114.86346396, 31.18842165 ], [ 114.86374165, 31.18854617 ], [ 114.86395415, 31.1885061 ], [ 114.86453221, 31.1882295 ], [ 114.86497444, 31.18824152 ], [ 114.86509773, 31.18840506 ], [ 114.86492035, 31.18868568 ], [ 114.86489637, 31.18884341 ], [ 114.8650696, 31.18949222 ], [ 114.86530398, 31.18960557 ], [ 114.86606398, 31.18964341 ], [ 114.86633244, 31.1894874 ], [ 114.86637769, 31.18899614 ], [ 114.86659013, 31.18866626 ], [ 114.86643388, 31.18819963 ], [ 114.86642953, 31.18791025 ], [ 114.86652151, 31.18763431 ], [ 114.86673166, 31.18746285 ], [ 114.86699207, 31.18753606 ], [ 114.86718775, 31.18780618 ], [ 114.86730235, 31.188122 ], [ 114.86733411, 31.18869717 ], [ 114.86742482, 31.18892247 ], [ 114.86766526, 31.18903196 ], [ 114.86813396, 31.18882829 ], [ 114.86846349, 31.18937221 ], [ 114.86856192, 31.18944022 ], [ 114.86870763, 31.18940596 ], [ 114.86895365, 31.18903954 ], [ 114.86916195, 31.1889021 ], [ 114.86937186, 31.18898014 ], [ 114.86972578, 31.18930357 ], [ 114.86990448, 31.1892998 ], [ 114.87004372, 31.18900683 ], [ 114.87016603, 31.18824103 ], [ 114.87030416, 31.18806704 ], [ 114.87060001, 31.18811401 ], [ 114.87106109, 31.18844895 ], [ 114.87121451, 31.18862547 ], [ 114.8712146, 31.18877195 ], [ 114.87087681, 31.18913771 ], [ 114.87077003, 31.18966553 ], [ 114.87067074, 31.1898305 ], [ 114.87039788, 31.19009738 ], [ 114.87016809, 31.19044737 ], [ 114.86960814, 31.19071015 ], [ 114.86922235, 31.19118977 ], [ 114.86865967, 31.19154816 ], [ 114.86851039, 31.19171197 ], [ 114.86852036, 31.1918521 ], [ 114.86859588, 31.19193049 ], [ 114.86914961, 31.19201149 ], [ 114.86927898, 31.19208475 ], [ 114.86934616, 31.19221067 ], [ 114.86937413, 31.19264143 ], [ 114.86931597, 31.19308205 ], [ 114.86889442, 31.19416562 ], [ 114.8689481, 31.19433175 ], [ 114.8690816, 31.194392 ], [ 114.86933382, 31.19423483 ], [ 114.87005519, 31.19336755 ], [ 114.8703181, 31.19284009 ], [ 114.87064615, 31.19238985 ], [ 114.87088341, 31.19163238 ], [ 114.8710683, 31.19139227 ], [ 114.87164386, 31.19084109 ], [ 114.87211959, 31.19053562 ], [ 114.87237372, 31.19047423 ], [ 114.87289269, 31.19063971 ], [ 114.87308487, 31.19054776 ], [ 114.87326312, 31.19034558 ], [ 114.87342143, 31.18994362 ], [ 114.87338242, 31.18963168 ], [ 114.87323096, 31.18957596 ], [ 114.8727177, 31.18969499 ], [ 114.87261049, 31.18963454 ], [ 114.87254814, 31.18950368 ], [ 114.87256842, 31.1887138 ], [ 114.87291638, 31.18831228 ], [ 114.87311009, 31.18828358 ], [ 114.873576, 31.18871763 ], [ 114.87447442, 31.18879552 ], [ 114.87478182, 31.18873164 ], [ 114.87522305, 31.18842367 ], [ 114.87534425, 31.18840048 ], [ 114.87529822, 31.18859751 ], [ 114.87480931, 31.18933555 ], [ 114.87432561, 31.18972391 ], [ 114.87430763, 31.18989225 ], [ 114.8744829, 31.1905582 ], [ 114.87424203, 31.19124265 ], [ 114.87406131, 31.19137026 ], [ 114.87343042, 31.19155595 ], [ 114.87268419, 31.1918777 ], [ 114.87196441, 31.19194598 ], [ 114.87166996, 31.19216784 ], [ 114.87155045, 31.19265205 ], [ 114.87166822, 31.19374217 ], [ 114.8714695, 31.19525356 ], [ 114.87131566, 31.19546788 ], [ 114.87069968, 31.19594161 ], [ 114.87042493, 31.19602912 ], [ 114.8699885, 31.19603906 ], [ 114.86988, 31.19610763 ], [ 114.86972597, 31.19660034 ], [ 114.86938179, 31.19734038 ], [ 114.86913411, 31.19835582 ], [ 114.86884784, 31.19901649 ], [ 114.86892753, 31.19911186 ], [ 114.86908106, 31.19908242 ], [ 114.86953611, 31.19874622 ], [ 114.87026053, 31.19779154 ], [ 114.87059431, 31.19708146 ], [ 114.8708446, 31.19686482 ], [ 114.8715698, 31.19662043 ], [ 114.87204414, 31.19624044 ], [ 114.87231217, 31.19612379 ], [ 114.87272426, 31.19611579 ], [ 114.87336217, 31.19628313 ], [ 114.87350574, 31.19623946 ], [ 114.87351809, 31.1961401 ], [ 114.87340975, 31.19597989 ], [ 114.87273167, 31.19562406 ], [ 114.8725839, 31.19540101 ], [ 114.87256401, 31.19514154 ], [ 114.87264133, 31.19481144 ], [ 114.87297239, 31.19447319 ], [ 114.87344462, 31.1943256 ], [ 114.87463145, 31.19436395 ], [ 114.87512991, 31.1942431 ], [ 114.87525573, 31.19434027 ], [ 114.87534375, 31.19475366 ], [ 114.8754351, 31.1948824 ], [ 114.87597023, 31.19490565 ], [ 114.87619365, 31.19500486 ], [ 114.87637955, 31.19533019 ], [ 114.87631975, 31.19568907 ], [ 114.87634004, 31.19614379 ], [ 114.87597782, 31.19680036 ], [ 114.87538635, 31.19753213 ], [ 114.87532367, 31.19782 ], [ 114.87546468, 31.19787875 ], [ 114.87570212, 31.19778779 ], [ 114.87617403, 31.19746246 ], [ 114.87658801, 31.19706325 ], [ 114.87690406, 31.19691181 ], [ 114.87721594, 31.19700409 ], [ 114.87731565, 31.1971822 ], [ 114.87732845, 31.19740293 ], [ 114.877184, 31.19777846 ], [ 114.87677782, 31.19832016 ], [ 114.87602499, 31.19904032 ], [ 114.87606192, 31.1995884 ], [ 114.876006, 31.20054595 ], [ 114.87584133, 31.20091792 ], [ 114.8755359, 31.20135016 ], [ 114.87548899, 31.20194578 ], [ 114.87538971, 31.20226556 ], [ 114.87487914, 31.20302656 ], [ 114.87482545, 31.2032332 ], [ 114.87489527, 31.20338967 ], [ 114.87502562, 31.20346187 ], [ 114.87560234, 31.20328562 ], [ 114.87585735, 31.20338249 ], [ 114.87633793, 31.20389885 ], [ 114.87670999, 31.20451605 ], [ 114.87701377, 31.20475752 ], [ 114.87728067, 31.20482214 ], [ 114.8777604, 31.20476603 ], [ 114.87789849, 31.20480552 ], [ 114.87793811, 31.20495005 ], [ 114.87784931, 31.20514407 ], [ 114.87703569, 31.20583763 ], [ 114.87689186, 31.20611162 ], [ 114.87702921, 31.20639168 ], [ 114.87774412, 31.20684205 ] ], [ [ 114.86824148, 31.27444802 ], [ 114.86823319, 31.27424574 ] ], [ [ 114.8439057, 31.29853241 ], [ 114.84399574, 31.29834632 ], [ 114.84420318, 31.29821187 ], [ 114.84446978, 31.2981604 ], [ 114.84494446, 31.29819355 ], [ 114.84505675, 31.29808962 ], [ 114.8449083, 31.29793394 ], [ 114.8444431, 31.29771783 ], [ 114.84425868, 31.2974684 ], [ 114.84410391, 31.29693561 ], [ 114.84392642, 31.29575564 ], [ 114.84319351, 31.29380429 ], [ 114.84310842, 31.29297989 ], [ 114.84316406, 31.29190209 ], [ 114.84327593, 31.29146416 ], [ 114.84343112, 31.29134628 ], [ 114.84357354, 31.29136996 ], [ 114.84405878, 31.29180493 ], [ 114.84516406, 31.29244912 ], [ 114.84538027, 31.29246075 ], [ 114.84675951, 31.29219836 ], [ 114.84758183, 31.29246357 ], [ 114.84775365, 31.29231802 ], [ 114.84786671, 31.29162276 ], [ 114.8484593, 31.29096771 ], [ 114.8485322, 31.29081272 ], [ 114.8485116, 31.29066421 ], [ 114.84840099, 31.29061387 ], [ 114.84794787, 31.29068918 ], [ 114.84737, 31.29042256 ], [ 114.84643739, 31.29062414 ], [ 114.84610845, 31.29082646 ], [ 114.84564776, 31.29157354 ], [ 114.84541031, 31.2916609 ], [ 114.84516564, 31.29160617 ], [ 114.84419959, 31.29073977 ], [ 114.84382691, 31.29009509 ], [ 114.84264867, 31.28871824 ], [ 114.84100534, 31.28801782 ], [ 114.83948479, 31.28753983 ], [ 114.83875356, 31.28722537 ], [ 114.83626555, 31.28533826 ], [ 114.83588914, 31.28497988 ], [ 114.83562557, 31.28457568 ], [ 114.83539987, 31.28404589 ], [ 114.83529068, 31.28350198 ], [ 114.83532836, 31.28315999 ], [ 114.83544219, 31.28285281 ], [ 114.83587009, 31.28239812 ], [ 114.83729517, 31.28179192 ], [ 114.83816831, 31.28155212 ], [ 114.83841964, 31.28156397 ], [ 114.83874964, 31.2816941 ], [ 114.83943892, 31.28226181 ], [ 114.83944163, 31.28259568 ], [ 114.83911209, 31.28312606 ], [ 114.83916017, 31.28331588 ], [ 114.83986565, 31.283051 ], [ 114.84004073, 31.28308781 ], [ 114.84034026, 31.28329711 ], [ 114.84058193, 31.28332023 ], [ 114.8416611, 31.28287857 ], [ 114.84215959, 31.28244714 ], [ 114.84253843, 31.28171161 ], [ 114.84279635, 31.2813964 ], [ 114.84377825, 31.28080607 ], [ 114.84451784, 31.28063077 ], [ 114.84496403, 31.2802408 ], [ 114.8453459, 31.27979423 ], [ 114.84563696, 31.27882674 ], [ 114.84569375, 31.27843479 ], [ 114.84565907, 31.27807574 ], [ 114.84539587, 31.2773116 ], [ 114.84541826, 31.2769359 ], [ 114.84553429, 31.27671032 ], [ 114.8458125, 31.27651828 ], [ 114.84610425, 31.27642527 ], [ 114.84749761, 31.27626015 ], [ 114.8476755, 31.2761739 ], [ 114.84778582, 31.27600183 ], [ 114.84779833, 31.27573225 ], [ 114.8476954, 31.27559446 ], [ 114.84722674, 31.27584439 ], [ 114.84688009, 31.27592643 ], [ 114.84637819, 31.27591962 ], [ 114.8459243, 31.2758004 ], [ 114.84532774, 31.27547355 ], [ 114.84422687, 31.27464258 ], [ 114.84388153, 31.27420488 ], [ 114.84331367, 31.27307095 ], [ 114.84236154, 31.27199379 ], [ 114.84178173, 31.27088221 ], [ 114.84138362, 31.2692649 ], [ 114.84131221, 31.26824678 ], [ 114.84148786, 31.26727756 ], [ 114.8416063, 31.26698166 ], [ 114.84180517, 31.2667304 ], [ 114.84225903, 31.26644157 ], [ 114.84336001, 31.26610396 ], [ 114.84412213, 31.2657337 ], [ 114.84419588, 31.26580238 ], [ 114.84412618, 31.26630797 ], [ 114.84426818, 31.26647268 ], [ 114.84445679, 31.26652193 ], [ 114.84462359, 31.26646152 ], [ 114.84494755, 31.26595798 ], [ 114.84521335, 31.2657582 ], [ 114.84555176, 31.26572241 ], [ 114.84592039, 31.26593962 ], [ 114.84613845, 31.2658995 ], [ 114.8463243, 31.26571612 ], [ 114.84657586, 31.26528072 ], [ 114.84692575, 31.26404497 ], [ 114.84720428, 31.26376368 ], [ 114.84739362, 31.26378026 ], [ 114.84779239, 31.26416224 ], [ 114.84813021, 31.26437568 ], [ 114.84828968, 31.26439387 ], [ 114.84834018, 31.26429385 ], [ 114.84812583, 31.26382405 ], [ 114.84805484, 31.26334386 ], [ 114.84798951, 31.26324319 ], [ 114.84718606, 31.26321789 ], [ 114.84654807, 31.26304316 ], [ 114.8462737, 31.26286398 ], [ 114.84607625, 31.26244069 ], [ 114.84615846, 31.26195771 ], [ 114.84611635, 31.26182071 ], [ 114.84535155, 31.26098642 ], [ 114.84488243, 31.26062035 ], [ 114.84461966, 31.26029402 ], [ 114.84404387, 31.26006507 ], [ 114.84352048, 31.25959153 ], [ 114.8433119, 31.25934025 ], [ 114.84292601, 31.25864268 ], [ 114.84225936, 31.25805489 ], [ 114.84188055, 31.25761433 ], [ 114.84170633, 31.25730762 ], [ 114.84171977, 31.25712579 ], [ 114.84229636, 31.25695248 ], [ 114.84275228, 31.25709632 ], [ 114.84284652, 31.25722942 ], [ 114.84312988, 31.25812394 ], [ 114.84337233, 31.25846228 ], [ 114.8436965, 31.2587064 ], [ 114.84432616, 31.25878575 ], [ 114.84492246, 31.25868505 ], [ 114.84590227, 31.25786192 ], [ 114.8464091, 31.25766833 ], [ 114.8467298, 31.25741132 ], [ 114.84724403, 31.25717046 ], [ 114.84747463, 31.25690378 ], [ 114.847416, 31.25642498 ], [ 114.84745835, 31.25589031 ], [ 114.84721949, 31.25517609 ], [ 114.84709419, 31.25503631 ], [ 114.84694024, 31.2549881 ], [ 114.84653175, 31.25519785 ], [ 114.84604736, 31.25507146 ], [ 114.84591608, 31.25496603 ], [ 114.84585631, 31.25480707 ], [ 114.84599416, 31.25445447 ], [ 114.84644046, 31.25414403 ], [ 114.84777561, 31.25378236 ], [ 114.84845169, 31.25377032 ], [ 114.84911228, 31.25392157 ], [ 114.84928081, 31.25411226 ], [ 114.84931841, 31.2543359 ], [ 114.8492459, 31.25551836 ], [ 114.84905938, 31.25615024 ], [ 114.84905368, 31.25647704 ], [ 114.84939437, 31.25727318 ], [ 114.84958409, 31.25810358 ], [ 114.84993249, 31.25911793 ], [ 114.85009036, 31.2598697 ], [ 114.85052037, 31.26045319 ], [ 114.85133845, 31.26120062 ], [ 114.85218982, 31.26257043 ], [ 114.85235609, 31.26259153 ], [ 114.85249216, 31.26245287 ], [ 114.85259231, 31.26221005 ], [ 114.85262866, 31.26186448 ], [ 114.85269857, 31.26182475 ], [ 114.85373765, 31.26212011 ], [ 114.85496955, 31.2620552 ], [ 114.85532836, 31.26218205 ], [ 114.85553184, 31.26242478 ], [ 114.85569616, 31.26275598 ], [ 114.85605349, 31.26442786 ], [ 114.85592991, 31.26473966 ], [ 114.85530413, 31.265196 ], [ 114.85521918, 31.26538956 ], [ 114.85525139, 31.26552361 ], [ 114.85554363, 31.26560035 ], [ 114.85651395, 31.26552638 ], [ 114.85673751, 31.26535379 ], [ 114.85674238, 31.26488485 ], [ 114.85681909, 31.26470166 ], [ 114.85703471, 31.26462772 ], [ 114.85731364, 31.26473994 ], [ 114.85753358, 31.26497824 ], [ 114.85767138, 31.26527891 ], [ 114.85778193, 31.26656796 ], [ 114.85789595, 31.2668917 ], [ 114.85805112, 31.26710787 ], [ 114.85844228, 31.26745555 ], [ 114.85888765, 31.26769092 ], [ 114.85960225, 31.2679323 ], [ 114.86040371, 31.26806906 ], [ 114.8606601, 31.26851607 ], [ 114.86122981, 31.269244 ], [ 114.86152772, 31.2697877 ], [ 114.8618465, 31.27005371 ], [ 114.86212161, 31.27009327 ], [ 114.86219598, 31.27003054 ], [ 114.86220214, 31.26991961 ], [ 114.86171415, 31.26917846 ], [ 114.86165849, 31.26890389 ], [ 114.86190572, 31.26872592 ], [ 114.8624592, 31.26863691 ], [ 114.86292607, 31.26869664 ], [ 114.86377033, 31.26907039 ], [ 114.86480515, 31.26924866 ], [ 114.86549476, 31.26946981 ], [ 114.8665363, 31.26957416 ], [ 114.86709575, 31.26980908 ], [ 114.86731634, 31.27012778 ], [ 114.86739814, 31.2706509 ], [ 114.86742021, 31.27171152 ], [ 114.8672444, 31.27272156 ], [ 114.86731026, 31.27361493 ], [ 114.86744037, 31.27390153 ], [ 114.86763234, 31.27408684 ], [ 114.86793037, 31.27423047 ], [ 114.86823319, 31.27424574 ] ], [ [ 114.84396554, 31.29901483 ], [ 114.8439479, 31.2986035 ], [ 114.8439057, 31.29853241 ] ], [ [ 114.82306832, 31.30330234 ], [ 114.82319989, 31.30324867 ], [ 114.82331151, 31.30290395 ], [ 114.82323729, 31.30132772 ], [ 114.82334371, 31.30057399 ], [ 114.82367163, 31.29995964 ], [ 114.82364931, 31.29933603 ], [ 114.82370787, 31.29905494 ], [ 114.82406417, 31.29825796 ], [ 114.82494815, 31.29740827 ], [ 114.82536381, 31.29641556 ], [ 114.82557577, 31.29607408 ], [ 114.82572609, 31.29598239 ], [ 114.82597358, 31.29600274 ], [ 114.8272766, 31.2967958 ], [ 114.82766869, 31.29688036 ], [ 114.82791833, 31.29682248 ], [ 114.8283575, 31.29629112 ], [ 114.82891019, 31.29593974 ], [ 114.82954386, 31.29531387 ], [ 114.8303185, 31.29494381 ], [ 114.83087833, 31.29433029 ], [ 114.83146987, 31.29405087 ], [ 114.83202425, 31.29398831 ], [ 114.8321702, 31.29390443 ], [ 114.83282874, 31.29284387 ], [ 114.83389639, 31.29178412 ], [ 114.83423519, 31.29097151 ], [ 114.83504767, 31.29051205 ], [ 114.83598237, 31.28979362 ], [ 114.83653757, 31.28928331 ], [ 114.8376116, 31.28807166 ], [ 114.83795761, 31.28787774 ], [ 114.83839607, 31.28795794 ], [ 114.838532, 31.28806759 ], [ 114.83859768, 31.28821876 ], [ 114.83856649, 31.28841746 ], [ 114.83822115, 31.28898957 ], [ 114.83812787, 31.28930813 ], [ 114.83818999, 31.28966684 ], [ 114.83840529, 31.28990575 ], [ 114.83945515, 31.29019017 ], [ 114.83975236, 31.29013818 ], [ 114.8397695, 31.28990571 ], [ 114.83936026, 31.28939021 ], [ 114.83927358, 31.28907126 ], [ 114.83934962, 31.28864241 ], [ 114.83944867, 31.28855043 ], [ 114.83965456, 31.28852418 ], [ 114.84001216, 31.2886488 ], [ 114.8415601, 31.28953968 ], [ 114.84194029, 31.2898155 ], [ 114.84225266, 31.29018755 ], [ 114.84244313, 31.29079161 ], [ 114.84255989, 31.2918282 ], [ 114.84244306, 31.29303706 ], [ 114.84249088, 31.2936755 ], [ 114.84239159, 31.29413422 ], [ 114.84203439, 31.29476812 ], [ 114.84203081, 31.29577001 ], [ 114.84188111, 31.29641628 ], [ 114.84188334, 31.29668579 ], [ 114.84195372, 31.29688652 ], [ 114.84209755, 31.2970051 ], [ 114.84278409, 31.29685243 ], [ 114.84302806, 31.29698385 ], [ 114.84312356, 31.29726145 ], [ 114.84313369, 31.29767326 ], [ 114.84303984, 31.29797563 ], [ 114.84281027, 31.29825416 ], [ 114.84289777, 31.29842706 ], [ 114.84337199, 31.29862043 ], [ 114.84374986, 31.29861131 ], [ 114.8439057, 31.29853241 ] ], [ [ 114.82334647, 31.30364179 ], [ 114.82308987, 31.30343479 ], [ 114.82306832, 31.30330234 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9850400000000", "RVNM": "沙河", "GB": "210101", "FRVCD": "AFA9850300000000,AFA98501A0000000", "TRVCD": "AFA9850500000000", "INDCD": "QFA9850300000000", "ONDCD": "QFA9850400000000", "BWSCD": "WFA9850400000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 1977.0, "RVSLP": 0.0011, "IELV": 59.21, "OELV": 56.09, "VR": "0", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03796237, 30.95130567 ], [ 115.03577588, 30.9533559 ], [ 115.03511353, 30.95435357 ], [ 115.03409539, 30.95515802 ], [ 115.0334604, 30.95596165 ], [ 115.03215379, 30.95719387 ], [ 115.031837, 30.95756952 ], [ 115.03156568, 30.95883714 ], [ 115.03148961, 30.9595445 ], [ 115.03087628, 30.96140808 ], [ 115.03084042, 30.96242541 ], [ 115.03067162, 30.9631363 ], [ 115.03067104, 30.96475787 ], [ 115.03042157, 30.96515027 ], [ 115.02947219, 30.96602279 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900126000000", "RVNM": "观音寺河", "GB": "210101", "FRVCD": "AFA9900125000000,AFA9900121D00000", "TRVCD": "AFA9900127000000", "INDCD": "QFA9900125000000", "ONDCD": "QFA9900126000000", "BWSCD": "WFA9900126000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 7.0, "RVLEN": 2220.0, "RVSLP": 0.0024, "IELV": 129.95, "OELV": 120.01, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37087449, 31.19991581 ], [ 115.37050188, 31.19958154 ], [ 115.36988267, 31.198861 ], [ 115.36937797, 31.19812644 ], [ 115.36899956, 31.19769849 ], [ 115.36819969, 31.19643977 ], [ 115.36770638, 31.1954692 ], [ 115.36702744, 31.19460921 ], [ 115.36605539, 31.1931203 ], [ 115.36562843, 31.19262855 ], [ 115.36466071, 31.19113753 ], [ 115.36443659, 31.19089528 ], [ 115.36356001, 31.19020363 ], [ 115.36260679, 31.18970624 ], [ 115.36198031, 31.18952028 ], [ 115.36094209, 31.18902788 ], [ 115.35984412, 31.18871184 ], [ 115.35878192, 31.18829236 ], [ 115.35740862, 31.18726078 ], [ 115.35640662, 31.18666103 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121NA0000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA9800122N00000", "INDCD": "-1", "ONDCD": "QFA9800121N00000", "BWSCD": "WFA9800121NA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6136.0, "RVSLP": 0.0007, "IELV": 54.83, "OELV": 50.0, "VR": "0", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02186854, 31.20045209 ], [ 115.02235239, 31.20036219 ], [ 115.0231756, 31.20001373 ], [ 115.02519163, 31.19937368 ], [ 115.02600229, 31.19901783 ], [ 115.0264742, 31.19887995 ], [ 115.02698765, 31.19864212 ], [ 115.0278187, 31.19812242 ], [ 115.02896555, 31.19731194 ], [ 115.02992386, 31.19647805 ], [ 115.03047987, 31.19613237 ], [ 115.03175017, 31.19498216 ], [ 115.03223646, 31.19442097 ], [ 115.03250416, 31.19360332 ], [ 115.0324885, 31.19310809 ], [ 115.03224911, 31.19241313 ], [ 115.03218621, 31.19167706 ], [ 115.03209706, 31.18927556 ], [ 115.03227452, 31.18842352 ], [ 115.03225436, 31.18808366 ], [ 115.03184669, 31.18743551 ], [ 115.03168266, 31.18674956 ], [ 115.03154578, 31.18648895 ], [ 115.03103085, 31.18606643 ], [ 115.03006915, 31.18563778 ], [ 115.02990164, 31.18542106 ], [ 115.02987936, 31.18517166 ], [ 115.03002396, 31.18460699 ], [ 115.03006364, 31.18365592 ], [ 115.03023634, 31.18294569 ], [ 115.03020563, 31.18131152 ], [ 115.0304008, 31.18038631 ], [ 115.03035194, 31.17927518 ], [ 115.03022897, 31.17894163 ], [ 115.02959558, 31.17829117 ], [ 115.0293038, 31.17777987 ], [ 115.02916615, 31.17670194 ], [ 115.02894965, 31.17607442 ], [ 115.02882765, 31.17467964 ], [ 115.02809682, 31.1731023 ], [ 115.02813226, 31.17291993 ], [ 115.02831565, 31.17267192 ], [ 115.02882125, 31.17222097 ], [ 115.02935638, 31.17186371 ], [ 115.02972824, 31.171396 ], [ 115.03051439, 31.17062072 ], [ 115.0306767, 31.17031171 ], [ 115.03064552, 31.17012755 ], [ 115.03024767, 31.1693401 ], [ 115.03011212, 31.16810042 ], [ 115.02963514, 31.16694773 ], [ 115.02959633, 31.1666074 ], [ 115.02963815, 31.16615418 ], [ 115.02932626, 31.16560561 ], [ 115.02934204, 31.16521415 ], [ 115.02953557, 31.16482388 ], [ 115.02979771, 31.16450808 ], [ 115.03200254, 31.16245161 ], [ 115.0321721, 31.16219224 ], [ 115.03219176, 31.16193833 ], [ 115.0320721, 31.16168606 ], [ 115.03144837, 31.16103787 ], [ 115.03121774, 31.16064562 ], [ 115.03103264, 31.16004874 ], [ 115.03089033, 31.15985651 ], [ 115.03050559, 31.15953789 ], [ 115.0298462, 31.15919164 ], [ 115.02923926, 31.15872395 ], [ 115.02840492, 31.15762547 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121R00000", "RVNM": null, "GB": "210101", "FRVCD": "-1", "TRVCD": "AFA980012P000000", "INDCD": "-1", "ONDCD": "QFA980012N000000", "BWSCD": "WFA9800121R00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 1.0, "RVLEN": 6636.0, "RVSLP": 0.0017, "IELV": 49.28, "OELV": 40.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96397586, 31.0553095 ], [ 114.96400976, 31.05571163 ], [ 114.96417389, 31.05603066 ], [ 114.96438571, 31.05614002 ], [ 114.96510982, 31.05627164 ], [ 114.9654777, 31.05657416 ], [ 114.96633153, 31.05812159 ], [ 114.96658841, 31.05885648 ], [ 114.96763068, 31.06034165 ], [ 114.96792647, 31.06061894 ], [ 114.96856555, 31.0609756 ], [ 114.96877187, 31.06119392 ], [ 114.96881862, 31.06143405 ], [ 114.96871376, 31.0620583 ], [ 114.96881665, 31.06238649 ], [ 114.96911162, 31.06264954 ], [ 114.9697241, 31.06285263 ], [ 114.96996818, 31.06303195 ], [ 114.97020587, 31.06345287 ], [ 114.97016409, 31.06396556 ], [ 114.97021902, 31.06414576 ], [ 114.97092239, 31.06482777 ], [ 114.9710633, 31.06506917 ], [ 114.97102303, 31.06594011 ], [ 114.97076226, 31.06638176 ], [ 114.97055432, 31.06704579 ], [ 114.97060384, 31.06728955 ], [ 114.97096816, 31.06786192 ], [ 114.97099245, 31.0681344 ], [ 114.97092035, 31.06840186 ], [ 114.97006495, 31.06941539 ], [ 114.96977009, 31.0695196 ], [ 114.96901781, 31.06962189 ], [ 114.96831619, 31.06984539 ], [ 114.96803717, 31.07000704 ], [ 114.96778167, 31.07031032 ], [ 114.9675678, 31.0709836 ], [ 114.96761997, 31.07122707 ], [ 114.96796003, 31.07156427 ], [ 114.96832439, 31.07176807 ], [ 114.96895188, 31.07196208 ], [ 114.96930171, 31.07228737 ], [ 114.9695962, 31.07295359 ], [ 114.96964067, 31.07322334 ], [ 114.96959358, 31.07356025 ], [ 114.96937634, 31.07394594 ], [ 114.96935799, 31.07412002 ], [ 114.96983915, 31.07472995 ], [ 114.97041785, 31.07503052 ], [ 114.97051778, 31.07524193 ], [ 114.97056221, 31.07559012 ], [ 114.97054774, 31.07632367 ], [ 114.97015013, 31.07728638 ], [ 114.96998601, 31.07862172 ], [ 114.97003752, 31.07880432 ], [ 114.97040385, 31.07937611 ], [ 114.97046477, 31.07980272 ], [ 114.97043611, 31.08023051 ], [ 114.97018758, 31.08076375 ], [ 114.96982251, 31.08128972 ], [ 114.96945719, 31.08236392 ], [ 114.96923328, 31.08283104 ], [ 114.96867696, 31.08373762 ], [ 114.96863702, 31.0839198 ], [ 114.96869752, 31.08432197 ], [ 114.96843994, 31.08471834 ], [ 114.96847314, 31.08494362 ], [ 114.96876552, 31.08543014 ], [ 114.96845311, 31.08648759 ], [ 114.96879246, 31.08736048 ], [ 114.96865184, 31.08753559 ], [ 114.96822271, 31.08769565 ], [ 114.96795772, 31.08787829 ], [ 114.9673581, 31.08867902 ], [ 114.96700527, 31.08878397 ], [ 114.96579361, 31.0888301 ], [ 114.96540567, 31.08892032 ], [ 114.9652034, 31.08912245 ], [ 114.96498623, 31.08971234 ], [ 114.96461551, 31.0899625 ], [ 114.96401934, 31.09020984 ], [ 114.96344079, 31.09022791 ], [ 114.96201103, 31.08987647 ], [ 114.96037017, 31.0899215 ], [ 114.95957805, 31.09012246 ], [ 114.9587463, 31.09024238 ], [ 114.95820404, 31.09040972 ], [ 114.95693152, 31.09052578 ], [ 114.95577189, 31.09090371 ], [ 114.95512413, 31.0910398 ], [ 114.95482233, 31.09126163 ], [ 114.954598, 31.09170951 ], [ 114.95458183, 31.09197386 ], [ 114.95470971, 31.09237993 ], [ 114.95470196, 31.09255811 ], [ 114.95443981, 31.09277566 ], [ 114.95405538, 31.09283426 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800121Q00000,AFA9800121QA0000", "TRVCD": "AFA9800123Q00000", "INDCD": "QFA9800121Q00000", "ONDCD": "QFA9800122Q00000", "BWSCD": "WFA9800122Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 7796.0, "RVSLP": 0.0051, "IELV": 139.76, "OELV": 90.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18432756, 30.99198603 ], [ 115.18381669, 30.99197834 ], [ 115.18316839, 30.99183829 ], [ 115.18224356, 30.99176378 ], [ 115.18144846, 30.99156441 ], [ 115.18060183, 30.99126305 ], [ 115.17986038, 30.99115605 ], [ 115.17848028, 30.99064698 ], [ 115.17720448, 30.99033382 ], [ 115.17670588, 30.99002397 ], [ 115.17459232, 30.98834616 ], [ 115.17398809, 30.98809845 ], [ 115.17361545, 30.98812989 ], [ 115.17325831, 30.98843503 ], [ 115.1730094, 30.98901816 ], [ 115.17319362, 30.9896988 ], [ 115.17329904, 30.99104005 ], [ 115.17341331, 30.99163712 ], [ 115.17293204, 30.99251843 ], [ 115.17274439, 30.99327471 ], [ 115.17216823, 30.99425876 ], [ 115.1721284, 30.99615984 ], [ 115.1718575, 30.99669571 ], [ 115.17151402, 30.99706022 ], [ 115.17117759, 30.99730978 ], [ 115.17058409, 30.9975324 ], [ 115.17022541, 30.99741876 ], [ 115.16995789, 30.99713184 ], [ 115.16973577, 30.99645475 ], [ 115.16909809, 30.99556634 ], [ 115.16879033, 30.99490847 ], [ 115.16848785, 30.99416835 ], [ 115.16832954, 30.99340371 ], [ 115.16805467, 30.99280004 ], [ 115.16764748, 30.99222604 ], [ 115.16764164, 30.99186364 ], [ 115.16822114, 30.99129415 ], [ 115.16830192, 30.9907381 ], [ 115.16818598, 30.99002072 ], [ 115.16791173, 30.98972832 ], [ 115.16762006, 30.98960324 ], [ 115.16722396, 30.98964386 ], [ 115.1664272, 30.99012399 ], [ 115.16570379, 30.98988701 ], [ 115.16441846, 30.98983833 ], [ 115.16324404, 30.98948659 ], [ 115.16283024, 30.98952035 ], [ 115.16134181, 30.98990646 ], [ 115.16018222, 30.98958041 ], [ 115.1596703, 30.98957448 ], [ 115.15927259, 30.98968031 ], [ 115.1587776, 30.99011371 ], [ 115.15842119, 30.99084228 ], [ 115.15801466, 30.99123932 ], [ 115.15773573, 30.99135965 ], [ 115.15720262, 30.99129893 ], [ 115.15690034, 30.99135825 ], [ 115.15639641, 30.99160639 ], [ 115.15608703, 30.99196754 ], [ 115.15593829, 30.99290151 ], [ 115.1567743, 30.99428689 ], [ 115.15688229, 30.99468726 ], [ 115.15659406, 30.99556953 ], [ 115.15631352, 30.99584942 ], [ 115.15601637, 30.99597359 ], [ 115.15418991, 30.99606321 ], [ 115.15331374, 30.99628369 ], [ 115.15227503, 30.99633395 ], [ 115.15185084, 30.99630649 ], [ 115.151289, 30.9961742 ], [ 115.15034186, 30.99614369 ], [ 115.1498994, 30.99594611 ], [ 115.14969441, 30.99570557 ], [ 115.14962035, 30.99543863 ], [ 115.14962361, 30.99500935 ], [ 115.14977372, 30.99450968 ], [ 115.14978986, 30.99423386 ], [ 115.14953559, 30.99333016 ], [ 115.14938825, 30.99133184 ], [ 115.14877358, 30.98991954 ], [ 115.14849073, 30.9896283 ], [ 115.14819994, 30.98949921 ], [ 115.14789084, 30.98951357 ], [ 115.147657, 30.98967876 ], [ 115.14756637, 30.98993553 ], [ 115.14750187, 30.9910267 ], [ 115.14651621, 30.99226278 ], [ 115.14615397, 30.99243304 ], [ 115.14539784, 30.99253017 ], [ 115.14428055, 30.99281196 ], [ 115.14221541, 30.99415592 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123F00000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800122F00000", "TRVCD": "AFA980012A000000", "INDCD": "QFA9800122F00000", "ONDCD": "QFA9800129000000", "BWSCD": "WFA9800123F00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 3.0, "RVLEN": 4390.0, "RVSLP": 0.0014, "IELV": 98.12, "OELV": 88.06, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05953589, 31.44680016 ], [ 115.05996557, 31.44741002 ], [ 115.06021798, 31.44794775 ], [ 115.06064503, 31.44835821 ], [ 115.0612207, 31.44872014 ], [ 115.0615523, 31.44876393 ], [ 115.06188482, 31.44871844 ], [ 115.06222927, 31.44850827 ], [ 115.0624166, 31.448249 ], [ 115.06247346, 31.44790402 ], [ 115.06242535, 31.44755573 ], [ 115.06220985, 31.44727756 ], [ 115.06158984, 31.447071 ], [ 115.06132002, 31.44688641 ], [ 115.06115394, 31.44664457 ], [ 115.06114152, 31.4463915 ], [ 115.06123084, 31.44619753 ], [ 115.06145527, 31.44596814 ], [ 115.06237829, 31.44541594 ], [ 115.06287593, 31.44532964 ], [ 115.06435816, 31.44529207 ], [ 115.06596222, 31.44565991 ], [ 115.06697836, 31.44560349 ], [ 115.06762006, 31.4452518 ], [ 115.06816444, 31.44506903 ], [ 115.06941796, 31.44450166 ], [ 115.0699681, 31.44433399 ], [ 115.07095768, 31.44376586 ], [ 115.07191212, 31.4433163 ], [ 115.07367882, 31.44289551 ], [ 115.07483008, 31.44229346 ], [ 115.07548528, 31.44216224 ], [ 115.07656396, 31.44182158 ], [ 115.07739649, 31.44183945 ], [ 115.07912191, 31.44136598 ], [ 115.07994025, 31.44080843 ], [ 115.08044487, 31.44054589 ], [ 115.08203141, 31.43991397 ], [ 115.08319008, 31.43911769 ], [ 115.08370637, 31.43867628 ], [ 115.08545999, 31.4367405 ], [ 115.08549213, 31.4364964 ], [ 115.08521291, 31.43561759 ], [ 115.08430216, 31.4341479 ], [ 115.08423724, 31.43383272 ], [ 115.08442411, 31.43337575 ], [ 115.08497609, 31.43239649 ], [ 115.08594433, 31.43142041 ], [ 115.08638173, 31.43081297 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800123Q00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA9800122Q00000,AFA9800123QB0000", "TRVCD": "AFA9800124Q00000", "INDCD": "QFA9800122Q00000", "ONDCD": "QFA9800123Q00000", "BWSCD": "WFA9800123Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 479.0, "RVSLP": 0.0032, "IELV": 90.0, "OELV": 89.0, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14221541, 30.99415592 ], [ 115.14157597, 30.99470609 ], [ 115.1408843, 30.99496605 ], [ 115.14032439, 30.99545548 ], [ 115.13977842, 30.9962137 ], [ 115.13957958, 30.99662014 ], [ 115.13957022, 30.99694642 ], [ 115.13972397, 30.99716022 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124000000", "RVNM": "举水", "GB": "210101", "FRVCD": "AFA9800123000000", "TRVCD": "AFA9800125000000", "INDCD": "QFA9800123000000", "ONDCD": "QFA9800124000000", "BWSCD": "WFA9800124000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 4.0, "RVLEN": 2256.0, "RVSLP": 0.0065, "IELV": 131.08, "OELV": 118.38, "VR": "0", "LEVEL": 2, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13516412, 31.52322633 ], [ 115.13389167, 31.5219536 ], [ 115.13328418, 31.52123089 ], [ 115.13300912, 31.52078593 ], [ 115.13240892, 31.51938178 ], [ 115.13227148, 31.51868487 ], [ 115.13179607, 31.51737229 ], [ 115.13166506, 31.51651828 ], [ 115.13134958, 31.5155562 ], [ 115.13074416, 31.51415627 ], [ 115.12951024, 31.51217383 ], [ 115.12926431, 31.5114304 ], [ 115.12831588, 31.50988866 ], [ 115.12755199, 31.50832804 ], [ 115.12690224, 31.50744876 ], [ 115.12647723, 31.5066543 ], [ 115.12597613, 31.5061624 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA980012DP00000", "RVNM": null, "GB": "210101", "FRVCD": "AFA980012CP00000,AFA9800123PK0000", "TRVCD": "AFA980012EP00000", "INDCD": "QFA980012CP00000", "ONDCD": "QFA980012DP00000", "BWSCD": "WFA980012DP00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "6", "RVCS": 15.0, "RVLEN": 3578.0, "RVSLP": 0.0016, "IELV": 60.0, "OELV": 56.83, "VR": "0", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": null, "RESRVID": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08684748, 31.16240937 ], [ 115.08669322, 31.16220064 ], [ 115.08632048, 31.1612018 ], [ 115.08602465, 31.16030785 ], [ 115.08588901, 31.1596103 ], [ 115.08526832, 31.15776156 ], [ 115.08482236, 31.15674182 ], [ 115.08437762, 31.15531047 ], [ 115.0819776, 31.15150177 ], [ 115.08130415, 31.1502158 ], [ 115.08002171, 31.14817753 ], [ 115.07929192, 31.14645949 ], [ 115.07887276, 31.14573405 ], [ 115.07799964, 31.14373615 ], [ 115.07769376, 31.14300043 ], [ 115.07754551, 31.14246275 ], [ 115.07637609, 31.1401739 ], [ 115.07553244, 31.1388491 ], [ 115.07492189, 31.13813383 ], [ 115.07417414, 31.13745066 ], [ 115.07375623, 31.13676176 ], [ 115.07291577, 31.13585821 ], [ 115.07234994, 31.13538758 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124Q00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800122QC0000", "TRVCD": "AFA9800125Q00000", "INDCD": "QFA9800122QC0000", "ONDCD": "QFA9800124Q00000", "BWSCD": "WFA9800124Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 13820.0, "RVSLP": -0.001, "IELV": 85.8, "OELV": 85.97, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98302562", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15244364, 31.03035564 ], [ 115.15229731, 31.03049403 ], [ 115.15216433, 31.03047254 ], [ 115.1516584, 31.0301641 ], [ 115.15141954, 31.02991561 ], [ 115.15111803, 31.02933016 ], [ 115.15102807, 31.0279161 ], [ 115.15093365, 31.02750029 ], [ 115.15054157, 31.0270712 ], [ 115.14997768, 31.0266845 ], [ 115.14957208, 31.02661143 ], [ 115.14916634, 31.02668003 ], [ 115.14721151, 31.02790187 ], [ 115.14682566, 31.028037 ], [ 115.14631599, 31.02805775 ], [ 115.14598831, 31.02799841 ], [ 115.14545427, 31.02777955 ], [ 115.14512987, 31.02752594 ], [ 115.14478801, 31.02702473 ], [ 115.14434362, 31.02611409 ], [ 115.14377043, 31.02523328 ], [ 115.14282843, 31.02415046 ], [ 115.14254828, 31.02370804 ], [ 115.14242827, 31.02321854 ], [ 115.1422959, 31.02129194 ], [ 115.14166521, 31.01944097 ], [ 115.14139759, 31.01914956 ], [ 115.14102986, 31.01898216 ], [ 115.14027082, 31.01881291 ], [ 115.13986076, 31.01878822 ], [ 115.13893975, 31.01907457 ], [ 115.13547815, 31.02066466 ], [ 115.1326754, 31.02154429 ], [ 115.13178249, 31.02192555 ], [ 115.12720553, 31.02339214 ], [ 115.12505963, 31.0239037 ], [ 115.12377801, 31.02368671 ], [ 115.12335763, 31.02340716 ], [ 115.12302549, 31.02305213 ], [ 115.12277155, 31.02259029 ], [ 115.12272216, 31.02202329 ], [ 115.12278986, 31.02174615 ], [ 115.1229964, 31.0213525 ], [ 115.1235964, 31.02067027 ], [ 115.12411993, 31.01990778 ], [ 115.12459962, 31.01854179 ], [ 115.12464894, 31.01811605 ], [ 115.124613, 31.01752571 ], [ 115.12453391, 31.01725697 ], [ 115.12433217, 31.01700144 ], [ 115.12358177, 31.01643346 ], [ 115.1230449, 31.01622027 ], [ 115.12263325, 31.01615607 ], [ 115.12107525, 31.01622737 ], [ 115.11983773, 31.01663149 ], [ 115.11942384, 31.01670187 ], [ 115.1178574, 31.0167503 ], [ 115.11737959, 31.01662996 ], [ 115.11474215, 31.01453044 ], [ 115.11385237, 31.0134569 ], [ 115.11325459, 31.01287375 ], [ 115.1119263, 31.01126188 ], [ 115.11092951, 31.01020628 ], [ 115.10977982, 31.00928002 ], [ 115.1091204, 31.00902656 ], [ 115.10879043, 31.00914781 ], [ 115.10843387, 31.00948607 ], [ 115.10814611, 31.01001378 ], [ 115.10810393, 31.01028325 ], [ 115.10830001, 31.01090249 ], [ 115.10842159, 31.01168915 ], [ 115.10862862, 31.01224678 ], [ 115.10874363, 31.01303269 ], [ 115.10893203, 31.01352155 ], [ 115.10906829, 31.01421865 ], [ 115.10939004, 31.01517826 ], [ 115.1101024, 31.01685143 ], [ 115.10984803, 31.01771394 ], [ 115.10963462, 31.01795198 ], [ 115.10936439, 31.01813195 ], [ 115.10867127, 31.01837811 ], [ 115.10675355, 31.0184486 ], [ 115.10625638, 31.01838428 ], [ 115.10564972, 31.0181297 ], [ 115.1051243, 31.0177057 ], [ 115.10479014, 31.01720028 ], [ 115.10470242, 31.01692424 ], [ 115.1045876, 31.01590971 ], [ 115.10393967, 31.01444083 ], [ 115.10352003, 31.01403075 ], [ 115.10282749, 31.01351982 ], [ 115.10180827, 31.01323324 ], [ 115.10148602, 31.01324637 ], [ 115.10077805, 31.01343152 ], [ 115.09948559, 31.01351608 ], [ 115.09855019, 31.01380112 ], [ 115.09649681, 31.01476629 ], [ 115.09449248, 31.01603758 ], [ 115.09391612, 31.01633436 ], [ 115.09339425, 31.01655621 ], [ 115.09289614, 31.0166309 ], [ 115.08829566, 31.01673633 ], [ 115.08618849, 31.01635216 ], [ 115.0837304, 31.01573772 ], [ 115.08137155, 31.01482871 ], [ 115.08050018, 31.01460063 ], [ 115.0799104, 31.01455796 ], [ 115.07931618, 31.01461645 ], [ 115.07871765, 31.01487402 ], [ 115.07845692, 31.01506899 ], [ 115.07821594, 31.01537444 ], [ 115.07799392, 31.01591755 ], [ 115.07819623, 31.02108816 ], [ 115.07817221, 31.02144754 ], [ 115.07805692, 31.02171825 ], [ 115.077396, 31.02235811 ], [ 115.0764216, 31.0229701 ], [ 115.07462046, 31.0236953 ], [ 115.07259954, 31.02432768 ], [ 115.07181498, 31.02475437 ], [ 115.07087198, 31.02562321 ], [ 115.07061175, 31.02593831 ], [ 115.07038364, 31.02640266 ], [ 115.07026876, 31.02701936 ], [ 115.07000166, 31.02774775 ], [ 115.06986006, 31.02797609 ], [ 115.06938981, 31.02841429 ], [ 115.06937153, 31.02866117 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124Q00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800123Q00000", "TRVCD": "AFA9800125Q00000", "INDCD": "QFA9800123Q00000", "ONDCD": "QFA9800124Q00000", "BWSCD": "WFA9800124Q00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 14143.0, "RVSLP": 0.0002, "IELV": 89.0, "OELV": 85.97, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98302562", "RESRVID": "02" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13972397, 30.99716022 ], [ 115.13988931, 30.99735588 ], [ 115.14022139, 30.99807665 ], [ 115.14037559, 30.99922544 ], [ 115.14089237, 31.00067164 ], [ 115.14098802, 31.00215223 ], [ 115.14088836, 31.0025642 ], [ 115.14035791, 31.0031882 ], [ 115.14010234, 31.00364044 ], [ 115.13980383, 31.0046027 ], [ 115.13987369, 31.00631182 ], [ 115.14044598, 31.0081945 ], [ 115.14050807, 31.00885611 ], [ 115.14048287, 31.00936415 ], [ 115.14036565, 31.00963123 ], [ 115.13966556, 31.01035554 ], [ 115.13939764, 31.01080473 ], [ 115.13929493, 31.01115373 ], [ 115.1392934, 31.0116673 ], [ 115.13942273, 31.0123077 ], [ 115.13968313, 31.01290579 ], [ 115.14010803, 31.01362972 ], [ 115.14098778, 31.01563262 ], [ 115.1410925, 31.0164951 ], [ 115.14104676, 31.01691997 ], [ 115.14076978, 31.01767159 ], [ 115.14021948, 31.01843441 ], [ 115.13987585, 31.0187881 ], [ 115.13878775, 31.01913236 ], [ 115.13547815, 31.02066466 ], [ 115.1326754, 31.02154429 ], [ 115.13178249, 31.02192555 ], [ 115.12720553, 31.02339214 ], [ 115.12505963, 31.0239037 ], [ 115.12385459, 31.02371821 ], [ 115.12342305, 31.02346074 ], [ 115.12302549, 31.02305213 ], [ 115.12277155, 31.02259029 ], [ 115.12272216, 31.02202329 ], [ 115.12278986, 31.02174615 ], [ 115.1229964, 31.0213525 ], [ 115.1235964, 31.02067027 ], [ 115.12411993, 31.01990778 ], [ 115.12459962, 31.01854179 ], [ 115.12464894, 31.01811605 ], [ 115.124613, 31.01752571 ], [ 115.12453391, 31.01725697 ], [ 115.12433217, 31.01700144 ], [ 115.12358177, 31.01643346 ], [ 115.1230449, 31.01622027 ], [ 115.12263325, 31.01615607 ], [ 115.12107525, 31.01622737 ], [ 115.11983773, 31.01663149 ], [ 115.11942384, 31.01670187 ], [ 115.1178574, 31.0167503 ], [ 115.11737959, 31.01662996 ], [ 115.11474215, 31.01453044 ], [ 115.11385237, 31.0134569 ], [ 115.11325459, 31.01287375 ], [ 115.1119263, 31.01126188 ], [ 115.11092951, 31.01020628 ], [ 115.1097076, 31.00923414 ], [ 115.10905144, 31.00902713 ], [ 115.10872623, 31.00919626 ], [ 115.10838419, 31.00955185 ], [ 115.10814611, 31.01001378 ], [ 115.10810393, 31.01028325 ], [ 115.10830001, 31.01090249 ], [ 115.10842159, 31.01168915 ], [ 115.10862862, 31.01224678 ], [ 115.10874363, 31.01303269 ], [ 115.10893203, 31.01352155 ], [ 115.10906829, 31.01421865 ], [ 115.10939004, 31.01517826 ], [ 115.1101024, 31.01685143 ], [ 115.10984803, 31.01771394 ], [ 115.10963462, 31.01795198 ], [ 115.10936439, 31.01813195 ], [ 115.10867127, 31.01837811 ], [ 115.10675355, 31.0184486 ], [ 115.10625638, 31.01838428 ], [ 115.10564972, 31.0181297 ], [ 115.1051243, 31.0177057 ], [ 115.10479014, 31.01720028 ], [ 115.10470242, 31.01692424 ], [ 115.1045876, 31.01590971 ], [ 115.10393967, 31.01444083 ], [ 115.10352003, 31.01403075 ], [ 115.10282749, 31.01351982 ], [ 115.10180827, 31.01323324 ], [ 115.10148602, 31.01324637 ], [ 115.10077805, 31.01343152 ], [ 115.09948559, 31.01351608 ], [ 115.09855019, 31.01380112 ], [ 115.09649681, 31.01476629 ], [ 115.09449248, 31.01603758 ], [ 115.09391612, 31.01633436 ], [ 115.09339425, 31.01655621 ], [ 115.09289614, 31.0166309 ], [ 115.08829566, 31.01673633 ], [ 115.08618849, 31.01635216 ], [ 115.0837304, 31.01573772 ], [ 115.08137155, 31.01482871 ], [ 115.08050018, 31.01460063 ], [ 115.0799104, 31.01455796 ], [ 115.07931618, 31.01461645 ], [ 115.07871765, 31.01487402 ], [ 115.07845692, 31.01506899 ], [ 115.07821594, 31.01537444 ], [ 115.07799392, 31.01591755 ], [ 115.07819623, 31.02108816 ], [ 115.07817221, 31.02144754 ], [ 115.07805692, 31.02171825 ], [ 115.077396, 31.02235811 ], [ 115.0764216, 31.0229701 ], [ 115.07462046, 31.0236953 ], [ 115.07259954, 31.02432768 ], [ 115.07181498, 31.02475437 ], [ 115.07087198, 31.02562321 ], [ 115.07061175, 31.02593831 ], [ 115.07038364, 31.02640266 ], [ 115.07026876, 31.02701936 ], [ 115.07000166, 31.02774775 ], [ 115.06986006, 31.02797609 ], [ 115.06938981, 31.02841429 ], [ 115.06937153, 31.02866117 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122QD0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121QD0000", "TRVCD": "AFA9800123QD0000", "INDCD": "QFA9800121QD0000", "ONDCD": "QFA9800122QD0000", "BWSCD": "WFA9800122QD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 5519.0, "RVSLP": 0.0003, "IELV": 205.21, "OELV": 189.86, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA98002523", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12668932, 31.07755382 ], [ 115.12617798, 31.07714562 ], [ 115.12584043, 31.07709244 ], [ 115.12479755, 31.0762616 ], [ 115.12453808, 31.07626227 ], [ 115.12427502, 31.07605938 ], [ 115.1240507, 31.07602693 ], [ 115.12363225, 31.07576029 ], [ 115.12227443, 31.07466321 ], [ 115.12163256, 31.07387631 ], [ 115.1215336, 31.07365151 ], [ 115.11990755, 31.07235029 ], [ 115.11916162, 31.07199958 ], [ 115.11883801, 31.07194365 ], [ 115.11834368, 31.07199987 ], [ 115.11650755, 31.07266874 ], [ 115.11546764, 31.07272192 ], [ 115.11496402, 31.07267566 ], [ 115.11435374, 31.07243467 ], [ 115.11338, 31.07174953 ], [ 115.11240278, 31.07131783 ], [ 115.11089808, 31.07014783 ], [ 115.11045018, 31.06996781 ], [ 115.11005732, 31.07002552 ], [ 115.10910193, 31.07048224 ], [ 115.10837226, 31.0710415 ], [ 115.10760042, 31.07151555 ], [ 115.10737213, 31.07158386 ], [ 115.10705544, 31.07156198 ], [ 115.10669735, 31.07136231 ], [ 115.10637972, 31.07108096 ], [ 115.10510201, 31.06942556 ], [ 115.10456846, 31.06899611 ], [ 115.10427409, 31.06884263 ], [ 115.1037743, 31.06878816 ], [ 115.10168384, 31.06884315 ], [ 115.10038179, 31.06861695 ], [ 115.09897357, 31.06819629 ], [ 115.09844572, 31.06796964 ], [ 115.09713997, 31.06725084 ], [ 115.09599041, 31.06682085 ], [ 115.09514013, 31.06682069 ], [ 115.09434641, 31.06703702 ], [ 115.09375424, 31.06707039 ], [ 115.09271033, 31.06684084 ], [ 115.09217805, 31.06663382 ], [ 115.09178016, 31.06634759 ], [ 115.08980443, 31.06417794 ], [ 115.0893582, 31.06378419 ], [ 115.0879979, 31.06271792 ], [ 115.08678187, 31.06198969 ], [ 115.08617974, 31.06173182 ], [ 115.08431645, 31.06113371 ], [ 115.08346745, 31.06109432 ], [ 115.08200576, 31.0612043 ], [ 115.08123135, 31.06161801 ], [ 115.08095576, 31.06164687 ], [ 115.08071158, 31.0618678 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124PD0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800122PDA000", "TRVCD": "AFA9800125PD0000", "INDCD": "QFA9800122PDA000", "ONDCD": "QFA9800124PD0000", "BWSCD": "WFA9800124PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 7089.0, "RVSLP": 0.0006, "IELV": 129.66, "OELV": 125.08, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA98102543", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25381122, 31.27254203 ], [ 115.25417, 31.27287074 ], [ 115.25433407, 31.27320167 ], [ 115.25444444, 31.27431243 ], [ 115.2546568, 31.27487173 ], [ 115.25473008, 31.27530247 ], [ 115.25474197, 31.27581836 ], [ 115.25464138, 31.27614167 ], [ 115.25440496, 31.27631203 ], [ 115.25390953, 31.27638231 ], [ 115.25250239, 31.27639823 ], [ 115.25170364, 31.27628691 ], [ 115.25137221, 31.27646343 ], [ 115.2511559, 31.27684054 ], [ 115.25120081, 31.27731972 ], [ 115.25166805, 31.27836996 ], [ 115.25175438, 31.27914762 ], [ 115.25079574, 31.28010209 ], [ 115.25055571, 31.28063513 ], [ 115.2505317, 31.28121461 ], [ 115.25068072, 31.28352408 ], [ 115.25082124, 31.28378391 ], [ 115.2514156, 31.28437372 ], [ 115.25170366, 31.28488076 ], [ 115.25170397, 31.28520792 ], [ 115.25143839, 31.28573835 ], [ 115.25108205, 31.28607047 ], [ 115.25056786, 31.28631801 ], [ 115.24923539, 31.28652024 ], [ 115.24860561, 31.28689182 ], [ 115.24716996, 31.28745529 ], [ 115.24646308, 31.28784911 ], [ 115.2462408, 31.2880821 ], [ 115.24598001, 31.28853212 ], [ 115.24558001, 31.28953828 ], [ 115.2446597, 31.2913122 ], [ 115.24407471, 31.29213975 ], [ 115.24369502, 31.29243337 ], [ 115.24294212, 31.29253561 ], [ 115.24236418, 31.29244556 ], [ 115.24044444, 31.29097776 ], [ 115.23969244, 31.29065219 ], [ 115.2391878, 31.29060773 ], [ 115.23823226, 31.29064899 ], [ 115.23790843, 31.29072416 ], [ 115.23763093, 31.29089695 ], [ 115.23649542, 31.29194382 ], [ 115.23616625, 31.29238985 ], [ 115.23592829, 31.29314383 ], [ 115.23594559, 31.29477025 ], [ 115.23578169, 31.29540844 ], [ 115.23572758, 31.29626927 ], [ 115.23548641, 31.29702297 ], [ 115.2352645, 31.2974897 ], [ 115.23462273, 31.29859601 ], [ 115.23292987, 31.30016037 ], [ 115.23254595, 31.30029975 ], [ 115.23203685, 31.30032004 ], [ 115.23171188, 31.30025901 ], [ 115.2311778, 31.30004128 ], [ 115.22736381, 31.29702228 ], [ 115.22686992, 31.29673776 ], [ 115.22650848, 31.29680593 ], [ 115.22587984, 31.29736171 ], [ 115.22567879, 31.29762048 ], [ 115.22504562, 31.29879001 ], [ 115.22433597, 31.29951249 ], [ 115.22379971, 31.29990813 ], [ 115.22335387, 31.30010619 ], [ 115.22302484, 31.30016839 ], [ 115.2219077, 31.30017047 ], [ 115.22102835, 31.29995616 ], [ 115.22049338, 31.29975167 ], [ 115.21954437, 31.29924397 ], [ 115.21871184, 31.2986459 ], [ 115.21805328, 31.29829319 ], [ 115.21718842, 31.29765445 ], [ 115.21671197, 31.29766968 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124PD0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800123PD0000", "TRVCD": "AFA9800125PD0000", "INDCD": "QFA9800123PD0000", "ONDCD": "QFA9800124PD0000", "BWSCD": "WFA9800124PD0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 6726.0, "RVSLP": 0.0007, "IELV": 129.68, "OELV": 125.08, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA98102543", "RESRVID": "02" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25614203, 31.28372797 ], [ 115.25613614, 31.28352404 ], [ 115.25601721, 31.28329307 ], [ 115.25546161, 31.28258788 ], [ 115.25481201, 31.28194578 ], [ 115.25429832, 31.28112769 ], [ 115.25405451, 31.28061386 ], [ 115.2531925, 31.27966939 ], [ 115.2526775, 31.27922499 ], [ 115.25236811, 31.27904287 ], [ 115.25208027, 31.27900265 ], [ 115.2517941, 31.27910764 ], [ 115.25083911, 31.28003565 ], [ 115.25059967, 31.28049527 ], [ 115.25053557, 31.28077416 ], [ 115.25061208, 31.28302139 ], [ 115.25068072, 31.28352408 ], [ 115.25082124, 31.28378391 ], [ 115.2514156, 31.28437372 ], [ 115.25171647, 31.28494558 ], [ 115.25167926, 31.28527983 ], [ 115.25133381, 31.2858602 ], [ 115.25101274, 31.28611367 ], [ 115.25049173, 31.28634553 ], [ 115.24923539, 31.28652024 ], [ 115.24860561, 31.28689182 ], [ 115.24716996, 31.28745529 ], [ 115.24646308, 31.28784911 ], [ 115.2462408, 31.2880821 ], [ 115.24598001, 31.28853212 ], [ 115.24558001, 31.28953828 ], [ 115.2446597, 31.2913122 ], [ 115.24407471, 31.29213975 ], [ 115.2436184, 31.2924616 ], [ 115.24294212, 31.29253561 ], [ 115.24236418, 31.29244556 ], [ 115.24044444, 31.29097776 ], [ 115.23969244, 31.29065219 ], [ 115.2391878, 31.29060773 ], [ 115.23823226, 31.29064899 ], [ 115.23790843, 31.29072416 ], [ 115.23763093, 31.29089695 ], [ 115.23649542, 31.29194382 ], [ 115.23616625, 31.29238985 ], [ 115.23592829, 31.29314383 ], [ 115.23594559, 31.29477025 ], [ 115.23578169, 31.29540844 ], [ 115.23572758, 31.29626927 ], [ 115.23548641, 31.29702297 ], [ 115.23502451, 31.29795004 ], [ 115.23477032, 31.29840228 ], [ 115.23450997, 31.298718 ], [ 115.23319446, 31.29995429 ], [ 115.23270838, 31.30026391 ], [ 115.23229237, 31.30032383 ], [ 115.23187021, 31.30030161 ], [ 115.23110571, 31.3 ], [ 115.22736381, 31.29702228 ], [ 115.22686992, 31.29673776 ], [ 115.22650848, 31.29680593 ], [ 115.22587984, 31.29736171 ], [ 115.22567879, 31.29762048 ], [ 115.22504562, 31.29879001 ], [ 115.22433597, 31.29951249 ], [ 115.22379971, 31.29990813 ], [ 115.22335387, 31.30010619 ], [ 115.22302484, 31.30016839 ], [ 115.2219077, 31.30017047 ], [ 115.22102835, 31.29995616 ], [ 115.22049338, 31.29975167 ], [ 115.21954437, 31.29924397 ], [ 115.21871184, 31.2986459 ], [ 115.21805328, 31.29829319 ], [ 115.21718842, 31.29765445 ], [ 115.21671197, 31.29766968 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122TB0000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121TB0000", "TRVCD": "AFA9800123TB0000", "INDCD": "QFA9800121TB0000", "ONDCD": "QFA9800122TB0000", "BWSCD": "WFA9800122TB0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 3941.0, "RVSLP": 0.0068, "IELV": 69.24, "OELV": 50.31, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA98402599", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7660962, 31.18017024 ], [ 114.76546546, 31.1801639 ], [ 114.76520167, 31.18004675 ], [ 114.76487868, 31.17979642 ], [ 114.76437593, 31.17905683 ], [ 114.76293991, 31.17737395 ], [ 114.76259805, 31.17679556 ], [ 114.76231371, 31.17590604 ], [ 114.76230358, 31.17564244 ], [ 114.76254247, 31.17489706 ], [ 114.76291204, 31.17414952 ], [ 114.7631642, 31.17339794 ], [ 114.76319351, 31.1728185 ], [ 114.76311813, 31.17224332 ], [ 114.76253578, 31.17067805 ], [ 114.76206917, 31.16982244 ], [ 114.76177362, 31.1689303 ], [ 114.76163874, 31.16823143 ], [ 114.76146996, 31.16780962 ], [ 114.76130558, 31.16682096 ], [ 114.76073223, 31.16548407 ], [ 114.76031226, 31.16475967 ], [ 114.76000597, 31.16402361 ], [ 114.75987038, 31.16332762 ], [ 114.75966981, 31.16276782 ], [ 114.7595681, 31.16128875 ], [ 114.75932377, 31.16052191 ], [ 114.75921164, 31.15935368 ], [ 114.75860068, 31.15749608 ], [ 114.75842551, 31.15724992 ], [ 114.75816425, 31.15706446 ], [ 114.75752984, 31.15689385 ], [ 114.75684717, 31.15659961 ], [ 114.75639215, 31.15622448 ], [ 114.75609422, 31.15578997 ], [ 114.75594628, 31.15530182 ], [ 114.75589514, 31.15380489 ], [ 114.75594617, 31.15345405 ], [ 114.75629259, 31.15247879 ], [ 114.75629268, 31.1521564 ], [ 114.75602387, 31.1517864 ], [ 114.75475436, 31.15078237 ], [ 114.75471203, 31.15053167 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122B00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121B00000", "TRVCD": "AFA9800123B00000", "INDCD": "QFA9800121B00000", "ONDCD": "QFA9800122B00000", "BWSCD": "WFA9800122B00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 3773.0, "RVSLP": 0.0025, "IELV": 167.16, "OELV": 157.9, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98002513", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15842061, 31.47702018 ], [ 115.15816022, 31.47681539 ], [ 115.15795386, 31.47677435 ], [ 115.15761981, 31.47657809 ], [ 115.15658368, 31.47578201 ], [ 115.15592182, 31.47522867 ], [ 115.15534151, 31.47458232 ], [ 115.1525755, 31.47234172 ], [ 115.15240679, 31.47194228 ], [ 115.1522688, 31.47009372 ], [ 115.15194958, 31.46950377 ], [ 115.15158759, 31.46901731 ], [ 115.15053011, 31.46835621 ], [ 115.14826819, 31.46655819 ], [ 115.14798417, 31.46639613 ], [ 115.14776048, 31.46636775 ], [ 115.14734618, 31.46658393 ], [ 115.14681235, 31.4671265 ], [ 115.14649631, 31.46795441 ], [ 115.14636987, 31.46856572 ], [ 115.14599996, 31.46897389 ], [ 115.14480983, 31.4695083 ], [ 115.14360319, 31.46960081 ], [ 115.14328148, 31.46967904 ], [ 115.14179622, 31.47036158 ], [ 115.14133643, 31.47071957 ], [ 115.14110024, 31.47104387 ], [ 115.14104185, 31.47139006 ], [ 115.14109036, 31.47205541 ], [ 115.14126569, 31.47261058 ], [ 115.14126259, 31.4727902 ], [ 115.14116039, 31.47298231 ], [ 115.14087227, 31.47326854 ], [ 115.14015015, 31.47366169 ], [ 115.13880437, 31.47406296 ], [ 115.1383558, 31.47426042 ], [ 115.13776561, 31.47471372 ], [ 115.13758578, 31.47497831 ], [ 115.13753021, 31.4752501 ], [ 115.13757019, 31.47733029 ], [ 115.13733231, 31.47787813 ], [ 115.13700133, 31.47843069 ], [ 115.13663966, 31.47880023 ], [ 115.13663572, 31.47903111 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800121JA0000", "RVNM": null, "GB": "210501", "FRVCD": "-1", "TRVCD": "AFA9800122JA0000", "INDCD": "-1", "ONDCD": "QFA9800121JA0000", "BWSCD": "WFA9800121JA0000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 1622.0, "RVSLP": -0.0001, "IELV": 149.14, "OELV": 149.73, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA97002453", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94199017, 31.47545128 ], [ 114.94196216, 31.47403867 ], [ 114.94223159, 31.4732192 ], [ 114.94255753, 31.47254219 ], [ 114.94259594, 31.47221111 ], [ 114.94249893, 31.47194625 ], [ 114.94156837, 31.47040985 ], [ 114.94142959, 31.46933242 ], [ 114.94121169, 31.46870445 ], [ 114.94111438, 31.46783295 ], [ 114.94087092, 31.46713644 ], [ 114.94085387, 31.46641769 ], [ 114.94092797, 31.46621532 ], [ 114.94112828, 31.4659598 ], [ 114.94221272, 31.46498753 ], [ 114.94330807, 31.46444951 ], [ 114.94440747, 31.46409203 ], [ 114.94463473, 31.46388041 ], [ 114.94464172, 31.46364803 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9900122X00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9900121X00000", "TRVCD": "AFA9900123X00000", "INDCD": "QFA9900121X00000", "ONDCD": "QFA9900122X00000", "BWSCD": "WFA9900122X00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 1994.0, "RVSLP": 0.0043, "IELV": 156.18, "OELV": 136.58, "VR": "1", "LEVEL": 7, "ISDISP": "0", "DESP": null, "RESCD": "BFA98002463", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18580027, 30.92389071 ], [ 115.18686404, 30.92388732 ], [ 115.18734611, 30.9242503 ], [ 115.18765388, 30.92428954 ], [ 115.1886673, 30.92512023 ], [ 115.18902024, 30.92529493 ], [ 115.1893101, 30.92525124 ], [ 115.19004974, 30.9247358 ], [ 115.19054393, 30.92463929 ], [ 115.19148482, 30.92466139 ], [ 115.19222651, 30.92502642 ], [ 115.19293434, 30.92524051 ], [ 115.19361479, 30.92519982 ], [ 115.19445365, 30.92491391 ], [ 115.19460273, 30.92477441 ], [ 115.19464728, 30.92460591 ], [ 115.19415632, 30.92310203 ], [ 115.1940609, 30.92145595 ], [ 115.19410963, 30.92095827 ], [ 115.19437967, 30.92042531 ], [ 115.19484975, 30.91996044 ], [ 115.19550167, 30.91962145 ], [ 115.19612363, 30.91941578 ], [ 115.19657386, 30.91905493 ], [ 115.19679012, 30.91861893 ], [ 115.1967898, 30.91771418 ], [ 115.19703203, 30.91746092 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122L00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121L00000", "TRVCD": "AFA9800123L00000", "INDCD": "QFA9800121L00000", "ONDCD": "QFA9800122L00000", "BWSCD": "WFA9800122L00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 1806.0, "RVSLP": -0.0052, "IELV": 112.33, "OELV": 114.41, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA97002443", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10581265, 31.32203988 ], [ 115.10400912, 31.32055952 ], [ 115.10334046, 31.31955782 ], [ 115.10313576, 31.31911197 ], [ 115.1031579, 31.31892178 ], [ 115.10334004, 31.31853792 ], [ 115.10389003, 31.31778009 ], [ 115.10574449, 31.31570806 ], [ 115.10598152, 31.31524643 ], [ 115.10670775, 31.31305616 ], [ 115.10668041, 31.31210838 ], [ 115.10635587, 31.31130233 ], [ 115.10516971, 31.30997752 ], [ 115.10476226, 31.30940943 ], [ 115.10471201, 31.30878032 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124P00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121PB0000", "TRVCD": "AFA9800125P00000", "INDCD": "QFA9800121PB0000", "ONDCD": "QFA9800124P00000", "BWSCD": "WFA9800124P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 4683.0, "RVSLP": 0.0003, "IELV": 149.57, "OELV": 145.05, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98102532", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25896761, 31.3699276 ], [ 115.25889901, 31.36919219 ], [ 115.25814978, 31.36789856 ], [ 115.25785887, 31.36722871 ], [ 115.25778436, 31.36688302 ], [ 115.25781932, 31.36617177 ], [ 115.25817639, 31.36541657 ], [ 115.25843191, 31.36466165 ], [ 115.25844983, 31.36423772 ], [ 115.25836619, 31.36390213 ], [ 115.25797042, 31.3634807 ], [ 115.25528016, 31.36130761 ], [ 115.25467335, 31.36035953 ], [ 115.25434958, 31.35955604 ], [ 115.25423309, 31.35877045 ], [ 115.25403149, 31.35821584 ], [ 115.25401607, 31.35787206 ], [ 115.2541576, 31.35737813 ], [ 115.25423772, 31.3566721 ], [ 115.2545977, 31.35533599 ], [ 115.25462448, 31.35409398 ], [ 115.25478001, 31.35352558 ], [ 115.25481242, 31.35309422 ], [ 115.25474172, 31.35221546 ], [ 115.25441553, 31.35141153 ], [ 115.25408018, 31.35067904 ], [ 115.25347965, 31.34986907 ], [ 115.25317224, 31.34930173 ], [ 115.25262425, 31.34864093 ], [ 115.25137761, 31.34759401 ], [ 115.24933383, 31.34537799 ], [ 115.24851581, 31.34464165 ], [ 115.24771441, 31.34361559 ], [ 115.2473238, 31.34274608 ], [ 115.24722496, 31.34149264 ], [ 115.24783097, 31.34089976 ], [ 115.24890986, 31.33938399 ], [ 115.24932799, 31.33855393 ], [ 115.2494238, 31.33820232 ], [ 115.24933633, 31.33658752 ], [ 115.24912249, 31.33616987 ], [ 115.24901738, 31.33564745 ], [ 115.24881082, 31.33523599 ], [ 115.24874769, 31.33469925 ], [ 115.24848953, 31.33445982 ], [ 115.24846966, 31.33423988 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124P00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800122PC0000", "TRVCD": "AFA9800125P00000", "INDCD": "QFA9800122PC0000", "ONDCD": "QFA9800124P00000", "BWSCD": "WFA9800124P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 6464.0, "RVSLP": 0.0004, "IELV": 147.91, "OELV": 145.05, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98102532", "RESRVID": "02" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22016782, 31.36335237 ], [ 115.22068482, 31.36333764 ], [ 115.22086831, 31.36348611 ], [ 115.22121271, 31.36415202 ], [ 115.22137233, 31.36569797 ], [ 115.22155752, 31.36591175 ], [ 115.22185595, 31.36599595 ], [ 115.22244977, 31.36596414 ], [ 115.22324996, 31.36574435 ], [ 115.22533237, 31.36563645 ], [ 115.226014, 31.36537244 ], [ 115.22715557, 31.36474816 ], [ 115.22798777, 31.3646228 ], [ 115.22853437, 31.36445965 ], [ 115.22990364, 31.36431774 ], [ 115.23018386, 31.36414569 ], [ 115.23048095, 31.36385549 ], [ 115.23059972, 31.36365558 ], [ 115.23062965, 31.36346217 ], [ 115.23056611, 31.36319784 ], [ 115.23033355, 31.3628186 ], [ 115.22983716, 31.36235185 ], [ 115.22894151, 31.36165976 ], [ 115.22834446, 31.36139768 ], [ 115.22804035, 31.36135755 ], [ 115.2274187, 31.36151974 ], [ 115.22663821, 31.36155603 ], [ 115.22624383, 31.36144093 ], [ 115.2259061, 31.36110829 ], [ 115.2258378, 31.36084471 ], [ 115.22586957, 31.36050234 ], [ 115.2262137, 31.35973803 ], [ 115.22636627, 31.35904535 ], [ 115.22656445, 31.3586506 ], [ 115.22677236, 31.35840842 ], [ 115.22703783, 31.35823197 ], [ 115.22744726, 31.35815035 ], [ 115.23224488, 31.35797982 ], [ 115.232872, 31.35779835 ], [ 115.23370759, 31.35767768 ], [ 115.23460255, 31.35730575 ], [ 115.23579807, 31.35700267 ], [ 115.23805082, 31.35687922 ], [ 115.23835405, 31.35675805 ], [ 115.23867103, 31.35649267 ], [ 115.2389079, 31.35616814 ], [ 115.23913834, 31.35525785 ], [ 115.23917249, 31.35387264 ], [ 115.23943713, 31.35305535 ], [ 115.23968188, 31.35273555 ], [ 115.24046577, 31.35196205 ], [ 115.2418019, 31.35021428 ], [ 115.24203478, 31.34975203 ], [ 115.24307084, 31.34662095 ], [ 115.24402813, 31.34478352 ], [ 115.24503216, 31.34354249 ], [ 115.24777034, 31.3409716 ], [ 115.24886574, 31.33944955 ], [ 115.24919036, 31.33886666 ], [ 115.2494238, 31.33820232 ], [ 115.24935626, 31.33669185 ], [ 115.24912249, 31.33616987 ], [ 115.24900045, 31.33560013 ], [ 115.24881082, 31.33523599 ], [ 115.24874769, 31.33469925 ], [ 115.24848953, 31.33445982 ], [ 115.24846966, 31.33423988 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800124P00000", "RVNM": "张广河", "GB": "210501", "FRVCD": "AFA9800123P00000", "TRVCD": "AFA9800125P00000", "INDCD": "QFA9800123P00000", "ONDCD": "QFA9800124P00000", "BWSCD": "WFA9800124P00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 5296.0, "RVSLP": 0.0011, "IELV": 156.35, "OELV": 145.05, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98102532", "RESRVID": "03" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27804827, 31.34672417 ], [ 115.27777763, 31.34650961 ], [ 115.2770328, 31.34627586 ], [ 115.27657566, 31.34598836 ], [ 115.27578754, 31.34533045 ], [ 115.27488354, 31.34432151 ], [ 115.27449482, 31.34309132 ], [ 115.27430175, 31.3390411 ], [ 115.27418215, 31.33870774 ], [ 115.2738134, 31.33840314 ], [ 115.27340937, 31.33832151 ], [ 115.27227622, 31.33836606 ], [ 115.27194775, 31.33842993 ], [ 115.27143186, 31.33866713 ], [ 115.27003769, 31.3399123 ], [ 115.26951611, 31.34059607 ], [ 115.26904379, 31.34107814 ], [ 115.26871586, 31.34134151 ], [ 115.26820206, 31.34159582 ], [ 115.26779831, 31.34168048 ], [ 115.26738579, 31.34163922 ], [ 115.26708958, 31.34148474 ], [ 115.26676575, 31.34121163 ], [ 115.26662196, 31.34101535 ], [ 115.26654556, 31.34074764 ], [ 115.26657625, 31.34018243 ], [ 115.26760167, 31.3381924 ], [ 115.26770801, 31.3377704 ], [ 115.26760719, 31.33598831 ], [ 115.26741314, 31.33567264 ], [ 115.26700603, 31.33540656 ], [ 115.26608466, 31.33506034 ], [ 115.26576007, 31.33500287 ], [ 115.26314781, 31.33507544 ], [ 115.26257988, 31.33519837 ], [ 115.26225127, 31.33544597 ], [ 115.26193227, 31.33581864 ], [ 115.26125712, 31.33713786 ], [ 115.26104628, 31.33774821 ], [ 115.26073561, 31.3382649 ], [ 115.25998199, 31.33892771 ], [ 115.2591363, 31.33922314 ], [ 115.25804072, 31.33935177 ], [ 115.25749793, 31.33952006 ], [ 115.25707888, 31.33957447 ], [ 115.25186032, 31.33974427 ], [ 115.25081869, 31.33950775 ], [ 115.25045976, 31.33930234 ], [ 115.25008567, 31.33896627 ], [ 115.24942499, 31.33803748 ], [ 115.24933633, 31.33658752 ], [ 115.24912249, 31.33616987 ], [ 115.24901738, 31.33564745 ], [ 115.24881082, 31.33523599 ], [ 115.24874769, 31.33469925 ], [ 115.24848953, 31.33445982 ], [ 115.24846966, 31.33423988 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122T00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121TA0000", "TRVCD": "AFA9800123T00000", "INDCD": "QFA9800121TA0000", "ONDCD": "QFA9800122T00000", "BWSCD": "WFA9800122T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 10631.0, "RVSLP": -0.0023, "IELV": 69.14, "OELV": 76.7, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98402582", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74870014, 31.23704523 ], [ 114.7489395, 31.23719012 ], [ 114.74944719, 31.23725153 ], [ 114.75001516, 31.23722732 ], [ 114.75032612, 31.23712795 ], [ 114.7507879, 31.23676439 ], [ 114.75371976, 31.23400418 ], [ 114.75399239, 31.23347301 ], [ 114.75409309, 31.23270192 ], [ 114.75424579, 31.23213362 ], [ 114.75421324, 31.2316379 ], [ 114.75397606, 31.23094043 ], [ 114.75390412, 31.22989265 ], [ 114.75394237, 31.2293156 ], [ 114.75415041, 31.2289997 ], [ 114.75448631, 31.22878604 ], [ 114.75543626, 31.22851203 ], [ 114.75857426, 31.22840692 ], [ 114.75982862, 31.22723798 ], [ 114.76073793, 31.2261278 ], [ 114.76127986, 31.22537 ], [ 114.76196984, 31.22406243 ], [ 114.76237997, 31.22306193 ], [ 114.76372558, 31.22101322 ], [ 114.76469858, 31.21917974 ], [ 114.76492968, 31.21849472 ], [ 114.7649756, 31.21814445 ], [ 114.7649224, 31.2164945 ], [ 114.76484697, 31.21591996 ], [ 114.76450365, 31.21511415 ], [ 114.76359567, 31.2136445 ], [ 114.76314815, 31.2127385 ], [ 114.76257966, 31.21185873 ], [ 114.76137361, 31.21041545 ], [ 114.76025321, 31.20947633 ], [ 114.75998385, 31.20916988 ], [ 114.75978364, 31.20872424 ], [ 114.75912756, 31.20762188 ], [ 114.75842808, 31.20596599 ], [ 114.75819011, 31.20565618 ], [ 114.75502026, 31.20309514 ], [ 114.75439382, 31.20266274 ], [ 114.75297619, 31.20201759 ], [ 114.75146822, 31.20163373 ], [ 114.75080527, 31.20155179 ], [ 114.74992781, 31.20134199 ], [ 114.74924793, 31.2010575 ], [ 114.74872606, 31.20063455 ], [ 114.74752214, 31.19918783 ], [ 114.74726106, 31.19873576 ], [ 114.74709783, 31.19774773 ], [ 114.74685225, 31.1972874 ], [ 114.74473404, 31.19476389 ], [ 114.74422083, 31.1939435 ], [ 114.7432372, 31.1919899 ], [ 114.74194154, 31.19034043 ], [ 114.74139169, 31.18944851 ], [ 114.74130382, 31.18881363 ], [ 114.74150755, 31.18781687 ], [ 114.74147, 31.18639952 ], [ 114.74140497, 31.18597232 ], [ 114.74122043, 31.18548153 ], [ 114.74112432, 31.18476391 ], [ 114.74101893, 31.18449759 ], [ 114.74067142, 31.18414158 ], [ 114.74011584, 31.18374835 ], [ 114.73902372, 31.18339955 ], [ 114.73873239, 31.18324193 ], [ 114.73750239, 31.18227677 ], [ 114.73717842, 31.18190985 ], [ 114.73711162, 31.18164636 ], [ 114.737142, 31.18130771 ], [ 114.73740065, 31.18076618 ], [ 114.7380184, 31.17986588 ], [ 114.73847323, 31.17901482 ], [ 114.73854628, 31.17866609 ], [ 114.73851178, 31.17824082 ], [ 114.73821588, 31.17765034 ], [ 114.73781466, 31.17709056 ], [ 114.73548563, 31.17517395 ], [ 114.7347704, 31.1743323 ], [ 114.73446749, 31.17382247 ], [ 114.73422135, 31.17321827 ], [ 114.73419447, 31.1728908 ], [ 114.73431995, 31.17246705 ], [ 114.73442851, 31.17169515 ], [ 114.73505016, 31.17062928 ], [ 114.73507422, 31.17035598 ], [ 114.73500991, 31.1700929 ], [ 114.73486697, 31.16990583 ], [ 114.73460152, 31.16971958 ], [ 114.73402953, 31.16965156 ], [ 114.73300077, 31.16995848 ], [ 114.73211777, 31.17037225 ], [ 114.73169494, 31.17050168 ], [ 114.73133048, 31.17033961 ], [ 114.73034835, 31.16953373 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9800122T00000", "RVNM": null, "GB": "210501", "FRVCD": "AFA9800121T00000", "TRVCD": "AFA9800123T00000", "INDCD": "QFA9800121T00000", "ONDCD": "QFA9800122T00000", "BWSCD": "WFA9800122T00000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 11387.0, "RVSLP": -0.0021, "IELV": 71.86, "OELV": 76.7, "VR": "1", "LEVEL": 6, "ISDISP": "0", "DESP": null, "RESCD": "BFA98402582", "RESRVID": "02" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76857197, 31.24253591 ], [ 114.76828993, 31.24232213 ], [ 114.76812398, 31.24231783 ], [ 114.76642192, 31.24175244 ], [ 114.76554571, 31.24153566 ], [ 114.76407656, 31.24154237 ], [ 114.76294356, 31.24179381 ], [ 114.76181044, 31.24183589 ], [ 114.76132775, 31.24171764 ], [ 114.76086284, 31.24135831 ], [ 114.76069489, 31.24109844 ], [ 114.76063758, 31.24075206 ], [ 114.76066493, 31.24039644 ], [ 114.7608443, 31.23967907 ], [ 114.76076617, 31.238584 ], [ 114.75986724, 31.23651848 ], [ 114.75916605, 31.23558193 ], [ 114.75863022, 31.23468429 ], [ 114.75829459, 31.23365782 ], [ 114.75816245, 31.23257787 ], [ 114.75799204, 31.23215575 ], [ 114.75785223, 31.23145994 ], [ 114.75763531, 31.23083057 ], [ 114.75756771, 31.22948904 ], [ 114.75766317, 31.22908616 ], [ 114.75853558, 31.22844531 ], [ 114.75971186, 31.22735806 ], [ 114.76119037, 31.2255024 ], [ 114.7617778, 31.224458 ], [ 114.76237997, 31.22306193 ], [ 114.76372558, 31.22101322 ], [ 114.76469858, 31.21917974 ], [ 114.76496774, 31.21828853 ], [ 114.7649224, 31.2164945 ], [ 114.76484697, 31.21591996 ], [ 114.76450365, 31.21511415 ], [ 114.76359567, 31.2136445 ], [ 114.76314815, 31.2127385 ], [ 114.76257966, 31.21185873 ], [ 114.76137361, 31.21041545 ], [ 114.76002759, 31.20923629 ], [ 114.75912756, 31.20762188 ], [ 114.75842808, 31.20596599 ], [ 114.75819011, 31.20565618 ], [ 114.75502026, 31.20309514 ], [ 114.75439382, 31.20266274 ], [ 114.75297619, 31.20201759 ], [ 114.75146822, 31.20163373 ], [ 114.75080527, 31.20155179 ], [ 114.74992781, 31.20134199 ], [ 114.74924793, 31.2010575 ], [ 114.74872606, 31.20063455 ], [ 114.74757015, 31.19925205 ], [ 114.74726106, 31.19873576 ], [ 114.74709783, 31.19774773 ], [ 114.74685225, 31.1972874 ], [ 114.74473404, 31.19476389 ], [ 114.74422083, 31.1939435 ], [ 114.7432372, 31.1919899 ], [ 114.74194154, 31.19034043 ], [ 114.74139169, 31.18944851 ], [ 114.74130382, 31.18881363 ], [ 114.74150755, 31.18781687 ], [ 114.74147, 31.18639952 ], [ 114.74140497, 31.18597232 ], [ 114.74122043, 31.18548153 ], [ 114.74112432, 31.18476391 ], [ 114.74101893, 31.18449759 ], [ 114.74067142, 31.18414158 ], [ 114.74011584, 31.18374835 ], [ 114.73902372, 31.18339955 ], [ 114.73873239, 31.18324193 ], [ 114.73750239, 31.18227677 ], [ 114.73717842, 31.18190985 ], [ 114.73711162, 31.18164636 ], [ 114.737142, 31.18130771 ], [ 114.73740065, 31.18076618 ], [ 114.7380184, 31.17986588 ], [ 114.73847323, 31.17901482 ], [ 114.73854628, 31.17866609 ], [ 114.73851178, 31.17824082 ], [ 114.73821588, 31.17765034 ], [ 114.73781466, 31.17709056 ], [ 114.73548563, 31.17517395 ], [ 114.7347704, 31.1743323 ], [ 114.73446749, 31.17382247 ], [ 114.73422135, 31.17321827 ], [ 114.73419447, 31.1728908 ], [ 114.73431995, 31.17246705 ], [ 114.73442851, 31.17169515 ], [ 114.73505016, 31.17062928 ], [ 114.73507422, 31.17035598 ], [ 114.73500991, 31.1700929 ], [ 114.73486697, 31.16990583 ], [ 114.73460152, 31.16971958 ], [ 114.73402953, 31.16965156 ], [ 114.73300077, 31.16995848 ], [ 114.73211777, 31.17037225 ], [ 114.73169494, 31.17050168 ], [ 114.73133048, 31.17033961 ], [ 114.73034835, 31.16953373 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA98201D0000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA98201D0000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 6124.0, "RVSLP": 0.001, "IELV": 69.33, "OELV": 63.32, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": "BFA98202552", "RESRVID": "01" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87757436, 31.20723062 ], [ 114.87757202, 31.20700834 ], [ 114.87775238, 31.20683859 ], [ 114.87776592, 31.20674372 ], [ 114.87761355, 31.20596236 ], [ 114.87820854, 31.20513813 ], [ 114.87822919, 31.20467651 ], [ 114.87802469, 31.20440349 ], [ 114.87726225, 31.20411974 ], [ 114.87668976, 31.20362883 ], [ 114.87613562, 31.2027322 ], [ 114.87604751, 31.20194849 ], [ 114.87615648, 31.2015283 ], [ 114.87740589, 31.19916171 ], [ 114.87791167, 31.19794833 ], [ 114.87817389, 31.19690364 ], [ 114.8781799, 31.19624686 ], [ 114.87779793, 31.19470248 ], [ 114.87700421, 31.19242905 ], [ 114.87688213, 31.19103521 ], [ 114.87663637, 31.19026837 ], [ 114.87653394, 31.18878791 ], [ 114.8762029, 31.18791027 ], [ 114.87580377, 31.18711357 ], [ 114.87549548, 31.18683164 ], [ 114.87513399, 31.18662835 ], [ 114.87402543, 31.18656038 ], [ 114.87346361, 31.18643032 ], [ 114.872618, 31.18636615 ], [ 114.87108194, 31.1860459 ], [ 114.86943641, 31.18578788 ], [ 114.86874366, 31.18553171 ], [ 114.86764124, 31.18469566 ], [ 114.86718386, 31.18422739 ], [ 114.86694443, 31.1838387 ], [ 114.86663469, 31.18310179 ], [ 114.86658028, 31.18223991 ], [ 114.86688786, 31.18158993 ], [ 114.86720527, 31.18127421 ], [ 114.867843, 31.1809715 ], [ 114.86969179, 31.18032044 ], [ 114.87220562, 31.17916954 ], [ 114.8728586, 31.17883139 ], [ 114.87349244, 31.17827194 ], [ 114.87373177, 31.17795837 ], [ 114.87416824, 31.17709344 ], [ 114.87450996, 31.1755699 ], [ 114.87521599, 31.17351996 ], [ 114.87545948, 31.17319758 ], [ 114.87608772, 31.17261855 ], [ 114.8764268, 31.17237765 ], [ 114.87848891, 31.17141006 ], [ 114.8795623, 31.17102197 ], [ 114.88159815, 31.17006776 ], [ 114.88233402, 31.1694526 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA98202G0000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA98202G0000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 17254.0, "RVSLP": -0.0005, "IELV": 63.16, "OELV": 63.32, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": "BFA98202552", "RESRVID": "02" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86824148, 31.27444802 ], [ 114.86823319, 31.27424574 ], [ 114.86806432, 31.2740161 ], [ 114.86769241, 31.27317359 ], [ 114.86753815, 31.27010592 ], [ 114.86747491, 31.26983631 ], [ 114.8672943, 31.26961072 ], [ 114.86670789, 31.26935604 ], [ 114.86589958, 31.26916201 ], [ 114.86368878, 31.2689044 ], [ 114.86300577, 31.26873573 ], [ 114.86230822, 31.26830187 ], [ 114.86008849, 31.26762451 ], [ 114.85920067, 31.26717647 ], [ 114.85881546, 31.26686704 ], [ 114.85828247, 31.26619586 ], [ 114.85799587, 31.26501124 ], [ 114.85757373, 31.26461392 ], [ 114.85691227, 31.26425845 ], [ 114.85659752, 31.26399405 ], [ 114.85628153, 31.2634819 ], [ 114.85608004, 31.26280184 ], [ 114.85585104, 31.2624182 ], [ 114.85556446, 31.2621204 ], [ 114.85506739, 31.26181164 ], [ 114.85351832, 31.26150568 ], [ 114.8519084, 31.26088102 ], [ 114.85141053, 31.26055555 ], [ 114.85068473, 31.25994562 ], [ 114.85038616, 31.25951015 ], [ 114.85025818, 31.25916612 ], [ 114.85015197, 31.25745787 ], [ 114.84988378, 31.25654977 ], [ 114.84976577, 31.2546132 ], [ 114.84945947, 31.25402573 ], [ 114.84916357, 31.2537485 ], [ 114.84894582, 31.2536368 ], [ 114.84861401, 31.25358376 ], [ 114.84676241, 31.25363016 ], [ 114.84634617, 31.25371017 ], [ 114.84593753, 31.25399031 ], [ 114.84563767, 31.2543738 ], [ 114.84559641, 31.25493243 ], [ 114.84566602, 31.25520546 ], [ 114.84612976, 31.25600563 ], [ 114.84634629, 31.25653433 ], [ 114.84636154, 31.25678362 ], [ 114.84609141, 31.2571583 ], [ 114.84556798, 31.25759804 ], [ 114.84526437, 31.25773432 ], [ 114.84473415, 31.25785674 ], [ 114.84453237, 31.25781906 ], [ 114.84434159, 31.25769408 ], [ 114.84382711, 31.25710839 ], [ 114.84327849, 31.25671427 ], [ 114.84171212, 31.25621064 ], [ 114.84010999, 31.25556849 ], [ 114.83958752, 31.25528592 ], [ 114.8392727, 31.25521442 ], [ 114.83875825, 31.25520944 ], [ 114.83810789, 31.25466511 ], [ 114.83774385, 31.25415962 ], [ 114.83740952, 31.25357805 ], [ 114.83715245, 31.25296975 ], [ 114.8370794, 31.25262351 ], [ 114.8367016, 31.24383635 ], [ 114.83663316, 31.2434107 ], [ 114.83641608, 31.24278235 ], [ 114.83630367, 31.24061847 ], [ 114.8362419, 31.24026603 ], [ 114.83603622, 31.23970841 ], [ 114.83597187, 31.23889744 ], [ 114.83592991, 31.23732763 ], [ 114.83613169, 31.23633619 ], [ 114.83606506, 31.23426248 ], [ 114.83624797, 31.23346371 ], [ 114.83625416, 31.23206442 ], [ 114.83644275, 31.23121469 ], [ 114.8363577, 31.22867076 ], [ 114.83655589, 31.22767704 ], [ 114.83651638, 31.22544756 ], [ 114.83701117, 31.22394447 ], [ 114.83727206, 31.2234091 ], [ 114.83764031, 31.22283342 ], [ 114.83832003, 31.22218591 ], [ 114.83884183, 31.22175153 ], [ 114.83947091, 31.22135831 ], [ 114.84106834, 31.21993247 ], [ 114.84222773, 31.2191323 ], [ 114.84306864, 31.21861947 ], [ 114.84516165, 31.21751232 ], [ 114.84677249, 31.2165236 ], [ 114.84792038, 31.21550029 ], [ 114.84829073, 31.21492569 ], [ 114.8485939, 31.21351238 ], [ 114.84865232, 31.21265068 ], [ 114.84879973, 31.21215239 ], [ 114.84883818, 31.21113584 ], [ 114.84899756, 31.21056974 ], [ 114.8490361, 31.20955223 ], [ 114.84919564, 31.20898619 ], [ 114.84923518, 31.20826422 ], [ 114.84940062, 31.20762626 ], [ 114.84946148, 31.20676616 ], [ 114.8504226, 31.20463373 ], [ 114.85150642, 31.20259406 ], [ 114.85189276, 31.2014469 ], [ 114.85225088, 31.20069878 ], [ 114.85261067, 31.19962503 ], [ 114.85296173, 31.19887357 ], [ 114.85303093, 31.19772222 ], [ 114.8532036, 31.19701351 ], [ 114.853186, 31.19523549 ], [ 114.85356613, 31.19353837 ], [ 114.8536141, 31.1927457 ], [ 114.85397794, 31.19111419 ], [ 114.85404762, 31.19018438 ], [ 114.8545639, 31.18912237 ], [ 114.85517044, 31.18822368 ], [ 114.85586451, 31.1870038 ], [ 114.85767929, 31.18531381 ], [ 114.85911403, 31.18432968 ], [ 114.86133044, 31.18351236 ], [ 114.86266536, 31.18291977 ], [ 114.86314235, 31.18278425 ], [ 114.86525562, 31.18194578 ], [ 114.8666633, 31.1814383 ], [ 114.86705138, 31.18138387 ], [ 114.86775641, 31.18100592 ], [ 114.87014035, 31.18012606 ], [ 114.8728586, 31.17883139 ], [ 114.87360234, 31.17814815 ], [ 114.87410831, 31.1772371 ], [ 114.87449087, 31.17563517 ], [ 114.87496642, 31.17419777 ], [ 114.87521599, 31.17351996 ], [ 114.87551838, 31.17313829 ], [ 114.8764268, 31.17237765 ], [ 114.87848891, 31.17141006 ], [ 114.8795623, 31.17102197 ], [ 114.88113173, 31.17030358 ], [ 114.88177638, 31.16996584 ], [ 114.88233402, 31.1694526 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA98201E0000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA98201E0000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 14528.0, "RVSLP": 0.0003, "IELV": 67.45, "OELV": 63.32, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": "BFA98202552", "RESRVID": "03" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80165547, 31.24248088 ], [ 114.80326629, 31.24377014 ], [ 114.80377963, 31.24377375 ], [ 114.80482641, 31.24285586 ], [ 114.80565981, 31.24230836 ], [ 114.80642578, 31.24161833 ], [ 114.806782, 31.24117376 ], [ 114.8071023, 31.23978824 ], [ 114.80722317, 31.23952193 ], [ 114.80871751, 31.2381161 ], [ 114.80901233, 31.2377322 ], [ 114.80907569, 31.23731577 ], [ 114.80902158, 31.23552228 ], [ 114.80925333, 31.23454177 ], [ 114.8093759, 31.23427617 ], [ 114.81201098, 31.23183093 ], [ 114.81323402, 31.23097411 ], [ 114.81398579, 31.23066055 ], [ 114.81624426, 31.23060247 ], [ 114.81746916, 31.23082559 ], [ 114.81826832, 31.23102392 ], [ 114.8188044, 31.23123079 ], [ 114.82011434, 31.23221354 ], [ 114.82127678, 31.23336828 ], [ 114.82501732, 31.2363616 ], [ 114.82537385, 31.23658371 ], [ 114.82698034, 31.23721011 ], [ 114.8289221, 31.23762679 ], [ 114.82977847, 31.23763379 ], [ 114.83153562, 31.23718382 ], [ 114.83282205, 31.23707839 ], [ 114.8338661, 31.23682758 ], [ 114.83416819, 31.2367036 ], [ 114.83456241, 31.23638954 ], [ 114.83557002, 31.2354444 ], [ 114.83607177, 31.23476228 ], [ 114.83608052, 31.23407301 ], [ 114.8362554, 31.23339401 ], [ 114.83625416, 31.23206442 ], [ 114.83644275, 31.23121469 ], [ 114.8363577, 31.22867076 ], [ 114.83655589, 31.22767704 ], [ 114.83651638, 31.22544756 ], [ 114.83701117, 31.22394447 ], [ 114.83749188, 31.22302541 ], [ 114.83851381, 31.22201511 ], [ 114.83947091, 31.22135831 ], [ 114.84113624, 31.21988284 ], [ 114.84299774, 31.21865932 ], [ 114.84516165, 31.21751232 ], [ 114.84683968, 31.21647414 ], [ 114.84792038, 31.21550029 ], [ 114.84832373, 31.21485492 ], [ 114.84844806, 31.21401035 ], [ 114.8485939, 31.21351238 ], [ 114.84865232, 31.21265068 ], [ 114.84879973, 31.21215239 ], [ 114.84883818, 31.21113584 ], [ 114.84899756, 31.21056974 ], [ 114.8490361, 31.20955223 ], [ 114.84919564, 31.20898619 ], [ 114.84923518, 31.20826422 ], [ 114.84940062, 31.20762626 ], [ 114.84946148, 31.20676616 ], [ 114.8504226, 31.20463373 ], [ 114.85150642, 31.20259406 ], [ 114.85189276, 31.2014469 ], [ 114.85225088, 31.20069878 ], [ 114.85261067, 31.19962503 ], [ 114.85296173, 31.19887357 ], [ 114.85303093, 31.19772222 ], [ 114.8532036, 31.19701351 ], [ 114.853186, 31.19523549 ], [ 114.85356613, 31.19353837 ], [ 114.8536141, 31.1927457 ], [ 114.85397794, 31.19111419 ], [ 114.85404762, 31.19018438 ], [ 114.8545639, 31.18912237 ], [ 114.85517044, 31.18822368 ], [ 114.85581496, 31.18706767 ], [ 114.85767929, 31.18531381 ], [ 114.85911403, 31.18432968 ], [ 114.86133044, 31.18351236 ], [ 114.86266536, 31.18291977 ], [ 114.86314235, 31.18278425 ], [ 114.86525562, 31.18194578 ], [ 114.8666633, 31.1814383 ], [ 114.86705138, 31.18138387 ], [ 114.86775641, 31.18100592 ], [ 114.87014035, 31.18012606 ], [ 114.8728586, 31.17883139 ], [ 114.87360234, 31.17814815 ], [ 114.87410831, 31.1772371 ], [ 114.87449087, 31.17563517 ], [ 114.87496642, 31.17419777 ], [ 114.87521599, 31.17351996 ], [ 114.87551838, 31.17313829 ], [ 114.8764268, 31.17237765 ], [ 114.87848891, 31.17141006 ], [ 114.8795623, 31.17102197 ], [ 114.88113173, 31.17030358 ], [ 114.88177638, 31.16996584 ], [ 114.88233402, 31.1694526 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA9820500000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA9820500000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 18835.0, "RVSLP": 0.0003, "IELV": 69.04, "OELV": 63.32, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": "BFA98202552", "RESRVID": "04" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84396554, 31.29901483 ], [ 114.84394352, 31.29858212 ], [ 114.84373768, 31.29820838 ], [ 114.84358976, 31.29716423 ], [ 114.84339778, 31.29667638 ], [ 114.84326654, 31.2958233 ], [ 114.84303343, 31.29512636 ], [ 114.84282095, 31.29025499 ], [ 114.8427379, 31.28983641 ], [ 114.84251037, 31.28944157 ], [ 114.84190956, 31.28888296 ], [ 114.84094985, 31.28837992 ], [ 114.83954021, 31.28792756 ], [ 114.83825501, 31.28762138 ], [ 114.83693434, 31.28706278 ], [ 114.83630637, 31.28657005 ], [ 114.83567905, 31.28568272 ], [ 114.83478018, 31.28465895 ], [ 114.8344959, 31.28421404 ], [ 114.83440452, 31.28387453 ], [ 114.83446407, 31.2834612 ], [ 114.83481898, 31.28287658 ], [ 114.83646057, 31.28135382 ], [ 114.83693597, 31.28101906 ], [ 114.83752006, 31.28093019 ], [ 114.84084965, 31.28083314 ], [ 114.8417963, 31.28056038 ], [ 114.8420831, 31.28040325 ], [ 114.84341266, 31.279194 ], [ 114.84407527, 31.2783176 ], [ 114.84460626, 31.27733227 ], [ 114.84484937, 31.27651956 ], [ 114.84474643, 31.27612035 ], [ 114.84398179, 31.27492633 ], [ 114.84281936, 31.27354201 ], [ 114.84221839, 31.27295845 ], [ 114.84161038, 31.27200558 ], [ 114.8413015, 31.27127007 ], [ 114.84100627, 31.27037555 ], [ 114.84086858, 31.26967766 ], [ 114.84067798, 31.26918955 ], [ 114.84056154, 31.2674008 ], [ 114.84066027, 31.26683855 ], [ 114.84104964, 31.26641871 ], [ 114.84343022, 31.26513219 ], [ 114.84402281, 31.2646503 ], [ 114.84453997, 31.26410355 ], [ 114.84485851, 31.26314587 ], [ 114.84484459, 31.26210234 ], [ 114.84475395, 31.26145516 ], [ 114.84358845, 31.25999638 ], [ 114.84187842, 31.25818024 ], [ 114.84117847, 31.25755578 ], [ 114.84066002, 31.25696593 ], [ 114.83980505, 31.25624303 ], [ 114.83932422, 31.25568478 ], [ 114.83804358, 31.25459635 ], [ 114.83743727, 31.25364071 ], [ 114.83709946, 31.2527676 ], [ 114.8367016, 31.24383635 ], [ 114.83663316, 31.2434107 ], [ 114.83640661, 31.24271152 ], [ 114.83630367, 31.24061847 ], [ 114.83601501, 31.23956581 ], [ 114.83592577, 31.23769509 ], [ 114.83594419, 31.23718593 ], [ 114.83609631, 31.23668985 ], [ 114.83613169, 31.23633619 ], [ 114.83607104, 31.23416787 ], [ 114.83624797, 31.23346371 ], [ 114.83625416, 31.23206442 ], [ 114.83643915, 31.23128698 ], [ 114.8363577, 31.22867076 ], [ 114.83655589, 31.22767704 ], [ 114.83649784, 31.22573599 ], [ 114.83654607, 31.2253119 ], [ 114.83701117, 31.22394447 ], [ 114.83749188, 31.22302541 ], [ 114.83851381, 31.22201511 ], [ 114.83947091, 31.22135831 ], [ 114.84106834, 31.21993247 ], [ 114.84222773, 31.2191323 ], [ 114.84306864, 31.21861947 ], [ 114.84516165, 31.21751232 ], [ 114.84677249, 31.2165236 ], [ 114.84780015, 31.21562002 ], [ 114.84815847, 31.21518803 ], [ 114.84836978, 31.21471576 ], [ 114.84844806, 31.21401035 ], [ 114.8485939, 31.21351238 ], [ 114.84864048, 31.21271955 ], [ 114.84879973, 31.21215239 ], [ 114.84883818, 31.21113584 ], [ 114.84899756, 31.21056974 ], [ 114.8490361, 31.20955223 ], [ 114.84919564, 31.20898619 ], [ 114.84924364, 31.20819395 ], [ 114.84939008, 31.20769525 ], [ 114.84947952, 31.20669987 ], [ 114.85004444, 31.20556394 ], [ 114.8504226, 31.20463373 ], [ 114.85150642, 31.20259406 ], [ 114.85189276, 31.2014469 ], [ 114.85225088, 31.20069878 ], [ 114.85261067, 31.19962503 ], [ 114.85296173, 31.19887357 ], [ 114.85303093, 31.19772222 ], [ 114.8532036, 31.19701351 ], [ 114.853186, 31.19523549 ], [ 114.85356613, 31.19353837 ], [ 114.8536141, 31.1927457 ], [ 114.85397794, 31.19111419 ], [ 114.85404762, 31.19018438 ], [ 114.8545639, 31.18912237 ], [ 114.85517044, 31.18822368 ], [ 114.85586451, 31.1870038 ], [ 114.85767929, 31.18531381 ], [ 114.85911403, 31.18432968 ], [ 114.86133044, 31.18351236 ], [ 114.86266536, 31.18291977 ], [ 114.86314235, 31.18278425 ], [ 114.86525562, 31.18194578 ], [ 114.8666633, 31.1814383 ], [ 114.86705138, 31.18138387 ], [ 114.86775641, 31.18100592 ], [ 114.87014035, 31.18012606 ], [ 114.8728586, 31.17883139 ], [ 114.87360234, 31.17814815 ], [ 114.87410831, 31.1772371 ], [ 114.87449087, 31.17563517 ], [ 114.87496642, 31.17419777 ], [ 114.87521599, 31.17351996 ], [ 114.87551838, 31.17313829 ], [ 114.8764268, 31.17237765 ], [ 114.87848891, 31.17141006 ], [ 114.8795623, 31.17102197 ], [ 114.88113173, 31.17030358 ], [ 114.88177638, 31.16996584 ], [ 114.88233402, 31.1694526 ] ] ] } }, +{ "type": "Feature", "properties": { "RVCD": "AFA9820600000000", "RVNM": "浮桥河", "GB": "210501", "FRVCD": "AFA98203F0000000", "TRVCD": "AFA9820700000000", "INDCD": "QFA98203F0000000", "ONDCD": "QFA9820600000000", "BWSCD": "WFA9820600000000", "RSCD": "AFA00006", "RSNM": "长江干流水系", "RVTYPE": "9", "RVCS": 0.0, "RVLEN": 19580.0, "RVSLP": 0.0, "IELV": 63.74, "OELV": 63.32, "VR": "1", "LEVEL": 3, "ISDISP": "0", "DESP": null, "RESCD": "BFA98202552", "RESRVID": "05" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82334647, 31.30364179 ], [ 114.8230723, 31.30339764 ], [ 114.82295953, 31.29976161 ], [ 114.82310771, 31.29926394 ], [ 114.82323729, 31.29842173 ], [ 114.82373042, 31.29728633 ], [ 114.82446192, 31.29613373 ], [ 114.82481535, 31.29580212 ], [ 114.82592003, 31.29507515 ], [ 114.8262452, 31.29500432 ], [ 114.82762968, 31.29492044 ], [ 114.82888504, 31.29433799 ], [ 114.82966821, 31.29369317 ], [ 114.83049015, 31.29313353 ], [ 114.83583061, 31.28825599 ], [ 114.83628522, 31.2877701 ], [ 114.83638375, 31.28740536 ], [ 114.8363483, 31.28660422 ], [ 114.83567905, 31.28568272 ], [ 114.83473168, 31.28459552 ], [ 114.83444006, 31.28407819 ], [ 114.83441992, 31.28359965 ], [ 114.83471392, 31.28300297 ], [ 114.83646057, 31.28135382 ], [ 114.83693597, 31.28101906 ], [ 114.83752006, 31.28093019 ], [ 114.84084965, 31.28083314 ], [ 114.84201494, 31.2804501 ], [ 114.8435756, 31.27900748 ], [ 114.84437757, 31.27779782 ], [ 114.84460626, 31.27733227 ], [ 114.84484364, 31.27658426 ], [ 114.84483071, 31.27632206 ], [ 114.84474643, 31.27612035 ], [ 114.84398179, 31.27492633 ], [ 114.84281936, 31.27354201 ], [ 114.84221839, 31.27295845 ], [ 114.84161038, 31.27200558 ], [ 114.8413015, 31.27127007 ], [ 114.84100627, 31.27037555 ], [ 114.84086858, 31.26967766 ], [ 114.84067798, 31.26918955 ], [ 114.84056154, 31.2674008 ], [ 114.84066027, 31.26683855 ], [ 114.84104964, 31.26641871 ], [ 114.84343022, 31.26513219 ], [ 114.84402281, 31.2646503 ], [ 114.84453997, 31.26410355 ], [ 114.84485851, 31.26314587 ], [ 114.84484459, 31.26210234 ], [ 114.84475395, 31.26145516 ], [ 114.84358845, 31.25999638 ], [ 114.84187842, 31.25818024 ], [ 114.84117847, 31.25755578 ], [ 114.84066002, 31.25696593 ], [ 114.83980505, 31.25624303 ], [ 114.83932422, 31.25568478 ], [ 114.83804358, 31.25459635 ], [ 114.83743727, 31.25364071 ], [ 114.83708836, 31.25269559 ], [ 114.8367016, 31.24383635 ], [ 114.83663316, 31.2434107 ], [ 114.83640661, 31.24271152 ], [ 114.83630367, 31.24061847 ], [ 114.83601501, 31.23956581 ], [ 114.83592577, 31.23769509 ], [ 114.83594419, 31.23718593 ], [ 114.83609631, 31.23668985 ], [ 114.83613169, 31.23633619 ], [ 114.83607104, 31.23416787 ], [ 114.83624797, 31.23346371 ], [ 114.83625416, 31.23206442 ], [ 114.83644275, 31.23121469 ], [ 114.8363577, 31.22867076 ], [ 114.83655589, 31.22767704 ], [ 114.83650799, 31.22551785 ], [ 114.83704221, 31.2238729 ], [ 114.83749188, 31.22302541 ], [ 114.83781554, 31.22265244 ], [ 114.83870826, 31.22185135 ], [ 114.83947091, 31.22135831 ], [ 114.84106834, 31.21993247 ], [ 114.84299774, 31.21865932 ], [ 114.84516165, 31.21751232 ], [ 114.84670408, 31.21657 ], [ 114.84780015, 31.21562002 ], [ 114.84815847, 31.21518803 ], [ 114.84836978, 31.21471576 ], [ 114.84844806, 31.21401035 ], [ 114.8485939, 31.21351238 ], [ 114.84864048, 31.21271955 ], [ 114.84879973, 31.21215239 ], [ 114.84883818, 31.21113584 ], [ 114.84899756, 31.21056974 ], [ 114.8490361, 31.20955223 ], [ 114.84919564, 31.20898619 ], [ 114.84924364, 31.20819395 ], [ 114.84939008, 31.20769525 ], [ 114.84947952, 31.20669987 ], [ 114.85004444, 31.20556394 ], [ 114.8504226, 31.20463373 ], [ 114.85150642, 31.20259406 ], [ 114.85189276, 31.2014469 ], [ 114.85225088, 31.20069878 ], [ 114.85261067, 31.19962503 ], [ 114.85296173, 31.19887357 ], [ 114.85303093, 31.19772222 ], [ 114.8532036, 31.19701351 ], [ 114.853186, 31.19523549 ], [ 114.85356613, 31.19353837 ], [ 114.8536141, 31.1927457 ], [ 114.85397794, 31.19111419 ], [ 114.85404762, 31.19018438 ], [ 114.8545639, 31.18912237 ], [ 114.85517044, 31.18822368 ], [ 114.85586451, 31.1870038 ], [ 114.85767929, 31.18531381 ], [ 114.85911403, 31.18432968 ], [ 114.86133044, 31.18351236 ], [ 114.86266536, 31.18291977 ], [ 114.86314235, 31.18278425 ], [ 114.86525562, 31.18194578 ], [ 114.8666633, 31.1814383 ], [ 114.86705138, 31.18138387 ], [ 114.86775641, 31.18100592 ], [ 114.87014035, 31.18012606 ], [ 114.8728586, 31.17883139 ], [ 114.87360234, 31.17814815 ], [ 114.87410831, 31.1772371 ], [ 114.87449087, 31.17563517 ], [ 114.87496642, 31.17419777 ], [ 114.87521599, 31.17351996 ], [ 114.87551838, 31.17313829 ], [ 114.8764268, 31.17237765 ], [ 114.87848891, 31.17141006 ], [ 114.8795623, 31.17102197 ], [ 114.88113173, 31.17030358 ], [ 114.88177638, 31.16996584 ], [ 114.88233402, 31.1694526 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/九级路.geojson b/public/mapbox/geojson/九级路.geojson new file mode 100644 index 0000000..afd6eaf --- /dev/null +++ b/public/mapbox/geojson/九级路.geojson @@ -0,0 +1,8 @@ +{ +"type": "FeatureCollection", +"name": "九级路", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ + +] +} diff --git a/public/mapbox/geojson/乡镇名称.geojson b/public/mapbox/geojson/乡镇名称.geojson new file mode 100644 index 0000000..96dada4 --- /dev/null +++ b/public/mapbox/geojson/乡镇名称.geojson @@ -0,0 +1,26 @@ +{ +"type": "FeatureCollection", +"name": "乡镇名称", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.17064", "Name": "福田河镇", "pyname": "fthz", "mapid": "475510", "kind": "BB84", "display_x": "115.10008", "display_y": "31.47217" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.09447266, 31.47401502 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18570", "Name": "三河口镇", "pyname": "shkz", "mapid": "465571", "kind": "BB84", "display_x": "115.23409", "display_y": "31.32825" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.22867706, 31.33030734 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18618", "Name": "铁门岗乡", "pyname": "tmgx", "mapid": "465446", "kind": "BB84", "display_x": "114.85459", "display_y": "31.03854" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.84943956, 31.04089011 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18683", "Name": "南湖街道", "pyname": "nhjd", "mapid": "465457", "kind": "BB84", "display_x": "114.99997", "display_y": "31.16642" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.99464754, 31.16857964 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18684", "Name": "龙池桥街道", "pyname": "lcqjd", "mapid": "465560", "kind": "BB84", "display_x": "115.02615", "display_y": "31.18465" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.02073188, 31.18672346 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18726", "Name": "中馆驿镇", "pyname": "zgyz", "mapid": "465457", "kind": "BB84", "display_x": "114.89362", "display_y": "31.12354" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.88850982, 31.12588773 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18738", "Name": "黄土岗镇", "pyname": "htgz", "mapid": "475500", "kind": "BB84", "display_x": "115.07725", "display_y": "31.37308" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.07167872, 31.37496863 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18972", "Name": "张家畈镇", "pyname": "zjfz", "mapid": "465542", "kind": "BB84", "display_x": "115.31901", "display_y": "31.04693" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.31354922, 31.04906621 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.18992", "Name": "木子店镇", "pyname": "mzdz", "mapid": "465562", "kind": "BB84", "display_x": "115.36739", "display_y": "31.18886" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.36181316, 31.1908325 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19028", "Name": "阎家河镇", "pyname": "yjhz", "mapid": "465560", "kind": "BB84", "display_x": "115.111", "display_y": "31.20534" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.10541954, 31.20727892 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19094", "Name": "岐亭镇", "pyname": "qtz", "mapid": "465446", "kind": "BB84", "display_x": "114.75407", "display_y": "31.01766" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.74877906, 31.01989509 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19118", "Name": "龟山镇", "pyname": "gsz", "mapid": "465541", "kind": "BB84", "display_x": "115.18814", "display_y": "31.07342" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.18268508, 31.07553696 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19131", "Name": "宋埠镇", "pyname": "sbz", "mapid": "465446", "kind": "BB84", "display_x": "114.80561", "display_y": "31.07092" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.8003577, 31.07316308 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19233", "Name": "白果镇", "pyname": "bgz", "mapid": "465540", "kind": "BB84", "display_x": "115.01564", "display_y": "31.03899" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.01027172, 31.04117276 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19239", "Name": "乘马岗镇", "pyname": "cmgz", "mapid": "475407", "kind": "BB84", "display_x": "114.98292", "display_y": "31.35406" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.97764042, 31.35618873 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19276", "Name": "夫子河镇", "pyname": "fzhz", "mapid": "465530", "kind": "BB84", "display_x": "115.02573", "display_y": "30.96608" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.02033282, 30.96827595 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19277", "Name": "顺河镇", "pyname": "shz", "mapid": "465476", "kind": "BB84", "display_x": "114.83602", "display_y": "31.3" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 114.8308083, 31.30218509 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19366", "Name": "盐田河镇", "pyname": "ythz", "mapid": "465531", "kind": "BB84", "display_x": "115.17824", "display_y": "30.96138" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.17277626, 30.96354411 ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_town_pt.19430", "Name": "鼓楼街道", "pyname": "gljd", "mapid": "465560", "kind": "BB84", "display_x": "115.04535", "display_y": "31.16792" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.03987308, 31.16995362 ] ] } } +] +} diff --git a/public/mapbox/geojson/乡镇边界.geojson b/public/mapbox/geojson/乡镇边界.geojson new file mode 100644 index 0000000..a55b614 --- /dev/null +++ b/public/mapbox/geojson/乡镇边界.geojson @@ -0,0 +1,57 @@ +{ +"type": "FeatureCollection", +"name": "乡镇边界", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.9889", "Name": "沙河乡", "layer": "乡镇", "code": "341524206000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.401436279127836, 31.339818153580676 ], [ 115.402225121, 31.341332268 ], [ 115.403336274, 31.343947669 ], [ 115.404378612, 31.344928664000101 ], [ 115.40713085199999, 31.3467591470001 ], [ 115.410656045, 31.3489823090001 ], [ 115.414910561, 31.351826411 ], [ 115.41634299, 31.352481404000098 ], [ 115.417117653903702, 31.352482096789164 ], [ 115.41628617, 31.35210178 ], [ 115.41203517, 31.34925985 ], [ 115.40851217, 31.3470379 ], [ 115.40576117, 31.34520894 ], [ 115.40471917, 31.34422796 ], [ 115.40360817, 31.34161202 ], [ 115.40275717, 31.33997706 ], [ 115.40170717, 31.33977906 ], [ 115.401436279127836, 31.339818153580676 ] ] ], [ [ [ 115.424132162, 31.350456245 ], [ 115.42602498799999, 31.351305348 ], [ 115.426796894957306, 31.351305713716577 ], [ 115.42549617, 31.35072281 ], [ 115.42366617, 31.34921985 ], [ 115.42235002394122, 31.348993908127877 ], [ 115.424132162, 31.350456245 ] ] ], [ [ [ 115.450249507, 31.316223983 ], [ 115.452402294, 31.317270471 ], [ 115.45456416499999, 31.319625645 ], [ 115.455415572, 31.320016526000099 ], [ 115.455921889440958, 31.319854290324692 ], [ 115.45585917, 31.31982552 ], [ 115.45370317, 31.31747458 ], [ 115.45155517, 31.3164326 ], [ 115.44966717, 31.31604561 ], [ 115.449525102291418, 31.31607434896641 ], [ 115.450249507, 31.316223983 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24838", "Name": "冯店乡", "layer": "乡镇", "code": "411524213000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.170171291403889, 31.602558933082772 ], [ 115.17135182, 31.60079523 ], [ 115.17174299, 31.59667608 ], [ 115.17141275, 31.59187162 ], [ 115.17194228, 31.58690381 ], [ 115.17377352, 31.58115049 ], [ 115.17488489, 31.57971162 ], [ 115.174884923792291, 31.579711593751696 ], [ 115.174884946, 31.579711565 ], [ 115.178669782, 31.5767716780001 ], [ 115.181681885, 31.574744233 ], [ 115.18566560799999, 31.573861315 ], [ 115.186646492584671, 31.573273055445764 ], [ 115.18710636, 31.57268393 ], [ 115.18736695, 31.57150845 ], [ 115.18684616, 31.56954668 ], [ 115.18631635, 31.56752189 ], [ 115.18664604, 31.56673652 ], [ 115.186646081791352, 31.566736484701003 ], [ 115.18664609299999, 31.566736458 ], [ 115.187496743, 31.5660179670001 ], [ 115.18997936, 31.5652972120001 ], [ 115.192071142, 31.564840695 ], [ 115.195993915, 31.5646429550001 ], [ 115.19814643, 31.565035218 ], [ 115.2006373, 31.5660158260001 ], [ 115.20180908499999, 31.5662114900001 ], [ 115.203120091121576, 31.565623375020326 ], [ 115.20423086, 31.56366108 ], [ 115.20566232, 31.55908633 ], [ 115.205662370618839, 31.559086277414032 ], [ 115.205662372, 31.559086273 ], [ 115.207172603, 31.557517352 ], [ 115.21011454, 31.556665049000099 ], [ 115.21428952799999, 31.556534774000099 ], [ 115.220434654, 31.557154667000098 ], [ 115.225537567, 31.5584625400001 ], [ 115.227628889, 31.558786881000099 ], [ 115.228131306303439, 31.558705933487602 ], [ 115.22807647, 31.55836802 ], [ 115.22706047, 31.55853201 ], [ 115.22497047, 31.55820902 ], [ 115.21987147, 31.55690504 ], [ 115.21373247, 31.55629106 ], [ 115.20956347, 31.55642705 ], [ 115.20662547, 31.55728204 ], [ 115.20511747, 31.55885301 ], [ 115.20368747, 31.56342992 ], [ 115.20257847, 31.56539388 ], [ 115.20126947, 31.56598387 ], [ 115.20009947, 31.56579088 ], [ 115.19761347, 31.56481389 ], [ 115.19546347, 31.5644239 ], [ 115.19154747, 31.5646289 ], [ 115.18945947, 31.56508789 ], [ 115.18698147, 31.56581288 ], [ 115.18613247, 31.56653286 ], [ 115.18580347, 31.56731885 ], [ 115.18633247, 31.56934281 ], [ 115.18685247, 31.57130377 ], [ 115.18659247, 31.57248075 ], [ 115.18613347, 31.57306974 ], [ 115.18515447, 31.57365973 ], [ 115.18117847, 31.57454971 ], [ 115.17817247, 31.57658267 ], [ 115.17439547, 31.57953062 ], [ 115.17328747, 31.58097159 ], [ 115.17145947, 31.58672748 ], [ 115.17093147, 31.59169639 ], [ 115.17126147, 31.5965003 ], [ 115.17101947, 31.59905725 ], [ 115.17087147, 31.60062022 ], [ 115.16969347, 31.60238618 ], [ 115.16820747, 31.60338317 ], [ 115.16828647, 31.60357116 ], [ 115.168427463976059, 31.603723148686317 ], [ 115.170171291403889, 31.602558933082772 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24840", "Name": "达权店镇", "layer": "乡镇", "code": "411524106000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.228131306303439, 31.558705933487602 ], [ 115.22965105199999, 31.5584610780001 ], [ 115.230171313224673, 31.558198389519401 ], [ 115.23050152, 31.55748066 ], [ 115.230150531398493, 31.556773374602724 ], [ 115.23004747, 31.55676405 ], [ 115.22977147, 31.55690104 ], [ 115.22993147, 31.55722404 ], [ 115.22960147, 31.55794202 ], [ 115.22908147, 31.55820502 ], [ 115.22807647, 31.55836802 ], [ 115.228131306303439, 31.558705933487602 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24842", "Name": "长竹园乡", "layer": "乡镇", "code": "411524215000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.230150531398493, 31.556773374602724 ], [ 115.2301114, 31.55669452 ], [ 115.22794944, 31.5542775 ], [ 115.22592752, 31.55022454 ], [ 115.22481711, 31.54623813 ], [ 115.22468621, 31.54401524 ], [ 115.22507671, 31.54156376 ], [ 115.22514688, 31.54025693 ], [ 115.2242964, 31.53875347 ], [ 115.22226508, 31.53581121 ], [ 115.21985254, 31.52966784 ], [ 115.21834249, 31.52554894 ], [ 115.21612147, 31.52299909 ], [ 115.21396832, 31.52077812 ], [ 115.21337876, 31.51953663 ], [ 115.21278827, 31.51731426 ], [ 115.21285754, 31.51522261 ], [ 115.21317909, 31.51326022 ], [ 115.21389916, 31.51051538 ], [ 115.21409853, 31.50891381 ], [ 115.21357815, 31.50656158 ], [ 115.21252821, 31.50348886 ], [ 115.20860483, 31.4977361 ], [ 115.20736434, 31.49590682 ], [ 115.20684376, 31.49440339 ], [ 115.20691306, 31.49211584 ], [ 115.20769427, 31.49041711 ], [ 115.21011477, 31.48655771 ], [ 115.21148674, 31.48358482 ], [ 115.21259747, 31.47907286 ], [ 115.21311757, 31.47358143 ], [ 115.21291876, 31.46887508 ], [ 115.21161657, 31.46488838 ], [ 115.20952513, 31.46302527 ], [ 115.20749477, 31.45949646 ], [ 115.20678587, 31.4587747 ], [ 115.2064526, 31.45661871 ], [ 115.20553269, 31.45243737 ], [ 115.2050815, 31.44746782 ], [ 115.2057327, 31.44433037 ], [ 115.20691256, 31.44184645 ], [ 115.206912605511491, 31.441846396133737 ], [ 115.206912605511491, 31.44184639613373 ], [ 115.206912607, 31.441846393 ], [ 115.208735238, 31.439689169000101 ], [ 115.21095720081486, 31.437760301675826 ], [ 115.21337864, 31.43141854 ], [ 115.21507978, 31.42873799 ], [ 115.215079817641609, 31.428737958200706 ], [ 115.215079833, 31.428737934 ], [ 115.216780762, 31.4273010040001 ], [ 115.218473476, 31.4269727070001 ], [ 115.223246536, 31.428148491000101 ], [ 115.227559438, 31.429128257000102 ], [ 115.230441046, 31.428734985000101 ], [ 115.234033661, 31.427164976 ], [ 115.237886796, 31.4253346190001 ], [ 115.241419205, 31.424418451000101 ], [ 115.24364112799999, 31.4244835760001 ], [ 115.245792868, 31.424319573 ], [ 115.247163638415046, 31.423731600108876 ], [ 115.248524479530971, 31.422048191723455 ], [ 115.251844586, 31.417941098 ], [ 115.252785210598105, 31.417139026838697 ], [ 115.25487935, 31.41418506 ], [ 115.2549405, 31.41209358 ], [ 115.25376849, 31.40817206 ], [ 115.24631408, 31.39794448 ], [ 115.24494243, 31.39657094 ], [ 115.24455162, 31.39500238 ], [ 115.24507265, 31.3938257 ], [ 115.245072680357183, 31.393825686618641 ], [ 115.245072680357183, 31.393825686618637 ], [ 115.245072701, 31.39382564 ], [ 115.251643082, 31.390929426000099 ], [ 115.25313643, 31.390535076 ], [ 115.25500953, 31.3894436900001 ], [ 115.257560896, 31.389836415 ], [ 115.260067060802626, 31.391221286012541 ], [ 115.25959347, 31.39073018 ], [ 115.25697947, 31.3895522 ], [ 115.25442647, 31.3891592 ], [ 115.24448647, 31.39353912 ], [ 115.24396547, 31.3947161 ], [ 115.24435647, 31.39628507 ], [ 115.24572747, 31.39765904 ], [ 115.25318547, 31.40789185 ], [ 115.25435847, 31.41181378 ], [ 115.25429747, 31.41390674 ], [ 115.24658047, 31.42345256 ], [ 115.24593147, 31.42373155 ], [ 115.24520847, 31.42404155 ], [ 115.24305647, 31.42420455 ], [ 115.24083447, 31.42413955 ], [ 115.23730347, 31.42505753 ], [ 115.23345147, 31.4268895 ], [ 115.22985947, 31.42846047 ], [ 115.22698047, 31.42885546 ], [ 115.22266947, 31.42787848 ], [ 115.21790047, 31.4267075 ], [ 115.21620947, 31.42703649 ], [ 115.21451047, 31.42847547 ], [ 115.21281147, 31.43115841 ], [ 115.21039347, 31.43750429 ], [ 115.20817547, 31.43943726 ], [ 115.20635547, 31.44159722 ], [ 115.20517647, 31.44408217 ], [ 115.20452647, 31.44722111 ], [ 115.20497747, 31.45219102 ], [ 115.20589647, 31.45637294 ], [ 115.20693747, 31.45924889 ], [ 115.20896547, 31.46277582 ], [ 115.21105547, 31.46463778 ], [ 115.21235547, 31.46862271 ], [ 115.21245147, 31.47088567 ], [ 115.21255547, 31.47333062 ], [ 115.21203547, 31.47882252 ], [ 115.21092647, 31.48333643 ], [ 115.20955747, 31.48631138 ], [ 115.20713947, 31.4901743 ], [ 115.20635947, 31.49187427 ], [ 115.20629047, 31.49416223 ], [ 115.20681047, 31.4956652 ], [ 115.20805047, 31.49749316 ], [ 115.21196847, 31.50324206 ], [ 115.21277547, 31.50560601 ], [ 115.21301747, 31.506314 ], [ 115.21353747, 31.50866595 ], [ 115.21333847, 31.51026792 ], [ 115.21261947, 31.51301487 ], [ 115.21229847, 31.51497684 ], [ 115.21223147, 31.5169948 ], [ 115.21222947, 31.5170688 ], [ 115.21281947, 31.51929075 ], [ 115.21340947, 31.52053173 ], [ 115.21555947, 31.52275169 ], [ 115.21777847, 31.52529864 ], [ 115.21928747, 31.52941656 ], [ 115.22169947, 31.53555845 ], [ 115.22372847, 31.53849939 ], [ 115.22457847, 31.54000236 ], [ 115.22450947, 31.54130934 ], [ 115.22411947, 31.54376229 ], [ 115.22424947, 31.54598425 ], [ 115.22483447, 31.54808221 ], [ 115.22510647, 31.54905919 ], [ 115.22536047, 31.54997018 ], [ 115.22738147, 31.5540221 ], [ 115.22738147, 31.5540231 ], [ 115.22954147, 31.55643805 ], [ 115.22977147, 31.55690104 ], [ 115.23004747, 31.55676405 ], [ 115.230150531398493, 31.556773374602724 ] ] ], [ [ [ 115.272782821, 31.401041503 ], [ 115.275924524, 31.40189187 ], [ 115.280108407, 31.401433993000101 ], [ 115.2845514, 31.3996026290001 ], [ 115.288604553209765, 31.397052531047255 ], [ 115.29219735, 31.39175658 ], [ 115.29566116, 31.38607066 ], [ 115.295661172195324, 31.386070654208307 ], [ 115.295661204, 31.3860706020001 ], [ 115.298143336, 31.384891811 ], [ 115.301736961, 31.38436878 ], [ 115.307962331454874, 31.385394487324756 ], [ 115.30757747, 31.38519328 ], [ 115.30121947, 31.3841363 ], [ 115.29761847, 31.38465329 ], [ 115.29513147, 31.38582827 ], [ 115.29166247, 31.39151116 ], [ 115.28806347, 31.39680206 ], [ 115.28400247, 31.39934801 ], [ 115.27955247, 31.40117298 ], [ 115.27536347, 31.40162597 ], [ 115.27442847, 31.40137298 ], [ 115.272320117645123, 31.400800845070371 ], [ 115.272782821, 31.401041503 ] ] ], [ [ [ 115.331803905, 31.405907309 ], [ 115.33311498499999, 31.405972825 ], [ 115.338080284, 31.40433907 ], [ 115.34507788, 31.401919305 ], [ 115.347299479, 31.401526637000099 ], [ 115.349721743, 31.40185454 ], [ 115.354248350599221, 31.403303046422664 ], [ 115.35422547, 31.40329294 ], [ 115.34931047, 31.40171597 ], [ 115.34688447, 31.40138398 ], [ 115.34465747, 31.40177197 ], [ 115.33764547, 31.40417992 ], [ 115.33266947, 31.40580489 ], [ 115.331417804091458, 31.405741068374528 ], [ 115.331803905, 31.405907309 ] ] ], [ [ [ 115.361102991068861, 31.406279265311053 ], [ 115.361225233, 31.406333159 ], [ 115.36436841699999, 31.40711888 ], [ 115.367659969306146, 31.407590349071288 ], [ 115.36764247, 31.40753086 ], [ 115.36398247, 31.40700187 ], [ 115.361102991068861, 31.406279265311053 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24939", "Name": "沙窝镇", "layer": "乡镇", "code": "411523101000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.129033385996848, 31.60421188985174 ], [ 115.129248454, 31.604287524 ], [ 115.14337313199999, 31.606251033 ], [ 115.15330481, 31.606808409000099 ], [ 115.15886892, 31.606480643000101 ], [ 115.161942206, 31.605827392 ], [ 115.168210186, 31.603868208000101 ], [ 115.168427463976059, 31.603723148686317 ], [ 115.16828647, 31.60357116 ], [ 115.16820747, 31.60338317 ], [ 115.16773647, 31.60369916 ], [ 115.16148147, 31.60567012 ], [ 115.15841547, 31.60632911 ], [ 115.15286147, 31.6066671 ], [ 115.14294847, 31.60612811 ], [ 115.129033385996848, 31.60421188985174 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24945", "Name": "田铺乡", "layer": "乡镇", "code": "411523210000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.968525677134508, 31.498474743642742 ], [ 114.970839374956313, 31.498012466380356 ], [ 114.97227149, 31.49696658 ], [ 114.97345152, 31.49520148 ], [ 114.97489317, 31.48683369 ], [ 114.97717542, 31.4824538 ], [ 114.97907677, 31.48036157 ], [ 114.98005727, 31.47977378 ], [ 114.980057418083902, 31.479773779939336 ], [ 114.980057438, 31.479773768 ], [ 114.981619756, 31.479773130000101 ], [ 114.983581399025525, 31.479838251324104 ], [ 114.98437151, 31.47947795 ], [ 114.98574258, 31.47803907 ], [ 114.98828549, 31.47418306 ], [ 114.98979593, 31.47339961 ], [ 114.99201765, 31.47333385 ], [ 114.992017763002536, 31.473333890432784 ], [ 114.992017879, 31.473333887 ], [ 114.992360248850048, 31.47345638777891 ], [ 114.99229847, 31.47338162 ], [ 114.99138447, 31.47305263 ], [ 114.98915347, 31.47311162 ], [ 114.98763747, 31.47389061 ], [ 114.98508547, 31.47773954 ], [ 114.98370947, 31.47917451 ], [ 114.98291647, 31.4795325 ], [ 114.98094747, 31.4794625 ], [ 114.97937947, 31.47945751 ], [ 114.97839547, 31.48004249 ], [ 114.97648847, 31.48212945 ], [ 114.97419747, 31.48650337 ], [ 114.97275247, 31.49486821 ], [ 114.97156747, 31.49663018 ], [ 114.97013047, 31.49767216 ], [ 114.96843347, 31.49800516 ], [ 114.968525677134508, 31.498474743642742 ] ] ], [ [ [ 114.996652843, 31.504023720000099 ], [ 115.004101577969465, 31.506708333228548 ], [ 115.00404647, 31.50666099 ], [ 114.99840247, 31.50461703 ], [ 114.996632296418667, 31.503976068417025 ], [ 114.996652843, 31.504023720000099 ] ] ], [ [ [ 115.018670316634086, 31.530363079633201 ], [ 115.018884692, 31.530532527 ], [ 115.02149773, 31.530727248000101 ], [ 115.023980426112274, 31.530334534298703 ], [ 115.024116946525183, 31.530219512342597 ], [ 115.024831609998728, 31.529617383238357 ], [ 115.02483093, 31.5260208 ], [ 115.02529157, 31.52432177 ], [ 115.0269842, 31.52262351 ], [ 115.026984221140069, 31.522623497006037 ], [ 115.026984265, 31.522623453000101 ], [ 115.032939869, 31.518962789000099 ], [ 115.037255124, 31.518244576 ], [ 115.039347151, 31.518375779000099 ], [ 115.04235182, 31.519159072 ], [ 115.04340299099999, 31.519446798 ], [ 115.044425294965734, 31.51903573152088 ], [ 115.044541, 31.51881555 ], [ 115.04455502, 31.51816661 ], [ 115.04444238, 31.51747993 ], [ 115.04449128, 31.51717386 ], [ 115.04467583, 31.51687052 ], [ 115.044675869591529, 31.516870504832973 ], [ 115.044675892, 31.516870468 ], [ 115.046515217834312, 31.516165842302485 ], [ 115.04679455, 31.5155754 ], [ 115.046794608835668, 31.515575362257323 ], [ 115.046794617, 31.515575345000101 ], [ 115.047119825, 31.5153667290001 ], [ 115.047350523573314, 31.515370404545234 ], [ 115.04706447, 31.51524683 ], [ 115.04667247, 31.51523983 ], [ 115.04634647, 31.51544783 ], [ 115.04606647, 31.51603782 ], [ 115.04422347, 31.5167388 ], [ 115.04403747, 31.5170428 ], [ 115.04398947, 31.51734779 ], [ 115.04410147, 31.51803578 ], [ 115.04408747, 31.51868477 ], [ 115.04397147, 31.51890476 ], [ 115.04294647, 31.51931275 ], [ 115.04189247, 31.51902376 ], [ 115.03888047, 31.51823277 ], [ 115.03678147, 31.51809778 ], [ 115.03245447, 31.51880476 ], [ 115.03214647, 31.51899276 ], [ 115.02647947, 31.52245069 ], [ 115.02478147, 31.52414466 ], [ 115.02432047, 31.52584363 ], [ 115.02432047, 31.52943956 ], [ 115.02346647, 31.53015555 ], [ 115.02097547, 31.53054154 ], [ 115.018670316634086, 31.530363079633201 ] ] ], [ [ [ 115.049358974835101, 31.516345804977938 ], [ 115.049664546, 31.5164486890001 ], [ 115.050104501, 31.51650786 ], [ 115.052005185, 31.515729497000098 ], [ 115.052818411, 31.515158134 ], [ 115.05368852399999, 31.5147946720001 ], [ 115.054674409, 31.5146040240001 ], [ 115.056291069, 31.513992447000099 ], [ 115.057282293047265, 31.513375510176019 ], [ 115.05718447, 31.51318387 ], [ 115.05694347, 31.51321487 ], [ 115.05586447, 31.51388286 ], [ 115.05424547, 31.51449084 ], [ 115.05325647, 31.51467984 ], [ 115.05238547, 31.51504283 ], [ 115.05157047, 31.51561282 ], [ 115.04966547, 31.51638681 ], [ 115.049358974835101, 31.516345804977938 ] ] ], [ [ [ 115.058794964, 31.515044406000101 ], [ 115.059097350868441, 31.514962972730387 ], [ 115.05940777, 31.51448762 ], [ 115.05990395, 31.51310207 ], [ 115.0602703, 31.51268359 ], [ 115.060270368402186, 31.512683545109823 ], [ 115.060270372, 31.512683541000101 ], [ 115.060734538, 31.512378917 ], [ 115.06181657, 31.512412396000101 ], [ 115.062913616, 31.512652879 ], [ 115.064101587, 31.512706322 ], [ 115.064543814868316, 31.512713759375622 ], [ 115.0647285, 31.51244562 ], [ 115.06508296, 31.51211122 ], [ 115.065082973524227, 31.512111215619694 ], [ 115.065083024, 31.512111168 ], [ 115.065298754725035, 31.512041295673875 ], [ 115.06500147, 31.51190789 ], [ 115.06467247, 31.51201389 ], [ 115.06431747, 31.51234689 ], [ 115.06413247, 31.51261488 ], [ 115.06369047, 31.51260788 ], [ 115.06250047, 31.51255188 ], [ 115.06140047, 31.51231089 ], [ 115.06031647, 31.51227489 ], [ 115.05985147, 31.51257888 ], [ 115.05948447, 31.51299687 ], [ 115.05898847, 31.51438185 ], [ 115.05867747, 31.51485784 ], [ 115.058441933149126, 31.514920805296768 ], [ 115.058794964, 31.515044406000101 ] ] ], [ [ [ 115.066800279, 31.512472062 ], [ 115.06780874099999, 31.512645891 ], [ 115.069060935, 31.5125345430001 ], [ 115.06981790499999, 31.512225795000099 ], [ 115.07043876417579, 31.512154437098499 ], [ 115.07003847, 31.51206289 ], [ 115.06941447, 31.51213389 ], [ 115.06865747, 31.51244188 ], [ 115.06740347, 31.51255188 ], [ 115.066578559255262, 31.512408949920466 ], [ 115.066800279, 31.512472062 ] ] ], [ [ [ 115.07777465267425, 31.511082192085663 ], [ 115.077779171115324, 31.511061545305392 ], [ 115.077759449814408, 31.511079499131228 ], [ 115.07777465267425, 31.511082192085663 ] ] ], [ [ [ 115.081064909, 31.5102363620001 ], [ 115.082246059, 31.50979284 ], [ 115.082400487559838, 31.509758685419492 ], [ 115.08238147, 31.50974493 ], [ 115.08201347, 31.50976193 ], [ 115.08151047, 31.51001193 ], [ 115.080943970059494, 31.510204391926141 ], [ 115.081064909, 31.5102363620001 ] ] ], [ [ [ 115.084532227918658, 31.510580470964058 ], [ 115.084608428, 31.510561759 ], [ 115.085410999, 31.510182536000102 ], [ 115.085570030033466, 31.510061453058356 ], [ 115.08575777, 31.50991851 ], [ 115.08575777319416, 31.509918509296412 ], [ 115.085757834, 31.509918463000101 ], [ 115.086098852325975, 31.509843344577995 ], [ 115.08575147, 31.50975293 ], [ 115.08536947, 31.50983593 ], [ 115.08502347, 31.51010093 ], [ 115.08478047, 31.51041092 ], [ 115.084532227918658, 31.510580470964058 ] ] ], [ [ [ 115.08874038099999, 31.510816620000099 ], [ 115.089767024, 31.510735475 ], [ 115.090424989713483, 31.510403304099135 ], [ 115.09023747, 31.51022192 ], [ 115.08938047, 31.51065492 ], [ 115.088362835062796, 31.510735181372844 ], [ 115.08874038099999, 31.510816620000099 ] ] ], [ [ [ 115.087200106, 31.520935631 ], [ 115.08896937, 31.520936270000099 ], [ 115.09290332438448, 31.521435667395654 ], [ 115.09270947, 31.52137971 ], [ 115.08858347, 31.52085572 ], [ 115.087181207111939, 31.520854927313234 ], [ 115.087200106, 31.520935631 ] ] ], [ [ [ 114.997540589583977, 31.487518479697087 ], [ 114.99658757748648, 31.487226119292497 ], [ 114.99665333, 31.487322313000099 ], [ 114.997540589583977, 31.487518479697087 ] ] ], [ [ [ 115.071820319624848, 31.512062950537004 ], [ 115.07174547, 31.51204889 ], [ 115.07133247, 31.51220089 ], [ 115.070933037106883, 31.51226646853469 ], [ 115.071330867, 31.512357275000099 ], [ 115.071820319624848, 31.512062950537004 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24949", "Name": "箭厂河乡", "layer": "乡镇", "code": "411523208000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.824223546568149, 31.460643516833084 ], [ 114.824612403153367, 31.461047452500086 ], [ 114.824612442, 31.461047364 ], [ 114.82909189199999, 31.460719824000101 ], [ 114.831596382951972, 31.460977695401695 ], [ 114.83086247, 31.46059386 ], [ 114.82831647, 31.46033587 ], [ 114.824223546568149, 31.460643516833084 ] ] ], [ [ [ 114.845496142, 31.4783358970001 ], [ 114.847657102, 31.478531455000098 ], [ 114.85641489, 31.480164742000099 ], [ 114.857488450271191, 31.480340773399316 ], [ 114.85787347, 31.48010949 ], [ 114.85558947, 31.4797375 ], [ 114.84684747, 31.47811753 ], [ 114.845074576617364, 31.477959793424713 ], [ 114.845496142, 31.4783358970001 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.24952", "Name": "泗店乡", "layer": "乡镇", "code": "411523209000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.864781885, 31.481536676000101 ], [ 114.86804497, 31.4812085310001 ], [ 114.870136370767298, 31.480489925229165 ], [ 114.87065703, 31.47911676 ], [ 114.87098786, 31.47362608 ], [ 114.87163862, 31.47277789 ], [ 114.871638635702851, 31.472777887163737 ], [ 114.871638688, 31.472777819 ], [ 114.878894225, 31.471467319000102 ], [ 114.881575994, 31.471662099000099 ], [ 114.884844548999865, 31.473169334623496 ], [ 114.88412147, 31.47277363 ], [ 114.88072147, 31.47120666 ], [ 114.87804147, 31.47101366 ], [ 114.87756347, 31.47110066 ], [ 114.87143047, 31.47221464 ], [ 114.87079247, 31.47233064 ], [ 114.87014247, 31.47317962 ], [ 114.86981347, 31.47867152 ], [ 114.86929347, 31.48004549 ], [ 114.86720347, 31.48076648 ], [ 114.86394447, 31.48109847 ], [ 114.85787347, 31.48010949 ], [ 114.857488450271191, 31.480340773399316 ], [ 114.864781885, 31.481536676000101 ] ] ], [ [ [ 114.888501743, 31.475159830000099 ], [ 114.891252182, 31.476597362000099 ], [ 114.895296268, 31.477184835000099 ], [ 114.900720089, 31.4776414080001 ], [ 114.90686481199999, 31.479011192 ], [ 114.908546249209081, 31.479853589299541 ], [ 114.90849547, 31.4797995 ], [ 114.90601147, 31.47855552 ], [ 114.89986347, 31.47718255 ], [ 114.89443947, 31.47672556 ], [ 114.89039447, 31.47613857 ], [ 114.888088309888062, 31.474933513288121 ], [ 114.888501743, 31.475159830000099 ] ] ], [ [ [ 114.912063363622309, 31.48301320128385 ], [ 114.912487784, 31.483389134 ], [ 114.914318877, 31.483716696 ], [ 114.91752118, 31.483520948 ], [ 114.92012279668144, 31.482660510665362 ], [ 114.92587647, 31.47657982 ], [ 114.92972893, 31.47295111 ], [ 114.929729007686035, 31.472951061482576 ], [ 114.929729022, 31.472951048 ], [ 114.931300101, 31.471969860000101 ], [ 114.932075348624338, 31.471969393037671 ], [ 114.93152247, 31.47153765 ], [ 114.93047847, 31.47153665 ], [ 114.92890547, 31.47251564 ], [ 114.92504547, 31.47614057 ], [ 114.91928347, 31.48221445 ], [ 114.91667947, 31.48307244 ], [ 114.91347247, 31.48326543 ], [ 114.91278647, 31.48314244 ], [ 114.912063363622309, 31.48301320128385 ] ] ], [ [ [ 114.936913260062212, 31.481771382578042 ], [ 114.936914524, 31.481772802 ], [ 114.938942290892768, 31.482827438678505 ], [ 114.936913260062212, 31.481771382578042 ] ] ], [ [ [ 114.948550768497626, 31.489999644453345 ], [ 114.94874335199999, 31.49017078 ], [ 114.952256360705917, 31.491516612625254 ], [ 114.95189847, 31.49128628 ], [ 114.948550768497626, 31.489999644453345 ] ] ], [ [ [ 114.958423145241895, 31.497251178832361 ], [ 114.958750366, 31.497490884000101 ], [ 114.962733609, 31.498731425000098 ], [ 114.96691680799999, 31.4987961960001 ], [ 114.968525677134508, 31.498474743642742 ], [ 114.96843347, 31.49800516 ], [ 114.96619447, 31.49844515 ], [ 114.96199747, 31.49837015 ], [ 114.958423145241895, 31.497251178832361 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.29432", "Name": "三店街道", "layer": "乡镇", "code": "420117006000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.83831760309856, 30.947089751522419 ], [ 114.83785276, 30.94718767 ], [ 114.83756613, 30.94791773 ], [ 114.8370108, 30.9505172 ], [ 114.83648165, 30.95159361 ], [ 114.836294411139363, 30.951790500462277 ], [ 114.83672129, 30.95157707 ], [ 114.83705929, 30.95122107 ], [ 114.83758729, 30.9501421 ], [ 114.83772029, 30.94951711 ], [ 114.83814129, 30.94754015 ], [ 114.83831760309856, 30.947089751522419 ] ] ], [ [ [ 114.821009632398258, 30.950997922708051 ], [ 114.82040535, 30.95116396 ], [ 114.82030089, 30.95389816 ], [ 114.82026682, 30.95393807 ], [ 114.81969352, 30.95505134 ], [ 114.81922445, 30.95593394 ], [ 114.81978858, 30.95660261 ], [ 114.82026651, 30.95750298 ], [ 114.82028444, 30.95878126 ], [ 114.820184229358219, 30.958850927038799 ], [ 114.82029829, 30.95886091 ], [ 114.82089629, 30.95844292 ], [ 114.82087829, 30.95716395 ], [ 114.82040229, 30.95626297 ], [ 114.81983929, 30.95559598 ], [ 114.82030629, 30.954711 ], [ 114.82087829, 30.95359602 ], [ 114.82091329, 30.95355702 ], [ 114.821009632398258, 30.950997922708051 ] ] ], [ [ [ 114.813173281798001, 30.958529726738188 ], [ 114.81291404, 30.95857962 ], [ 114.81149001, 30.95964038 ], [ 114.81064815, 30.96125489 ], [ 114.80998854, 30.96434287 ], [ 114.80960668, 30.96522866 ], [ 114.809179584957278, 30.965465437643218 ], [ 114.80956529, 30.96528977 ], [ 114.81024129, 30.96491278 ], [ 114.81062229, 30.9640268 ], [ 114.81128029, 30.96093587 ], [ 114.81212029, 30.9593189 ], [ 114.813173281798001, 30.958529726738188 ] ] ], [ [ [ 114.80864847229445, 30.965731115240171 ], [ 114.80801739, 30.96601633 ], [ 114.80777483, 30.96686539 ], [ 114.80780082, 30.96752505 ], [ 114.807637712760965, 30.968006429514965 ], [ 114.80820529, 30.96790672 ], [ 114.80843929, 30.96721373 ], [ 114.80841329, 30.96655375 ], [ 114.80864847229445, 30.965731115240171 ] ] ], [ [ [ 114.806028091638225, 30.968542891691943 ], [ 114.80575162, 30.96861376 ], [ 114.803777634765808, 30.969879251362755 ], [ 114.80398629, 30.96985968 ], [ 114.80504229, 30.96917869 ], [ 114.806028091638225, 30.968542891691943 ] ] ], [ [ [ 114.801342823824911, 30.970414295611132 ], [ 114.80071663, 30.97065783 ], [ 114.80033484, 30.97142873 ], [ 114.7998569, 30.9718077 ], [ 114.79964945, 30.97251294 ], [ 114.79997901, 30.97320309 ], [ 114.8007344, 30.97372206 ], [ 114.80089062, 30.9746158 ], [ 114.80146367, 30.97524541 ], [ 114.80194053, 30.97591183 ], [ 114.80266193, 30.97588609 ], [ 114.80333021, 30.97609212 ], [ 114.80356463, 30.97650929 ], [ 114.80367671, 30.97821248 ], [ 114.80397215, 30.97978308 ], [ 114.80451006, 30.98153699 ], [ 114.8047543, 30.98432178 ], [ 114.80437144, 30.98564334 ], [ 114.80387643, 30.98602125 ], [ 114.80312189, 30.98675251 ], [ 114.80254874, 30.98720925 ], [ 114.80181926, 30.98804951 ], [ 114.80161981, 30.98875675 ], [ 114.80187116, 30.99030827 ], [ 114.80227084, 30.99139632 ], [ 114.8022797, 30.99330322 ], [ 114.80203711, 30.99462803 ], [ 114.80188074, 30.99551924 ], [ 114.80187168, 30.99591399 ], [ 114.80141177, 30.996264 ], [ 114.801227593686747, 30.996381679982747 ], [ 114.80133729, 30.99634411 ], [ 114.80180529, 30.99614812 ], [ 114.80206529, 30.99598012 ], [ 114.80252429, 30.99563013 ], [ 114.80253329, 30.99523413 ], [ 114.80268929, 30.99434215 ], [ 114.80293129, 30.99301718 ], [ 114.80292729, 30.9921702 ], [ 114.80292229, 30.99110822 ], [ 114.80252429, 30.99002125 ], [ 114.80227229, 30.98846928 ], [ 114.80247229, 30.98776029 ], [ 114.80319929, 30.98691931 ], [ 114.80377129, 30.98646032 ], [ 114.80452529, 30.98572734 ], [ 114.80501929, 30.98534835 ], [ 114.80540029, 30.98402537 ], [ 114.80515729, 30.98123943 ], [ 114.80462029, 30.97948647 ], [ 114.80432529, 30.9779145 ], [ 114.80421229, 30.97621054 ], [ 114.80397829, 30.97579355 ], [ 114.80331129, 30.97558855 ], [ 114.80259229, 30.97561555 ], [ 114.80211529, 30.97494957 ], [ 114.80154329, 30.97432158 ], [ 114.80138729, 30.9734266 ], [ 114.80137129, 30.9734156 ], [ 114.80063329, 30.97290961 ], [ 114.80030429, 30.97221863 ], [ 114.80051229, 30.97151264 ], [ 114.80098829, 30.97113265 ], [ 114.801342823824911, 30.970414295611132 ] ] ], [ [ [ 114.789411752811759, 30.991322637605645 ], [ 114.78883168, 30.99150282 ], [ 114.78812848, 30.99213643 ], [ 114.78765967, 30.99269244 ], [ 114.78750333, 30.99380356 ], [ 114.78784187, 30.99386601 ], [ 114.78829359, 30.99391863 ], [ 114.78880541, 30.99404629 ], [ 114.78905782, 30.99409163 ], [ 114.78934429, 30.99414402 ], [ 114.78938736, 30.99412909 ], [ 114.78980403, 30.99443253 ], [ 114.79029882, 30.99485801 ], [ 114.79056822, 30.99540509 ], [ 114.79084564, 30.99596318 ], [ 114.79094172, 30.99691777 ], [ 114.79115906, 30.99729387 ], [ 114.79158376, 30.99753238 ], [ 114.79240918, 30.99756861 ], [ 114.79344192, 30.99821383 ], [ 114.79413609, 30.9989295 ], [ 114.79454478, 30.99926595 ], [ 114.79457081, 30.99954382 ], [ 114.79456177, 30.9997397 ], [ 114.79450965, 31.0001084 ], [ 114.79447557, 31.00026925 ], [ 114.79429322, 31.00067273 ], [ 114.79413691, 31.00102428 ], [ 114.7939285, 31.00152066 ], [ 114.7938323, 31.00182233 ], [ 114.79361592, 31.001818 ], [ 114.793433091185975, 31.002135985277999 ], [ 114.79340029, 31.00238998 ], [ 114.79335729, 31.00277497 ], [ 114.79356529, 31.00298897 ], [ 114.79372129, 31.00291097 ], [ 114.79387729, 31.00289997 ], [ 114.79391129, 31.00286297 ], [ 114.79393729, 31.00273897 ], [ 114.79404129, 31.00222199 ], [ 114.79406729, 31.00208299 ], [ 114.79407629, 31.00191399 ], [ 114.79428429, 31.001551 ], [ 114.79450129, 31.001555 ], [ 114.79459629, 31.00125301 ], [ 114.79480429, 31.00075502 ], [ 114.79496029, 31.00040302 ], [ 114.79514229, 30.99999903 ], [ 114.79517729, 30.99983804 ], [ 114.79522829, 30.99946904 ], [ 114.79523729, 30.99927405 ], [ 114.79521129, 30.99899605 ], [ 114.79480429, 30.99866006 ], [ 114.79411029, 30.99794408 ], [ 114.79307929, 30.99730109 ], [ 114.79225529, 30.99726509 ], [ 114.79183129, 30.9970271 ], [ 114.79161429, 30.9966511 ], [ 114.79151929, 30.99569613 ], [ 114.79124129, 30.99513814 ], [ 114.79097229, 30.99459115 ], [ 114.79047929, 30.99416716 ], [ 114.79006229, 30.99386316 ], [ 114.79001929, 30.99387816 ], [ 114.78973329, 30.99382716 ], [ 114.78948229, 30.99378117 ], [ 114.78897029, 30.99365417 ], [ 114.78851929, 30.99360217 ], [ 114.78818129, 30.99354017 ], [ 114.78790429, 30.99344717 ], [ 114.78779129, 30.99324918 ], [ 114.78774829, 30.99304118 ], [ 114.78781729, 30.99292818 ], [ 114.78833729, 30.99242819 ], [ 114.78880529, 30.99187121 ], [ 114.789411752811759, 30.991322637605645 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.29434", "Name": "凤凰镇", "layer": "乡镇", "code": "420117102000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.76195046550184, 30.962787830531255 ], [ 114.76167362, 30.96280684 ], [ 114.76115223, 30.96309136 ], [ 114.76082297, 30.96365783 ], [ 114.7606658, 30.9644103 ], [ 114.75921673, 30.96628539 ], [ 114.75772268, 30.96865625 ], [ 114.75765359, 30.96920789 ], [ 114.75796569, 30.97000657 ], [ 114.75912929, 30.97073173 ], [ 114.76035398, 30.97150395 ], [ 114.76123047, 30.97253286 ], [ 114.76169069, 30.97365748 ], [ 114.76187378, 30.97411133 ], [ 114.76204688, 30.97446323 ], [ 114.7621429, 30.97502696 ], [ 114.76189971, 30.97521769 ], [ 114.76117915, 30.97590585 ], [ 114.76081383, 30.97678712 ], [ 114.76037139, 30.97845288 ], [ 114.7600501, 30.97953207 ], [ 114.75965077, 30.98038635 ], [ 114.75921642, 30.98147148 ], [ 114.75921634, 30.98236395 ], [ 114.75912923, 30.98307749 ], [ 114.75931225, 30.98408899 ], [ 114.75965042, 30.98452892 ], [ 114.76020671, 30.98519983 ], [ 114.76044085, 30.9853109 ], [ 114.76069301, 30.985387 ], [ 114.76097019, 30.98536717 ], [ 114.76164766, 30.98526165 ], [ 114.76243724, 30.98511823 ], [ 114.76296763, 30.98510558 ], [ 114.76367915, 30.9853879 ], [ 114.76423555, 30.98581504 ], [ 114.76468687, 30.98639702 ], [ 114.76491298, 30.98720671 ], [ 114.76492994, 30.98787433 ], [ 114.76450451, 30.9887715 ], [ 114.76419061036502, 30.989009148738123 ], [ 114.76473329, 30.98889327 ], [ 114.76521029, 30.98853028 ], [ 114.76563529, 30.9876333 ], [ 114.76561829, 30.98696431 ], [ 114.76539229, 30.98615433 ], [ 114.76494129, 30.98557234 ], [ 114.76438529, 30.98514535 ], [ 114.76367429, 30.98486336 ], [ 114.76314529, 30.98487636 ], [ 114.76235529, 30.98502035 ], [ 114.76167929, 30.98512735 ], [ 114.76140129, 30.98514635 ], [ 114.76114929, 30.98507035 ], [ 114.76091529, 30.98496035 ], [ 114.76035929, 30.98428937 ], [ 114.76029229, 30.98420237 ], [ 114.76002129, 30.98384838 ], [ 114.75983929, 30.9828364 ], [ 114.75992529, 30.98212241 ], [ 114.75992529, 30.98123043 ], [ 114.76035929, 30.98014446 ], [ 114.76075829, 30.97928848 ], [ 114.76107929, 30.9782095 ], [ 114.76152229, 30.97654153 ], [ 114.76188629, 30.97565955 ], [ 114.76260629, 30.97497057 ], [ 114.76284929, 30.97477957 ], [ 114.76275329, 30.97421558 ], [ 114.76258029, 30.97386359 ], [ 114.76239729, 30.9734096 ], [ 114.76193829, 30.97228562 ], [ 114.76106129, 30.97125665 ], [ 114.76042029, 30.97085165 ], [ 114.75983729, 30.97048366 ], [ 114.75867529, 30.96975868 ], [ 114.75836229, 30.9689597 ], [ 114.75843229, 30.96840871 ], [ 114.75992429, 30.96603476 ], [ 114.76137329, 30.9641578 ], [ 114.76152929, 30.96340481 ], [ 114.76185929, 30.96283783 ], [ 114.76195046550184, 30.962787830531255 ] ] ], [ [ [ 114.757062520816888, 30.988638939516445 ], [ 114.7564643, 30.98881086 ], [ 114.75544878, 30.9893921 ], [ 114.7551526, 30.98990369 ], [ 114.75523958, 30.99065528 ], [ 114.75590876, 30.9919338 ], [ 114.75660297, 30.99331128 ], [ 114.75600455, 30.99487212 ], [ 114.75447575, 30.99656654 ], [ 114.753148557422307, 30.997080099417833 ], [ 114.75326229, 30.99708209 ], [ 114.75518829, 30.99633511 ], [ 114.75671629, 30.99463915 ], [ 114.75731529, 30.99307818 ], [ 114.75662029, 30.99169921 ], [ 114.75595229, 30.99042024 ], [ 114.75586529, 30.98966925 ], [ 114.75616029, 30.98915626 ], [ 114.757062520816888, 30.988638939516445 ] ] ], [ [ [ 114.710538990674664, 30.980112722367743 ], [ 114.70995279, 30.98021905 ], [ 114.70950935, 30.98089821 ], [ 114.70925764, 30.98168606 ], [ 114.70854558, 30.98244951 ], [ 114.70855457, 30.98251047 ], [ 114.70854557, 30.98256245 ], [ 114.708403782108064, 30.982749644563064 ], [ 114.70901429, 30.9825874 ], [ 114.70923229, 30.98230041 ], [ 114.70924129, 30.98224841 ], [ 114.70923229, 30.98218741 ], [ 114.70994529, 30.98142443 ], [ 114.71019729, 30.98063645 ], [ 114.710538990674664, 30.980112722367743 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.29437", "Name": "潘塘街道", "layer": "乡镇", "code": "420117007000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.974500918228813, 30.992276738488552 ], [ 114.97418485, 30.99234293 ], [ 114.97309162, 30.99303766 ], [ 114.97224946, 30.9939965 ], [ 114.97206704, 30.99462165 ], [ 114.97212773, 30.99572383 ], [ 114.97233695, 30.99639284 ], [ 114.97237076, 30.99724725 ], [ 114.97236576, 30.99742616 ], [ 114.97234477, 30.99816778 ], [ 114.97239653, 30.99889921 ], [ 114.97250115, 30.99902684 ], [ 114.97270941, 30.99922413 ], [ 114.97296151, 30.99946727 ], [ 114.97318668, 31.00008526 ], [ 114.97319564, 31.00010722 ], [ 114.97324741, 31.00072571 ], [ 114.9733002, 31.00097741 ], [ 114.97347358, 31.0011818 ], [ 114.97373366, 31.00131198 ], [ 114.97411532, 31.00131788 ], [ 114.97422892, 31.00132055 ], [ 114.9743844, 31.00109523 ], [ 114.974397369518002, 31.001023038643918 ], [ 114.97414229, 31.00089502 ], [ 114.97396829, 31.00069102 ], [ 114.97391529, 31.00043902 ], [ 114.97386329, 30.99982004 ], [ 114.97362829, 30.99917805 ], [ 114.97337529, 30.99893406 ], [ 114.97316629, 30.99873606 ], [ 114.97306229, 30.99860806 ], [ 114.97301029, 30.99787608 ], [ 114.97303129, 30.99713509 ], [ 114.97303629, 30.9969551 ], [ 114.97300129, 30.99610012 ], [ 114.97279229, 30.99543013 ], [ 114.97273129, 30.99432715 ], [ 114.97291429, 30.99370217 ], [ 114.97375829, 30.99274519 ], [ 114.974500918228813, 30.992276738488552 ] ] ], [ [ [ 114.974963853502857, 31.000944919856636 ], [ 114.97502712, 31.0012313 ], [ 114.97516562, 31.00135982 ], [ 114.97533901, 31.00136132 ], [ 114.97592992, 31.00134662 ], [ 114.9762508, 31.00122475 ], [ 114.976343250240276, 31.001073254183506 ], [ 114.97601529, 31.00108101 ], [ 114.97584029, 31.00107801 ], [ 114.97570129, 31.00094901 ], [ 114.97556229, 31.00031703 ], [ 114.97556229, 31.00005403 ], [ 114.97550129, 31.00002803 ], [ 114.97518729, 31.00008403 ], [ 114.97505729, 31.00081102 ], [ 114.974963853502857, 31.000944919856636 ] ] ], [ [ [ 114.92656139389679, 30.997310019633776 ], [ 114.92621796, 30.99748575 ], [ 114.92594839, 30.99778093 ], [ 114.92582754, 30.99831478 ], [ 114.925768184296757, 30.998425561936713 ], [ 114.92598529, 30.99838507 ], [ 114.92618429, 30.99826307 ], [ 114.92636729, 30.99792308 ], [ 114.92648929, 30.99738909 ], [ 114.92656139389679, 30.997310019633776 ] ] ], [ [ [ 114.924970893183513, 30.998816228257645 ], [ 114.92481217, 30.99880979 ], [ 114.9245346, 30.99893207 ], [ 114.92442176, 30.99924203 ], [ 114.92437779, 30.99964185 ], [ 114.92441272, 30.99986268 ], [ 114.92448259, 31.00009245 ], [ 114.92258221, 31.00388658 ], [ 114.92070766, 31.00703385 ], [ 114.9199785, 31.00907143 ], [ 114.9191275, 31.01069936 ], [ 114.91881778, 31.01228175 ], [ 114.91843615, 31.01371029 ], [ 114.9179247, 31.01486711 ], [ 114.91749917, 31.01554812 ], [ 114.91710062, 31.01599123 ], [ 114.91671805, 31.01634238 ], [ 114.916468623586439, 31.016665439326296 ], [ 114.91649929, 31.01668568 ], [ 114.91691629, 31.01634068 ], [ 114.91699429, 31.01627569 ], [ 114.91724629, 31.01595069 ], [ 114.91762929, 31.0155987 ], [ 114.91802829, 31.01515571 ], [ 114.91845429, 31.01447472 ], [ 114.91896729, 31.01331775 ], [ 114.91934929, 31.01188878 ], [ 114.91965929, 31.01030581 ], [ 114.92016029, 31.00934783 ], [ 114.92051029, 31.00867885 ], [ 114.92124029, 31.00663989 ], [ 114.92311729, 31.00349296 ], [ 114.92397429, 31.001784 ], [ 114.92436829, 31.00100001 ], [ 114.92452229, 31.00069202 ], [ 114.92502029, 30.99970004 ], [ 114.92495029, 30.99946905 ], [ 114.92491529, 30.99924805 ], [ 114.92495929, 30.99884806 ], [ 114.924970893183513, 30.998816228257645 ] ] ], [ [ [ 114.850698621178267, 30.986496845011448 ], [ 114.85150792, 30.98628683 ], [ 114.85404923, 30.98580501 ], [ 114.85598538, 30.98563799 ], [ 114.85818979, 30.98579606 ], [ 114.85983025, 30.98571937 ], [ 114.86145267, 30.98485804 ], [ 114.8627285, 30.9841721 ], [ 114.86337943, 30.9837072 ], [ 114.86415149, 30.98332739 ], [ 114.86535011, 30.98257629 ], [ 114.86542821, 30.98257638 ], [ 114.865532262367196, 30.982396154412395 ], [ 114.86468529, 30.9829294 ], [ 114.86391329, 30.98331039 ], [ 114.86326429, 30.98377538 ], [ 114.86199029, 30.98446337 ], [ 114.86036929, 30.98532835 ], [ 114.85873129, 30.98540634 ], [ 114.85653029, 30.98525135 ], [ 114.85615029, 30.98528435 ], [ 114.85459829, 30.98542134 ], [ 114.85209429, 30.98571434 ], [ 114.85090629, 30.98620933 ], [ 114.850698621178267, 30.986496845011448 ] ] ], [ [ [ 114.867278469314854, 30.975162184134984 ], [ 114.86867385, 30.97433794 ], [ 114.868758156692138, 30.974190726252601 ], [ 114.86739729, 30.97499757 ], [ 114.867278469314854, 30.975162184134984 ] ] ], [ [ [ 114.976827950297363, 30.978807734341345 ], [ 114.97671905, 30.97907837 ], [ 114.97677183, 30.97948398 ], [ 114.97763065, 30.98081868 ], [ 114.978162989407252, 30.981476514213707 ], [ 114.97878829, 30.98113344 ], [ 114.97831229, 30.98053245 ], [ 114.97745029, 30.97919448 ], [ 114.97741929, 30.97895448 ], [ 114.97686229, 30.97902548 ], [ 114.976827950297363, 30.978807734341345 ] ] ], [ [ [ 114.982975039521364, 30.999232389945622 ], [ 114.98280436, 30.99935349 ], [ 114.982396285874486, 31.000028680831353 ], [ 114.98244329, 31.00006303 ], [ 114.98246029, 31.00024303 ], [ 114.98257429, 31.00029603 ], [ 114.98274829, 31.00029803 ], [ 114.98289629, 31.00022503 ], [ 114.98299229, 31.00007503 ], [ 114.98305329, 30.99983904 ], [ 114.98318929, 30.99961504 ], [ 114.982975039521364, 30.999232389945622 ] ] ], [ [ [ 114.979753610716813, 30.999689776108678 ], [ 114.97948835, 30.99971014 ], [ 114.9788546, 31.00008579 ], [ 114.97767443, 31.00468563 ], [ 114.97852508, 31.00821706 ], [ 114.97900194, 31.01304784 ], [ 114.9804783, 31.01679529 ], [ 114.98018309, 31.01991135 ], [ 114.97853875, 31.02289048 ], [ 114.97541747, 31.02749292 ], [ 114.972883925113663, 31.02917901363023 ], [ 114.97305629, 31.02923541 ], [ 114.97643529, 31.02769144 ], [ 114.97863029, 31.02454751 ], [ 114.97964029, 31.02261755 ], [ 114.98087729, 31.01965561 ], [ 114.98117329, 31.01653768 ], [ 114.97969229, 31.01278376 ], [ 114.97925329, 31.00835186 ], [ 114.97921229, 31.00794886 ], [ 114.97835829, 31.00441394 ], [ 114.97954229, 30.99981404 ], [ 114.979753610716813, 30.999689776108678 ] ] ], [ [ [ 114.952132021548962, 30.989186060200151 ], [ 114.95195755, 30.98923612 ], [ 114.95081272, 30.99004827 ], [ 114.95020534, 30.99089715 ], [ 114.94997891, 30.99157127 ], [ 114.94998788, 30.99161522 ], [ 114.94954504, 30.99242474 ], [ 114.94929369, 30.99291302 ], [ 114.94950208, 30.99338128 ], [ 114.95010935, 30.99388262 ], [ 114.95038752, 30.99451462 ], [ 114.95023983, 30.99572125 ], [ 114.95019689, 30.99646991 ], [ 114.95015298, 30.9968278 ], [ 114.95023073, 30.99716842 ], [ 114.9516456, 30.99892616 ], [ 114.95189679, 31.0000869 ], [ 114.95186288, 31.00016693 ], [ 114.95182797, 31.00025596 ], [ 114.95179306, 31.00034499 ], [ 114.95176712, 31.00048597 ], [ 114.951802, 31.00078971 ], [ 114.951916031050715, 31.001614329510609 ], [ 114.95246229, 31.00197999 ], [ 114.95270629, 31.00204299 ], [ 114.95252329, 31.00132601 ], [ 114.95240129, 31.00044702 ], [ 114.95236629, 31.00014303 ], [ 114.95239229, 31.00000103 ], [ 114.95242729, 30.99991204 ], [ 114.95246229, 30.99982404 ], [ 114.95249729, 30.99974304 ], [ 114.95224529, 30.99858106 ], [ 114.95082629, 30.9968191 ], [ 114.95074729, 30.99647811 ], [ 114.95079129, 30.99612012 ], [ 114.95083429, 30.99537113 ], [ 114.95098229, 30.99416416 ], [ 114.95070329, 30.99353117 ], [ 114.95009429, 30.99302918 ], [ 114.94988529, 30.99255919 ], [ 114.95013829, 30.9920712 ], [ 114.95058129, 30.99126222 ], [ 114.95079929, 30.99054424 ], [ 114.95140829, 30.98969625 ], [ 114.952132021548962, 30.989186060200151 ] ] ], [ [ [ 114.940152726256869, 30.997156201956944 ], [ 114.93985143, 30.99699009 ], [ 114.93940049, 30.99696395 ], [ 114.93938251, 30.99717486 ], [ 114.939392157323212, 30.997188892818698 ], [ 114.93967229, 30.99725909 ], [ 114.93994129, 30.99727909 ], [ 114.94006329, 30.99724009 ], [ 114.940152726256869, 30.997156201956944 ] ] ], [ [ [ 114.937793234072018, 30.995978326686657 ], [ 114.93760367, 30.99600081 ], [ 114.93727438, 30.99629423 ], [ 114.9367884, 30.99697569 ], [ 114.93647604, 30.99754691 ], [ 114.93650194, 30.99803658 ], [ 114.9366057, 30.99824927 ], [ 114.93663161, 30.99854305 ], [ 114.936515381223856, 30.998848554490589 ], [ 114.93700129, 30.99866806 ], [ 114.93719329, 30.99816707 ], [ 114.93716629, 30.99787408 ], [ 114.93706229, 30.99766108 ], [ 114.93703629, 30.99717009 ], [ 114.93734929, 30.99659911 ], [ 114.937793234072018, 30.995978326686657 ] ] ], [ [ [ 114.935197814130248, 30.999507964223351 ], [ 114.93481842, 30.99964953 ], [ 114.93448808, 31.00009082 ], [ 114.93427138, 31.00186815 ], [ 114.93369846, 31.0031504 ], [ 114.932727296006405, 31.004202168680354 ], [ 114.93286229, 31.00427494 ], [ 114.93325229, 31.00385395 ], [ 114.93425429, 31.00277297 ], [ 114.93482729, 31.00149 ], [ 114.93504429, 30.99971204 ], [ 114.935197814130248, 30.999507964223351 ] ] ], [ [ [ 114.924610218603064, 31.026408228036342 ], [ 114.92485576, 31.02630776 ], [ 114.92508139, 31.02634045 ], [ 114.92515027, 31.02639733 ], [ 114.92514227, 31.02659423 ], [ 114.92510731, 31.02684813 ], [ 114.9251682, 31.02690502 ], [ 114.92527203, 31.02690688 ], [ 114.92546272, 31.02685467 ], [ 114.925704540347724, 31.026523031800338 ], [ 114.92564829, 31.02647047 ], [ 114.92568329, 31.02621747 ], [ 114.92569229, 31.02601948 ], [ 114.92562229, 31.02596248 ], [ 114.92539629, 31.02593048 ], [ 114.92499629, 31.02609248 ], [ 114.92479629, 31.02617447 ], [ 114.924610218603064, 31.026408228036342 ] ] ], [ [ [ 114.926110721716725, 31.026331785044796 ], [ 114.9261656, 31.02630107 ], [ 114.926273211987095, 31.026133167453622 ], [ 114.92624829, 31.02614348 ], [ 114.926110721716725, 31.026331785044796 ] ] ], [ [ [ 114.926839818707535, 31.025720533188188 ], [ 114.92689441, 31.02572143 ], [ 114.92718989, 31.02580998 ], [ 114.92748536, 31.02595549 ], [ 114.92761513, 31.02592933 ], [ 114.92794457, 31.02576496 ], [ 114.92813698296338, 31.025560314297344 ], [ 114.92803029, 31.02558149 ], [ 114.92773429, 31.02543549 ], [ 114.92743929, 31.02534549 ], [ 114.92721329, 31.02534149 ], [ 114.92701329, 31.02544949 ], [ 114.926839818707535, 31.025720533188188 ] ] ], [ [ [ 114.928996093549259, 31.024853979854338 ], [ 114.92912552, 31.02483382 ], [ 114.9296196, 31.02487708 ], [ 114.93004478, 31.02518027 ], [ 114.93078334, 31.02566188 ], [ 114.93101688, 31.02578646 ], [ 114.93138118, 31.02565097 ], [ 114.931695423537278, 31.025369837869775 ], [ 114.93156929, 31.02541649 ], [ 114.93133429, 31.02529249 ], [ 114.93059529, 31.0248095 ], [ 114.93016929, 31.02450451 ], [ 114.92967329, 31.02446051 ], [ 114.92939529, 31.02450351 ], [ 114.92906429, 31.0247815 ], [ 114.928996093549259, 31.024853979854338 ] ] ], [ [ [ 114.931338115573013, 31.023064578129322 ], [ 114.93166784, 31.02314698 ], [ 114.93183252, 31.02309276 ], [ 114.93196327, 31.02292565 ], [ 114.932042819150425, 31.022731784383588 ], [ 114.93131629, 31.02254955 ], [ 114.93129929, 31.02276055 ], [ 114.931338115573013, 31.023064578129322 ] ] ], [ [ [ 114.932745260707577, 31.021867041665701 ], [ 114.93319589, 31.02187929 ], [ 114.93377669, 31.02210022 ], [ 114.9341489, 31.02231048 ], [ 114.93460093, 31.02256658 ], [ 114.93510485, 31.02280559 ], [ 114.93540017, 31.02338275 ], [ 114.93568551, 31.02395193 ], [ 114.93732584, 31.02475759 ], [ 114.93778581, 31.02476476 ], [ 114.93834155, 31.02477274 ], [ 114.93896611, 31.02484056 ], [ 114.93921752, 31.02498601 ], [ 114.93931327, 31.02532363 ], [ 114.93930526, 31.02560548 ], [ 114.93946987, 31.02572111 ], [ 114.93973027, 31.02569663 ], [ 114.940082372363023, 31.025361693469925 ], [ 114.94003929, 31.02536549 ], [ 114.93987429, 31.02525049 ], [ 114.93988229, 31.0249685 ], [ 114.93978729, 31.02462951 ], [ 114.93953529, 31.02448351 ], [ 114.93890829, 31.02441451 ], [ 114.93835229, 31.02440551 ], [ 114.93789129, 31.02439851 ], [ 114.93729929, 31.02444451 ], [ 114.93690829, 31.02443751 ], [ 114.93638629, 31.02386652 ], [ 114.93596029, 31.02301854 ], [ 114.93566429, 31.02244055 ], [ 114.93516029, 31.02220056 ], [ 114.93470629, 31.02194456 ], [ 114.93433329, 31.02173257 ], [ 114.93375129, 31.02151057 ], [ 114.93326429, 31.02149657 ], [ 114.93293329, 31.02151857 ], [ 114.93276829, 31.02165657 ], [ 114.932745260707577, 31.021867041665701 ] ] ], [ [ [ 114.94073446993221, 31.024931004069611 ], [ 114.94089259, 31.0248699 ], [ 114.94144825, 31.02482185 ], [ 114.94203881, 31.02491764 ], [ 114.94252459, 31.0252345 ], [ 114.94268118, 31.02546205 ], [ 114.942552448654098, 31.025670134886294 ], [ 114.94311929, 31.02533649 ], [ 114.94325829, 31.0251125 ], [ 114.94310129, 31.0248845 ], [ 114.94261429, 31.02456651 ], [ 114.94202329, 31.02447051 ], [ 114.94146629, 31.02451651 ], [ 114.94097029, 31.02470751 ], [ 114.94073446993221, 31.024931004069611 ] ] ], [ [ [ 114.942113433866936, 31.025939599674572 ], [ 114.94161373, 31.02623471 ], [ 114.94075375, 31.02687101 ], [ 114.94021598, 31.02736975 ], [ 114.9401122, 31.02767876 ], [ 114.94010319, 31.02801658 ], [ 114.9401291, 31.02838332 ], [ 114.94012109, 31.02872214 ], [ 114.93998239, 31.02900224 ], [ 114.93965214, 31.02930569 ], [ 114.93941765, 31.02972488 ], [ 114.93977667, 31.03135927 ], [ 114.94009487, 31.03201229 ], [ 114.94011181, 31.03224712 ], [ 114.94034624, 31.03248753 ], [ 114.94060661, 31.03262895 ], [ 114.94115329, 31.03267388 ], [ 114.94148349, 31.03275419 ], [ 114.94166503, 31.03297571 ], [ 114.94183061, 31.03320325 ], [ 114.94191736, 31.03365682 ], [ 114.94163997, 31.03438394 ], [ 114.94137059, 31.03483121 ], [ 114.94136158, 31.03511306 ], [ 114.94135357, 31.03550785 ], [ 114.94127471, 31.03604169 ], [ 114.94117093, 31.03640868 ], [ 114.94072795, 31.03696422 ], [ 114.94019016, 31.03768883 ], [ 114.93995569, 31.03796711 ], [ 114.939955676392231, 31.038120789315247 ], [ 114.93996229, 31.03811822 ], [ 114.94015429, 31.03823322 ], [ 114.94077129, 31.03861221 ], [ 114.94131929, 31.0390172 ], [ 114.94145029, 31.0389342 ], [ 114.94132829, 31.03862221 ], [ 114.94091029, 31.03819122 ], [ 114.94064929, 31.03798922 ], [ 114.94052829, 31.03781123 ], [ 114.94052829, 31.03761923 ], [ 114.94076229, 31.03734224 ], [ 114.94130229, 31.03661725 ], [ 114.94174529, 31.03606226 ], [ 114.94185029, 31.03569527 ], [ 114.94192829, 31.03516128 ], [ 114.94193729, 31.03476629 ], [ 114.94194529, 31.0344843 ], [ 114.94221529, 31.03403731 ], [ 114.94249329, 31.03331032 ], [ 114.94240629, 31.03285633 ], [ 114.94224129, 31.03262834 ], [ 114.94205829, 31.03240634 ], [ 114.94172729, 31.03232534 ], [ 114.94118029, 31.03227934 ], [ 114.94091929, 31.03213735 ], [ 114.94068329, 31.03189635 ], [ 114.94066629, 31.03166136 ], [ 114.94033629, 31.03143736 ], [ 114.94004829, 31.03106537 ], [ 114.93990029, 31.03053138 ], [ 114.93984029, 31.02993439 ], [ 114.93998829, 31.02937141 ], [ 114.94022229, 31.02895341 ], [ 114.94055329, 31.02864942 ], [ 114.94069229, 31.02836943 ], [ 114.94070129, 31.02803143 ], [ 114.94067429, 31.02766444 ], [ 114.94068329, 31.02732545 ], [ 114.94078829, 31.02701746 ], [ 114.94132729, 31.02651847 ], [ 114.942113433866936, 31.025939599674572 ] ] ], [ [ [ 114.939677082170192, 31.038639385684338 ], [ 114.93958251, 31.03858146 ], [ 114.93939196, 31.03846588 ], [ 114.939345975005111, 31.03848419375301 ], [ 114.93962329, 31.03864721 ], [ 114.939677082170192, 31.038639385684338 ] ] ], [ [ [ 114.938618371091081, 31.038790102403585 ], [ 114.9383683, 31.03873162 ], [ 114.93820267, 31.03881387 ], [ 114.938180815183372, 31.038862410349672 ], [ 114.93830129, 31.0389082 ], [ 114.93853629, 31.0389102 ], [ 114.938618371091081, 31.038790102403585 ] ] ], [ [ [ 114.932816732648192, 31.03658978707978 ], [ 114.93281342, 31.03658639 ], [ 114.93258787, 31.03661074 ], [ 114.93228445, 31.03686008 ], [ 114.93221457, 31.03714002 ], [ 114.93224049, 31.03742182 ], [ 114.932232148628756, 31.037435405161698 ], [ 114.93230029, 31.03742023 ], [ 114.93269129, 31.03723024 ], [ 114.93279629, 31.03706024 ], [ 114.93277029, 31.03677825 ], [ 114.932816732648192, 31.03658978707978 ] ] ], [ [ [ 114.931025018803226, 31.037955088423406 ], [ 114.93052276, 31.03826898 ], [ 114.93035706, 31.03843614 ], [ 114.930317805189503, 31.038905172646231 ], [ 114.93076129, 31.0388032 ], [ 114.93085729, 31.03869321 ], [ 114.93090929, 31.03807222 ], [ 114.931025018803226, 31.037955088423406 ] ] ], [ [ [ 114.922721460628253, 31.034579502134967 ], [ 114.9225816, 31.03458973 ], [ 114.92225208, 31.03475501 ], [ 114.922150825395192, 31.035055186647686 ], [ 114.92227729, 31.03521628 ], [ 114.92243329, 31.03522528 ], [ 114.92258129, 31.03499529 ], [ 114.922721460628253, 31.034579502134967 ] ] ], [ [ [ 114.921730424548031, 31.031402963513287 ], [ 114.921914018542779, 31.031212877026924 ], [ 114.92180729, 31.03125737 ], [ 114.921730424548031, 31.031402963513287 ] ] ], [ [ [ 114.922492654924952, 31.030783457095346 ], [ 114.92249506, 31.03078303 ], [ 114.92272972, 31.03058987 ], [ 114.92285055, 31.0304558 ], [ 114.92283518765791, 31.03043945532016 ], [ 114.92273729, 31.03045638 ], [ 114.922492654924952, 31.030783457095346 ] ] ], [ [ [ 114.923499753892088, 31.028277239698451 ], [ 114.92375537, 31.02799814 ], [ 114.923840156512512, 31.027683665870054 ], [ 114.92361429, 31.02776344 ], [ 114.92325829, 31.02778444 ], [ 114.92317129, 31.02789544 ], [ 114.92324929, 31.02800643 ], [ 114.923499753892088, 31.028277239698451 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.29444", "Name": "徐古镇", "layer": "乡镇", "code": "420117101000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.061806761833651, 30.895694806478964 ], [ 115.06100551, 30.8957751 ], [ 115.057836021219174, 30.896663169128537 ], [ 115.05874329, 30.89654724 ], [ 115.061806761833651, 30.895694806478964 ] ] ], [ [ [ 115.05477597727608, 30.897058442491897 ], [ 115.05466792, 30.89706516 ], [ 115.05424182, 30.89708387 ], [ 115.05392949, 30.89713437 ], [ 115.05377282, 30.89723958 ], [ 115.05264426, 30.89773925 ], [ 115.05155066, 30.89835784 ], [ 115.05113351, 30.89954691 ], [ 115.05085611, 30.89990021 ], [ 115.05060365, 30.9003694 ], [ 115.04992718, 30.9009893 ], [ 115.04884965, 30.90188181 ], [ 115.0484855, 30.90215235 ], [ 115.04835479, 30.90241745 ], [ 115.04843358, 30.90265216 ], [ 115.04859018, 30.90296568 ], [ 115.04887646, 30.90329594 ], [ 115.04917972, 30.90350424 ], [ 115.04945806, 30.90347373 ], [ 115.04986611, 30.90330106 ], [ 115.049955195799342, 30.903275101023151 ], [ 115.04979029, 30.9031621 ], [ 115.04950329, 30.90283111 ], [ 115.04934629, 30.90251611 ], [ 115.04926829, 30.90228112 ], [ 115.04939829, 30.90201612 ], [ 115.04976429, 30.90174613 ], [ 115.05084329, 30.90085615 ], [ 115.05152229, 30.90023616 ], [ 115.05177429, 30.89976717 ], [ 115.05205229, 30.89941418 ], [ 115.05234129, 30.8985922 ], [ 115.05247029, 30.8982252 ], [ 115.05356729, 30.89760822 ], [ 115.05469829, 30.89711123 ], [ 115.05477597727608, 30.897058442491897 ] ] ], [ [ [ 115.052604965219246, 30.902641371939648 ], [ 115.0527835, 30.9027351 ], [ 115.05326939, 30.90322297 ], [ 115.05379918, 30.90386768 ], [ 115.05418129, 30.90452964 ], [ 115.05430295, 30.90539793 ], [ 115.0541203, 30.90596691 ], [ 115.05411223, 30.90687539 ], [ 115.0538777, 30.90735551 ], [ 115.05339073, 30.9076072 ], [ 115.05292276, 30.90766998 ], [ 115.05199277, 30.90841419 ], [ 115.05136813, 30.90898498 ], [ 115.05072554, 30.90978369 ], [ 115.0499443, 30.91034281 ], [ 115.04904139, 30.91094216 ], [ 115.048471925368332, 30.911131871212913 ], [ 115.04897329, 30.91113793 ], [ 115.04995629, 30.91081194 ], [ 115.05086129, 30.91021395 ], [ 115.05164429, 30.90965596 ], [ 115.05228829, 30.90885798 ], [ 115.05291529, 30.90828799 ], [ 115.05337529, 30.907921 ], [ 115.05384629, 30.90754501 ], [ 115.05431629, 30.90748301 ], [ 115.05480329, 30.90723201 ], [ 115.05503829, 30.90675302 ], [ 115.05504629, 30.90584304 ], [ 115.05522929, 30.90527406 ], [ 115.05510729, 30.90440607 ], [ 115.05472429, 30.90374309 ], [ 115.05419429, 30.9030971 ], [ 115.05370629, 30.90260711 ], [ 115.05335829, 30.90242412 ], [ 115.052604965219246, 30.902641371939648 ] ] ], [ [ [ 115.043755413364877, 30.910861232284358 ], [ 115.04364092, 30.91084505 ], [ 115.04324097, 30.91087587 ], [ 115.04293677, 30.91092149 ], [ 115.04254677, 30.91131609 ], [ 115.04181763, 30.91234007 ], [ 115.04076643, 30.91302796 ], [ 115.040182037021268, 30.913264656924454 ], [ 115.04020729, 30.91327988 ], [ 115.04049429, 30.91327488 ], [ 115.04094729, 30.91316889 ], [ 115.04166129, 30.91288189 ], [ 115.04271429, 30.91219591 ], [ 115.04344529, 30.91117293 ], [ 115.043755413364877, 30.910861232284358 ] ] ], [ [ [ 115.035012962710525, 30.910352114152513 ], [ 115.03434103, 30.91042634 ], [ 115.03136394, 30.9117179 ], [ 115.02894236, 30.91329512 ], [ 115.02664953, 30.91504406 ], [ 115.02482728, 30.91702773 ], [ 115.02283871, 30.91879807 ], [ 115.02270808, 30.91950301 ], [ 115.02269111, 30.91984386 ], [ 115.02282163, 30.92032322 ], [ 115.02312557, 30.92084009 ], [ 115.02366376, 30.92112047 ], [ 115.02381127, 30.92112007 ], [ 115.02439231, 30.92162321 ], [ 115.02581658, 30.92235698 ], [ 115.02682325, 30.92322082 ], [ 115.02696278, 30.92345531 ], [ 115.02735345, 30.92421485 ], [ 115.02761359, 30.92454697 ], [ 115.02800429, 30.92511562 ], [ 115.02842091, 30.92577516 ], [ 115.02918543, 30.92649177 ], [ 115.02987119, 30.92742048 ], [ 115.03020109, 30.92817819 ], [ 115.03047917, 30.92881012 ], [ 115.03045322, 30.92910901 ], [ 115.0293586, 30.92969545 ], [ 115.02540016, 30.93121989 ], [ 115.023895503790584, 30.931988276480929 ], [ 115.02436829, 30.93199949 ], [ 115.02624929, 30.93104751 ], [ 115.03022129, 30.92953154 ], [ 115.03102629, 30.92910355 ], [ 115.03131829, 30.92894855 ], [ 115.03134429, 30.92864856 ], [ 115.03106529, 30.92801557 ], [ 115.03073429, 30.92725759 ], [ 115.03004629, 30.92632561 ], [ 115.02927929, 30.92560762 ], [ 115.02886229, 30.92494664 ], [ 115.02846929, 30.92437665 ], [ 115.02820829, 30.92404366 ], [ 115.02781629, 30.92328267 ], [ 115.02767729, 30.92304768 ], [ 115.02666629, 30.92218069 ], [ 115.02523829, 30.92144271 ], [ 115.02465429, 30.92093672 ], [ 115.02450629, 30.92093672 ], [ 115.02396629, 30.92065473 ], [ 115.02366129, 30.92013774 ], [ 115.02353029, 30.91965775 ], [ 115.02354829, 30.91931676 ], [ 115.02367829, 30.91861077 ], [ 115.02567329, 30.91684481 ], [ 115.02750229, 30.91486485 ], [ 115.02980129, 30.91312089 ], [ 115.03024029, 30.91283689 ], [ 115.03223029, 30.91154892 ], [ 115.035012962710525, 30.910352114152513 ] ] ], [ [ [ 115.018118189163147, 30.928307809187132 ], [ 115.01736947, 30.92845661 ], [ 115.016332340919234, 30.92912629374057 ], [ 115.01668029, 30.92905355 ], [ 115.01708529, 30.92896955 ], [ 115.01810929, 30.92831356 ], [ 115.018118189163147, 30.928307809187132 ] ] ], [ [ [ 115.004948395128125, 30.928145384802924 ], [ 115.00477356, 30.92814573 ], [ 115.0041837, 30.92835238 ], [ 115.00380101, 30.92947188 ], [ 115.00295104, 30.9305658 ], [ 115.00200448, 30.93116431 ], [ 115.001481359724281, 30.931467657321139 ], [ 115.00195229, 30.9313945 ], [ 115.00277129, 30.93092451 ], [ 115.00372129, 30.93032752 ], [ 115.00457429, 30.92923554 ], [ 115.00481029, 30.92854756 ], [ 115.004948395128125, 30.928145384802924 ] ] ], [ [ [ 114.999359435443438, 30.931889239221924 ], [ 114.9983818, 30.93195085 ], [ 114.993853, 30.93687867 ], [ 114.99171778, 30.93859918 ], [ 114.9889926, 30.94188355 ], [ 114.98875739, 30.94278873 ], [ 114.98717007, 30.94497626 ], [ 114.98589362, 30.94667313 ], [ 114.985322385041272, 30.947363093567883 ], [ 114.98596629, 30.94715716 ], [ 114.98660229, 30.94639218 ], [ 114.98788329, 30.94469821 ], [ 114.98947729, 30.94251426 ], [ 114.98971229, 30.94160928 ], [ 114.99171629, 30.93920933 ], [ 114.99236729, 30.93843035 ], [ 114.99244829, 30.93833235 ], [ 114.99459129, 30.93661639 ], [ 114.99477229, 30.93649239 ], [ 114.99696929, 30.93499742 ], [ 114.99927729, 30.93190849 ], [ 114.999359435443438, 30.931889239221924 ] ] ], [ [ [ 114.983743781881856, 30.947899014796199 ], [ 114.98334185, 30.948057 ], [ 114.98304592, 30.94818581 ], [ 114.98280378, 30.94848736 ], [ 114.98278582, 30.94880222 ], [ 114.98275183, 30.95010156 ], [ 114.9829421, 30.95047078 ], [ 114.98327188, 30.95070565 ], [ 114.9840271, 30.95093325 ], [ 114.98316789, 30.95496746 ], [ 114.98249118, 30.95695531 ], [ 114.98229187, 30.95736067 ], [ 114.98197895, 30.95802921 ], [ 114.9816062, 30.95924461 ], [ 114.98155438, 30.95931272 ], [ 114.98175361, 30.9598638 ], [ 114.9821611, 30.96026036 ], [ 114.98276885, 30.96060134 ], [ 114.98291632, 30.96060789 ], [ 114.98325507, 30.96070282 ], [ 114.98353304, 30.96093285 ], [ 114.98466983, 30.9615061 ], [ 114.98481727, 30.96171253 ], [ 114.98482622, 30.96183144 ], [ 114.98460899, 30.96223285 ], [ 114.9843489, 30.96269736 ], [ 114.9842273, 30.96323341 ], [ 114.98418442, 30.96359833 ], [ 114.98441853, 30.96395641 ], [ 114.9848001, 30.964412 ], [ 114.98549449, 30.96507152 ], [ 114.98588502, 30.96540814 ], [ 114.98623172, 30.96570092 ], [ 114.9871264, 30.966063 ], [ 114.98782978, 30.96627774 ], [ 114.98824621, 30.96667324 ], [ 114.98863672, 30.96716777 ], [ 114.98881903, 30.9673581 ], [ 114.98999962, 30.96782523 ], [ 114.99059839, 30.96788138 ], [ 114.99130079, 30.9677663 ], [ 114.99164701698335, 30.967575390054037 ], [ 114.99132629, 30.96762672 ], [ 114.99072529, 30.96756873 ], [ 114.98954029, 30.96709874 ], [ 114.98935729, 30.96690674 ], [ 114.98896529, 30.96641075 ], [ 114.98854729, 30.96601376 ], [ 114.98784129, 30.96579676 ], [ 114.98694429, 30.96543177 ], [ 114.98659529, 30.96513778 ], [ 114.98620329, 30.96479979 ], [ 114.98550629, 30.9641378 ], [ 114.98512329, 30.96368081 ], [ 114.98488829, 30.96332182 ], [ 114.98493129, 30.96295682 ], [ 114.98505329, 30.96242084 ], [ 114.98531429, 30.96195685 ], [ 114.98553229, 30.96155585 ], [ 114.98552329, 30.96143686 ], [ 114.98537529, 30.96122986 ], [ 114.98423429, 30.96065387 ], [ 114.98395529, 30.96042288 ], [ 114.98361629, 30.96032588 ], [ 114.98346729, 30.96031888 ], [ 114.98285729, 30.95997589 ], [ 114.98244829, 30.9595779 ], [ 114.98224829, 30.95902591 ], [ 114.98230029, 30.95895891 ], [ 114.98267529, 30.95774394 ], [ 114.98298829, 30.95707595 ], [ 114.98318829, 30.95666996 ], [ 114.98386829, 30.954683 ], [ 114.98484329, 30.95217606 ], [ 114.98513129, 30.95139107 ], [ 114.98506929, 30.95102408 ], [ 114.98473029, 30.95064909 ], [ 114.98397229, 30.95041909 ], [ 114.98364129, 30.9501831 ], [ 114.98344929, 30.9498141 ], [ 114.98348429, 30.94851313 ], [ 114.98350129, 30.94819814 ], [ 114.98355929, 30.94812714 ], [ 114.983743781881856, 30.947899014796199 ] ] ], [ [ [ 114.991985755887598, 30.967521177435355 ], [ 114.99203907, 30.96754718 ], [ 114.99220444, 30.96777054 ], [ 114.99220441, 30.9680184 ], [ 114.9920041, 30.96867962 ], [ 114.99091994, 30.97083766 ], [ 114.98984787, 30.97135762 ], [ 114.989317415566816, 30.971600046514325 ], [ 114.98939329, 30.97160164 ], [ 114.99002029, 30.97158364 ], [ 114.99031129, 30.97154964 ], [ 114.99056029, 30.97152064 ], [ 114.99137929, 30.97114965 ], [ 114.99164929, 30.97058566 ], [ 114.99273829, 30.96843071 ], [ 114.99293829, 30.96776872 ], [ 114.99293829, 30.96752073 ], [ 114.99277229, 30.96729673 ], [ 114.99263329, 30.96722973 ], [ 114.99240629, 30.96730873 ], [ 114.99203229, 30.96751373 ], [ 114.991985755887598, 30.967521177435355 ] ] ], [ [ [ 114.983949930660842, 30.969827575302656 ], [ 114.98346649, 30.96999472 ], [ 114.98300313, 30.97057077 ], [ 114.98190101, 30.97211416 ], [ 114.98080793, 30.9726591 ], [ 114.980045383341931, 30.973358804570459 ], [ 114.98063729, 30.97316561 ], [ 114.98150029, 30.97237762 ], [ 114.98259729, 30.97183564 ], [ 114.98332929, 30.97081666 ], [ 114.98370329, 30.97029467 ], [ 114.983949930660842, 30.969827575302656 ] ] ], [ [ [ 114.978370005711795, 30.973918868389706 ], [ 114.97784746, 30.97405702 ], [ 114.97771692, 30.97417433 ], [ 114.97716184, 30.97482657 ], [ 114.97698837, 30.97590345 ], [ 114.97686663, 30.97786065 ], [ 114.97685863, 30.97819248 ], [ 114.97690144, 30.9786251 ], [ 114.976827950297363, 30.978807734341345 ], [ 114.97686229, 30.97902548 ], [ 114.97741929, 30.97895448 ], [ 114.97739829, 30.97878849 ], [ 114.97758129, 30.9783355 ], [ 114.97753729, 30.97790351 ], [ 114.97754629, 30.97757151 ], [ 114.97766729, 30.97561255 ], [ 114.97784229, 30.97453658 ], [ 114.978370005711795, 30.973918868389706 ] ] ], [ [ [ 114.978162989407252, 30.981476514213707 ], [ 114.9785682, 30.98197725 ], [ 114.98098045, 30.98254578 ], [ 114.98131923, 30.98245083 ], [ 114.98183137, 30.98251126 ], [ 114.98224785, 30.98252901 ], [ 114.98333286, 30.98289255 ], [ 114.98520791, 30.98386234 ], [ 114.98591129, 30.984236 ], [ 114.98650203, 30.98518665 ], [ 114.9869005, 30.98590303 ], [ 114.98688349, 30.98677957 ], [ 114.98681369, 30.98746537 ], [ 114.98675289, 30.98771241 ], [ 114.98527824, 30.98860435 ], [ 114.98406262, 30.9894665 ], [ 114.98398484, 30.9902063 ], [ 114.98397584, 30.99056612 ], [ 114.98417509, 30.99085135 ], [ 114.98472207, 30.99106758 ], [ 114.98533778, 30.99141952 ], [ 114.98585086, 30.99174977 ], [ 114.98646654, 30.99233757 ], [ 114.98647546, 30.99287723 ], [ 114.9862582, 30.99356548 ], [ 114.98526875, 30.99464883 ], [ 114.98515609, 30.99548868 ], [ 114.985442, 30.99599152 ], [ 114.98574584, 30.99641036 ], [ 114.985955, 30.99722925 ], [ 114.98593707, 30.99724829 ], [ 114.98445343, 30.99819821 ], [ 114.98370513, 30.99871816 ], [ 114.98339424, 30.99893496 ], [ 114.982975039521364, 30.999232389945622 ], [ 114.98318929, 30.99961504 ], [ 114.98350629, 30.99909305 ], [ 114.98409829, 30.99867606 ], [ 114.98441129, 30.99846107 ], [ 114.98516129, 30.99794308 ], [ 114.98666829, 30.9969771 ], [ 114.98645929, 30.99615712 ], [ 114.98615429, 30.99573713 ], [ 114.98586629, 30.99523314 ], [ 114.98597929, 30.99439315 ], [ 114.98697329, 30.99331218 ], [ 114.98719029, 30.99262519 ], [ 114.98718129, 30.9920842 ], [ 114.98656329, 30.99149422 ], [ 114.98604929, 30.99116222 ], [ 114.98543029, 30.99080823 ], [ 114.98488129, 30.99059024 ], [ 114.98468129, 30.99030524 ], [ 114.98469029, 30.98994425 ], [ 114.98476829, 30.98920426 ], [ 114.98598829, 30.98834528 ], [ 114.98746929, 30.9874573 ], [ 114.98753029, 30.98721031 ], [ 114.98759929, 30.98652432 ], [ 114.98761629, 30.98564734 ], [ 114.98721629, 30.98492936 ], [ 114.98662329, 30.98397638 ], [ 114.98591729, 30.98360138 ], [ 114.98403629, 30.98262541 ], [ 114.98294729, 30.98225741 ], [ 114.98252829, 30.98223841 ], [ 114.98201529, 30.98217641 ], [ 114.98167529, 30.98227041 ], [ 114.97925329, 30.98169542 ], [ 114.97878829, 30.98113344 ], [ 114.978162989407252, 30.981476514213707 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30044", "Name": "贾庙乡", "layer": "乡镇", "code": "421121200000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.098962042201791, 30.862328889535284 ], [ 115.09782156, 30.86137395 ], [ 115.09673597, 30.86733033 ], [ 115.09510361, 30.87167761 ], [ 115.09321136, 30.87671159 ], [ 115.09106641, 30.88105814 ], [ 115.08837492, 30.88540199 ], [ 115.08627373, 30.88696659 ], [ 115.08464939, 30.88968054 ], [ 115.08293029, 30.89192593 ], [ 115.08101162, 30.89282433 ], [ 115.07924001, 30.89367184 ], [ 115.07800706, 30.89457909 ], [ 115.07752139, 30.89609154 ], [ 115.07710368, 30.89736309 ], [ 115.07688683, 30.89818976 ], [ 115.07679988, 30.8985716 ], [ 115.076668528360273, 30.898714261626267 ], [ 115.07738917, 30.89893513 ], [ 115.07770217, 30.89905713 ], [ 115.07810117, 30.89862314 ], [ 115.07818917, 30.89824115 ], [ 115.07840617, 30.89741417 ], [ 115.07882317, 30.8961422 ], [ 115.07930917, 30.89462923 ], [ 115.08054317, 30.89372225 ], [ 115.08231617, 30.89287527 ], [ 115.08423717, 30.89197729 ], [ 115.08571917, 30.89004234 ], [ 115.08595717, 30.88973135 ], [ 115.08758117, 30.88701741 ], [ 115.08865517, 30.88621743 ], [ 115.08968317, 30.88545144 ], [ 115.09237517, 30.88110554 ], [ 115.09251517, 30.88082155 ], [ 115.09452017, 30.87675664 ], [ 115.09641217, 30.87171976 ], [ 115.09804517, 30.86737086 ], [ 115.09824217, 30.86628688 ], [ 115.098962042201791, 30.862328889535284 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30087", "Name": "七里坪镇", "layer": "乡镇", "code": "421122101000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.768927878205218, 31.340736599113811 ], [ 114.77126493, 31.34549596 ], [ 114.77392171, 31.34780981 ], [ 114.77711747, 31.34966165 ], [ 114.7808413, 31.35175038 ], [ 114.78483593, 31.35452664 ], [ 114.78749191, 31.35660764 ], [ 114.78881192, 31.35822101 ], [ 114.79146813, 31.36099005 ], [ 114.79491492, 31.36399144 ], [ 114.79624311, 31.36652277 ], [ 114.79674671, 31.37019044 ], [ 114.79965484, 31.37364717 ], [ 114.80231982, 31.37526821 ], [ 114.80577543, 31.37758254 ], [ 114.80790255, 31.37942877 ], [ 114.80949059, 31.38172896 ], [ 114.81107055, 31.38494988 ], [ 114.81132291, 31.38678581 ], [ 114.81209515, 31.39091604 ], [ 114.81340566, 31.39344574 ], [ 114.8155238, 31.39666676 ], [ 114.81710383, 31.40011276 ], [ 114.81813662, 31.40447451 ], [ 114.81810215, 31.40905823 ], [ 114.81725996, 31.4138644 ], [ 114.81641785, 31.41775383 ], [ 114.81606169, 31.42246899 ], [ 114.8143864, 31.43147871 ], [ 114.81350924, 31.4352662 ], [ 114.81350914, 31.43642293 ], [ 114.8144208, 31.43921099 ], [ 114.8165739, 31.44405492 ], [ 114.82004632, 31.45446121 ], [ 114.82187788, 31.45820689 ], [ 114.824612403153367, 31.461047452500086 ], [ 114.824612442, 31.461047364 ], [ 114.825517379988767, 31.460981194405797 ], [ 114.82286917, 31.45822922 ], [ 114.82104117, 31.4544863 ], [ 114.81757517, 31.44408554 ], [ 114.81542617, 31.43924466 ], [ 114.81451717, 31.43645672 ], [ 114.81451717, 31.43529975 ], [ 114.81539117, 31.43151084 ], [ 114.81706317, 31.42249505 ], [ 114.81741717, 31.41777816 ], [ 114.81825717, 31.41388725 ], [ 114.81909717, 31.40907736 ], [ 114.81913217, 31.40449347 ], [ 114.81810017, 31.40013157 ], [ 114.81652417, 31.39668765 ], [ 114.81441017, 31.39347072 ], [ 114.81310117, 31.39094178 ], [ 114.81233017, 31.38681188 ], [ 114.81207917, 31.38497592 ], [ 114.81050217, 31.381758 ], [ 114.80960917, 31.38046403 ], [ 114.80891617, 31.37946005 ], [ 114.80679317, 31.37761609 ], [ 114.80334517, 31.37530815 ], [ 114.80068517, 31.37369018 ], [ 114.79778117, 31.37023726 ], [ 114.79727817, 31.36656935 ], [ 114.79595217, 31.36404041 ], [ 114.79251217, 31.36104248 ], [ 114.78985917, 31.35827654 ], [ 114.78854217, 31.35666558 ], [ 114.78588917, 31.35458663 ], [ 114.78190117, 31.35181469 ], [ 114.77818117, 31.34973074 ], [ 114.77498917, 31.34788178 ], [ 114.77233517, 31.34556984 ], [ 114.76996717, 31.34074295 ], [ 114.768927878205218, 31.340736599113811 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30089", "Name": "太平桥镇", "layer": "乡镇", "code": "421122108000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.708214778696004, 30.982879155015258 ], [ 114.70723544, 30.9831418 ], [ 114.706942005635355, 30.983249195336505 ], [ 114.70775517, 30.9832142 ], [ 114.70825917, 30.98303021 ], [ 114.708214778696004, 30.982879155015258 ] ] ], [ [ [ 114.702420385959897, 30.982230565664061 ], [ 114.7021215, 30.98188061 ], [ 114.70114006, 30.98252467 ], [ 114.7004352, 30.98294247 ], [ 114.70027238, 30.98400009 ], [ 114.69863186, 30.98765743 ], [ 114.69327521, 30.99036838 ], [ 114.69033263, 30.99172252 ], [ 114.68711167, 30.99422064 ], [ 114.68388188, 30.9969478 ], [ 114.68065318, 31.00035969 ], [ 114.67874274, 31.00493162 ], [ 114.67708469, 31.01087824 ], [ 114.677290502510829, 31.01526151310842 ], [ 114.67828217, 31.01555146 ], [ 114.67805617, 31.01073257 ], [ 114.67971617, 31.00478671 ], [ 114.68163017, 31.00021481 ], [ 114.68486517, 30.99680789 ], [ 114.68810117, 30.99408395 ], [ 114.69132817, 30.99159101 ], [ 114.69427617, 30.99024104 ], [ 114.69964217, 30.9875361 ], [ 114.70128517, 30.98387919 ], [ 114.70144917, 30.98282221 ], [ 114.70215517, 30.98240422 ], [ 114.702420385959897, 30.982230565664061 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30090", "Name": "八里镇", "layer": "乡镇", "code": "421122107000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.677290502510829, 31.01526151310842 ], [ 114.67731081, 31.01569401 ], [ 114.67941221, 31.01822862 ], [ 114.68232799, 31.02077477 ], [ 114.6854973, 31.02423404 ], [ 114.68893433, 31.02655366 ], [ 114.69290251, 31.02979007 ], [ 114.69581092, 31.03301947 ], [ 114.69764236, 31.03670245 ], [ 114.69813716, 31.04060244 ], [ 114.69544671, 31.04310424 ], [ 114.69168747, 31.04513924 ], [ 114.68714711, 31.04648028 ], [ 114.68258102, 31.04942677 ], [ 114.68041016, 31.05307666 ], [ 114.67877014, 31.05787996 ], [ 114.67687687, 31.06061394 ], [ 114.6760272, 31.06588155 ], [ 114.67914299, 31.07392617 ], [ 114.68311046, 31.07830941 ], [ 114.68396021644638, 31.078629870265321 ], [ 114.68409917, 31.07821302 ], [ 114.68012417, 31.07381912 ], [ 114.67700017, 31.06576431 ], [ 114.67785217, 31.06049543 ], [ 114.67974817, 31.05776349 ], [ 114.68056617, 31.05537354 ], [ 114.68139117, 31.0529616 ], [ 114.68356617, 31.04931268 ], [ 114.68814117, 31.04637275 ], [ 114.69269017, 31.04503878 ], [ 114.69645617, 31.04300883 ], [ 114.69753717, 31.04200585 ], [ 114.69915117, 31.04050989 ], [ 114.69865517, 31.03660698 ], [ 114.69682017, 31.03291906 ], [ 114.69390617, 31.02968313 ], [ 114.68993117, 31.02643921 ], [ 114.68648617, 31.02411126 ], [ 114.68331117, 31.02064434 ], [ 114.68038817, 31.0180914 ], [ 114.67828217, 31.01555146 ], [ 114.677290502510829, 31.01526151310842 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30091", "Name": "杏花乡", "layer": "乡镇", "code": "421122200000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.795532416307239, 31.282374787017453 ], [ 114.79480377, 31.28286673 ], [ 114.7880748, 31.28832136 ], [ 114.78404628, 31.29081179 ], [ 114.77946236, 31.29467845 ], [ 114.77623192, 31.29717574 ], [ 114.77486088, 31.30129465 ], [ 114.77375728, 31.30472517 ], [ 114.77346259, 31.30861838 ], [ 114.77261121, 31.31342471 ], [ 114.77204728, 31.31685988 ], [ 114.77147421, 31.32189647 ], [ 114.77037072, 31.32555511 ], [ 114.76924203, 31.33173588 ], [ 114.76866908, 31.33608385 ], [ 114.76889491, 31.34066946 ], [ 114.768927878205218, 31.340736599113811 ], [ 114.76996717, 31.34074295 ], [ 114.76986517, 31.338665 ], [ 114.76974117, 31.33615706 ], [ 114.77005917, 31.33374111 ], [ 114.77031417, 31.33180616 ], [ 114.77144117, 31.3256223 ], [ 114.77254217, 31.32196139 ], [ 114.77311417, 31.3169225 ], [ 114.77367717, 31.31348558 ], [ 114.77391117, 31.31216361 ], [ 114.77452717, 31.30867669 ], [ 114.77469217, 31.30649674 ], [ 114.77482217, 31.30478178 ], [ 114.77592317, 31.30134886 ], [ 114.77729317, 31.29722696 ], [ 114.78051817, 31.29472502 ], [ 114.78509517, 31.29085211 ], [ 114.78911717, 31.28835416 ], [ 114.79583417, 31.28288729 ], [ 114.795532416307239, 31.282374787017453 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30094", "Name": "永河镇", "layer": "乡镇", "code": "421122109000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.68396021644638, 31.078629870265321 ], [ 114.68683487, 31.07971396 ], [ 114.69243408, 31.07975333 ], [ 114.69269414661089, 31.079666456528372 ], [ 114.68783117, 31.07962399 ], [ 114.68409917, 31.07821302 ], [ 114.68396021644638, 31.078629870265321 ] ] ], [ [ [ 114.709839696101028, 31.075757922449323 ], [ 114.71274977, 31.07577856 ], [ 114.71647405, 31.0771807 ], [ 114.71913094, 31.07880415 ], [ 114.72311584, 31.08043673 ], [ 114.72577242, 31.08183092 ], [ 114.72949758, 31.08300583 ], [ 114.73349117, 31.08418013 ], [ 114.73801526, 31.08535988 ], [ 114.74173126, 31.0872181 ], [ 114.74184924, 31.08726207 ], [ 114.74423785, 31.08930074 ], [ 114.74745875, 31.09171949 ], [ 114.75026703, 31.0936898 ], [ 114.75318981, 31.0943002 ], [ 114.753906982054787, 31.094203495917672 ], [ 114.75132917, 31.09366466 ], [ 114.74989317, 31.09265769 ], [ 114.74852117, 31.09169471 ], [ 114.74530117, 31.08927376 ], [ 114.74291217, 31.08723381 ], [ 114.74279317, 31.08718981 ], [ 114.74052517, 31.08605484 ], [ 114.73907617, 31.08532986 ], [ 114.73648417, 31.08465287 ], [ 114.73455117, 31.08414788 ], [ 114.73055417, 31.08297091 ], [ 114.72682717, 31.08179294 ], [ 114.72416717, 31.08039697 ], [ 114.72017817, 31.07875901 ], [ 114.71751817, 31.07713204 ], [ 114.71378917, 31.07572508 ], [ 114.71005117, 31.07569408 ], [ 114.709839696101028, 31.075757922449323 ] ] ], [ [ [ 114.755216144842365, 31.094145148910815 ], [ 114.758294881258465, 31.096453746712985 ], [ 114.75856117, 31.0963166 ], [ 114.75939317, 31.0964566 ], [ 114.75614317, 31.09401965 ], [ 114.755216144842365, 31.094145148910815 ] ] ], [ [ [ 114.758261651059669, 31.096470861265068 ], [ 114.75750152, 31.09634273 ], [ 114.75667006, 31.09676912 ], [ 114.75502111, 31.09892226 ], [ 114.75435678, 31.09964062 ], [ 114.75386153, 31.10036206 ], [ 114.75352534, 31.10107755 ], [ 114.75220578, 31.10251537 ], [ 114.75062524, 31.10380229 ], [ 114.74971799, 31.10438279 ], [ 114.74805464, 31.10524608 ], [ 114.7472295, 31.10581769 ], [ 114.7467344, 31.10653826 ], [ 114.74540622, 31.10797542 ], [ 114.74408607, 31.10998134 ], [ 114.74417702, 31.11045108 ], [ 114.7467034, 31.118007 ], [ 114.74265908, 31.12261458 ], [ 114.74204789, 31.12554306 ], [ 114.73889615, 31.12975236 ], [ 114.73504332, 31.13174748 ], [ 114.73370775, 31.13381591 ], [ 114.73356257, 31.1367884 ], [ 114.73605811, 31.14094423 ], [ 114.73472958, 31.14180426 ], [ 114.7330663, 31.14266751 ], [ 114.7325705, 31.14338036 ], [ 114.73224262, 31.14410414 ], [ 114.73224255, 31.14481676 ], [ 114.73257831, 31.14553523 ], [ 114.73341782, 31.14624447 ], [ 114.7342494, 31.14638504 ], [ 114.73508101, 31.14667057 ], [ 114.73591263, 31.14710004 ], [ 114.73675225, 31.14781839 ], [ 114.73708807, 31.14852791 ], [ 114.73692007, 31.14924559 ], [ 114.73659212, 31.14996132 ], [ 114.73592831, 31.15067916 ], [ 114.73559938, 31.1514039 ], [ 114.73427283, 31.15283167 ], [ 114.73394392, 31.15354843 ], [ 114.73228865, 31.15498743 ], [ 114.73179286, 31.1557093 ], [ 114.73001175, 31.15780716 ], [ 114.73000251, 31.16063671 ], [ 114.73410069, 31.1668855 ], [ 114.7345872, 31.16990576 ], [ 114.7358894, 31.17289476 ], [ 114.7371916, 31.17657348 ], [ 114.73902371, 31.18048404 ], [ 114.74139381, 31.18508331 ], [ 114.74377331, 31.18785071 ], [ 114.74614304, 31.19084622 ], [ 114.74905203, 31.19453369 ], [ 114.7514313, 31.19753369 ], [ 114.75460003, 31.20144974 ], [ 114.75803836, 31.20513942 ], [ 114.75989727, 31.20721639 ], [ 114.7614599, 31.21180911 ], [ 114.76169469, 31.2161662 ], [ 114.76085175, 31.22028775 ], [ 114.760279, 31.2246384 ], [ 114.76319678, 31.22763582 ], [ 114.76638329, 31.2290345 ], [ 114.76824991, 31.23019349 ], [ 114.77170527, 31.23227966 ], [ 114.77436215, 31.23390159 ], [ 114.77834791, 31.23667974 ], [ 114.78099533, 31.2389889 ], [ 114.78391328, 31.2424471 ], [ 114.78789306, 31.24729543 ], [ 114.79504665, 31.254679 ], [ 114.79976952, 31.26456447 ], [ 114.80160967, 31.26893074 ], [ 114.80239094, 31.27168492 ], [ 114.80236567, 31.27420682 ], [ 114.80100271, 31.27809288 ], [ 114.79884042, 31.2801414 ], [ 114.795532416307239, 31.282374787017453 ], [ 114.79583417, 31.28288729 ], [ 114.79832317, 31.28119933 ], [ 114.79986317, 31.28015435 ], [ 114.80202117, 31.2781024 ], [ 114.80338117, 31.27421149 ], [ 114.80340717, 31.27168855 ], [ 114.80262717, 31.26893561 ], [ 114.80243517, 31.26847963 ], [ 114.80078917, 31.26456972 ], [ 114.79931317, 31.26147679 ], [ 114.79607517, 31.25468894 ], [ 114.79592617, 31.25453495 ], [ 114.79577817, 31.25438195 ], [ 114.78893217, 31.24731212 ], [ 114.78495817, 31.24246723 ], [ 114.78204517, 31.23901231 ], [ 114.77940017, 31.23670436 ], [ 114.77542017, 31.23392942 ], [ 114.77276617, 31.23230946 ], [ 114.76931317, 31.23022551 ], [ 114.76744817, 31.22906754 ], [ 114.76426417, 31.22767157 ], [ 114.76134917, 31.22467364 ], [ 114.76192117, 31.22032074 ], [ 114.76276217, 31.21619784 ], [ 114.76252717, 31.21183794 ], [ 114.76203117, 31.21037797 ], [ 114.76096517, 31.20724404 ], [ 114.75910817, 31.20516709 ], [ 114.75567117, 31.20147718 ], [ 114.75250217, 31.19756027 ], [ 114.75012317, 31.19456034 ], [ 114.74721517, 31.19087042 ], [ 114.74484417, 31.18787449 ], [ 114.74246417, 31.18510555 ], [ 114.74009317, 31.18050366 ], [ 114.73852517, 31.17715674 ], [ 114.73826017, 31.17658975 ], [ 114.73695717, 31.17290884 ], [ 114.73641517, 31.17166486 ], [ 114.73565417, 31.1699189 ], [ 114.73516717, 31.16689597 ], [ 114.73430717, 31.165585 ], [ 114.73356517, 31.16445303 ], [ 114.73279617, 31.16328106 ], [ 114.73193917, 31.16197409 ], [ 114.73106617, 31.16064212 ], [ 114.73107017, 31.15924715 ], [ 114.73107517, 31.15781118 ], [ 114.73205017, 31.15666321 ], [ 114.73285717, 31.15571323 ], [ 114.73335317, 31.15499225 ], [ 114.73501017, 31.15355228 ], [ 114.73533817, 31.1528363 ], [ 114.73666617, 31.15140833 ], [ 114.73699417, 31.15068335 ], [ 114.73765817, 31.14996436 ], [ 114.73798617, 31.14924938 ], [ 114.73815417, 31.1485304 ], [ 114.73781917, 31.14782041 ], [ 114.73741817, 31.14747742 ], [ 114.73697917, 31.14710143 ], [ 114.73614717, 31.14667144 ], [ 114.73531417, 31.14638645 ], [ 114.73448217, 31.14624445 ], [ 114.73364217, 31.14553447 ], [ 114.73330617, 31.14481548 ], [ 114.73330617, 31.1441035 ], [ 114.73363417, 31.14337852 ], [ 114.73413017, 31.14266553 ], [ 114.73579517, 31.14180355 ], [ 114.73712317, 31.14094357 ], [ 114.73462617, 31.13678467 ], [ 114.73477117, 31.13380974 ], [ 114.73610717, 31.13174179 ], [ 114.73940517, 31.13003382 ], [ 114.73996217, 31.12974583 ], [ 114.74311417, 31.12553493 ], [ 114.74372417, 31.122605 ], [ 114.74498317, 31.12117103 ], [ 114.74604917, 31.11995506 ], [ 114.74776917, 31.1179951 ], [ 114.74524217, 31.11043628 ], [ 114.74515017, 31.10996529 ], [ 114.74647017, 31.10795933 ], [ 114.74745117, 31.10689736 ], [ 114.74779817, 31.10652137 ], [ 114.74829417, 31.10579938 ], [ 114.74911817, 31.1052274 ], [ 114.75078117, 31.10436342 ], [ 114.75168917, 31.10378243 ], [ 114.75326817, 31.10249446 ], [ 114.75458717, 31.10105649 ], [ 114.75492317, 31.10034051 ], [ 114.75541917, 31.09961853 ], [ 114.75608217, 31.09889854 ], [ 114.75773017, 31.09674459 ], [ 114.758261651059669, 31.096470861265068 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30099", "Name": "三里畈镇", "layer": "乡镇", "code": "421123106000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.311917031320945, 30.958375214367397 ], [ 115.31100395, 30.95837259 ], [ 115.30461583, 30.95881404 ], [ 115.302237626077655, 30.958978973416894 ], [ 115.30261817, 30.95899976 ], [ 115.30581917, 30.95878377 ], [ 115.31089717, 30.95844377 ], [ 115.311917031320945, 30.958375214367397 ] ] ], [ [ [ 115.292995962672876, 30.958586940150017 ], [ 115.29236064, 30.95855293 ], [ 115.28809041, 30.95923003 ], [ 115.28276139, 30.96013198 ], [ 115.27902096, 30.96310101 ], [ 115.27554975, 30.96538274 ], [ 115.2718175, 30.96697576 ], [ 115.2688759, 30.96811589 ], [ 115.26568224, 30.96902406 ], [ 115.262150176683136, 30.969368777949828 ], [ 115.26227817, 30.96938752 ], [ 115.26682117, 30.96894653 ], [ 115.27001817, 30.96804055 ], [ 115.27296317, 30.96690358 ], [ 115.27670017, 30.96531261 ], [ 115.28017617, 30.96303367 ], [ 115.28392217, 30.96006774 ], [ 115.28697617, 30.95955575 ], [ 115.28926017, 30.95917376 ], [ 115.292995962672876, 30.958586940150017 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30102", "Name": "大崎乡", "layer": "乡镇", "code": "421123204000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.224576638435423, 30.916827794635608 ], [ 115.22379008, 30.91664061 ], [ 115.2221927, 30.91801255 ], [ 115.22216709, 30.92465964 ], [ 115.22214171, 30.9287852 ], [ 115.22212338, 30.93245004 ], [ 115.22264452, 30.93565957 ], [ 115.21944251, 30.93840125 ], [ 115.2159709, 30.94045471 ], [ 115.21356712, 30.94205024 ], [ 115.21089375, 30.94433387 ], [ 115.208209523600559, 30.945565432306886 ], [ 115.20857117, 30.94585306 ], [ 115.21203817, 30.9442541 ], [ 115.21470817, 30.94196615 ], [ 115.21710917, 30.94036719 ], [ 115.22057717, 30.93830923 ], [ 115.22377617, 30.9355643 ], [ 115.22325617, 30.93235337 ], [ 115.22327317, 30.92868545 ], [ 115.22329817, 30.92455755 ], [ 115.22332417, 30.9179067 ], [ 115.224576638435423, 30.916827794635608 ] ] ], [ [ [ 115.190691841055511, 30.928460939620592 ], [ 115.19044476, 30.9284488 ], [ 115.18752043, 30.92866773 ], [ 115.18298877, 30.93002702 ], [ 115.17897884, 30.93161587 ], [ 115.176870240869434, 30.93175911889174 ], [ 115.17698717, 30.93180138 ], [ 115.18017517, 30.93157839 ], [ 115.18417717, 30.92998142 ], [ 115.18870017, 30.92861446 ], [ 115.190691841055511, 30.928460939620592 ] ] ], [ [ [ 115.119297228338041, 30.88107409618625 ], [ 115.11685312, 30.87806287 ], [ 115.10845257, 30.86779396 ], [ 115.106591800190728, 30.867679484919162 ], [ 115.10814017, 30.8699358 ], [ 115.11078717, 30.87269674 ], [ 115.11343417, 30.87591766 ], [ 115.11608017, 30.8786776 ], [ 115.119297228338041, 30.88107409618625 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30106", "Name": "胜利镇", "layer": "乡镇", "code": "421123104000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.393766597640067, 31.112039346493845 ], [ 115.39816787, 31.1142851 ], [ 115.40460958, 31.11521391 ], [ 115.404591390675691, 31.11519631806377 ], [ 115.39953217, 31.11446719 ], [ 115.39445617, 31.11187525 ], [ 115.393766597640067, 31.112039346493845 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30144", "Name": "麻城三河水库", "layer": "乡镇", "code": "421181403000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.25910817, 31.37456317 ], [ 115.26082517, 31.37177923 ], [ 115.25945217, 31.36694234 ], [ 115.26065317, 31.36401041 ], [ 115.25876517, 31.36137247 ], [ 115.25636217, 31.3600525 ], [ 115.25756317, 31.35829354 ], [ 115.25687717, 31.35433564 ], [ 115.25928017, 31.35448263 ], [ 115.26116817, 31.35697457 ], [ 115.26494517, 31.35917352 ], [ 115.26288517, 31.3558016 ], [ 115.25979517, 31.35184369 ], [ 115.25619017, 31.35023073 ], [ 115.25498917, 31.34773879 ], [ 115.25481717, 31.34656582 ], [ 115.25241417, 31.34612583 ], [ 115.25207017, 31.34319389 ], [ 115.25413017, 31.34172793 ], [ 115.26031017, 31.34099495 ], [ 115.26305717, 31.33776902 ], [ 115.26614617, 31.33762302 ], [ 115.26614617, 31.34128794 ], [ 115.26975117, 31.34392688 ], [ 115.27146817, 31.34026196 ], [ 115.27284117, 31.34026196 ], [ 115.27421517, 31.34685881 ], [ 115.27541617, 31.34612583 ], [ 115.27816317, 31.3474458 ], [ 115.28005117, 31.34641982 ], [ 115.27850617, 31.34407387 ], [ 115.28245417, 31.34583283 ], [ 115.28151017, 31.34436687 ], [ 115.28031417, 31.34355989 ], [ 115.27987917, 31.34326689 ], [ 115.27824817, 31.34326689 ], [ 115.27773317, 31.34605283 ], [ 115.27636017, 31.34443987 ], [ 115.27661817, 31.34187393 ], [ 115.27610317, 31.34048196 ], [ 115.27730417, 31.33974797 ], [ 115.27704717, 31.338575 ], [ 115.27524417, 31.33696304 ], [ 115.27472917, 31.33593606 ], [ 115.27361417, 31.33696304 ], [ 115.27224017, 31.33784202 ], [ 115.27103917, 31.33842901 ], [ 115.26897917, 31.34033496 ], [ 115.26910417, 31.33979997 ], [ 115.26940817, 31.338502 ], [ 115.27103917, 31.33762202 ], [ 115.27043817, 31.33659605 ], [ 115.27064817, 31.33173516 ], [ 115.27069517, 31.33065819 ], [ 115.27000917, 31.33117117 ], [ 115.26992317, 31.33234415 ], [ 115.26889317, 31.3344701 ], [ 115.26717617, 31.33410311 ], [ 115.26597517, 31.33337012 ], [ 115.26494517, 31.33183116 ], [ 115.26434417, 31.3302182 ], [ 115.26262717, 31.32853124 ], [ 115.26202617, 31.32919122 ], [ 115.26245617, 31.33095118 ], [ 115.26245617, 31.33190416 ], [ 115.26116817, 31.33205115 ], [ 115.26065317, 31.33337012 ], [ 115.25825017, 31.33359012 ], [ 115.25979517, 31.33498309 ], [ 115.25979517, 31.33791602 ], [ 115.25713417, 31.338795 ], [ 115.25490217, 31.33798902 ], [ 115.25421617, 31.33732903 ], [ 115.25378717, 31.33644905 ], [ 115.25241317, 31.33564307 ], [ 115.25018217, 31.33542307 ], [ 115.24906617, 31.33469009 ], [ 115.24734917, 31.33630305 ], [ 115.24812217, 31.33776902 ], [ 115.24400217, 31.33930898 ], [ 115.24425917, 31.338575 ], [ 115.24348717, 31.33842901 ], [ 115.24280017, 31.33945498 ], [ 115.24048317, 31.338649 ], [ 115.24005417, 31.34077495 ], [ 115.24117017, 31.3429009 ], [ 115.24288617, 31.34429387 ], [ 115.24202817, 31.34575983 ], [ 115.24125517, 31.34451286 ], [ 115.23979617, 31.34649282 ], [ 115.23782217, 31.34869177 ], [ 115.23850917, 31.35059772 ], [ 115.23593417, 31.3514767 ], [ 115.23593417, 31.35323566 ], [ 115.23739317, 31.35543461 ], [ 115.23713517, 31.35653458 ], [ 115.23456117, 31.3557286 ], [ 115.23370217, 31.35477563 ], [ 115.23310117, 31.35550861 ], [ 115.23387417, 31.35697457 ], [ 115.23241517, 31.35748756 ], [ 115.23026917, 31.35756056 ], [ 115.22700717, 31.35389665 ], [ 115.22597717, 31.3559486 ], [ 115.22786517, 31.35800055 ], [ 115.22563417, 31.3601995 ], [ 115.22656617, 31.36157547 ], [ 115.22752217, 31.36298443 ], [ 115.22759017, 31.36339242 ], [ 115.22773117, 31.36423741 ], [ 115.22786517, 31.36503639 ], [ 115.22690917, 31.36521838 ], [ 115.22323117, 31.36591637 ], [ 115.22099917, 31.36313143 ], [ 115.22099917, 31.36664935 ], [ 115.22391717, 31.36723534 ], [ 115.22735117, 31.36620936 ], [ 115.22899117, 31.36588637 ], [ 115.23017917, 31.36565237 ], [ 115.23181417, 31.36532938 ], [ 115.23164217, 31.36327743 ], [ 115.22992517, 31.36107948 ], [ 115.22855217, 31.35946652 ], [ 115.23198517, 31.35931952 ], [ 115.23473217, 31.3600525 ], [ 115.23610517, 31.35844054 ], [ 115.23971017, 31.3603465 ], [ 115.24125517, 31.35844054 ], [ 115.24589017, 31.35756056 ], [ 115.24829317, 31.35726757 ], [ 115.24949517, 31.35536261 ], [ 115.24760717, 31.35257668 ], [ 115.25052517, 31.35286967 ], [ 115.25275617, 31.35418964 ], [ 115.25275617, 31.35653458 ], [ 115.25104017, 31.35814755 ], [ 115.24932317, 31.36151847 ], [ 115.25001017, 31.3643034 ], [ 115.25001017, 31.36606236 ], [ 115.25258517, 31.36371742 ], [ 115.25498817, 31.36386441 ], [ 115.25670517, 31.36576937 ], [ 115.25722017, 31.36767533 ], [ 115.25825017, 31.37119224 ], [ 115.25893617, 31.37485716 ], [ 115.25910817, 31.37456317 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30145", "Name": "龟山镇", "layer": "乡镇", "code": "421181106000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.18006017, 31.00001582 ], [ 115.17078217, 30.99877385 ], [ 115.16731117, 31.0007558 ], [ 115.16509217, 31.00202277 ], [ 115.15920317, 31.0053857 ], [ 115.14632817, 31.01414049 ], [ 115.14624217, 31.01627045 ], [ 115.14795817, 31.01509347 ], [ 115.15001817, 31.01479948 ], [ 115.15190717, 31.01509347 ], [ 115.14589817, 31.01759441 ], [ 115.14418217, 31.01936037 ], [ 115.14452517, 31.02230231 ], [ 115.14435317, 31.02495025 ], [ 115.14658517, 31.02759818 ], [ 115.14710017, 31.02892215 ], [ 115.14435317, 31.02877516 ], [ 115.14418217, 31.02715719 ], [ 115.14246517, 31.02598022 ], [ 115.14126417, 31.02406727 ], [ 115.14126417, 31.02171432 ], [ 115.13937517, 31.02039035 ], [ 115.13851717, 31.02156732 ], [ 115.13954717, 31.0227433 ], [ 115.13920417, 31.02347928 ], [ 115.13697217, 31.02215531 ], [ 115.13319517, 31.02318529 ], [ 115.13525517, 31.02377327 ], [ 115.13662917, 31.02553923 ], [ 115.13868917, 31.0270102 ], [ 115.13577017, 31.0268632 ], [ 115.13525517, 31.02509724 ], [ 115.13182217, 31.02421526 ], [ 115.13250917, 31.02583323 ], [ 115.13027717, 31.02642121 ], [ 115.12821717, 31.0268632 ], [ 115.13027717, 31.0311281 ], [ 115.13113617, 31.03392304 ], [ 115.12547117, 31.02730419 ], [ 115.12014917, 31.02627421 ], [ 115.11894817, 31.02362628 ], [ 115.12049317, 31.02156732 ], [ 115.12169417, 31.01994836 ], [ 115.12306717, 31.01994836 ], [ 115.12238117, 31.01774241 ], [ 115.11963417, 31.01980136 ], [ 115.11705917, 31.01759441 ], [ 115.11396917, 31.01582946 ], [ 115.11379817, 31.01862439 ], [ 115.11414117, 31.01994836 ], [ 115.11568617, 31.01936037 ], [ 115.11688817, 31.01980136 ], [ 115.11860417, 31.02112533 ], [ 115.11585817, 31.02200831 ], [ 115.11826117, 31.02480325 ], [ 115.11911917, 31.02745119 ], [ 115.11740317, 31.02759818 ], [ 115.11602917, 31.02583323 ], [ 115.11534317, 31.02392027 ], [ 115.11396917, 31.02215531 ], [ 115.11139417, 31.02362628 ], [ 115.10985017, 31.02362628 ], [ 115.10933517, 31.02024335 ], [ 115.10538617, 31.02171432 ], [ 115.10332617, 31.02112533 ], [ 115.10281117, 31.02480325 ], [ 115.10092317, 31.02789218 ], [ 115.10137517, 31.02850716 ], [ 115.11064417, 31.02880016 ], [ 115.11527917, 31.0313381 ], [ 115.12763917, 31.035603 ], [ 115.12861917, 31.0398869 ], [ 115.12935617, 31.04310483 ], [ 115.12918417, 31.04707574 ], [ 115.11757117, 31.04583677 ], [ 115.11336317, 31.04691974 ], [ 115.10875717, 31.04810471 ], [ 115.10034617, 31.05163463 ], [ 115.09056017, 31.05163463 ], [ 115.07837317, 31.05163463 ], [ 115.07441917, 31.05342759 ], [ 115.06670017, 31.05692951 ], [ 115.07820017, 31.06119441 ], [ 115.08027017, 31.07132418 ], [ 115.08181517, 31.07426411 ], [ 115.08851017, 31.08088096 ], [ 115.09966917, 31.08235092 ], [ 115.10344617, 31.08587884 ], [ 115.10275917, 31.08999475 ], [ 115.10190117, 31.09322968 ], [ 115.09554917, 31.09719858 ], [ 115.09108617, 31.10542939 ], [ 115.09108617, 31.10983829 ], [ 115.08994717, 31.11201724 ], [ 115.08816817, 31.11512917 ], [ 115.08284617, 31.11968506 ], [ 115.08730917, 31.12468295 ], [ 115.09383917, 31.12651291 ], [ 115.09074917, 31.12783488 ], [ 115.08800317, 31.13077381 ], [ 115.09177917, 31.13283076 ], [ 115.09521317, 31.13870863 ], [ 115.09417517, 31.14334352 ], [ 115.09881017, 31.1440775 ], [ 115.09795117, 31.15230531 ], [ 115.10470017, 31.16077512 ], [ 115.11156617, 31.16547501 ], [ 115.13868917, 31.17105688 ], [ 115.13911017, 31.17228185 ], [ 115.13955217, 31.17356682 ], [ 115.14040617, 31.17605076 ], [ 115.14006217, 31.18427458 ], [ 115.14130117, 31.18798449 ], [ 115.14143517, 31.18838648 ], [ 115.14864517, 31.19132341 ], [ 115.15585517, 31.19132341 ], [ 115.15757217, 31.19514132 ], [ 115.15757217, 31.19697228 ], [ 115.15757217, 31.20376512 ], [ 115.15757217, 31.2048331 ], [ 115.16787117, 31.20894401 ], [ 115.17439417, 31.20395212 ], [ 115.18366417, 31.19984022 ], [ 115.18763717, 31.19931723 ], [ 115.19259117, 31.19866624 ], [ 115.19430717, 31.1919114 ], [ 115.20038617, 31.19120242 ], [ 115.20186017, 31.19103042 ], [ 115.21181717, 31.19220539 ], [ 115.21456417, 31.19321237 ], [ 115.22383317, 31.19661029 ], [ 115.21827617, 31.20186117 ], [ 115.22926317, 31.19158041 ], [ 115.23454217, 31.19281938 ], [ 115.24134317, 31.19441434 ], [ 115.24711617, 31.19862824 ], [ 115.25295217, 31.20156518 ], [ 115.25260917, 31.21272292 ], [ 115.25673417, 31.21220093 ], [ 115.26187917, 31.21154895 ], [ 115.26428217, 31.20450111 ], [ 115.27046217, 31.20332714 ], [ 115.27629817, 31.20626307 ], [ 115.27884917, 31.20533909 ], [ 115.28314017, 31.20277015 ], [ 115.28820417, 31.19829125 ], [ 115.28923417, 31.19146341 ], [ 115.28554317, 31.18081666 ], [ 115.28460017, 31.17244585 ], [ 115.27953617, 31.16656998 ], [ 115.27352817, 31.16032613 ], [ 115.27344717, 31.15394928 ], [ 115.27053917, 31.15477826 ], [ 115.26538917, 31.15536524 ], [ 115.26041117, 31.1527213 ], [ 115.25972417, 31.1527213 ], [ 115.25629117, 31.15154633 ], [ 115.24633517, 31.15198732 ], [ 115.24324517, 31.15007737 ], [ 115.23998317, 31.15051735 ], [ 115.23068317, 31.1486644 ], [ 115.22699117, 31.1484784 ], [ 115.22488917, 31.1483724 ], [ 115.21984517, 31.14289453 ], [ 115.21168517, 31.13403273 ], [ 115.21151317, 31.12029305 ], [ 115.20902317, 31.09714559 ], [ 115.21015217, 31.09321068 ], [ 115.21151217, 31.08847278 ], [ 115.21258517, 31.08491887 ], [ 115.21454417, 31.07843002 ], [ 115.21900117, 31.07506209 ], [ 115.22329917, 31.07181417 ], [ 115.22879217, 31.06813825 ], [ 115.23634517, 31.06696128 ], [ 115.23817017, 31.07078519 ], [ 115.24040117, 31.05828648 ], [ 115.23679617, 31.04505078 ], [ 115.23902817, 31.04299183 ], [ 115.25002217, 31.03909292 ], [ 115.24400517, 31.03981091 ], [ 115.23292417, 31.03643498 ], [ 115.22640017, 31.03496402 ], [ 115.22325517, 31.02840517 ], [ 115.21644417, 31.02525624 ], [ 115.21198117, 31.02819817 ], [ 115.20133817, 31.03025712 ], [ 115.19275517, 31.02378527 ], [ 115.19309817, 31.01731242 ], [ 115.18760517, 31.0093676 ], [ 115.18679417, 31.00126979 ], [ 115.18387617, 30.99943083 ], [ 115.18006017, 31.00001582 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30146", "Name": "南湖办事处", "layer": "乡镇", "code": "421181003000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.98963917, 31.18490056 ], [ 114.98933917, 31.18412958 ], [ 114.98966117, 31.18345059 ], [ 114.98862517, 31.18256461 ], [ 114.98728517, 31.18141764 ], [ 114.98547617, 31.17987068 ], [ 114.98289617, 31.17808572 ], [ 114.98210717, 31.17753973 ], [ 114.98206517, 31.17548378 ], [ 114.98062717, 31.17504279 ], [ 114.98049817, 31.17285784 ], [ 114.98045817, 31.17089788 ], [ 114.97534817, 31.16971991 ], [ 114.97464317, 31.16955791 ], [ 114.96470817, 31.17111788 ], [ 114.96234917, 31.17192586 ], [ 114.95975217, 31.17095288 ], [ 114.96167817, 31.17631376 ], [ 114.96597017, 31.17998467 ], [ 114.96700017, 31.18409758 ], [ 114.96425317, 31.18923746 ], [ 114.95876017, 31.19334836 ], [ 114.95474717, 31.20330413 ], [ 114.96041117, 31.20257015 ], [ 114.96225817, 31.20333413 ], [ 114.97105417, 31.20697505 ], [ 114.97826417, 31.20829702 ], [ 114.98701917, 31.20682805 ], [ 114.99312917, 31.20522809 ], [ 114.98897017, 31.20189417 ], [ 114.98897017, 31.19440534 ], [ 114.99008517, 31.19304737 ], [ 114.99028817, 31.19280838 ], [ 114.99045517, 31.19261138 ], [ 114.99145617, 31.19143141 ], [ 114.99420017, 31.19029344 ], [ 114.99505717, 31.18859247 ], [ 114.99540117, 31.1874355 ], [ 114.99387417, 31.1874855 ], [ 114.99264917, 31.1875265 ], [ 114.99082517, 31.18826048 ], [ 114.99104017, 31.1875995 ], [ 114.99140417, 31.1873425 ], [ 114.99140417, 31.18688351 ], [ 114.99035317, 31.18563554 ], [ 114.98963917, 31.18490056 ] ] ], [ [ [ 115.02053917, 31.17512779 ], [ 115.02173317, 31.17496779 ], [ 115.02336317, 31.17509679 ], [ 115.02352017, 31.17505179 ], [ 115.02578817, 31.1743988 ], [ 115.02774017, 31.17406881 ], [ 115.02810417, 31.1743448 ], [ 115.02911317, 31.17425281 ], [ 115.02866217, 31.17355482 ], [ 115.02913417, 31.17269184 ], [ 115.02937017, 31.17258184 ], [ 115.03007817, 31.17237985 ], [ 115.03035717, 31.17184786 ], [ 115.03085117, 31.17131487 ], [ 115.03164517, 31.17087488 ], [ 115.03158017, 31.17069089 ], [ 115.03102317, 31.17043389 ], [ 115.03093717, 31.1702319 ], [ 115.03085117, 31.16955291 ], [ 115.03119417, 31.16916692 ], [ 115.03095817, 31.16870793 ], [ 115.03067917, 31.16830394 ], [ 115.03033617, 31.16738596 ], [ 115.03031417, 31.16676198 ], [ 115.02975717, 31.16643199 ], [ 115.02997117, 31.165791 ], [ 115.03031517, 31.16478102 ], [ 115.03170917, 31.16382605 ], [ 115.03209617, 31.16349605 ], [ 115.03304017, 31.16279807 ], [ 115.03218217, 31.16210009 ], [ 115.03190317, 31.16057612 ], [ 115.03246017, 31.15905216 ], [ 115.03364117, 31.15756519 ], [ 115.02951117, 31.15253131 ], [ 115.02879417, 31.15180132 ], [ 115.02657617, 31.14954338 ], [ 115.01955417, 31.14239354 ], [ 115.01509117, 31.13769165 ], [ 115.02032717, 31.13482672 ], [ 115.02303617, 31.13302576 ], [ 115.02685017, 31.13049182 ], [ 115.03268617, 31.12836186 ], [ 115.03818017, 31.12924284 ], [ 115.04283917, 31.13070381 ], [ 115.04833217, 31.1309978 ], [ 115.05554217, 31.12967583 ], [ 115.05998117, 31.12968383 ], [ 115.06573117, 31.13071281 ], [ 115.07036617, 31.13306376 ], [ 115.07594517, 31.13864663 ], [ 115.08032417, 31.14285253 ], [ 115.08112817, 31.13761265 ], [ 115.09417517, 31.14334352 ], [ 115.09521317, 31.13870863 ], [ 115.09177917, 31.13283076 ], [ 115.08800317, 31.13077381 ], [ 115.09074917, 31.12783488 ], [ 115.09383917, 31.12651291 ], [ 115.08730917, 31.12468295 ], [ 115.08284617, 31.11968506 ], [ 115.08816817, 31.11512917 ], [ 115.08994717, 31.11201724 ], [ 115.09108617, 31.10983829 ], [ 115.09108617, 31.10542939 ], [ 115.09554917, 31.09719858 ], [ 115.10190117, 31.09322968 ], [ 115.10275917, 31.08999475 ], [ 115.10344617, 31.08587884 ], [ 115.09966917, 31.08235092 ], [ 115.08851017, 31.08088096 ], [ 115.08181517, 31.07426411 ], [ 115.07909217, 31.07678505 ], [ 115.07585517, 31.07745204 ], [ 115.06137317, 31.08068396 ], [ 115.05008617, 31.08116095 ], [ 115.04699617, 31.08134495 ], [ 115.04034517, 31.08465287 ], [ 115.03860017, 31.08592384 ], [ 115.03448417, 31.08891977 ], [ 115.03089417, 31.09274169 ], [ 115.02813317, 31.09568162 ], [ 115.02137817, 31.09827956 ], [ 115.01931817, 31.09842355 ], [ 115.01400817, 31.09812156 ], [ 115.00873517, 31.09465264 ], [ 114.99394417, 31.09378166 ], [ 114.98876817, 31.09347667 ], [ 114.98126917, 31.09303568 ], [ 114.98064617, 31.09528163 ], [ 114.97463817, 31.09689859 ], [ 114.97068917, 31.09733958 ], [ 114.96948817, 31.09925054 ], [ 114.96983617, 31.10138349 ], [ 114.97097617, 31.10837932 ], [ 114.97154817, 31.11189124 ], [ 114.97195117, 31.1140222 ], [ 114.97244317, 31.11662214 ], [ 114.97385317, 31.12408396 ], [ 114.97874517, 31.13209278 ], [ 114.98154017, 31.1312158 ], [ 114.98647017, 31.12966783 ], [ 114.99264917, 31.1268029 ], [ 114.99917317, 31.12761088 ], [ 115.00307417, 31.12979583 ], [ 115.00732917, 31.13217978 ], [ 115.00861317, 31.13289976 ], [ 115.01277417, 31.1355067 ], [ 115.00908417, 31.13954761 ], [ 115.00582217, 31.14211855 ], [ 115.00080317, 31.15306629 ], [ 114.99587917, 31.1528143 ], [ 114.99346917, 31.15309529 ], [ 114.99184517, 31.15461326 ], [ 114.99098717, 31.15813918 ], [ 114.99175917, 31.15902016 ], [ 114.99390317, 31.15970614 ], [ 114.99583417, 31.16029413 ], [ 114.99707917, 31.16066112 ], [ 114.99805617, 31.16096211 ], [ 114.99745717, 31.16285407 ], [ 114.99799317, 31.16298207 ], [ 114.99773617, 31.16349605 ], [ 114.99782117, 31.16415704 ], [ 114.99872317, 31.16454303 ], [ 115.00001017, 31.16634199 ], [ 115.00058917, 31.16852694 ], [ 115.00058817, 31.16889193 ], [ 115.00028817, 31.16955291 ], [ 115.00018017, 31.17059889 ], [ 115.00045917, 31.17146187 ], [ 115.00027917, 31.17222285 ], [ 115.00435417, 31.17304483 ], [ 115.00514917, 31.17317883 ], [ 115.00577017, 31.17328383 ], [ 115.00630517, 31.17331683 ], [ 115.00851717, 31.17337283 ], [ 115.01019617, 31.17341482 ], [ 115.01066117, 31.17342683 ], [ 115.01080017, 31.17343382 ], [ 115.01435117, 31.17360982 ], [ 115.01497317, 31.17377482 ], [ 115.01532017, 31.17391281 ], [ 115.01539517, 31.17394281 ], [ 115.01556517, 31.17400981 ], [ 115.01621817, 31.17426981 ], [ 115.01814917, 31.17382982 ], [ 115.01840717, 31.17425181 ], [ 115.01868617, 31.17478379 ], [ 115.01905017, 31.17504079 ], [ 115.01995217, 31.17520678 ], [ 115.02053917, 31.17512779 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30147", "Name": "宋埠镇", "layer": "乡镇", "code": "421181101000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.753906982054787, 31.094203495917672 ], [ 114.75508256, 31.09404498 ], [ 114.755216144842365, 31.094145148910815 ], [ 114.75614317, 31.09401965 ], [ 114.75939317, 31.0964566 ], [ 114.75856117, 31.0963166 ], [ 114.758294881258465, 31.096453746712985 ], [ 114.75833396, 31.09648305 ], [ 114.758261651059669, 31.096470861265068 ], [ 114.75773017, 31.09674459 ], [ 114.75608217, 31.09889854 ], [ 114.75541917, 31.09961853 ], [ 114.75492317, 31.10034051 ], [ 114.75458717, 31.10105649 ], [ 114.75326817, 31.10249446 ], [ 114.75168917, 31.10378243 ], [ 114.75078117, 31.10436342 ], [ 114.74911817, 31.1052274 ], [ 114.74829417, 31.10579938 ], [ 114.74779817, 31.10652137 ], [ 114.74745117, 31.10689736 ], [ 114.74647017, 31.10795933 ], [ 114.74515017, 31.10996529 ], [ 114.74524217, 31.11043628 ], [ 114.74776917, 31.1179951 ], [ 114.74604917, 31.11995506 ], [ 114.74498317, 31.12117103 ], [ 114.74372417, 31.122605 ], [ 114.74311417, 31.12553493 ], [ 114.73996217, 31.12974583 ], [ 114.73940517, 31.13003382 ], [ 114.73610717, 31.13174179 ], [ 114.73477117, 31.13380974 ], [ 114.73462617, 31.13678467 ], [ 114.73712317, 31.14094357 ], [ 114.73579517, 31.14180355 ], [ 114.73413017, 31.14266553 ], [ 114.73363417, 31.14337852 ], [ 114.73330617, 31.1441035 ], [ 114.73330617, 31.14481548 ], [ 114.73364217, 31.14553447 ], [ 114.73448217, 31.14624445 ], [ 114.73531417, 31.14638645 ], [ 114.73614717, 31.14667144 ], [ 114.73697917, 31.14710143 ], [ 114.73741817, 31.14747742 ], [ 114.73781917, 31.14782041 ], [ 114.73815417, 31.1485304 ], [ 114.73798617, 31.14924938 ], [ 114.73765817, 31.14996436 ], [ 114.73699417, 31.15068335 ], [ 114.73666617, 31.15140833 ], [ 114.73533817, 31.1528363 ], [ 114.73501017, 31.15355228 ], [ 114.73335317, 31.15499225 ], [ 114.73285717, 31.15571323 ], [ 114.73205017, 31.15666321 ], [ 114.73107517, 31.15781118 ], [ 114.73107017, 31.15924715 ], [ 114.73106617, 31.16064212 ], [ 114.73193917, 31.16197409 ], [ 114.73279617, 31.16328106 ], [ 114.73356517, 31.16445303 ], [ 114.73430717, 31.165585 ], [ 114.73516717, 31.16689597 ], [ 114.73565417, 31.1699189 ], [ 114.73641517, 31.17166486 ], [ 114.73695717, 31.17290884 ], [ 114.73826017, 31.17658975 ], [ 114.73852517, 31.17715674 ], [ 114.74009317, 31.18050366 ], [ 114.74246417, 31.18510555 ], [ 114.74484417, 31.18787449 ], [ 114.74721517, 31.19087042 ], [ 114.75012317, 31.19456034 ], [ 114.75250217, 31.19756027 ], [ 114.75567117, 31.20147718 ], [ 114.75910817, 31.20516709 ], [ 114.76096517, 31.20724404 ], [ 114.76203117, 31.21037797 ], [ 114.76252717, 31.21183794 ], [ 114.76276217, 31.21619784 ], [ 114.76192117, 31.22032074 ], [ 114.76134917, 31.22467364 ], [ 114.76426417, 31.22767157 ], [ 114.76744817, 31.22906754 ], [ 114.76931317, 31.23022551 ], [ 114.77276617, 31.23230946 ], [ 114.77879717, 31.23225646 ], [ 114.78351817, 31.23335744 ], [ 114.78673717, 31.23159748 ], [ 114.78854117, 31.22965652 ], [ 114.79107117, 31.22693659 ], [ 114.79407517, 31.22337767 ], [ 114.79227317, 31.2178718 ], [ 114.79296017, 31.21449487 ], [ 114.79330417, 31.21284291 ], [ 114.79454817, 31.21086096 ], [ 114.79562317, 31.209246 ], [ 114.79733917, 31.20675005 ], [ 114.79785417, 31.20293214 ], [ 114.79489117, 31.19696328 ], [ 114.79429117, 31.19520132 ], [ 114.79461917, 31.18858647 ], [ 114.79359017, 31.18535555 ], [ 114.80072917, 31.1746428 ], [ 114.80406117, 31.16905292 ], [ 114.80371817, 31.165675 ], [ 114.80330417, 31.16186409 ], [ 114.80304617, 31.15672221 ], [ 114.81128617, 31.15040536 ], [ 114.81995517, 31.15077235 ], [ 114.82289917, 31.15469626 ], [ 114.82596317, 31.15877916 ], [ 114.83077017, 31.15826517 ], [ 114.83616117, 31.16111811 ], [ 114.84062417, 31.15788618 ], [ 114.84285517, 31.15171633 ], [ 114.84148217, 31.14789641 ], [ 114.84251217, 31.1398166 ], [ 114.83839217, 31.13805264 ], [ 114.83505917, 31.13622868 ], [ 114.84010817, 31.13158579 ], [ 114.84285517, 31.12482695 ], [ 114.84776217, 31.12454695 ], [ 114.84974717, 31.11998106 ], [ 114.85332617, 31.11174725 ], [ 114.85051217, 31.10844032 ], [ 114.84664817, 31.10390043 ], [ 114.84793417, 31.10247146 ], [ 114.85385817, 31.09588961 ], [ 114.85806417, 31.09008375 ], [ 114.85626117, 31.08905477 ], [ 114.84235717, 31.08023397 ], [ 114.83258517, 31.07502309 ], [ 114.82794817, 31.07255015 ], [ 114.82029817, 31.06847124 ], [ 114.81589317, 31.06649129 ], [ 114.80982717, 31.06376435 ], [ 114.80467817, 31.0617064 ], [ 114.79971117, 31.05841447 ], [ 114.79863717, 31.05770249 ], [ 114.79291917, 31.05391258 ], [ 114.79171917, 31.0484087 ], [ 114.79171717, 31.0483977 ], [ 114.79355417, 31.04348782 ], [ 114.79386317, 31.04266184 ], [ 114.79480717, 31.03729296 ], [ 114.79300517, 31.03317505 ], [ 114.79159117, 31.03082011 ], [ 114.79000117, 31.02817317 ], [ 114.78488317, 31.02522724 ], [ 114.78425017, 31.02486325 ], [ 114.77480917, 31.02140633 ], [ 114.76841317, 31.01951237 ], [ 114.76901417, 31.02193931 ], [ 114.76791917, 31.02737619 ], [ 114.76834817, 31.02855316 ], [ 114.76783317, 31.03145809 ], [ 114.76500117, 31.03197308 ], [ 114.76257717, 31.03069211 ], [ 114.76025917, 31.03238407 ], [ 114.75948617, 31.03400404 ], [ 114.76163217, 31.035548 ], [ 114.76455017, 31.03657798 ], [ 114.77090217, 31.03503401 ], [ 114.77510717, 31.03444503 ], [ 114.77639517, 31.03643098 ], [ 114.77759717, 31.0398139 ], [ 114.77665217, 31.04260784 ], [ 114.77304817, 31.04591776 ], [ 114.76824117, 31.05054966 ], [ 114.76927617, 31.05223962 ], [ 114.77185117, 31.05363658 ], [ 114.77459717, 31.05620952 ], [ 114.77537017, 31.0574595 ], [ 114.77622817, 31.05933045 ], [ 114.77397517, 31.0614444 ], [ 114.77292417, 31.06267638 ], [ 114.77103617, 31.06497332 ], [ 114.77067317, 31.06469833 ], [ 114.77039417, 31.06451433 ], [ 114.77011517, 31.06434934 ], [ 114.76960017, 31.06398135 ], [ 114.76868417, 31.06324036 ], [ 114.76922817, 31.06431534 ], [ 114.76970317, 31.06568631 ], [ 114.77176317, 31.06803925 ], [ 114.77178417, 31.07129218 ], [ 114.76882317, 31.07391812 ], [ 114.76285117, 31.07429411 ], [ 114.75308717, 31.07733804 ], [ 114.75034117, 31.07932299 ], [ 114.74774917, 31.08087096 ], [ 114.74644117, 31.08165294 ], [ 114.74275117, 31.08407888 ], [ 114.74052517, 31.08605484 ], [ 114.74279317, 31.08718981 ], [ 114.74291217, 31.08723381 ], [ 114.74530117, 31.08927376 ], [ 114.74852117, 31.09169471 ], [ 114.74989317, 31.09265769 ], [ 114.75132917, 31.09366466 ], [ 114.753906982054787, 31.094203495917672 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30148", "Name": "中馆驿镇", "layer": "乡镇", "code": "421181100000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.95889217, 31.06735127 ], [ 114.95339917, 31.06441034 ], [ 114.95071417, 31.06216039 ], [ 114.94334817, 31.06092142 ], [ 114.93853317, 31.05944345 ], [ 114.93555217, 31.05852847 ], [ 114.93194717, 31.05941045 ], [ 114.92970517, 31.06091342 ], [ 114.92799917, 31.06205739 ], [ 114.92429417, 31.06658729 ], [ 114.92319217, 31.07190916 ], [ 114.91907317, 31.0702922 ], [ 114.91563917, 31.06793926 ], [ 114.91246517, 31.07065819 ], [ 114.91066117, 31.07220316 ], [ 114.90794717, 31.07252015 ], [ 114.90688517, 31.07264415 ], [ 114.89933117, 31.07323213 ], [ 114.89476817, 31.07967299 ], [ 114.88841717, 31.08290791 ], [ 114.88275817, 31.0833969 ], [ 114.87820317, 31.08378989 ], [ 114.87708717, 31.08474487 ], [ 114.87554217, 31.08842078 ], [ 114.87477017, 31.09136072 ], [ 114.87451217, 31.09371266 ], [ 114.87408317, 31.09525563 ], [ 114.87064917, 31.09385766 ], [ 114.86756017, 31.09356367 ], [ 114.86344017, 31.0922407 ], [ 114.85806417, 31.09008375 ], [ 114.85385817, 31.09588961 ], [ 114.84793417, 31.10247146 ], [ 114.84664817, 31.10390043 ], [ 114.85051217, 31.10844032 ], [ 114.85332617, 31.11174725 ], [ 114.84974717, 31.11998106 ], [ 114.84776217, 31.12454695 ], [ 114.84285517, 31.12482695 ], [ 114.84010817, 31.13158579 ], [ 114.83505917, 31.13622868 ], [ 114.83839217, 31.13805264 ], [ 114.84251217, 31.1398166 ], [ 114.84148217, 31.14789641 ], [ 114.84285517, 31.15171633 ], [ 114.84062417, 31.15788618 ], [ 114.83616117, 31.16111811 ], [ 114.83077017, 31.15826517 ], [ 114.82596317, 31.15877916 ], [ 114.82289917, 31.15469626 ], [ 114.81995517, 31.15077235 ], [ 114.81128617, 31.15040536 ], [ 114.80304617, 31.15672221 ], [ 114.80330417, 31.16186409 ], [ 114.80371817, 31.165675 ], [ 114.80406117, 31.16905292 ], [ 114.80072917, 31.1746428 ], [ 114.79359017, 31.18535555 ], [ 114.79461917, 31.18858647 ], [ 114.79429117, 31.19520132 ], [ 114.79489117, 31.19696328 ], [ 114.79798317, 31.19525632 ], [ 114.79932217, 31.19451734 ], [ 114.80455817, 31.19378335 ], [ 114.81657417, 31.19297637 ], [ 114.82069217, 31.19335836 ], [ 114.82369817, 31.19363636 ], [ 114.83168017, 31.19459133 ], [ 114.83691617, 31.1960593 ], [ 114.84009217, 31.19738127 ], [ 114.84567017, 31.20017221 ], [ 114.84884817, 31.19201939 ], [ 114.84884817, 31.18555754 ], [ 114.83957817, 31.1829146 ], [ 114.82756217, 31.17938969 ], [ 114.82461317, 31.17807772 ], [ 114.81897917, 31.17557077 ], [ 114.81108317, 31.17204586 ], [ 114.80559017, 31.16705197 ], [ 114.81142617, 31.16793395 ], [ 114.81966717, 31.17079188 ], [ 114.82412917, 31.17233985 ], [ 114.83511517, 31.17586477 ], [ 114.84747517, 31.17792072 ], [ 114.86223817, 31.17703974 ], [ 114.87116417, 31.17645275 ], [ 114.87305217, 31.17300083 ], [ 114.86996217, 31.17138587 ], [ 114.87159217, 31.1703569 ], [ 114.87322317, 31.17123887 ], [ 114.87597017, 31.1701369 ], [ 114.87803017, 31.16940292 ], [ 114.88077617, 31.16830094 ], [ 114.88257917, 31.16815395 ], [ 114.88180617, 31.17079789 ], [ 114.88154917, 31.17219285 ], [ 114.87923117, 31.17285384 ], [ 114.87725717, 31.17292784 ], [ 114.87639917, 31.17300083 ], [ 114.87562617, 31.17483679 ], [ 114.87391017, 31.17828871 ], [ 114.87185017, 31.18085865 ], [ 114.87056217, 31.1830616 ], [ 114.87296617, 31.18240062 ], [ 114.88112017, 31.18019767 ], [ 114.88300817, 31.18269461 ], [ 114.88669917, 31.18401558 ], [ 114.88120517, 31.18386958 ], [ 114.87957517, 31.18350159 ], [ 114.87854517, 31.18430957 ], [ 114.87820117, 31.18629253 ], [ 114.87871517, 31.1876875 ], [ 114.88086017, 31.18952345 ], [ 114.88240517, 31.19099142 ], [ 114.88386417, 31.1918724 ], [ 114.88609617, 31.19246038 ], [ 114.88437917, 31.19326737 ], [ 114.88223417, 31.19326737 ], [ 114.88309217, 31.19422234 ], [ 114.88506617, 31.19554331 ], [ 114.88746917, 31.19708528 ], [ 114.88867117, 31.19826025 ], [ 114.89055917, 31.19884724 ], [ 114.89304817, 31.19833325 ], [ 114.89116017, 31.19943522 ], [ 114.89476517, 31.20339913 ], [ 114.89261917, 31.20391312 ], [ 114.89013017, 31.2004632 ], [ 114.88695417, 31.19980221 ], [ 114.88489417, 31.19972822 ], [ 114.88352117, 31.19774626 ], [ 114.88223417, 31.19782026 ], [ 114.88086017, 31.19554331 ], [ 114.87940117, 31.19400235 ], [ 114.87914417, 31.19774626 ], [ 114.87794217, 31.19884724 ], [ 114.87880017, 31.2003892 ], [ 114.87656917, 31.20222516 ], [ 114.87768517, 31.20303214 ], [ 114.87871517, 31.20266515 ], [ 114.87888617, 31.2045741 ], [ 114.87734117, 31.20508809 ], [ 114.87665517, 31.20369313 ], [ 114.87485217, 31.20251815 ], [ 114.87596817, 31.19987521 ], [ 114.87699817, 31.19649829 ], [ 114.87536717, 31.19400235 ], [ 114.87347917, 31.19356136 ], [ 114.87262117, 31.19444234 ], [ 114.86901617, 31.19833325 ], [ 114.87013217, 31.19488333 ], [ 114.87176217, 31.19216639 ], [ 114.87425117, 31.19018444 ], [ 114.87528117, 31.1872465 ], [ 114.87287817, 31.18827448 ], [ 114.87150517, 31.19055143 ], [ 114.86935917, 31.19334136 ], [ 114.86944517, 31.19040443 ], [ 114.87116217, 31.18790749 ], [ 114.86961717, 31.18783449 ], [ 114.86695617, 31.18783449 ], [ 114.86652717, 31.18665952 ], [ 114.86498217, 31.18871547 ], [ 114.86489617, 31.18614553 ], [ 114.86232117, 31.1875405 ], [ 114.86086217, 31.18952345 ], [ 114.86086217, 31.19069843 ], [ 114.86249317, 31.19033043 ], [ 114.86180617, 31.1915794 ], [ 114.85966017, 31.1916524 ], [ 114.85751417, 31.1916524 ], [ 114.85605517, 31.19400235 ], [ 114.85631317, 31.19569031 ], [ 114.85717117, 31.1962783 ], [ 114.85742917, 31.19796626 ], [ 114.85699917, 31.19980221 ], [ 114.85708517, 31.20222516 ], [ 114.85820117, 31.20339913 ], [ 114.85494017, 31.20435411 ], [ 114.85597017, 31.20633906 ], [ 114.86489617, 31.20722004 ], [ 114.87168317, 31.20998398 ], [ 114.87823217, 31.21416788 ], [ 114.88218617, 31.21720681 ], [ 114.88514817, 31.21885777 ], [ 114.88733617, 31.21863778 ], [ 114.89047417, 31.2179368 ], [ 114.89691217, 31.21947776 ], [ 114.90515117, 31.21389989 ], [ 114.90755517, 31.20985998 ], [ 114.90965217, 31.20667606 ], [ 114.91176117, 31.20347313 ], [ 114.91588017, 31.20075719 ], [ 114.92600817, 31.19723327 ], [ 114.92892017, 31.19585631 ], [ 114.92914117, 31.19575231 ], [ 114.92927017, 31.19569131 ], [ 114.93965517, 31.19737927 ], [ 114.94669417, 31.19994921 ], [ 114.95172917, 31.20534209 ], [ 114.95200017, 31.20565408 ], [ 114.95474717, 31.20330413 ], [ 114.95876017, 31.19334836 ], [ 114.96425317, 31.18923746 ], [ 114.96700017, 31.18409758 ], [ 114.96597017, 31.17998467 ], [ 114.96167817, 31.17631376 ], [ 114.95975217, 31.17095288 ], [ 114.95820717, 31.16898793 ], [ 114.95664117, 31.16834594 ], [ 114.95466717, 31.16860294 ], [ 114.95329417, 31.16634399 ], [ 114.95194117, 31.16386505 ], [ 114.95033217, 31.16292807 ], [ 114.94956217, 31.16250408 ], [ 114.94857317, 31.16185809 ], [ 114.94484217, 31.15941915 ], [ 114.94449817, 31.15611422 ], [ 114.93643017, 31.15214732 ], [ 114.93283417, 31.13855963 ], [ 114.93203317, 31.1355317 ], [ 114.93085117, 31.1310638 ], [ 114.94362817, 31.13083281 ], [ 114.95119317, 31.13069681 ], [ 114.95796317, 31.14676944 ], [ 114.95840317, 31.14781342 ], [ 114.95993917, 31.1439845 ], [ 114.96432517, 31.13304776 ], [ 114.96647117, 31.12937384 ], [ 114.96862517, 31.12783088 ], [ 114.97385317, 31.12408396 ], [ 114.97244317, 31.11662214 ], [ 114.97195117, 31.1140222 ], [ 114.97154817, 31.11189124 ], [ 114.97097617, 31.10837932 ], [ 114.96983617, 31.10138349 ], [ 114.96948817, 31.09925054 ], [ 114.97068917, 31.09733958 ], [ 114.97463817, 31.09689859 ], [ 114.98064617, 31.09528163 ], [ 114.98126917, 31.09303568 ], [ 114.98058317, 31.08509686 ], [ 114.97388817, 31.08039297 ], [ 114.97520017, 31.07676105 ], [ 114.96970817, 31.07352613 ], [ 114.96438617, 31.07235015 ], [ 114.95889217, 31.06735127 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30149", "Name": "顺河镇", "layer": "乡镇", "code": "421181114000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.82909189199999, 31.460719824000101 ], [ 114.829556265586817, 31.460767637575792 ], [ 114.83006817, 31.46072916 ], [ 114.83261417, 31.46098715 ], [ 114.83535217, 31.46241912 ], [ 114.83731017, 31.46411508 ], [ 114.84167617, 31.47084192 ], [ 114.84244517, 31.47237189 ], [ 114.84461317, 31.47668778 ], [ 114.84644117, 31.47831875 ], [ 114.84859917, 31.47851074 ], [ 114.85734117, 31.4801307 ], [ 114.85962517, 31.4805027 ], [ 114.865518016016779, 31.481462648595819 ], [ 114.86804497, 31.4812085310001 ], [ 114.870136370767298, 31.480489925229165 ], [ 114.87065703, 31.47911676 ], [ 114.87098786, 31.47362608 ], [ 114.87163862, 31.47277789 ], [ 114.871638635702851, 31.472777887163737 ], [ 114.871638688, 31.472777819 ], [ 114.878894225, 31.471467319000102 ], [ 114.879299506420324, 31.471496755060794 ], [ 114.87931517, 31.47149391 ], [ 114.87979317, 31.47140691 ], [ 114.88247317, 31.4715999 ], [ 114.88587317, 31.47316687 ], [ 114.88939617, 31.47509482 ], [ 114.89214617, 31.47653179 ], [ 114.89619117, 31.47711878 ], [ 114.90161517, 31.47757576 ], [ 114.90776317, 31.47894873 ], [ 114.91024717, 31.4801927 ], [ 114.91753317, 31.47334086 ], [ 114.91753317, 31.46926696 ], [ 114.91753217, 31.46016417 ], [ 114.91451717, 31.45421631 ], [ 114.91253417, 31.4503044 ], [ 114.91203917, 31.44932742 ], [ 114.90860617, 31.43643972 ], [ 114.90208517, 31.43146084 ], [ 114.90036917, 31.42296504 ], [ 114.89933917, 31.4115393 ], [ 114.89504717, 31.40399348 ], [ 114.89384617, 31.40047756 ], [ 114.89366917, 31.39934859 ], [ 114.89347017, 31.39808162 ], [ 114.89324517, 31.39410371 ], [ 114.90058317, 31.39546068 ], [ 114.90058317, 31.39148277 ], [ 114.90058317, 31.38886583 ], [ 114.89886617, 31.38373695 ], [ 114.89474617, 31.38183199 ], [ 114.89516717, 31.37704411 ], [ 114.89526117, 31.37597013 ], [ 114.89749317, 31.36776232 ], [ 114.89644317, 31.36381841 ], [ 114.89491817, 31.35808855 ], [ 114.89062617, 31.3557426 ], [ 114.88626017, 31.35851454 ], [ 114.88324517, 31.35354365 ], [ 114.87630417, 31.3514777 ], [ 114.87749917, 31.34774979 ], [ 114.87814017, 31.34574983 ], [ 114.88015417, 31.33946898 ], [ 114.88118417, 31.3343371 ], [ 114.87431717, 31.33345812 ], [ 114.86590617, 31.32905922 ], [ 114.86881217, 31.32734926 ], [ 114.87363017, 31.32451433 ], [ 114.87036717, 31.32026242 ], [ 114.87420017, 31.31139463 ], [ 114.87448717, 31.31072965 ], [ 114.88152517, 31.30545077 ], [ 114.87809217, 31.29870393 ], [ 114.88049517, 31.29313005 ], [ 114.88083817, 31.28828917 ], [ 114.88252917, 31.28742219 ], [ 114.88598817, 31.28564823 ], [ 114.89062317, 31.2866752 ], [ 114.90006417, 31.28359428 ], [ 114.90555717, 31.28212731 ], [ 114.90732917, 31.28295329 ], [ 114.90933417, 31.28388827 ], [ 114.91568617, 31.28755518 ], [ 114.92059217, 31.295461 ], [ 114.92460517, 31.29497101 ], [ 114.92780217, 31.29458102 ], [ 114.92957717, 31.29329205 ], [ 114.93466917, 31.28959314 ], [ 114.92993417, 31.27596545 ], [ 114.92992717, 31.27495748 ], [ 114.92990117, 31.27139256 ], [ 114.92880817, 31.26634368 ], [ 114.92962317, 31.26175778 ], [ 114.93511617, 31.25409096 ], [ 114.93707217, 31.24909708 ], [ 114.94222217, 31.24616214 ], [ 114.94704917, 31.24586015 ], [ 114.95629817, 31.24528116 ], [ 114.95800817, 31.24176524 ], [ 114.96298617, 31.23794933 ], [ 114.96745017, 31.23648237 ], [ 114.97174117, 31.23442741 ], [ 114.97706317, 31.22767457 ], [ 114.97689117, 31.22591361 ], [ 114.97191317, 31.22268369 ], [ 114.96436017, 31.21974775 ], [ 114.96092617, 31.21857378 ], [ 114.95680717, 31.21196693 ], [ 114.95423217, 31.20859001 ], [ 114.95200017, 31.20565408 ], [ 114.95172917, 31.20534209 ], [ 114.94669417, 31.19994921 ], [ 114.93965517, 31.19737927 ], [ 114.92927017, 31.19569131 ], [ 114.92914117, 31.19575231 ], [ 114.92892017, 31.19585631 ], [ 114.92600817, 31.19723327 ], [ 114.91588017, 31.20075719 ], [ 114.91176117, 31.20347313 ], [ 114.90965217, 31.20667606 ], [ 114.90755517, 31.20985998 ], [ 114.90515117, 31.21389989 ], [ 114.89691217, 31.21947776 ], [ 114.89047417, 31.2179368 ], [ 114.88733617, 31.21863778 ], [ 114.88514817, 31.21885777 ], [ 114.88218617, 31.21720681 ], [ 114.87823217, 31.21416788 ], [ 114.87168317, 31.20998398 ], [ 114.86489617, 31.20722004 ], [ 114.85597017, 31.20633906 ], [ 114.85700017, 31.21514786 ], [ 114.86489617, 31.22454364 ], [ 114.85253717, 31.2219007 ], [ 114.84464017, 31.22483664 ], [ 114.83983417, 31.23452441 ], [ 114.84061017, 31.2391683 ], [ 114.84189417, 31.24685313 ], [ 114.84401917, 31.25616691 ], [ 114.84464017, 31.25888685 ], [ 114.84567017, 31.26475671 ], [ 114.84601317, 31.27561446 ], [ 114.84596217, 31.27572346 ], [ 114.84024517, 31.28780918 ], [ 114.83949017, 31.28940414 ], [ 114.82541417, 31.295565 ], [ 114.83399717, 31.28735019 ], [ 114.83743017, 31.28001536 ], [ 114.83804817, 31.27940537 ], [ 114.84189417, 31.27561446 ], [ 114.83914717, 31.26798464 ], [ 114.84189417, 31.26328975 ], [ 114.83846017, 31.25947383 ], [ 114.83571417, 31.25096303 ], [ 114.83331017, 31.24391819 ], [ 114.82678717, 31.24567915 ], [ 114.82472717, 31.23892831 ], [ 114.82346517, 31.23795133 ], [ 114.81751817, 31.23335044 ], [ 114.80756117, 31.24127626 ], [ 114.81099517, 31.23335044 ], [ 114.80790517, 31.22953453 ], [ 114.80764817, 31.22902154 ], [ 114.80378517, 31.22131372 ], [ 114.80700217, 31.22437065 ], [ 114.81305417, 31.23012151 ], [ 114.81957817, 31.22747957 ], [ 114.82198117, 31.23364443 ], [ 114.83022117, 31.23540539 ], [ 114.83434017, 31.2348184 ], [ 114.83090717, 31.23217647 ], [ 114.82953417, 31.22806656 ], [ 114.83365417, 31.22424965 ], [ 114.83571417, 31.21896477 ], [ 114.82987717, 31.21896477 ], [ 114.82369717, 31.2133859 ], [ 114.83022117, 31.21544185 ], [ 114.83365417, 31.2133859 ], [ 114.82850417, 31.20751404 ], [ 114.83674417, 31.21044997 ], [ 114.84532717, 31.208982 ], [ 114.84601317, 31.20575208 ], [ 114.84155017, 31.20281515 ], [ 114.84567017, 31.20017221 ], [ 114.84009217, 31.19738127 ], [ 114.83691617, 31.1960593 ], [ 114.83168017, 31.19459133 ], [ 114.82369817, 31.19363636 ], [ 114.82069217, 31.19335836 ], [ 114.81657417, 31.19297637 ], [ 114.80455817, 31.19378335 ], [ 114.79932217, 31.19451734 ], [ 114.79798317, 31.19525632 ], [ 114.79489117, 31.19696328 ], [ 114.79785417, 31.20293214 ], [ 114.79733917, 31.20675005 ], [ 114.79562317, 31.209246 ], [ 114.79454817, 31.21086096 ], [ 114.79330417, 31.21284291 ], [ 114.79296017, 31.21449487 ], [ 114.79227317, 31.2178718 ], [ 114.79407517, 31.22337767 ], [ 114.79107117, 31.22693659 ], [ 114.78854117, 31.22965652 ], [ 114.78673717, 31.23159748 ], [ 114.78351817, 31.23335744 ], [ 114.77879717, 31.23225646 ], [ 114.77276617, 31.23230946 ], [ 114.77542017, 31.23392942 ], [ 114.77940017, 31.23670436 ], [ 114.78204517, 31.23901231 ], [ 114.78495817, 31.24246723 ], [ 114.78893217, 31.24731212 ], [ 114.79577817, 31.25438195 ], [ 114.79592617, 31.25453495 ], [ 114.79607517, 31.25468894 ], [ 114.79931317, 31.26147679 ], [ 114.80078917, 31.26456972 ], [ 114.80243517, 31.26847963 ], [ 114.80262717, 31.26893561 ], [ 114.80340717, 31.27168855 ], [ 114.80338117, 31.27421149 ], [ 114.80202117, 31.2781024 ], [ 114.79986317, 31.28015435 ], [ 114.79832317, 31.28119933 ], [ 114.79583417, 31.28288729 ], [ 114.78911717, 31.28835416 ], [ 114.78509517, 31.29085211 ], [ 114.78051817, 31.29472502 ], [ 114.77729317, 31.29722696 ], [ 114.77592317, 31.30134886 ], [ 114.77482217, 31.30478178 ], [ 114.77469217, 31.30649674 ], [ 114.77452717, 31.30867669 ], [ 114.77391117, 31.31216361 ], [ 114.77367717, 31.31348558 ], [ 114.77311417, 31.3169225 ], [ 114.77254217, 31.32196139 ], [ 114.77144117, 31.3256223 ], [ 114.77031417, 31.33180616 ], [ 114.77005917, 31.33374111 ], [ 114.76974117, 31.33615706 ], [ 114.76986517, 31.338665 ], [ 114.77537017, 31.34392987 ], [ 114.78464017, 31.34825477 ], [ 114.79742917, 31.34539584 ], [ 114.80206417, 31.34077795 ], [ 114.80489617, 31.33784602 ], [ 114.80697917, 31.33604906 ], [ 114.80858817, 31.33663604 ], [ 114.80998217, 31.33810401 ], [ 114.81056117, 31.33964397 ], [ 114.81073217, 31.34237191 ], [ 114.81096817, 31.34400287 ], [ 114.81088217, 31.34517585 ], [ 114.81083917, 31.34598183 ], [ 114.81092517, 31.34658681 ], [ 114.81058217, 31.3469718 ], [ 114.81038817, 31.34748479 ], [ 114.81004517, 31.34807178 ], [ 114.80899417, 31.34836477 ], [ 114.80809217, 31.34865777 ], [ 114.80706217, 31.34891476 ], [ 114.80601017, 31.34935375 ], [ 114.80369317, 31.35053072 ], [ 114.79768517, 31.3558816 ], [ 114.79727817, 31.36656935 ], [ 114.79778117, 31.37023726 ], [ 114.80068517, 31.37369018 ], [ 114.80334517, 31.37530815 ], [ 114.80679317, 31.37761609 ], [ 114.80891617, 31.37946005 ], [ 114.80960917, 31.38046403 ], [ 114.81050217, 31.381758 ], [ 114.81207917, 31.38497592 ], [ 114.81233017, 31.38681188 ], [ 114.81310117, 31.39094178 ], [ 114.81441017, 31.39347072 ], [ 114.81652417, 31.39668765 ], [ 114.81810017, 31.40013157 ], [ 114.81913217, 31.40449347 ], [ 114.81909717, 31.40907736 ], [ 114.81825717, 31.41388725 ], [ 114.81741717, 31.41777816 ], [ 114.81706317, 31.42249505 ], [ 114.81539117, 31.43151084 ], [ 114.81451717, 31.43529975 ], [ 114.81451717, 31.43645672 ], [ 114.81542617, 31.43924466 ], [ 114.81757517, 31.44408554 ], [ 114.82104117, 31.4544863 ], [ 114.82286917, 31.45822922 ], [ 114.825517379988767, 31.460981194405797 ], [ 114.82909189199999, 31.460719824000101 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30150", "Name": "麻城明山水库", "layer": "乡镇", "code": "421181402000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.09113817, 31.02730419 ], [ 115.08873517, 31.02509724 ], [ 115.08993717, 31.02347928 ], [ 115.08976517, 31.02171432 ], [ 115.09131017, 31.02009536 ], [ 115.09079517, 31.01891938 ], [ 115.09405717, 31.01862439 ], [ 115.09766217, 31.01744742 ], [ 115.09903517, 31.01891938 ], [ 115.09766217, 31.02024335 ], [ 115.09766217, 31.02171432 ], [ 115.09920717, 31.02333228 ], [ 115.10161017, 31.02612722 ], [ 115.10092317, 31.02789218 ], [ 115.10281117, 31.02480325 ], [ 115.10332617, 31.02112533 ], [ 115.10538617, 31.02171432 ], [ 115.10933517, 31.02024335 ], [ 115.10985017, 31.02362628 ], [ 115.11139417, 31.02362628 ], [ 115.11396917, 31.02215531 ], [ 115.11534317, 31.02392027 ], [ 115.11602917, 31.02583323 ], [ 115.11740317, 31.02759818 ], [ 115.11911917, 31.02745119 ], [ 115.11826117, 31.02480325 ], [ 115.11585817, 31.02200831 ], [ 115.11860417, 31.02112533 ], [ 115.11688817, 31.01980136 ], [ 115.11568617, 31.01936037 ], [ 115.11414117, 31.01994836 ], [ 115.11379817, 31.01862439 ], [ 115.11396917, 31.01582946 ], [ 115.11705917, 31.01759441 ], [ 115.11963417, 31.01980136 ], [ 115.12238117, 31.01774241 ], [ 115.12306717, 31.01994836 ], [ 115.12169417, 31.01994836 ], [ 115.12049317, 31.02156732 ], [ 115.11894817, 31.02362628 ], [ 115.12014917, 31.02627421 ], [ 115.12547117, 31.02730419 ], [ 115.13113617, 31.03392304 ], [ 115.13027717, 31.0311281 ], [ 115.12821717, 31.0268632 ], [ 115.13027717, 31.02642121 ], [ 115.13250917, 31.02583323 ], [ 115.13182217, 31.02421526 ], [ 115.13525517, 31.02509724 ], [ 115.13577017, 31.0268632 ], [ 115.13868917, 31.0270102 ], [ 115.13662917, 31.02553923 ], [ 115.13525517, 31.02377327 ], [ 115.13319517, 31.02318529 ], [ 115.13697217, 31.02215531 ], [ 115.13920417, 31.02347928 ], [ 115.13954717, 31.0227433 ], [ 115.13851717, 31.02156732 ], [ 115.13937517, 31.02039035 ], [ 115.14126417, 31.02171432 ], [ 115.14126417, 31.02406727 ], [ 115.14246517, 31.02598022 ], [ 115.14418217, 31.02715719 ], [ 115.14435317, 31.02877516 ], [ 115.14710017, 31.02892215 ], [ 115.14658517, 31.02759818 ], [ 115.14435317, 31.02495025 ], [ 115.14452517, 31.02230231 ], [ 115.14418217, 31.01936037 ], [ 115.14589817, 31.01759441 ], [ 115.15190717, 31.01509347 ], [ 115.15001817, 31.01479948 ], [ 115.14795817, 31.01509347 ], [ 115.14624217, 31.01627045 ], [ 115.14332417, 31.01553546 ], [ 115.14195017, 31.0137695 ], [ 115.14092017, 31.01229854 ], [ 115.14212217, 31.00906161 ], [ 115.14160717, 31.00685466 ], [ 115.14143517, 31.00405973 ], [ 115.14195017, 31.00008682 ], [ 115.14042517, 30.99718188 ], [ 115.14040517, 30.99714388 ], [ 115.13954717, 31.00008682 ], [ 115.13954717, 31.00214677 ], [ 115.13800217, 31.00376473 ], [ 115.13886017, 31.00788464 ], [ 115.13920417, 31.01082757 ], [ 115.14006217, 31.01553546 ], [ 115.14023417, 31.01641844 ], [ 115.13783017, 31.0183304 ], [ 115.13422517, 31.02009536 ], [ 115.13233717, 31.01980136 ], [ 115.13130717, 31.01788941 ], [ 115.13027717, 31.02053735 ], [ 115.12787417, 31.02039035 ], [ 115.12753117, 31.01862439 ], [ 115.12718717, 31.01685943 ], [ 115.12581417, 31.01465248 ], [ 115.12152317, 31.01597645 ], [ 115.11688817, 31.01479948 ], [ 115.12203717, 31.01273953 ], [ 115.12512717, 31.01171055 ], [ 115.12529917, 31.00994459 ], [ 115.12409717, 31.00876762 ], [ 115.12049317, 31.01038558 ], [ 115.11774617, 31.01141556 ], [ 115.11654417, 31.01097457 ], [ 115.11620117, 31.00817863 ], [ 115.11585817, 31.00641367 ], [ 115.11465617, 31.00626667 ], [ 115.11225317, 31.00832663 ], [ 115.11139417, 31.00832663 ], [ 115.11208117, 31.00611968 ], [ 115.10899117, 31.0009698 ], [ 115.10813317, 31.00332374 ], [ 115.10624517, 31.00361774 ], [ 115.10796117, 31.00803163 ], [ 115.10367017, 31.00626667 ], [ 115.10504317, 31.00979759 ], [ 115.10418517, 31.01185755 ], [ 115.09972217, 31.01229854 ], [ 115.09594517, 31.01435849 ], [ 115.09199717, 31.01435849 ], [ 115.08959317, 31.01215154 ], [ 115.08753417, 31.01038458 ], [ 115.08778817, 31.0094286 ], [ 115.08839217, 31.00714865 ], [ 115.08701917, 31.00317675 ], [ 115.08478717, 31.0052367 ], [ 115.08547417, 31.00862062 ], [ 115.08272717, 31.00994459 ], [ 115.08049517, 31.01082757 ], [ 115.07980917, 31.01244553 ], [ 115.07763817, 31.01236453 ], [ 115.07586117, 31.01229854 ], [ 115.07414417, 31.01421149 ], [ 115.07414417, 31.01597645 ], [ 115.07637617, 31.01685943 ], [ 115.07397217, 31.0180364 ], [ 115.07208417, 31.01906638 ], [ 115.07294217, 31.02127233 ], [ 115.06985217, 31.0227433 ], [ 115.06830717, 31.02450926 ], [ 115.07002417, 31.02892215 ], [ 115.07345717, 31.02774518 ], [ 115.07757717, 31.02715719 ], [ 115.07905417, 31.02742819 ], [ 115.08238417, 31.02803917 ], [ 115.08564517, 31.02833417 ], [ 115.08598917, 31.03068711 ], [ 115.08770517, 31.03024612 ], [ 115.08856417, 31.02833417 ], [ 115.09131017, 31.02730419 ], [ 115.09113817, 31.02730419 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30151", "Name": "黄土岗镇", "layer": "乡镇", "code": "421181111000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.999223670301504, 31.487890596708937 ], [ 115.002341046, 31.488579826 ], [ 115.004165995232711, 31.489388908021819 ], [ 115.00553517, 31.48963148 ], [ 115.00658117, 31.49038547 ], [ 115.00678117, 31.49163044 ], [ 115.00579717, 31.49391438 ], [ 114.99746817, 31.50212619 ], [ 114.99733817, 31.50310717 ], [ 114.99779017, 31.50415414 ], [ 115.00015417, 31.50501012 ], [ 115.00579817, 31.50705408 ], [ 115.00736717, 31.50315517 ], [ 115.04353517, 31.47513882 ], [ 115.05234317, 31.46831498 ], [ 115.05749217, 31.46363009 ], [ 115.06229917, 31.45337933 ], [ 115.06245817, 31.44074762 ], [ 115.06264217, 31.42613796 ], [ 115.06431717, 31.42310204 ], [ 115.06538917, 31.42115808 ], [ 115.07225517, 31.41822815 ], [ 115.08083817, 31.41734917 ], [ 115.09025617, 31.4203861 ], [ 115.09446617, 31.42174307 ], [ 115.09628817, 31.42233005 ], [ 115.10349817, 31.42174407 ], [ 115.11723117, 31.41500522 ], [ 115.11878517, 31.41429824 ], [ 115.12238017, 31.41266128 ], [ 115.13165017, 31.41383325 ], [ 115.13858217, 31.41770516 ], [ 115.15053317, 31.42438101 ], [ 115.15406017, 31.42369102 ], [ 115.16953517, 31.42066509 ], [ 115.18349217, 31.41793516 ], [ 115.19653817, 31.41734917 ], [ 115.21198817, 31.41881414 ], [ 115.217742475506569, 31.427114482438238 ], [ 115.218473476, 31.4269727070001 ], [ 115.219284456872728, 31.427172482057287 ], [ 115.21965217, 31.42710094 ], [ 115.22442117, 31.42827192 ], [ 115.227959148543476, 31.429073705872796 ], [ 115.230441046, 31.428734985000101 ], [ 115.234033661, 31.427164976 ], [ 115.237886796, 31.4253346190001 ], [ 115.23848002972835, 31.425180757496964 ], [ 115.22514217, 31.41891413 ], [ 115.22033317, 31.40572844 ], [ 115.21209317, 31.40162654 ], [ 115.20866017, 31.39693764 ], [ 115.20591317, 31.38961082 ], [ 115.20591317, 31.38492192 ], [ 115.20185517, 31.38480993 ], [ 115.19527017, 31.38462893 ], [ 115.19552717, 31.38397595 ], [ 115.19877117, 31.37573614 ], [ 115.18503817, 31.36518338 ], [ 115.18295617, 31.36376142 ], [ 115.17427617, 31.35783155 ], [ 115.16787217, 31.35345666 ], [ 115.15757217, 31.34993774 ], [ 115.14658617, 31.34231491 ], [ 115.14686717, 31.34087195 ], [ 115.14795917, 31.33527708 ], [ 115.15207917, 31.32471932 ], [ 115.15070617, 31.31592053 ], [ 115.14383917, 31.30770772 ], [ 115.14284317, 31.30345182 ], [ 115.14259817, 31.30240684 ], [ 115.14195117, 31.2996419 ], [ 115.14177917, 31.29890792 ], [ 115.13765917, 31.28952014 ], [ 115.13636817, 31.28532624 ], [ 115.13422617, 31.2783704 ], [ 115.12627217, 31.2740115 ], [ 115.12408717, 31.27903838 ], [ 115.12251117, 31.2826653 ], [ 115.12246417, 31.2827743 ], [ 115.11559717, 31.27749242 ], [ 115.10944817, 31.27503847 ], [ 115.10461117, 31.26986359 ], [ 115.09843117, 31.26634168 ], [ 115.09530017, 31.26634168 ], [ 115.09293817, 31.26634168 ], [ 115.08881817, 31.26047281 ], [ 115.08231817, 31.25618691 ], [ 115.07975417, 31.25449695 ], [ 115.07144917, 31.25957283 ], [ 115.06615917, 31.25929884 ], [ 115.06253817, 31.25616691 ], [ 115.05309617, 31.2479991 ], [ 115.05286017, 31.24893408 ], [ 115.04830617, 31.25636391 ], [ 115.03529117, 31.26293875 ], [ 115.03320017, 31.26399473 ], [ 115.01895117, 31.27485048 ], [ 115.01689217, 31.27888739 ], [ 115.02049717, 31.28130733 ], [ 115.02564717, 31.28336128 ], [ 115.03174617, 31.28585722 ], [ 115.03192417, 31.29085011 ], [ 115.03217517, 31.29788595 ], [ 115.03440717, 31.30103887 ], [ 115.04230317, 31.30155286 ], [ 115.04290417, 31.3041198 ], [ 115.04050117, 31.30749272 ], [ 115.03526017, 31.31035066 ], [ 115.03182717, 31.31445756 ], [ 115.03221217, 31.32283937 ], [ 115.03251317, 31.32940421 ], [ 115.03285817, 31.33691504 ], [ 115.03320017, 31.34436987 ], [ 115.02702017, 31.35199369 ], [ 115.02013617, 31.35525961 ], [ 115.01466017, 31.35785755 ], [ 115.02171517, 31.37984204 ], [ 115.02600217, 31.39319973 ], [ 115.02839317, 31.40065056 ], [ 115.02450317, 31.40412148 ], [ 115.01328717, 31.41413024 ], [ 115.01255817, 31.41919913 ], [ 115.01068117, 31.43224082 ], [ 115.00848117, 31.44752547 ], [ 114.99955417, 31.45631226 ], [ 114.99843017, 31.45988018 ], [ 114.99744817, 31.4629971 ], [ 114.99405017, 31.47377485 ], [ 114.99529617, 31.47528282 ], [ 114.99693517, 31.47979771 ], [ 114.99706617, 31.48496359 ], [ 114.99720517, 31.48659855 ], [ 114.99778917, 31.48745053 ], [ 114.999223670301504, 31.487890596708937 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30152", "Name": "麻城浮桥河水库", "layer": "乡镇", "code": "421181400000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84567017, 31.20017221 ], [ 114.84155017, 31.20281515 ], [ 114.84601317, 31.20575208 ], [ 114.84532717, 31.208982 ], [ 114.83674417, 31.21044997 ], [ 114.82850417, 31.20751404 ], [ 114.83365417, 31.2133859 ], [ 114.83022117, 31.21544185 ], [ 114.82369717, 31.2133859 ], [ 114.82987717, 31.21896477 ], [ 114.83571417, 31.21896477 ], [ 114.83365417, 31.22424965 ], [ 114.82953417, 31.22806656 ], [ 114.83090717, 31.23217647 ], [ 114.83434017, 31.2348184 ], [ 114.83022117, 31.23540539 ], [ 114.82198117, 31.23364443 ], [ 114.81957817, 31.22747957 ], [ 114.81305417, 31.23012151 ], [ 114.80700217, 31.22437065 ], [ 114.80378517, 31.22131372 ], [ 114.80764817, 31.22902154 ], [ 114.80790517, 31.22953453 ], [ 114.81099517, 31.23335044 ], [ 114.80756117, 31.24127626 ], [ 114.81751817, 31.23335044 ], [ 114.82346517, 31.23795133 ], [ 114.82472717, 31.23892831 ], [ 114.82678717, 31.24567915 ], [ 114.83331017, 31.24391819 ], [ 114.83571417, 31.25096303 ], [ 114.83846017, 31.25947383 ], [ 114.84189417, 31.26328975 ], [ 114.83914717, 31.26798464 ], [ 114.84189417, 31.27561446 ], [ 114.83804817, 31.27940537 ], [ 114.83743017, 31.28001536 ], [ 114.83399717, 31.28735019 ], [ 114.82541417, 31.295565 ], [ 114.83949017, 31.28940414 ], [ 114.84024517, 31.28780918 ], [ 114.84596217, 31.27572346 ], [ 114.84601317, 31.27561446 ], [ 114.84567017, 31.26475671 ], [ 114.84464017, 31.25888685 ], [ 114.84401917, 31.25616691 ], [ 114.84189417, 31.24685313 ], [ 114.84061017, 31.2391683 ], [ 114.83983417, 31.23452441 ], [ 114.84464017, 31.22483664 ], [ 114.85253717, 31.2219007 ], [ 114.86489617, 31.22454364 ], [ 114.85700017, 31.21514786 ], [ 114.85597017, 31.20633906 ], [ 114.85494017, 31.20435411 ], [ 114.85820117, 31.20339913 ], [ 114.85708517, 31.20222516 ], [ 114.85699917, 31.19980221 ], [ 114.85742917, 31.19796626 ], [ 114.85717117, 31.1962783 ], [ 114.85631317, 31.19569031 ], [ 114.85605517, 31.19400235 ], [ 114.85751417, 31.1916524 ], [ 114.85966017, 31.1916524 ], [ 114.86180617, 31.1915794 ], [ 114.86249317, 31.19033043 ], [ 114.86086217, 31.19069843 ], [ 114.86086217, 31.18952345 ], [ 114.86232117, 31.1875405 ], [ 114.86489617, 31.18614553 ], [ 114.86498217, 31.18871547 ], [ 114.86652717, 31.18665952 ], [ 114.86695617, 31.18783449 ], [ 114.86961717, 31.18783449 ], [ 114.87116217, 31.18790749 ], [ 114.86944517, 31.19040443 ], [ 114.86935917, 31.19334136 ], [ 114.87150517, 31.19055143 ], [ 114.87287817, 31.18827448 ], [ 114.87528117, 31.1872465 ], [ 114.87425117, 31.19018444 ], [ 114.87176217, 31.19216639 ], [ 114.87013217, 31.19488333 ], [ 114.86901617, 31.19833325 ], [ 114.87262117, 31.19444234 ], [ 114.87347917, 31.19356136 ], [ 114.87536717, 31.19400235 ], [ 114.87699817, 31.19649829 ], [ 114.87596817, 31.19987521 ], [ 114.87485217, 31.20251815 ], [ 114.87665517, 31.20369313 ], [ 114.87734117, 31.20508809 ], [ 114.87888617, 31.2045741 ], [ 114.87871517, 31.20266515 ], [ 114.87768517, 31.20303214 ], [ 114.87656917, 31.20222516 ], [ 114.87880017, 31.2003892 ], [ 114.87794217, 31.19884724 ], [ 114.87914417, 31.19774626 ], [ 114.87940117, 31.19400235 ], [ 114.88086017, 31.19554331 ], [ 114.88223417, 31.19782026 ], [ 114.88352117, 31.19774626 ], [ 114.88489417, 31.19972822 ], [ 114.88695417, 31.19980221 ], [ 114.89013017, 31.2004632 ], [ 114.89261917, 31.20391312 ], [ 114.89476517, 31.20339913 ], [ 114.89116017, 31.19943522 ], [ 114.89304817, 31.19833325 ], [ 114.89055917, 31.19884724 ], [ 114.88867117, 31.19826025 ], [ 114.88746917, 31.19708528 ], [ 114.88506617, 31.19554331 ], [ 114.88309217, 31.19422234 ], [ 114.88223417, 31.19326737 ], [ 114.88437917, 31.19326737 ], [ 114.88609617, 31.19246038 ], [ 114.88386417, 31.1918724 ], [ 114.88240517, 31.19099142 ], [ 114.88086017, 31.18952345 ], [ 114.87871517, 31.1876875 ], [ 114.87820117, 31.18629253 ], [ 114.87854517, 31.18430957 ], [ 114.87957517, 31.18350159 ], [ 114.88120517, 31.18386958 ], [ 114.88669917, 31.18401558 ], [ 114.88300817, 31.18269461 ], [ 114.88112017, 31.18019767 ], [ 114.87296617, 31.18240062 ], [ 114.87056217, 31.1830616 ], [ 114.87185017, 31.18085865 ], [ 114.87391017, 31.17828871 ], [ 114.87562617, 31.17483679 ], [ 114.87639917, 31.17300083 ], [ 114.87725717, 31.17292784 ], [ 114.87923117, 31.17285384 ], [ 114.88154917, 31.17219285 ], [ 114.88180617, 31.17079789 ], [ 114.88257917, 31.16815395 ], [ 114.88077617, 31.16830094 ], [ 114.87803017, 31.16940292 ], [ 114.87597017, 31.1701369 ], [ 114.87322317, 31.17123887 ], [ 114.87159217, 31.1703569 ], [ 114.86996217, 31.17138587 ], [ 114.87305217, 31.17300083 ], [ 114.87116417, 31.17645275 ], [ 114.86223817, 31.17703974 ], [ 114.84747517, 31.17792072 ], [ 114.83511517, 31.17586477 ], [ 114.82412917, 31.17233985 ], [ 114.81966717, 31.17079188 ], [ 114.81142617, 31.16793395 ], [ 114.80559017, 31.16705197 ], [ 114.81108317, 31.17204586 ], [ 114.81897917, 31.17557077 ], [ 114.82461317, 31.17807772 ], [ 114.82756217, 31.17938969 ], [ 114.83957817, 31.1829146 ], [ 114.84884817, 31.18555754 ], [ 114.84884817, 31.19201939 ], [ 114.84567017, 31.20017221 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30153", "Name": "宋埠良种场", "layer": "乡镇", "code": "421181401000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.76824117, 31.05054966 ], [ 114.76592317, 31.05476356 ], [ 114.76540917, 31.05569754 ], [ 114.76343517, 31.06018243 ], [ 114.76629617, 31.0618314 ], [ 114.76868417, 31.06324036 ], [ 114.76960017, 31.06398135 ], [ 114.77011517, 31.06434934 ], [ 114.77039417, 31.06451433 ], [ 114.77067317, 31.06469833 ], [ 114.77103617, 31.06497332 ], [ 114.77292417, 31.06267638 ], [ 114.77397517, 31.0614444 ], [ 114.77622817, 31.05933045 ], [ 114.77537017, 31.0574595 ], [ 114.77459717, 31.05620952 ], [ 114.77185117, 31.05363658 ], [ 114.76927617, 31.05223962 ], [ 114.76824117, 31.05054966 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30154", "Name": "木子店镇", "layer": "乡镇", "code": "421181109000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.417117863778216, 31.352482096976857 ], [ 115.417149085837551, 31.352482124899034 ], [ 115.417193924827302, 31.352482164998953 ], [ 115.417705744468918, 31.351526914375082 ], [ 115.418175193464364, 31.350650741525712 ], [ 115.41889621, 31.34888704 ], [ 115.418896218730126, 31.348887038474917 ], [ 115.418896241, 31.348886984 ], [ 115.42039814499999, 31.348624608000101 ], [ 115.422299665, 31.348952586000099 ], [ 115.42234988524126, 31.348993794317352 ], [ 115.42366617, 31.34921976 ], [ 115.42549617, 31.35072272 ], [ 115.426797096001039, 31.351305713811829 ], [ 115.42830873299999, 31.351306430000101 ], [ 115.43099150899999, 31.350851483 ], [ 115.432824043, 31.349805668 ], [ 115.43462063299999, 31.349135806 ], [ 115.436452491, 31.348024283 ], [ 115.437694269231628, 31.346455993233338 ], [ 115.43926618, 31.34099877 ], [ 115.44154973, 31.32609432 ], [ 115.44233991, 31.32249916 ], [ 115.442339931107625, 31.322499101609935 ], [ 115.442339933, 31.322499093 ], [ 115.444041441, 31.317792204000099 ], [ 115.44573475599999, 31.316355204 ], [ 115.44835652, 31.315832965 ], [ 115.449524905290957, 31.316074308273723 ], [ 115.44966717, 31.31604553 ], [ 115.45155517, 31.31643252 ], [ 115.45370317, 31.31747449 ], [ 115.45585917, 31.31982544 ], [ 115.455921992118604, 31.319854257424428 ], [ 115.457047372, 31.31949366 ], [ 115.457638192, 31.318645419000099 ], [ 115.458098695, 31.317141110000101 ], [ 115.458453745148375, 31.312833095418725 ], [ 115.45848928, 31.31240193 ], [ 115.4565869, 31.30959132 ], [ 115.45528535, 31.30710613 ], [ 115.45489445, 31.30462315 ], [ 115.45476446, 31.30043946 ], [ 115.45404386, 31.29540473 ], [ 115.45221222, 31.28997864 ], [ 115.45123075, 31.28743142 ], [ 115.45129114, 31.28491358 ], [ 115.451291155604636, 31.284913558174985 ], [ 115.451291157, 31.284913500000101 ], [ 115.45227298, 31.283540297000101 ], [ 115.452435439, 31.28344271 ], [ 115.452765378, 31.28319857 ], [ 115.452934861, 31.28308101 ], [ 115.453121391, 31.282987481000099 ], [ 115.45346938199999, 31.282830355 ], [ 115.457568429, 31.280403162 ], [ 115.460902663, 31.278311357000099 ], [ 115.462283078, 31.276612596000099 ], [ 115.463124976, 31.273607025 ], [ 115.465617287, 31.269030501 ], [ 115.467639984, 31.2672656720001 ], [ 115.47078236349958, 31.266734501831756 ], [ 115.46776997, 31.26102278 ], [ 115.46483506, 31.2548306 ], [ 115.46217828, 31.24840948 ], [ 115.46004307, 31.24450877 ], [ 115.45711677, 31.23946276 ], [ 115.45472032, 31.23395949 ], [ 115.45259292, 31.22730956 ], [ 115.45179521, 31.22180828 ], [ 115.44993648, 31.2183687 ], [ 115.44699298, 31.21606939 ], [ 115.44406782, 31.21445909 ], [ 115.44032516, 31.21284756 ], [ 115.43659119, 31.21078078 ], [ 115.4325793, 31.20916691 ], [ 115.42884676, 31.20663852 ], [ 115.42484356, 31.20342172 ], [ 115.4224473, 31.20089507 ], [ 115.41924332, 31.19836785 ], [ 115.41657744, 31.19607145 ], [ 115.41337244, 31.19377196 ], [ 115.41097656, 31.19193621 ], [ 115.40910939, 31.18963723 ], [ 115.40617482, 31.18711006 ], [ 115.40270967, 31.18297493 ], [ 115.40031326, 31.17999291 ], [ 115.40032247, 31.17769907 ], [ 115.40325654, 31.17564475 ], [ 115.40646932, 31.17244253 ], [ 115.40915306, 31.17153331 ], [ 115.41182719, 31.17062042 ], [ 115.41476205, 31.16856463 ], [ 115.4142328, 31.16558673 ], [ 115.41211332, 31.16076665 ], [ 115.41105487, 31.15618232 ], [ 115.41079406, 31.15182742 ], [ 115.4108024, 31.14815934 ], [ 115.4100031, 31.14471766 ], [ 115.40761591, 31.14013179 ], [ 115.40521985, 31.13737522 ], [ 115.40256199, 31.13484772 ], [ 115.39855941, 31.13094314 ], [ 115.39643244, 31.12887418 ], [ 115.39375768, 31.12772399 ], [ 115.38976384, 31.12473446 ], [ 115.38696506, 31.12352713 ], [ 115.3857428, 31.12190954 ], [ 115.385346440895503, 31.120659432203425 ], [ 115.38390717, 31.11948707 ], [ 115.38302517, 31.11876909 ], [ 115.37614217, 31.11316322 ], [ 115.37399117, 31.11445719 ], [ 115.36736517, 31.1184431 ], [ 115.36343917, 31.12080504 ], [ 115.36172217, 31.13197378 ], [ 115.36043317, 31.13395374 ], [ 115.35957517, 31.13821464 ], [ 115.35897417, 31.14137357 ], [ 115.35691417, 31.14394451 ], [ 115.35451217, 31.14372551 ], [ 115.34943017, 31.1399186 ], [ 115.34627317, 31.13755465 ], [ 115.34155017, 31.13667167 ], [ 115.33806017, 31.1357827 ], [ 115.33360017, 31.13464772 ], [ 115.33116617, 31.13402774 ], [ 115.32438417, 31.13182279 ], [ 115.30505917, 31.1357257 ], [ 115.30473017, 31.13579169 ], [ 115.29297217, 31.13373074 ], [ 115.28447517, 31.13608769 ], [ 115.28172817, 31.1357147 ], [ 115.27258617, 31.14541447 ], [ 115.27181417, 31.1483524 ], [ 115.27284417, 31.15129134 ], [ 115.27303717, 31.1527243 ], [ 115.27348817, 31.15345929 ], [ 115.27344717, 31.15394928 ], [ 115.27352817, 31.16032613 ], [ 115.27953617, 31.16656998 ], [ 115.28460017, 31.17244585 ], [ 115.28554317, 31.18081666 ], [ 115.28923417, 31.19146341 ], [ 115.28820417, 31.19829125 ], [ 115.28314017, 31.20277015 ], [ 115.28768117, 31.21232193 ], [ 115.29626417, 31.21496487 ], [ 115.30827917, 31.22083773 ], [ 115.31754817, 31.23199347 ], [ 115.31858517, 31.23562739 ], [ 115.32098217, 31.24402919 ], [ 115.32352617, 31.24604315 ], [ 115.33025117, 31.25136702 ], [ 115.33370717, 31.25727489 ], [ 115.33402817, 31.25782387 ], [ 115.33465917, 31.25769688 ], [ 115.33986417, 31.2566499 ], [ 115.34775817, 31.26339875 ], [ 115.35153417, 31.26868062 ], [ 115.36286417, 31.27337551 ], [ 115.36938717, 31.28100534 ], [ 115.37010017, 31.28572523 ], [ 115.37076017, 31.29010013 ], [ 115.36850917, 31.29359805 ], [ 115.36698417, 31.29596799 ], [ 115.37453717, 31.29772795 ], [ 115.38071717, 31.29801894 ], [ 115.38586617, 31.30388681 ], [ 115.39136017, 31.31063265 ], [ 115.39204617, 31.32236538 ], [ 115.38896017, 31.32513331 ], [ 115.38518017, 31.32852424 ], [ 115.38251817, 31.33108818 ], [ 115.38251717, 31.33555907 ], [ 115.39015717, 31.33731903 ], [ 115.39959817, 31.33233315 ], [ 115.40397617, 31.338785 ], [ 115.41053417, 31.3430309 ], [ 115.41203517, 31.34925975 ], [ 115.41628617, 31.35210169 ], [ 115.417117863778216, 31.352482096976857 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30155", "Name": "湖北省麻城开发区", "layer": "乡镇", "code": "421181471000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.98154017, 31.1312158 ], [ 114.97874517, 31.13209278 ], [ 114.97385317, 31.12408396 ], [ 114.96862517, 31.12783088 ], [ 114.96647117, 31.12937384 ], [ 114.96432517, 31.13304776 ], [ 114.95993917, 31.1439845 ], [ 114.95840317, 31.14781342 ], [ 114.95796317, 31.14676944 ], [ 114.95119317, 31.13069681 ], [ 114.94362817, 31.13083281 ], [ 114.93085117, 31.1310638 ], [ 114.93203317, 31.1355317 ], [ 114.93283417, 31.13855963 ], [ 114.93643017, 31.15214732 ], [ 114.94449817, 31.15611422 ], [ 114.94484217, 31.15941915 ], [ 114.94857317, 31.16185809 ], [ 114.94956217, 31.16250408 ], [ 114.95033217, 31.16292807 ], [ 114.95194117, 31.16386505 ], [ 114.95329417, 31.16634399 ], [ 114.95466717, 31.16860294 ], [ 114.95664117, 31.16834594 ], [ 114.95820717, 31.16898793 ], [ 114.95975217, 31.17095288 ], [ 114.96234917, 31.17192586 ], [ 114.96470817, 31.17111788 ], [ 114.97464317, 31.16955791 ], [ 114.97534817, 31.16971991 ], [ 114.98045817, 31.17089788 ], [ 114.98049817, 31.17285784 ], [ 114.98062717, 31.17504279 ], [ 114.98206517, 31.17548378 ], [ 114.98210717, 31.17753973 ], [ 114.98289617, 31.17808572 ], [ 114.98547617, 31.17987068 ], [ 114.98728517, 31.18141764 ], [ 114.98862517, 31.18256461 ], [ 114.98966117, 31.18345059 ], [ 114.98933917, 31.18412958 ], [ 114.98963917, 31.18490056 ], [ 114.99035317, 31.18563554 ], [ 114.99140417, 31.18688351 ], [ 114.99140417, 31.1873425 ], [ 114.99104017, 31.1875995 ], [ 114.99082517, 31.18826048 ], [ 114.99264917, 31.1875265 ], [ 114.99387417, 31.1874855 ], [ 114.99540117, 31.1874355 ], [ 114.99919417, 31.1873245 ], [ 114.99880717, 31.18288261 ], [ 114.99837217, 31.18056766 ], [ 114.99804217, 31.1788107 ], [ 114.99795217, 31.17833371 ], [ 114.99782017, 31.17763173 ], [ 114.99822817, 31.17651075 ], [ 114.99949417, 31.17471179 ], [ 115.00015917, 31.17272884 ], [ 115.00027917, 31.17222285 ], [ 115.00045917, 31.17146187 ], [ 115.00018017, 31.17059889 ], [ 115.00028817, 31.16955291 ], [ 115.00058817, 31.16889193 ], [ 115.00058917, 31.16852694 ], [ 115.00001017, 31.16634199 ], [ 114.99872317, 31.16454303 ], [ 114.99782117, 31.16415704 ], [ 114.99773617, 31.16349605 ], [ 114.99799317, 31.16298207 ], [ 114.99745717, 31.16285407 ], [ 114.99805617, 31.16096211 ], [ 114.99707917, 31.16066112 ], [ 114.99583417, 31.16029413 ], [ 114.99390317, 31.15970614 ], [ 114.99175917, 31.15902016 ], [ 114.99098717, 31.15813918 ], [ 114.99184517, 31.15461326 ], [ 114.99346917, 31.15309529 ], [ 114.99587917, 31.1528143 ], [ 115.00080317, 31.15306629 ], [ 115.00582217, 31.14211855 ], [ 115.00908417, 31.13954761 ], [ 115.01277417, 31.1355067 ], [ 115.00861317, 31.13289976 ], [ 115.00732917, 31.13217978 ], [ 115.00307417, 31.12979583 ], [ 114.99917317, 31.12761088 ], [ 114.99264917, 31.1268029 ], [ 114.98647017, 31.12966783 ], [ 114.98154017, 31.1312158 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30156", "Name": "三河口镇", "layer": "乡镇", "code": "421181110000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.23848002972835, 31.425180757496964 ], [ 115.241419205, 31.424418451000101 ], [ 115.24364112799999, 31.4244835760001 ], [ 115.245792868, 31.424319573 ], [ 115.247163638415046, 31.423731600108876 ], [ 115.248524479530971, 31.422048191723455 ], [ 115.251844586, 31.417941098 ], [ 115.252785210598105, 31.417139026838697 ], [ 115.25487935, 31.41418506 ], [ 115.2549405, 31.41209358 ], [ 115.25376849, 31.40817206 ], [ 115.24631408, 31.39794448 ], [ 115.24494243, 31.39657094 ], [ 115.24455162, 31.39500238 ], [ 115.24507265, 31.3938257 ], [ 115.245072680357183, 31.393825686618641 ], [ 115.245072680357183, 31.393825686618637 ], [ 115.245072701, 31.39382564 ], [ 115.251643082, 31.390929426000099 ], [ 115.25313643, 31.390535076 ], [ 115.25500953, 31.3894436900001 ], [ 115.256059164957762, 31.38960525752459 ], [ 115.25617817, 31.38955282 ], [ 115.25873117, 31.38994581 ], [ 115.26134517, 31.39112378 ], [ 115.26475017, 31.3946547 ], [ 115.26912917, 31.39864661 ], [ 115.27396917, 31.40116655 ], [ 115.27618017, 31.40176653 ], [ 115.276436369324472, 31.401835854523089 ], [ 115.280108407, 31.401433993000101 ], [ 115.2845514, 31.3996026290001 ], [ 115.288604553209765, 31.397052531047255 ], [ 115.29219735, 31.39175658 ], [ 115.29566116, 31.38607066 ], [ 115.295661172195324, 31.386070654208307 ], [ 115.295661204, 31.3860706020001 ], [ 115.298143336, 31.384891811 ], [ 115.30116475620467, 31.384452061045266 ], [ 115.31773317, 31.37896006 ], [ 115.32666017, 31.37397718 ], [ 115.33695917, 31.37221822 ], [ 115.34725917, 31.36401041 ], [ 115.35687217, 31.35697457 ], [ 115.366621167833998, 31.352863100383388 ], [ 115.36626071, 31.35217606 ], [ 115.36646053, 31.35119515 ], [ 115.36646056569019, 31.351195132793766 ], [ 115.366460574, 31.351195092000101 ], [ 115.368354127, 31.350282216 ], [ 115.381229226, 31.346752912000099 ], [ 115.390259601, 31.345774012 ], [ 115.393463987, 31.34485964 ], [ 115.395295957, 31.343422939000099 ], [ 115.397649249, 31.340743828 ], [ 115.398950496, 31.339697277 ], [ 115.400322769, 31.339500519000101 ], [ 115.401374014, 31.339698641 ], [ 115.401436235517465, 31.339818069874301 ], [ 115.40170717, 31.33977897 ], [ 115.40275717, 31.33997697 ], [ 115.40360817, 31.34161193 ], [ 115.40471917, 31.34422787 ], [ 115.40576117, 31.34520885 ], [ 115.40851217, 31.34703781 ], [ 115.41203517, 31.34925975 ], [ 115.41053417, 31.3430309 ], [ 115.40397617, 31.338785 ], [ 115.39959817, 31.33233315 ], [ 115.39015717, 31.33731903 ], [ 115.38251717, 31.33555907 ], [ 115.38251817, 31.33108818 ], [ 115.38518017, 31.32852424 ], [ 115.38896017, 31.32513331 ], [ 115.39204617, 31.32236538 ], [ 115.39136017, 31.31063265 ], [ 115.38586617, 31.30388681 ], [ 115.38071717, 31.29801894 ], [ 115.37453717, 31.29772795 ], [ 115.36698417, 31.29596799 ], [ 115.36850917, 31.29359805 ], [ 115.37076017, 31.29010013 ], [ 115.37010017, 31.28572523 ], [ 115.36938717, 31.28100534 ], [ 115.36286417, 31.27337551 ], [ 115.35153417, 31.26868062 ], [ 115.34775817, 31.26339875 ], [ 115.33986417, 31.2566499 ], [ 115.33465917, 31.25769688 ], [ 115.33402817, 31.25782387 ], [ 115.33370717, 31.25727489 ], [ 115.33025117, 31.25136702 ], [ 115.32352617, 31.24604315 ], [ 115.32098217, 31.24402919 ], [ 115.31858517, 31.23562739 ], [ 115.31754817, 31.23199347 ], [ 115.30827917, 31.22083773 ], [ 115.29626417, 31.21496487 ], [ 115.28768117, 31.21232193 ], [ 115.28314017, 31.20277015 ], [ 115.27884917, 31.20533909 ], [ 115.27629817, 31.20626307 ], [ 115.27046217, 31.20332714 ], [ 115.26428217, 31.20450111 ], [ 115.26187917, 31.21154895 ], [ 115.25673417, 31.21220093 ], [ 115.25260917, 31.21272292 ], [ 115.25295217, 31.20156518 ], [ 115.24711617, 31.19862824 ], [ 115.24134317, 31.19441434 ], [ 115.23454217, 31.19281938 ], [ 115.22926317, 31.19158041 ], [ 115.21827617, 31.20186117 ], [ 115.21495917, 31.21475287 ], [ 115.21449917, 31.21654283 ], [ 115.21655917, 31.22358967 ], [ 115.21550717, 31.22943553 ], [ 115.21524917, 31.2308695 ], [ 115.21449917, 31.2350384 ], [ 115.21333917, 31.23815633 ], [ 115.21270517, 31.23985929 ], [ 115.21209617, 31.24149625 ], [ 115.21201017, 31.24325621 ], [ 115.21038017, 31.24560416 ], [ 115.20874817, 31.24853909 ], [ 115.20797717, 31.25176801 ], [ 115.20737817, 31.25213501 ], [ 115.20462917, 31.25381997 ], [ 115.19810617, 31.25308598 ], [ 115.19252717, 31.25154502 ], [ 115.18849317, 31.2478761 ], [ 115.18205617, 31.2478761 ], [ 115.17473817, 31.24491417 ], [ 115.16649817, 31.2437402 ], [ 115.15631417, 31.24172825 ], [ 115.15408217, 31.24774511 ], [ 115.15099217, 31.2480391 ], [ 115.14738717, 31.2481851 ], [ 115.14515617, 31.24495617 ], [ 115.14154517, 31.24440518 ], [ 115.13554317, 31.24348921 ], [ 115.13237417, 31.24484417 ], [ 115.12764617, 31.24686513 ], [ 115.12686017, 31.252238 ], [ 115.12610117, 31.25743088 ], [ 115.13176617, 31.26359374 ], [ 115.13107917, 31.26740865 ], [ 115.13073617, 31.27269153 ], [ 115.13422617, 31.2783704 ], [ 115.13636817, 31.28532624 ], [ 115.13765917, 31.28952014 ], [ 115.14177917, 31.29890792 ], [ 115.14195117, 31.2996419 ], [ 115.14259817, 31.30240684 ], [ 115.14284317, 31.30345182 ], [ 115.14383917, 31.30770772 ], [ 115.15070617, 31.31592053 ], [ 115.15207917, 31.32471932 ], [ 115.14795917, 31.33527708 ], [ 115.14686717, 31.34087195 ], [ 115.14658617, 31.34231491 ], [ 115.15757217, 31.34993774 ], [ 115.16787217, 31.35345666 ], [ 115.17427617, 31.35783155 ], [ 115.18295617, 31.36376142 ], [ 115.18503817, 31.36518338 ], [ 115.19877117, 31.37573614 ], [ 115.19552717, 31.38397595 ], [ 115.19527017, 31.38462893 ], [ 115.20185517, 31.38480993 ], [ 115.20591317, 31.38492192 ], [ 115.20591317, 31.38961082 ], [ 115.20866017, 31.39693764 ], [ 115.21209317, 31.40162654 ], [ 115.22033317, 31.40572844 ], [ 115.22514217, 31.41891413 ], [ 115.23848002972835, 31.425180757496964 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30157", "Name": "龟山风景区管理处", "layer": "乡镇", "code": "421181472000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.19384217, 31.1571112 ], [ 115.19590217, 31.15828718 ], [ 115.19761917, 31.15858017 ], [ 115.20276917, 31.1574052 ], [ 115.20276917, 31.15534924 ], [ 115.19985117, 31.15358628 ], [ 115.19573117, 31.15388028 ], [ 115.19384217, 31.1571112 ] ] ], [ [ [ 115.23256617, 31.17761973 ], [ 115.23239517, 31.17776573 ], [ 115.23273817, 31.18011567 ], [ 115.23531317, 31.1790877 ], [ 115.23823117, 31.17717874 ], [ 115.24166417, 31.17776573 ], [ 115.24338117, 31.1790877 ], [ 115.24458217, 31.17805972 ], [ 115.24441117, 31.17556278 ], [ 115.24200817, 31.1743878 ], [ 115.23840317, 31.17335983 ], [ 115.23599917, 31.17365382 ], [ 115.23342417, 31.17585677 ], [ 115.23256617, 31.17761973 ] ] ], [ [ [ 115.19268917, 31.13454572 ], [ 115.19620817, 31.13513371 ], [ 115.20221617, 31.13263577 ], [ 115.20367517, 31.13021182 ], [ 115.20316017, 31.1267579 ], [ 115.20118617, 31.12323098 ], [ 115.19466317, 31.12058604 ], [ 115.18513517, 31.12073304 ], [ 115.18213117, 31.12102703 ], [ 115.18135917, 31.12447995 ], [ 115.18273217, 31.12793388 ], [ 115.18762517, 31.13278276 ], [ 115.19268917, 31.13454572 ] ] ], [ [ [ 115.24121517, 31.09583362 ], [ 115.23885517, 31.08962276 ], [ 115.23572317, 31.08229293 ], [ 115.23284817, 31.079018 ], [ 115.23559517, 31.07446011 ], [ 115.23817017, 31.07078519 ], [ 115.23634517, 31.06696128 ], [ 115.22879217, 31.06813825 ], [ 115.22329917, 31.07181417 ], [ 115.21900117, 31.07506209 ], [ 115.21454417, 31.07843002 ], [ 115.21258517, 31.08491887 ], [ 115.21151217, 31.08847278 ], [ 115.21015217, 31.09321068 ], [ 115.20902317, 31.09714559 ], [ 115.21151317, 31.12029305 ], [ 115.21168517, 31.13403273 ], [ 115.21984517, 31.14289453 ], [ 115.22488917, 31.1483724 ], [ 115.22699117, 31.1484784 ], [ 115.23068317, 31.1486644 ], [ 115.23998317, 31.15051735 ], [ 115.24324517, 31.15007737 ], [ 115.24633517, 31.15198732 ], [ 115.25629117, 31.15154633 ], [ 115.25972417, 31.1527213 ], [ 115.26041117, 31.1527213 ], [ 115.26538917, 31.15536524 ], [ 115.27053917, 31.15477826 ], [ 115.27344717, 31.15394928 ], [ 115.27348817, 31.15345929 ], [ 115.27303717, 31.1527243 ], [ 115.27284417, 31.15129134 ], [ 115.27181417, 31.1483524 ], [ 115.27258617, 31.14541447 ], [ 115.26730817, 31.14049559 ], [ 115.26387517, 31.12286299 ], [ 115.25460517, 31.11904208 ], [ 115.25735217, 31.11110626 ], [ 115.24979917, 31.09905354 ], [ 115.24702017, 31.09809356 ], [ 115.24435917, 31.09713859 ], [ 115.24121517, 31.09583362 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30158", "Name": "阎家河镇", "layer": "乡镇", "code": "421181105000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.13955217, 31.17356682 ], [ 115.13911017, 31.17228185 ], [ 115.13868917, 31.17105688 ], [ 115.11156617, 31.16547501 ], [ 115.10470017, 31.16077512 ], [ 115.09795117, 31.15230531 ], [ 115.09881017, 31.1440775 ], [ 115.09417517, 31.14334352 ], [ 115.08112817, 31.13761265 ], [ 115.08032417, 31.14285253 ], [ 115.07983917, 31.14576546 ], [ 115.08318717, 31.15245031 ], [ 115.08330617, 31.15822118 ], [ 115.08341417, 31.16341906 ], [ 115.08295117, 31.16453503 ], [ 115.07963717, 31.17252585 ], [ 115.07133417, 31.17927469 ], [ 115.06721817, 31.18261961 ], [ 115.06590417, 31.18368759 ], [ 115.06494717, 31.18565454 ], [ 115.06418817, 31.18721251 ], [ 115.06435317, 31.18786949 ], [ 115.06644917, 31.1962183 ], [ 115.06748317, 31.20722904 ], [ 115.06616317, 31.21042697 ], [ 115.06542317, 31.21222093 ], [ 115.06190217, 31.21941476 ], [ 115.06067217, 31.22296068 ], [ 115.05981617, 31.22542862 ], [ 115.05697817, 31.23360643 ], [ 115.05732117, 31.24241223 ], [ 115.05309617, 31.2479991 ], [ 115.06253817, 31.25616691 ], [ 115.06615917, 31.25929884 ], [ 115.07144917, 31.25957283 ], [ 115.07975417, 31.25449695 ], [ 115.08231817, 31.25618691 ], [ 115.08881817, 31.26047281 ], [ 115.09293817, 31.26634168 ], [ 115.09530017, 31.26634168 ], [ 115.09843117, 31.26634168 ], [ 115.10461117, 31.26986359 ], [ 115.10944817, 31.27503847 ], [ 115.11559717, 31.27749242 ], [ 115.12246417, 31.2827743 ], [ 115.12251117, 31.2826653 ], [ 115.12408717, 31.27903838 ], [ 115.12627217, 31.2740115 ], [ 115.13422617, 31.2783704 ], [ 115.13073617, 31.27269153 ], [ 115.13107917, 31.26740865 ], [ 115.13176617, 31.26359374 ], [ 115.12610117, 31.25743088 ], [ 115.12686017, 31.252238 ], [ 115.12764617, 31.24686513 ], [ 115.13237417, 31.24484417 ], [ 115.13554317, 31.24348921 ], [ 115.14154517, 31.24440518 ], [ 115.14515617, 31.24495617 ], [ 115.14738717, 31.2481851 ], [ 115.15099217, 31.2480391 ], [ 115.15408217, 31.24774511 ], [ 115.15631417, 31.24172825 ], [ 115.16649817, 31.2437402 ], [ 115.17473817, 31.24491417 ], [ 115.18205617, 31.2478761 ], [ 115.18849317, 31.2478761 ], [ 115.19252717, 31.25154502 ], [ 115.19810617, 31.25308598 ], [ 115.20462917, 31.25381997 ], [ 115.20737817, 31.25213501 ], [ 115.20797717, 31.25176801 ], [ 115.20874817, 31.24853909 ], [ 115.21038017, 31.24560416 ], [ 115.21201017, 31.24325621 ], [ 115.21209617, 31.24149625 ], [ 115.21270517, 31.23985929 ], [ 115.21333917, 31.23815633 ], [ 115.21449917, 31.2350384 ], [ 115.21524917, 31.2308695 ], [ 115.21550717, 31.22943553 ], [ 115.21655917, 31.22358967 ], [ 115.21449917, 31.21654283 ], [ 115.21495917, 31.21475287 ], [ 115.21827617, 31.20186117 ], [ 115.22383317, 31.19661029 ], [ 115.21456417, 31.19321237 ], [ 115.21181717, 31.19220539 ], [ 115.20186017, 31.19103042 ], [ 115.20038617, 31.19120242 ], [ 115.19430717, 31.1919114 ], [ 115.19259117, 31.19866624 ], [ 115.18763717, 31.19931723 ], [ 115.18366417, 31.19984022 ], [ 115.17439417, 31.20395212 ], [ 115.16787117, 31.20894401 ], [ 115.15757217, 31.2048331 ], [ 115.15757217, 31.20376512 ], [ 115.15757217, 31.19697228 ], [ 115.15757217, 31.19514132 ], [ 115.15585517, 31.19132341 ], [ 115.14864517, 31.19132341 ], [ 115.14143517, 31.18838648 ], [ 115.14130117, 31.18798449 ], [ 115.14006217, 31.18427458 ], [ 115.14040617, 31.17605076 ], [ 115.13955217, 31.17356682 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30159", "Name": "歧亭镇", "layer": "乡镇", "code": "421181102000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.77449179888481, 30.989872794049958 ], [ 114.77418507, 30.98981042 ], [ 114.77369854, 30.98941116 ], [ 114.77352538, 30.98891627 ], [ 114.77381184, 30.98737047 ], [ 114.77362887, 30.9846099 ], [ 114.77268312, 30.9807712 ], [ 114.77173626, 30.9786685 ], [ 114.77048606, 30.97708326 ], [ 114.76925299, 30.97501536 ], [ 114.76865453, 30.97351072 ], [ 114.76706544, 30.96882515 ], [ 114.766406, 30.96708465 ], [ 114.76569347, 30.96594077 ], [ 114.76438249, 30.96472752 ], [ 114.76350591, 30.96342367 ], [ 114.762654836261234, 30.962739906736587 ], [ 114.76247817, 30.96283667 ], [ 114.76219917, 30.96298967 ], [ 114.76186917, 30.96355665 ], [ 114.76171317, 30.96430964 ], [ 114.76026417, 30.96618659 ], [ 114.75877217, 30.96856054 ], [ 114.75870217, 30.96911153 ], [ 114.75901517, 30.96991051 ], [ 114.76017717, 30.97063549 ], [ 114.76076017, 30.97100348 ], [ 114.76140117, 30.97140847 ], [ 114.76227817, 30.97243745 ], [ 114.76273717, 30.97356142 ], [ 114.76292017, 30.97401541 ], [ 114.76309317, 30.9743674 ], [ 114.76318917, 30.97493139 ], [ 114.76294617, 30.97512239 ], [ 114.76222617, 30.97581137 ], [ 114.76186217, 30.97669335 ], [ 114.76141917, 30.97836131 ], [ 114.76109817, 30.97944029 ], [ 114.76069917, 30.98029627 ], [ 114.76026517, 30.98138224 ], [ 114.76026517, 30.98227422 ], [ 114.76017917, 30.98298821 ], [ 114.76036117, 30.98400018 ], [ 114.76063217, 30.98435418 ], [ 114.76069917, 30.98444117 ], [ 114.76125517, 30.98511216 ], [ 114.76148917, 30.98522216 ], [ 114.761629505141258, 30.985264477727714 ], [ 114.76164766, 30.98526165 ], [ 114.76243724, 30.98511823 ], [ 114.76296763, 30.98510558 ], [ 114.762996843418975, 30.985117171427426 ], [ 114.76348517, 30.98502816 ], [ 114.76401417, 30.98501516 ], [ 114.76472517, 30.98529715 ], [ 114.76528117, 30.98572414 ], [ 114.76573217, 30.98630613 ], [ 114.76595817, 30.98711611 ], [ 114.76597517, 30.9877851 ], [ 114.76555017, 30.98868208 ], [ 114.76507317, 30.98904507 ], [ 114.76412717, 30.98924706 ], [ 114.763405969267581, 30.989265622840588 ], [ 114.76308035, 30.98933518 ], [ 114.76202958, 30.98936148 ], [ 114.7600323, 30.98859275 ], [ 114.758617194612242, 30.98840938972862 ], [ 114.75751517, 30.98872608 ], [ 114.75650017, 30.98930806 ], [ 114.75620517, 30.98982105 ], [ 114.75629217, 30.99057203 ], [ 114.75696017, 30.991851 ], [ 114.75765517, 30.99322997 ], [ 114.75705617, 30.99479094 ], [ 114.75552817, 30.9964869 ], [ 114.75360217, 30.99723388 ], [ 114.752787987831923, 30.99721962243208 ], [ 114.75254799, 30.99731249 ], [ 114.75146367, 30.99729222 ], [ 114.74961426, 30.99708196 ], [ 114.747747, 30.99677589 ], [ 114.7452989, 30.99624107 ], [ 114.74316304, 30.99550557 ], [ 114.74093944, 30.99425655 ], [ 114.73933387, 30.99324545 ], [ 114.73717164, 30.99169092 ], [ 114.73442794, 30.98921034 ], [ 114.73429726, 30.98620215 ], [ 114.73375054, 30.98596552 ], [ 114.73191053, 30.98559159 ], [ 114.72993075, 30.98535278 ], [ 114.72713485, 30.98362253 ], [ 114.72522449, 30.98228966 ], [ 114.72310634, 30.98230029 ], [ 114.72288054, 30.98235844 ], [ 114.72141294, 30.98241465 ], [ 114.7206487, 30.98240133 ], [ 114.71963275, 30.98238227 ], [ 114.71904237, 30.98239282 ], [ 114.71763592, 30.98235621 ], [ 114.71623853, 30.98233165 ], [ 114.71471039, 30.98208142 ], [ 114.71319134, 30.98150246 ], [ 114.71175827, 30.98088748 ], [ 114.71143672, 30.98059703 ], [ 114.71114214, 30.98036052 ], [ 114.710895621429088, 30.980238858338961 ], [ 114.71053717, 30.98078826 ], [ 114.71028517, 30.98157624 ], [ 114.70957217, 30.98233922 ], [ 114.70958117, 30.98240022 ], [ 114.70957217, 30.98245222 ], [ 114.70935417, 30.98273921 ], [ 114.70825917, 30.98303021 ], [ 114.70775517, 30.9832142 ], [ 114.706942005635355, 30.983249195336505 ], [ 114.70673117, 30.98332636 ], [ 114.7054551, 30.98338204 ], [ 114.70459543, 30.98334525 ], [ 114.70391849, 30.98331321 ], [ 114.70338037, 30.98311708 ], [ 114.70281631, 30.98269414 ], [ 114.702420385959897, 30.982230565664061 ], [ 114.70215517, 30.98240422 ], [ 114.70144917, 30.98282221 ], [ 114.70128517, 30.98387919 ], [ 114.69964217, 30.9875361 ], [ 114.69427617, 30.99024104 ], [ 114.69132817, 30.99159101 ], [ 114.68810117, 30.99408395 ], [ 114.68486517, 30.99680789 ], [ 114.68163017, 31.00021481 ], [ 114.67971617, 31.00478671 ], [ 114.67805617, 31.01073257 ], [ 114.67828217, 31.01555146 ], [ 114.68038817, 31.0180914 ], [ 114.68331117, 31.02064434 ], [ 114.68648617, 31.02411126 ], [ 114.68993117, 31.02643921 ], [ 114.69390617, 31.02968313 ], [ 114.69682017, 31.03291906 ], [ 114.69865517, 31.03660698 ], [ 114.69915117, 31.04050989 ], [ 114.69753717, 31.04200585 ], [ 114.69645617, 31.04300883 ], [ 114.69269017, 31.04503878 ], [ 114.68814117, 31.04637275 ], [ 114.68356617, 31.04931268 ], [ 114.68139117, 31.0529616 ], [ 114.68056617, 31.05537354 ], [ 114.67974817, 31.05776349 ], [ 114.67785217, 31.06049543 ], [ 114.67700017, 31.06576431 ], [ 114.68012417, 31.07381912 ], [ 114.68409917, 31.07821302 ], [ 114.68783117, 31.07962399 ], [ 114.69269414661089, 31.079666456528372 ], [ 114.69645386, 31.07841055 ], [ 114.70018643, 31.07797904 ], [ 114.70607311, 31.07664542 ], [ 114.70901586, 31.07575208 ], [ 114.709839696101028, 31.075757922449323 ], [ 114.71005117, 31.07569408 ], [ 114.71378917, 31.07572508 ], [ 114.71751817, 31.07713204 ], [ 114.72017817, 31.07875901 ], [ 114.72416717, 31.08039697 ], [ 114.72682717, 31.08179294 ], [ 114.73055417, 31.08297091 ], [ 114.73455117, 31.08414788 ], [ 114.73648417, 31.08465287 ], [ 114.73907617, 31.08532986 ], [ 114.74052517, 31.08605484 ], [ 114.74275117, 31.08407888 ], [ 114.74644117, 31.08165294 ], [ 114.74774917, 31.08087096 ], [ 114.75034117, 31.07932299 ], [ 114.75308717, 31.07733804 ], [ 114.76285117, 31.07429411 ], [ 114.76882317, 31.07391812 ], [ 114.77178417, 31.07129218 ], [ 114.77176317, 31.06803925 ], [ 114.76970317, 31.06568631 ], [ 114.76922817, 31.06431534 ], [ 114.76868417, 31.06324036 ], [ 114.76629617, 31.0618314 ], [ 114.76343517, 31.06018243 ], [ 114.76540917, 31.05569754 ], [ 114.76592317, 31.05476356 ], [ 114.76824117, 31.05054966 ], [ 114.77304817, 31.04591776 ], [ 114.77665217, 31.04260784 ], [ 114.77759717, 31.0398139 ], [ 114.77639517, 31.03643098 ], [ 114.77510717, 31.03444503 ], [ 114.77090217, 31.03503401 ], [ 114.76455017, 31.03657798 ], [ 114.76163217, 31.035548 ], [ 114.75948617, 31.03400404 ], [ 114.76025917, 31.03238407 ], [ 114.76257717, 31.03069211 ], [ 114.76500117, 31.03197308 ], [ 114.76783317, 31.03145809 ], [ 114.76834817, 31.02855316 ], [ 114.76791917, 31.02737619 ], [ 114.76901417, 31.02193931 ], [ 114.76841317, 31.01951237 ], [ 114.76489417, 31.01693743 ], [ 114.76387717, 31.01610345 ], [ 114.76086017, 31.0136275 ], [ 114.76077417, 31.00980259 ], [ 114.76249117, 31.00627167 ], [ 114.76549517, 31.00369673 ], [ 114.76872417, 31.0006138 ], [ 114.76927117, 31.00009181 ], [ 114.77227517, 30.99494093 ], [ 114.77449179888481, 30.989872794049958 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30160", "Name": "张家畈镇", "layer": "乡镇", "code": "421181108000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.385346440895503, 31.120659432203425 ], [ 115.38476662, 31.11883069 ], [ 115.38530865, 31.1151854 ], [ 115.38784258, 31.1135232 ], [ 115.3906817, 31.11226896 ], [ 115.39309323, 31.11169576 ], [ 115.393766597640067, 31.112039346493845 ], [ 115.39445617, 31.11187525 ], [ 115.39953217, 31.11446719 ], [ 115.404591390675691, 31.11519631806377 ], [ 115.40405238, 31.11467501 ], [ 115.4038764, 31.1136725 ], [ 115.40386949, 31.11266205 ], [ 115.40448712, 31.10864745 ], [ 115.40431113, 31.10764494 ], [ 115.40429722, 31.10664348 ], [ 115.40360911, 31.10463237 ], [ 115.40310601, 31.10363477 ], [ 115.40174774, 31.10164253 ], [ 115.40123569, 31.10063497 ], [ 115.40070982, 31.09763453 ], [ 115.40036584, 31.09662903 ], [ 115.39985482, 31.09563051 ], [ 115.39917579, 31.09462998 ], [ 115.39816874, 31.09363445 ], [ 115.39581781, 31.09164753 ], [ 115.39229939, 31.08937522 ], [ 115.3912917, 31.08837999 ], [ 115.38797102, 31.08596736 ], [ 115.38532663, 31.08209667 ], [ 115.38240078, 31.07819247 ], [ 115.3768087, 31.0740528 ], [ 115.37388289, 31.07129592 ], [ 115.37042725, 31.06670494 ], [ 115.3690992, 31.06326332 ], [ 115.36697138, 31.05890321 ], [ 115.36512238, 31.05408717 ], [ 115.36353318, 31.04858131 ], [ 115.36088594, 31.0405514 ], [ 115.35505143, 31.03205867 ], [ 115.35055407, 31.01600401 ], [ 115.34897368, 31.00935247 ], [ 115.34499819, 31.00178054 ], [ 115.34261047, 30.99718739 ], [ 115.34129071, 30.99168395 ], [ 115.33997091, 30.98686714 ], [ 115.33918099, 30.98228126 ], [ 115.33840003, 30.9781531 ], [ 115.33734156, 30.97517379 ], [ 115.33548385, 30.97218797 ], [ 115.33309643, 30.96828572 ], [ 115.33150718, 30.96575919 ], [ 115.3285821, 30.96139531 ], [ 115.32566478, 30.95955693 ], [ 115.32166389, 30.95908789 ], [ 115.31793936, 30.95885018 ], [ 115.31394739, 30.95838105 ], [ 115.311917031320945, 30.958375214367397 ], [ 115.31089717, 30.95844377 ], [ 115.30581917, 30.95878377 ], [ 115.30261817, 30.95899976 ], [ 115.302237626077655, 30.958978973416894 ], [ 115.30142155, 30.95903557 ], [ 115.29689082, 30.95879544 ], [ 115.292995962672876, 30.958586940150017 ], [ 115.28926017, 30.95917376 ], [ 115.28697617, 30.95955575 ], [ 115.28392217, 30.96006774 ], [ 115.28017617, 30.96303367 ], [ 115.27670017, 30.96531261 ], [ 115.27296317, 30.96690358 ], [ 115.27001817, 30.96804055 ], [ 115.27117517, 30.97346743 ], [ 115.26202417, 30.97986628 ], [ 115.26270717, 30.98589914 ], [ 115.25996117, 30.99237399 ], [ 115.25652717, 30.9963469 ], [ 115.25446717, 31.0010558 ], [ 115.25961717, 31.0094426 ], [ 115.26459517, 31.01988736 ], [ 115.26253617, 31.02459525 ], [ 115.25618417, 31.02636021 ], [ 115.24931817, 31.02739019 ], [ 115.24811617, 31.03003813 ], [ 115.24622817, 31.03356805 ], [ 115.25002217, 31.03909292 ], [ 115.23902817, 31.04299183 ], [ 115.23679617, 31.04505078 ], [ 115.24040117, 31.05828648 ], [ 115.23817017, 31.07078519 ], [ 115.23559517, 31.07446011 ], [ 115.23284817, 31.079018 ], [ 115.23572317, 31.08229293 ], [ 115.23885517, 31.08962276 ], [ 115.24121517, 31.09583362 ], [ 115.24435917, 31.09713859 ], [ 115.24702017, 31.09809356 ], [ 115.24979917, 31.09905354 ], [ 115.25735217, 31.11110626 ], [ 115.25460517, 31.11904208 ], [ 115.26387517, 31.12286299 ], [ 115.26730817, 31.14049559 ], [ 115.27258617, 31.14541447 ], [ 115.28172817, 31.1357147 ], [ 115.28447517, 31.13608769 ], [ 115.29297217, 31.13373074 ], [ 115.30473017, 31.13579169 ], [ 115.30505917, 31.1357257 ], [ 115.32438417, 31.13182279 ], [ 115.33116617, 31.13402774 ], [ 115.33360017, 31.13464772 ], [ 115.33806017, 31.1357827 ], [ 115.34155017, 31.13667167 ], [ 115.34627317, 31.13755465 ], [ 115.34943017, 31.1399186 ], [ 115.35451217, 31.14372551 ], [ 115.35691417, 31.14394451 ], [ 115.35897417, 31.14137357 ], [ 115.35957517, 31.13821464 ], [ 115.36043317, 31.13395374 ], [ 115.36172217, 31.13197378 ], [ 115.36343917, 31.12080504 ], [ 115.36736517, 31.1184431 ], [ 115.37399117, 31.11445719 ], [ 115.37614217, 31.11316322 ], [ 115.38302517, 31.11876909 ], [ 115.38390717, 31.11948707 ], [ 115.385346440895503, 31.120659432203425 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30161", "Name": "麻城林店茶场", "layer": "乡镇", "code": "421181405000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.76986517, 31.338665 ], [ 114.76996717, 31.34074295 ], [ 114.77233517, 31.34556984 ], [ 114.77498917, 31.34788178 ], [ 114.77818117, 31.34973074 ], [ 114.78190117, 31.35181469 ], [ 114.78588917, 31.35458663 ], [ 114.78854217, 31.35666558 ], [ 114.78985917, 31.35827654 ], [ 114.79251217, 31.36104248 ], [ 114.79595217, 31.36404041 ], [ 114.79727817, 31.36656935 ], [ 114.79768517, 31.3558816 ], [ 114.80369317, 31.35053072 ], [ 114.80601017, 31.34935375 ], [ 114.80706217, 31.34891476 ], [ 114.80809217, 31.34865777 ], [ 114.80899417, 31.34836477 ], [ 114.81004517, 31.34807178 ], [ 114.81038817, 31.34748479 ], [ 114.81058217, 31.3469718 ], [ 114.81092517, 31.34658681 ], [ 114.81083917, 31.34598183 ], [ 114.81088217, 31.34517585 ], [ 114.81096817, 31.34400287 ], [ 114.81073217, 31.34237191 ], [ 114.81056117, 31.33964397 ], [ 114.80998217, 31.33810401 ], [ 114.80858817, 31.33663604 ], [ 114.80697917, 31.33604906 ], [ 114.80489617, 31.33784602 ], [ 114.80206417, 31.34077795 ], [ 114.79742917, 31.34539584 ], [ 114.78464017, 31.34825477 ], [ 114.77537017, 31.34392987 ], [ 114.76986517, 31.338665 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30162", "Name": "五脑山林场", "layer": "乡镇", "code": "421181500000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.01313417, 31.24895308 ], [ 115.01326217, 31.24583415 ], [ 115.01249117, 31.23666036 ], [ 115.01270517, 31.23346844 ], [ 115.01567717, 31.22882754 ], [ 115.01848817, 31.22781757 ], [ 115.02108417, 31.22557962 ], [ 115.02555917, 31.22234869 ], [ 115.02439517, 31.22092173 ], [ 115.01070817, 31.21226093 ], [ 115.00349817, 31.209031 ], [ 114.99543017, 31.2046261 ], [ 114.99312917, 31.20522809 ], [ 114.98701917, 31.20682805 ], [ 114.97826417, 31.20829702 ], [ 114.97105417, 31.20697505 ], [ 114.96225817, 31.20333413 ], [ 114.96041117, 31.20257015 ], [ 114.95474717, 31.20330413 ], [ 114.95200017, 31.20565408 ], [ 114.95423217, 31.20859001 ], [ 114.95680717, 31.21196693 ], [ 114.96092617, 31.21857378 ], [ 114.96436017, 31.21974775 ], [ 114.97191317, 31.22268369 ], [ 114.97689117, 31.22591361 ], [ 114.97706317, 31.22767457 ], [ 114.97174117, 31.23442741 ], [ 114.96745017, 31.23648237 ], [ 114.96298617, 31.23794933 ], [ 114.95800817, 31.24176524 ], [ 114.95629817, 31.24528116 ], [ 114.95732817, 31.2482171 ], [ 114.97277817, 31.24528116 ], [ 114.98067417, 31.24410719 ], [ 114.98651017, 31.24704312 ], [ 114.98822717, 31.24997805 ], [ 114.98754017, 31.25467395 ], [ 114.99063017, 31.25702189 ], [ 114.99612317, 31.25702189 ], [ 115.00299017, 31.25349997 ], [ 115.00642317, 31.24997805 ], [ 115.01466317, 31.25144502 ], [ 115.01912617, 31.25526093 ], [ 115.02026417, 31.25539993 ], [ 115.02393317, 31.25584792 ], [ 115.01837117, 31.25320898 ], [ 115.01313417, 31.24895308 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30163", "Name": "鼓楼办事处", "layer": "乡镇", "code": "421181002000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.05554217, 31.12967583 ], [ 115.04833217, 31.1309978 ], [ 115.04283917, 31.13070381 ], [ 115.03818017, 31.12924284 ], [ 115.03268617, 31.12836186 ], [ 115.02685017, 31.13049182 ], [ 115.02303617, 31.13302576 ], [ 115.02032717, 31.13482672 ], [ 115.01509117, 31.13769165 ], [ 115.01955417, 31.14239354 ], [ 115.02657617, 31.14954338 ], [ 115.02879417, 31.15180132 ], [ 115.02951117, 31.15253131 ], [ 115.03364117, 31.15756519 ], [ 115.03246017, 31.15905216 ], [ 115.03190317, 31.16057612 ], [ 115.03218217, 31.16210009 ], [ 115.03304017, 31.16279807 ], [ 115.03209617, 31.16349605 ], [ 115.03170917, 31.16382605 ], [ 115.03031517, 31.16478102 ], [ 115.02997117, 31.165791 ], [ 115.02975717, 31.16643199 ], [ 115.03031417, 31.16676198 ], [ 115.03033617, 31.16738596 ], [ 115.03067917, 31.16830394 ], [ 115.03095817, 31.16870793 ], [ 115.03119417, 31.16916692 ], [ 115.03085117, 31.16955291 ], [ 115.03093717, 31.1702319 ], [ 115.03102317, 31.17043389 ], [ 115.03158017, 31.17069089 ], [ 115.03164517, 31.17087488 ], [ 115.03085117, 31.17131487 ], [ 115.03035717, 31.17184786 ], [ 115.03007817, 31.17237985 ], [ 115.02937017, 31.17258184 ], [ 115.02913417, 31.17269184 ], [ 115.02866217, 31.17355482 ], [ 115.02911317, 31.17425281 ], [ 115.02810417, 31.1743448 ], [ 115.02774017, 31.17406881 ], [ 115.02578817, 31.1743988 ], [ 115.02356417, 31.17503879 ], [ 115.02377317, 31.17581377 ], [ 115.02417017, 31.17743373 ], [ 115.02428417, 31.17789372 ], [ 115.02437117, 31.17824471 ], [ 115.02456717, 31.1790337 ], [ 115.02482917, 31.18008967 ], [ 115.02513317, 31.18141164 ], [ 115.02517617, 31.18160064 ], [ 115.02543317, 31.18268361 ], [ 115.02560517, 31.1832516 ], [ 115.02569517, 31.18354659 ], [ 115.02662917, 31.18344559 ], [ 115.02789517, 31.1832806 ], [ 115.02821017, 31.1832396 ], [ 115.02884417, 31.1831566 ], [ 115.03032317, 31.1829886 ], [ 115.03094617, 31.1829706 ], [ 115.03236217, 31.1833746 ], [ 115.03280617, 31.18350759 ], [ 115.03313017, 31.18360459 ], [ 115.03443317, 31.18399458 ], [ 115.03450817, 31.18401658 ], [ 115.03476417, 31.1833476 ], [ 115.03968217, 31.18421358 ], [ 115.04145217, 31.18420958 ], [ 115.04154917, 31.18474856 ], [ 115.04168117, 31.18548055 ], [ 115.04213617, 31.18801349 ], [ 115.04229517, 31.18889447 ], [ 115.04244017, 31.18969745 ], [ 115.04257817, 31.19260138 ], [ 115.04278317, 31.19689328 ], [ 115.04100317, 31.20663806 ], [ 115.04063717, 31.20863901 ], [ 115.04063717, 31.21619984 ], [ 115.04271817, 31.21940376 ], [ 115.04407017, 31.22148471 ], [ 115.04990717, 31.2264756 ], [ 115.05333917, 31.23308045 ], [ 115.05347917, 31.23703635 ], [ 115.05368217, 31.24276722 ], [ 115.05324617, 31.24711712 ], [ 115.05309617, 31.2479991 ], [ 115.05732117, 31.24241223 ], [ 115.05697817, 31.23360643 ], [ 115.05981617, 31.22542862 ], [ 115.06067217, 31.22296068 ], [ 115.06190217, 31.21941476 ], [ 115.06542317, 31.21222093 ], [ 115.06616317, 31.21042697 ], [ 115.06748317, 31.20722904 ], [ 115.06644917, 31.1962183 ], [ 115.06435317, 31.18786949 ], [ 115.06418817, 31.18721251 ], [ 115.06494717, 31.18565454 ], [ 115.06590417, 31.18368759 ], [ 115.06721817, 31.18261961 ], [ 115.07133417, 31.17927469 ], [ 115.07963717, 31.17252585 ], [ 115.08295117, 31.16453503 ], [ 115.08341417, 31.16341906 ], [ 115.08330617, 31.15822118 ], [ 115.08318717, 31.15245031 ], [ 115.07983917, 31.14576546 ], [ 115.08032417, 31.14285253 ], [ 115.07594517, 31.13864663 ], [ 115.07036617, 31.13306376 ], [ 115.06573117, 31.13071281 ], [ 115.05998117, 31.12968383 ], [ 115.05554217, 31.12967583 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30164", "Name": "夫子河镇", "layer": "乡镇", "code": "421181104000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.145141996104712, 30.919059379136129 ], [ 115.14281395, 30.91795577 ], [ 115.13964482, 30.91381701 ], [ 115.13858628, 30.91106293 ], [ 115.13861169, 30.90693737 ], [ 115.14022685, 30.90212876 ], [ 115.14211964, 30.89640619 ], [ 115.14080864, 30.8931919 ], [ 115.13602487, 30.89088069 ], [ 115.1317704, 30.88971409 ], [ 115.12751657, 30.88763649 ], [ 115.12301014, 30.88440878 ], [ 115.12082076, 30.88295114 ], [ 115.119297228338041, 30.88107409618625 ], [ 115.11608017, 30.8786776 ], [ 115.11343417, 30.87591766 ], [ 115.11078717, 30.87269674 ], [ 115.10814017, 30.8699358 ], [ 115.106591800190728, 30.867679484919162 ], [ 115.10525395, 30.86759718 ], [ 115.098962042201791, 30.862328889535284 ], [ 115.09824217, 30.86628688 ], [ 115.09804517, 30.86737086 ], [ 115.09641217, 30.87171976 ], [ 115.09452017, 30.87675664 ], [ 115.09251517, 30.88082155 ], [ 115.09237517, 30.88110554 ], [ 115.08968317, 30.88545144 ], [ 115.08865517, 30.88621743 ], [ 115.08758117, 30.88701741 ], [ 115.08595717, 30.88973135 ], [ 115.08571917, 30.89004234 ], [ 115.08423717, 30.89197729 ], [ 115.08231617, 30.89287527 ], [ 115.08054317, 30.89372225 ], [ 115.07930917, 30.89462923 ], [ 115.07882317, 30.8961422 ], [ 115.07840617, 30.89741417 ], [ 115.07818917, 30.89824115 ], [ 115.07810117, 30.89862314 ], [ 115.07770217, 30.89905713 ], [ 115.07738917, 30.89893513 ], [ 115.076668528360273, 30.898714261626267 ], [ 115.07640025, 30.89900564 ], [ 115.07608858, 30.89888394 ], [ 115.07461222, 30.89843235 ], [ 115.07271948, 30.89797124 ], [ 115.06953277, 30.89645822 ], [ 115.06526021, 30.89587341 ], [ 115.063730124741937, 30.895665489654483 ], [ 115.06228517, 30.89580821 ], [ 115.05908317, 30.89669919 ], [ 115.05611717, 30.89707818 ], [ 115.05593417, 30.89708918 ], [ 115.05550717, 30.89710818 ], [ 115.05519417, 30.89715717 ], [ 115.05503817, 30.89726317 ], [ 115.05390717, 30.89776016 ], [ 115.05281017, 30.89837715 ], [ 115.05268117, 30.89874414 ], [ 115.05239217, 30.89956612 ], [ 115.05211417, 30.89991911 ], [ 115.05186217, 30.9003881 ], [ 115.05118317, 30.90100809 ], [ 115.05010417, 30.90189807 ], [ 115.04973817, 30.90216806 ], [ 115.04960817, 30.90243305 ], [ 115.04968617, 30.90266805 ], [ 115.04984317, 30.90298304 ], [ 115.05006793063707, 30.903242250882453 ], [ 115.05148142, 30.90283037 ], [ 115.05243629, 30.90255282 ], [ 115.0527835, 30.9027351 ], [ 115.052864533027844, 30.902816463237141 ], [ 115.05369817, 30.90257605 ], [ 115.05404617, 30.90275905 ], [ 115.05453417, 30.90324904 ], [ 115.05506417, 30.90389502 ], [ 115.05544717, 30.90455801 ], [ 115.05556917, 30.90542599 ], [ 115.05538617, 30.90599497 ], [ 115.05537817, 30.90690495 ], [ 115.05514317, 30.90738394 ], [ 115.05465617, 30.90763494 ], [ 115.05418617, 30.90769693 ], [ 115.05371517, 30.90807293 ], [ 115.05325517, 30.90843992 ], [ 115.05262817, 30.9090099 ], [ 115.05198417, 30.90980789 ], [ 115.05120117, 30.91036587 ], [ 115.05029617, 30.91096386 ], [ 115.04931317, 30.91128985 ], [ 115.04865117, 30.91128185 ], [ 115.04809417, 30.91129085 ], [ 115.047909361974391, 30.911267322078874 ], [ 115.04740034, 30.91126215 ], [ 115.04684471, 30.91127324 ], [ 115.04635793, 30.91121225 ], [ 115.04574149, 30.91111655 ], [ 115.04486473, 30.9110144 ], [ 115.044213180200614, 30.910925547019581 ], [ 115.04417717, 30.91093086 ], [ 115.04378517, 30.91132485 ], [ 115.04305417, 30.91234783 ], [ 115.04200117, 30.91303381 ], [ 115.04128717, 30.9133208 ], [ 115.04083417, 30.9134268 ], [ 115.04054717, 30.9134318 ], [ 115.04033817, 30.91330581 ], [ 115.040271877660999, 30.913228268733821 ], [ 115.04005436, 30.91331637 ], [ 115.0396036, 30.91342232 ], [ 115.0393164, 30.91342896 ], [ 115.03910899, 30.9133035 ], [ 115.03872611, 30.91285663 ], [ 115.03781479, 30.91176836 ], [ 115.03725044, 30.91137389 ], [ 115.03667812, 30.91103043 ], [ 115.03594828, 30.91054843 ], [ 115.035486688440869, 30.9104464768219 ], [ 115.03257017, 30.91170084 ], [ 115.03058017, 30.91298881 ], [ 115.03014117, 30.91327281 ], [ 115.02784217, 30.91501677 ], [ 115.02601317, 30.91699672 ], [ 115.02401817, 30.91876268 ], [ 115.02388817, 30.91946866 ], [ 115.02387017, 30.91980966 ], [ 115.02400117, 30.92028965 ], [ 115.02430617, 30.92080663 ], [ 115.02484617, 30.92108863 ], [ 115.02499417, 30.92108863 ], [ 115.02557817, 30.92159462 ], [ 115.02700617, 30.9223326 ], [ 115.02801717, 30.92319958 ], [ 115.02815617, 30.92343457 ], [ 115.02854817, 30.92419556 ], [ 115.02880917, 30.92452855 ], [ 115.02920217, 30.92509854 ], [ 115.02961917, 30.92575952 ], [ 115.03038617, 30.9264775 ], [ 115.03107417, 30.92740948 ], [ 115.03140517, 30.92816747 ], [ 115.03168417, 30.92880045 ], [ 115.03165817, 30.92910044 ], [ 115.03136617, 30.92925544 ], [ 115.03056117, 30.92968343 ], [ 115.02658917, 30.9311994 ], [ 115.02470817, 30.93215137 ], [ 115.023626377057596, 30.932125712090468 ], [ 115.02352524, 30.93217736 ], [ 115.02197044, 30.93214461 ], [ 115.02067683, 30.93186834 ], [ 115.02003502, 30.9317322 ], [ 115.01979196, 30.93046662 ], [ 115.01921905, 30.92895411 ], [ 115.0187497, 30.92846571 ], [ 115.018557397907671, 30.928407304086527 ], [ 115.01853117, 30.92841246 ], [ 115.01844917, 30.92846546 ], [ 115.01742517, 30.92912144 ], [ 115.01702017, 30.92920544 ], [ 115.01633617, 30.92934844 ], [ 115.01505617, 30.92950943 ], [ 115.01458617, 30.92962143 ], [ 115.01361817, 30.92985243 ], [ 115.012781245665963, 30.929836080780451 ], [ 115.01247355, 30.92991085 ], [ 115.01118017, 30.92988865 ], [ 115.01065906, 30.92970629 ], [ 115.01043388, 30.92955004 ], [ 115.00965173, 30.92915558 ], [ 115.00868825, 30.92874967 ], [ 115.00781145, 30.92843447 ], [ 115.00694363, 30.92815922 ], [ 115.005746, 30.92814381 ], [ 115.005659885752564, 30.928143980025254 ], [ 115.00544417, 30.92821846 ], [ 115.00529817, 30.92826846 ], [ 115.00515017, 30.92869945 ], [ 115.00491417, 30.92938744 ], [ 115.00406117, 30.93047941 ], [ 115.00311117, 30.9310764 ], [ 115.00229217, 30.93154639 ], [ 115.00086317, 30.93176838 ], [ 114.99961717, 30.93206038 ], [ 114.99730917, 30.93514931 ], [ 114.99511217, 30.93664427 ], [ 114.99493117, 30.93676827 ], [ 114.99278817, 30.93848423 ], [ 114.99270717, 30.93858223 ], [ 114.99205617, 30.93936121 ], [ 114.99005217, 30.94176115 ], [ 114.98981717, 30.94266613 ], [ 114.98822317, 30.94485008 ], [ 114.98694217, 30.94654404 ], [ 114.98630617, 30.94730903 ], [ 114.98541817, 30.94759302 ], [ 114.98493917, 30.94770402 ], [ 114.98438117, 30.94792201 ], [ 114.98408517, 30.94804901 ], [ 114.98389917, 30.948279 ], [ 114.98384117, 30.94835 ], [ 114.98382417, 30.948665 ], [ 114.98378917, 30.94996597 ], [ 114.98398117, 30.95033496 ], [ 114.98431217, 30.95057095 ], [ 114.98507017, 30.95080095 ], [ 114.98540917, 30.95117594 ], [ 114.98547117, 30.95154293 ], [ 114.98518317, 30.95232791 ], [ 114.98420817, 30.95483485 ], [ 114.98352817, 30.95682181 ], [ 114.98332817, 30.9572278 ], [ 114.98301517, 30.95789578 ], [ 114.98264017, 30.95911076 ], [ 114.98258817, 30.95917775 ], [ 114.98278817, 30.95972974 ], [ 114.98319717, 30.96012773 ], [ 114.98380717, 30.96047072 ], [ 114.98395617, 30.96047772 ], [ 114.98429517, 30.96057472 ], [ 114.98457417, 30.96080572 ], [ 114.98571517, 30.9613817 ], [ 114.98586317, 30.9615887 ], [ 114.98587217, 30.9617077 ], [ 114.98565417, 30.96210869 ], [ 114.98539317, 30.96257268 ], [ 114.98527117, 30.96310866 ], [ 114.98522817, 30.96347366 ], [ 114.98546317, 30.96383265 ], [ 114.98584617, 30.96428964 ], [ 114.98654317, 30.96495162 ], [ 114.98693517, 30.96528961 ], [ 114.98728417, 30.96558361 ], [ 114.98818117, 30.9659486 ], [ 114.98888717, 30.96616559 ], [ 114.98930517, 30.96656259 ], [ 114.98969717, 30.96705857 ], [ 114.98988017, 30.96725057 ], [ 114.99106517, 30.96772056 ], [ 114.991336290928189, 30.967746724748476 ], [ 114.99167442, 30.96756028 ], [ 114.99190059, 30.96747964 ], [ 114.99203907, 30.96754718 ], [ 114.992152720657074, 30.967700684328257 ], [ 114.99237217, 30.96766556 ], [ 114.99274617, 30.96746056 ], [ 114.99297317, 30.96738157 ], [ 114.99311217, 30.96744856 ], [ 114.99327817, 30.96767256 ], [ 114.99327817, 30.96792055 ], [ 114.99307817, 30.96858254 ], [ 114.99198917, 30.97073749 ], [ 114.99171917, 30.97130148 ], [ 114.99090017, 30.97167247 ], [ 114.99065117, 30.97170147 ], [ 114.99036017, 30.97173547 ], [ 114.98973317, 30.97175347 ], [ 114.98911417, 30.97174047 ], [ 114.989017621011058, 30.971720967585775 ], [ 114.98867118, 30.9718589 ], [ 114.98805546, 30.97184878 ], [ 114.98765595, 30.97176904 ], [ 114.98710002, 30.97153886 ], [ 114.98651024, 30.97101295 ], [ 114.98587164, 30.97046021 ], [ 114.98530774, 30.97012411 ], [ 114.984377476678048, 30.969813381048464 ], [ 114.98404317, 30.9704465 ], [ 114.98366917, 30.97096848 ], [ 114.98293717, 30.97198746 ], [ 114.98184017, 30.97252945 ], [ 114.98097717, 30.97331743 ], [ 114.98015917, 30.97358442 ], [ 114.97887017, 30.97391942 ], [ 114.97873917, 30.97403641 ], [ 114.97818217, 30.9746884 ], [ 114.97800717, 30.97576437 ], [ 114.97788617, 30.97772333 ], [ 114.97787717, 30.97805532 ], [ 114.97792117, 30.97848731 ], [ 114.97773817, 30.9789403 ], [ 114.97775917, 30.9791063 ], [ 114.97779017, 30.97934629 ], [ 114.98256217, 30.97551638 ], [ 114.98599517, 30.97492739 ], [ 114.98842017, 30.97801532 ], [ 114.99211017, 30.97830932 ], [ 114.99621017, 30.97801232 ], [ 115.00392617, 30.9787753 ], [ 115.00657317, 30.97554938 ], [ 115.00896717, 30.97519139 ], [ 115.01111317, 30.97430941 ], [ 115.01437417, 30.9744194 ], [ 115.01634417, 30.97685135 ], [ 115.01690717, 30.97754633 ], [ 115.01742117, 30.98045327 ], [ 115.01823717, 30.98214523 ], [ 115.01879517, 30.98442718 ], [ 115.02064017, 30.98600914 ], [ 115.02262617, 30.98500416 ], [ 115.02721817, 30.98566615 ], [ 115.02876317, 30.98625513 ], [ 115.03088617, 30.98743111 ], [ 115.03466217, 30.98831409 ], [ 115.03610317, 30.98739611 ], [ 115.03803417, 30.98868408 ], [ 115.03846417, 30.99052304 ], [ 115.04025817, 30.98965506 ], [ 115.04444617, 30.9876281 ], [ 115.04530517, 30.98713711 ], [ 115.05300717, 30.9833432 ], [ 115.05781917, 30.98382519 ], [ 115.05862917, 30.9834542 ], [ 115.06056517, 30.98239022 ], [ 115.06481417, 30.98228023 ], [ 115.06747517, 30.98176524 ], [ 115.06657317, 30.98389919 ], [ 115.06903117, 30.98486717 ], [ 115.07218717, 30.98399719 ], [ 115.07895117, 30.98213323 ], [ 115.08757817, 30.97981528 ], [ 115.09282317, 30.97640736 ], [ 115.09912317, 30.97227645 ], [ 115.10701917, 30.96565261 ], [ 115.11165417, 30.96462263 ], [ 115.12092417, 30.9616787 ], [ 115.11800617, 30.95755679 ], [ 115.12023717, 30.95505385 ], [ 115.12264117, 30.94990197 ], [ 115.12396517, 30.94453209 ], [ 115.12525217, 30.94180715 ], [ 115.12787617, 30.93902622 ], [ 115.12867517, 30.93496531 ], [ 115.12848817, 30.93190838 ], [ 115.12653917, 30.92848146 ], [ 115.12731117, 30.92524253 ], [ 115.12933517, 30.92163162 ], [ 115.13053717, 30.91986466 ], [ 115.13294017, 30.91721372 ], [ 115.14100817, 30.91839169 ], [ 115.145141996104712, 30.919059379136129 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30165", "Name": "福田河镇", "layer": "乡镇", "code": "421181112000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.02149773, 31.530727248000101 ], [ 115.023980426112274, 31.530334534298703 ], [ 115.024116946525183, 31.530219512342597 ], [ 115.024831609998728, 31.529617383238357 ], [ 115.02483093, 31.5260208 ], [ 115.02529157, 31.52432177 ], [ 115.0269842, 31.52262351 ], [ 115.026984221140069, 31.522623497006037 ], [ 115.026984265, 31.522623453000101 ], [ 115.032939869, 31.518962789000099 ], [ 115.037255124, 31.518244576 ], [ 115.039347151, 31.518375779000099 ], [ 115.04019951391011, 31.518597983143337 ], [ 115.04063217, 31.51862581 ], [ 115.043543419518116, 31.519390331960107 ], [ 115.044425294965734, 31.51903573152088 ], [ 115.044541, 31.51881555 ], [ 115.04455502, 31.51816661 ], [ 115.04444238, 31.51747993 ], [ 115.04449128, 31.51717386 ], [ 115.04467583, 31.51687052 ], [ 115.044675869591529, 31.516870504832973 ], [ 115.044675892, 31.516870468 ], [ 115.046515217834312, 31.516165842302485 ], [ 115.04679455, 31.5155754 ], [ 115.046794608835668, 31.515575362257323 ], [ 115.046794617, 31.515575345000101 ], [ 115.047119825, 31.5153667290001 ], [ 115.047510856, 31.515372959 ], [ 115.048298687006167, 31.515712938919901 ], [ 115.04842417, 31.51563288 ], [ 115.04881617, 31.51563988 ], [ 115.04977217, 31.51605287 ], [ 115.050313233966449, 31.516422380236957 ], [ 115.052005185, 31.515729497000098 ], [ 115.052818411, 31.515158134 ], [ 115.05368852399999, 31.5147946720001 ], [ 115.054674409, 31.5146040240001 ], [ 115.056291069, 31.513992447000099 ], [ 115.05736694, 31.513322826 ], [ 115.05760845899999, 31.513292453000101 ], [ 115.057991055549834, 31.514043824922677 ], [ 115.05869517, 31.51360792 ], [ 115.05893617, 31.51357693 ], [ 115.059403990452282, 31.514493407717794 ], [ 115.05940777, 31.51448762 ], [ 115.05990395, 31.51310207 ], [ 115.0602703, 31.51268359 ], [ 115.060270368402186, 31.512683545109823 ], [ 115.060270372, 31.512683541000101 ], [ 115.060734538, 31.512378917 ], [ 115.06181657, 31.512412396000101 ], [ 115.062913616, 31.512652879 ], [ 115.064101587, 31.512706322 ], [ 115.064543814868316, 31.512713759375622 ], [ 115.0647285, 31.51244562 ], [ 115.06508296, 31.51211122 ], [ 115.065082973524227, 31.512111215619694 ], [ 115.065083024, 31.512111168 ], [ 115.065411503, 31.512004778000101 ], [ 115.065848788, 31.512201222 ], [ 115.066493293519798, 31.512384679200309 ], [ 115.06675317, 31.51230095 ], [ 115.06719217, 31.51249795 ], [ 115.067560754335361, 31.512603145439009 ], [ 115.06780874099999, 31.512645891 ], [ 115.069060935, 31.5125345430001 ], [ 115.06981790499999, 31.512225795000099 ], [ 115.070441062, 31.512154173000098 ], [ 115.071330867, 31.512357275000099 ], [ 115.072091935, 31.511899619000101 ], [ 115.072903962, 31.511539932000101 ], [ 115.073725998, 31.5113382440001 ], [ 115.074137504216694, 31.511127943776007 ], [ 115.07471687, 31.51051459 ], [ 115.074716887445945, 31.51051458540287 ], [ 115.074716936, 31.510514534 ], [ 115.075318286, 31.5103560790001 ], [ 115.07629822299999, 31.510577307000101 ], [ 115.077170737497255, 31.51097149608422 ], [ 115.07728217, 31.51096799 ], [ 115.077391792461938, 31.511014374246304 ], [ 115.077568756775449, 31.511045720771747 ], [ 115.07777465267425, 31.511082192085663 ], [ 115.07790157, 31.51050225 ], [ 115.07844912, 31.50976299 ], [ 115.078449153280033, 31.509762987875668 ], [ 115.07844918799999, 31.509762941000101 ], [ 115.07911359, 31.509720533000099 ], [ 115.081064909, 31.5102363620001 ], [ 115.082246059, 31.50979284 ], [ 115.083206408, 31.5095804420001 ], [ 115.083701061, 31.509813206 ], [ 115.083722149699199, 31.51017638185925 ], [ 115.08376517, 31.510155 ], [ 115.08413317, 31.51013801 ], [ 115.08433917, 31.510287 ], [ 115.084431792805887, 31.510605134168966 ], [ 115.084608428, 31.510561759 ], [ 115.085410999, 31.510182536000102 ], [ 115.085570030033466, 31.510061453058356 ], [ 115.08575777, 31.50991851 ], [ 115.08575777319416, 31.509918509296412 ], [ 115.085757834, 31.509918463000101 ], [ 115.08613964, 31.509834360000099 ], [ 115.086504446, 31.509930244 ], [ 115.087163384516458, 31.510219828841045 ], [ 115.08750317, 31.51014601 ], [ 115.08786817, 31.510241 ], [ 115.08868717, 31.51060199 ], [ 115.089027601535591, 31.5107939183303 ], [ 115.089767024, 31.510735475 ], [ 115.09062280099999, 31.51030344 ], [ 115.09111262499999, 31.510776336 ], [ 115.09128695531156, 31.510969776392006 ], [ 115.09198917, 31.51061499 ], [ 115.09247817, 31.51108798 ], [ 115.09334617, 31.51205096 ], [ 115.09334617, 31.51205196 ], [ 115.09406917, 31.51381192 ], [ 115.09446717, 31.51494789 ], [ 115.09453317, 31.51569888 ], [ 115.09443717, 31.51637686 ], [ 115.09400917, 31.51666485 ], [ 115.09011117, 31.51767583 ], [ 115.08965317, 31.51810882 ], [ 115.08902017, 31.5189018 ], [ 115.08896117, 31.5190618 ], [ 115.08866217, 31.51986778 ], [ 115.08847917, 31.52088175 ], [ 115.088492088696981, 31.520936097621753 ], [ 115.08896937, 31.520936270000099 ], [ 115.093094238, 31.5214599030001 ], [ 115.093956611470261, 31.521708653757049 ], [ 115.09446117, 31.52177273 ], [ 115.09785617, 31.52275271 ], [ 115.10224017, 31.52543265 ], [ 115.10910617, 31.53111952 ], [ 115.11021717, 31.53265548 ], [ 115.11027817, 31.53383145 ], [ 115.10955817, 31.53500842 ], [ 115.10572617, 31.53805535 ], [ 115.10322317, 31.54004531 ], [ 115.10172117, 31.54220226 ], [ 115.10126117, 31.5448182 ], [ 115.10185217, 31.54769313 ], [ 115.10394417, 31.55089605 ], [ 115.10622717, 31.55292301 ], [ 115.10675717, 31.55377099 ], [ 115.10681817, 31.55449197 ], [ 115.10596717, 31.55501496 ], [ 115.10276417, 31.55524395 ], [ 115.09995217, 31.55674792 ], [ 115.09884017, 31.55792389 ], [ 115.09858017, 31.55962385 ], [ 115.09871017, 31.56243578 ], [ 115.10008317, 31.56635769 ], [ 115.10250517, 31.56962562 ], [ 115.11061217, 31.57478849 ], [ 115.11616517, 31.57792342 ], [ 115.11804317, 31.5786504 ], [ 115.12197617, 31.58017337 ], [ 115.12302617, 31.58121834 ], [ 115.12387617, 31.5873612 ], [ 115.12334817, 31.59016713 ], [ 115.12334617, 31.59017213 ], [ 115.12145717, 31.59560201 ], [ 115.12054717, 31.59870593 ], [ 115.12054717, 31.60040689 ], [ 115.12112817, 31.60125487 ], [ 115.130109223549141, 31.604407181860989 ], [ 115.14337313199999, 31.606251033 ], [ 115.15330481, 31.606808409000099 ], [ 115.15886892, 31.606480643000101 ], [ 115.161942206, 31.605827392 ], [ 115.168210186, 31.603868208000101 ], [ 115.170171291403889, 31.602558933082772 ], [ 115.17135182, 31.60079523 ], [ 115.17174299, 31.59667608 ], [ 115.17141275, 31.59187162 ], [ 115.17194228, 31.58690381 ], [ 115.17377352, 31.58115049 ], [ 115.17488489, 31.57971162 ], [ 115.174884923792291, 31.579711593751696 ], [ 115.174884946, 31.579711565 ], [ 115.178669782, 31.5767716780001 ], [ 115.181681885, 31.574744233 ], [ 115.18566560799999, 31.573861315 ], [ 115.186646492584671, 31.573273055445764 ], [ 115.18710636, 31.57268393 ], [ 115.18736695, 31.57150845 ], [ 115.18684616, 31.56954668 ], [ 115.18631635, 31.56752189 ], [ 115.18664604, 31.56673652 ], [ 115.186646081791352, 31.566736484701003 ], [ 115.18664609299999, 31.566736458 ], [ 115.187496743, 31.5660179670001 ], [ 115.18997936, 31.5652972120001 ], [ 115.192071142, 31.564840695 ], [ 115.195993915, 31.5646429550001 ], [ 115.197007224883137, 31.564827615257791 ], [ 115.19721517, 31.56481673 ], [ 115.19936517, 31.56520672 ], [ 115.20185117, 31.5661837 ], [ 115.201865693331257, 31.566186095604873 ], [ 115.201870604191711, 31.566183892601739 ], [ 115.203120091121576, 31.565623375020326 ], [ 115.20423086, 31.56366108 ], [ 115.20566232, 31.55908633 ], [ 115.205662370618839, 31.559086277414032 ], [ 115.205662372, 31.559086273 ], [ 115.207172603, 31.557517352 ], [ 115.21011454, 31.556665049000099 ], [ 115.21428952799999, 31.556534774000099 ], [ 115.220434654, 31.557154667000098 ], [ 115.220590559652905, 31.557194625508892 ], [ 115.22162317, 31.5572979 ], [ 115.22672217, 31.55860187 ], [ 115.227771071982332, 31.558763973033631 ], [ 115.22965105199999, 31.5584610780001 ], [ 115.230171313224673, 31.558198389519401 ], [ 115.23050152, 31.55748066 ], [ 115.2301114, 31.55669452 ], [ 115.22794944, 31.5542775 ], [ 115.22592752, 31.55022454 ], [ 115.22481711, 31.54623813 ], [ 115.22468621, 31.54401524 ], [ 115.22507671, 31.54156376 ], [ 115.22514688, 31.54025693 ], [ 115.2242964, 31.53875347 ], [ 115.22226508, 31.53581121 ], [ 115.21985254, 31.52966784 ], [ 115.21834249, 31.52554894 ], [ 115.21612147, 31.52299909 ], [ 115.21396832, 31.52077812 ], [ 115.21337876, 31.51953663 ], [ 115.21278827, 31.51731426 ], [ 115.21285754, 31.51522261 ], [ 115.21317909, 31.51326022 ], [ 115.21389916, 31.51051538 ], [ 115.21409853, 31.50891381 ], [ 115.21357815, 31.50656158 ], [ 115.21252821, 31.50348886 ], [ 115.20860483, 31.4977361 ], [ 115.20736434, 31.49590682 ], [ 115.20684376, 31.49440339 ], [ 115.20691306, 31.49211584 ], [ 115.20769427, 31.49041711 ], [ 115.21011477, 31.48655771 ], [ 115.21148674, 31.48358482 ], [ 115.21259747, 31.47907286 ], [ 115.21311757, 31.47358143 ], [ 115.21291876, 31.46887508 ], [ 115.21161657, 31.46488838 ], [ 115.20952513, 31.46302527 ], [ 115.20749477, 31.45949646 ], [ 115.20678587, 31.4587747 ], [ 115.2064526, 31.45661871 ], [ 115.20553269, 31.45243737 ], [ 115.2050815, 31.44746782 ], [ 115.2057327, 31.44433037 ], [ 115.20691256, 31.44184645 ], [ 115.206912605511491, 31.441846396133737 ], [ 115.206912605511491, 31.44184639613373 ], [ 115.206912607, 31.441846393 ], [ 115.208735238, 31.439689169000101 ], [ 115.21095720081486, 31.437760301675826 ], [ 115.21337864, 31.43141854 ], [ 115.21507978, 31.42873799 ], [ 115.215079817641609, 31.428737958200706 ], [ 115.215079833, 31.428737934 ], [ 115.216780762, 31.4273010040001 ], [ 115.217742475506569, 31.427114482438238 ], [ 115.21198817, 31.41881414 ], [ 115.19653817, 31.41734917 ], [ 115.18349217, 31.41793516 ], [ 115.16953517, 31.42066509 ], [ 115.15406017, 31.42369102 ], [ 115.15053317, 31.42438101 ], [ 115.13858217, 31.41770516 ], [ 115.13165017, 31.41383325 ], [ 115.12238017, 31.41266128 ], [ 115.11878517, 31.41429824 ], [ 115.11723117, 31.41500522 ], [ 115.10349817, 31.42174407 ], [ 115.09628817, 31.42233005 ], [ 115.09446617, 31.42174307 ], [ 115.09025617, 31.4203861 ], [ 115.08083817, 31.41734917 ], [ 115.07225517, 31.41822815 ], [ 115.06538917, 31.42115808 ], [ 115.06431717, 31.42310204 ], [ 115.06264217, 31.42613796 ], [ 115.06245817, 31.44074762 ], [ 115.06229917, 31.45337933 ], [ 115.05749217, 31.46363009 ], [ 115.05234317, 31.46831498 ], [ 115.04353517, 31.47513882 ], [ 115.00736717, 31.50315517 ], [ 115.00579817, 31.50705408 ], [ 115.00717517, 31.50823705 ], [ 115.01022417, 31.51409591 ], [ 115.01065117, 31.51491489 ], [ 115.01570517, 31.52274271 ], [ 115.01885917, 31.52974655 ], [ 115.01982217, 31.53050853 ], [ 115.019953727028067, 31.530612190430002 ], [ 115.02149773, 31.530727248000101 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30166", "Name": "龙池办事处", "layer": "乡镇", "code": "421181001000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.02377317, 31.17581377 ], [ 115.02356417, 31.17503879 ], [ 115.02352017, 31.17505179 ], [ 115.02336317, 31.17509679 ], [ 115.02173317, 31.17496779 ], [ 115.02053917, 31.17512779 ], [ 115.01995217, 31.17520678 ], [ 115.01905017, 31.17504079 ], [ 115.01868617, 31.17478379 ], [ 115.01840717, 31.17425181 ], [ 115.01814917, 31.17382982 ], [ 115.01621817, 31.17426981 ], [ 115.01556517, 31.17400981 ], [ 115.01539517, 31.17394281 ], [ 115.01532017, 31.17391281 ], [ 115.01497317, 31.17377482 ], [ 115.01435117, 31.17360982 ], [ 115.01080017, 31.17343382 ], [ 115.01066117, 31.17342683 ], [ 115.01019617, 31.17341482 ], [ 115.00851717, 31.17337283 ], [ 115.00630517, 31.17331683 ], [ 115.00577017, 31.17328383 ], [ 115.00514917, 31.17317883 ], [ 115.00435417, 31.17304483 ], [ 115.00027917, 31.17222285 ], [ 115.00015917, 31.17272884 ], [ 114.99949417, 31.17471179 ], [ 114.99822817, 31.17651075 ], [ 114.99782017, 31.17763173 ], [ 114.99795217, 31.17833371 ], [ 114.99804217, 31.1788107 ], [ 114.99837217, 31.18056766 ], [ 114.99880717, 31.18288261 ], [ 114.99919417, 31.1873245 ], [ 114.99540117, 31.1874355 ], [ 114.99505717, 31.18859247 ], [ 114.99420017, 31.19029344 ], [ 114.99145617, 31.19143141 ], [ 114.99026117, 31.19284038 ], [ 114.99045517, 31.19261138 ], [ 114.99028817, 31.19280838 ], [ 114.99008517, 31.19304737 ], [ 114.98897017, 31.19440534 ], [ 114.98897017, 31.20189417 ], [ 114.99312917, 31.20522809 ], [ 114.99543017, 31.2046261 ], [ 115.00349817, 31.209031 ], [ 115.01070817, 31.21226093 ], [ 115.02439517, 31.22092173 ], [ 115.02555917, 31.22234869 ], [ 115.02108417, 31.22557962 ], [ 115.01848817, 31.22781757 ], [ 115.01567717, 31.22882754 ], [ 115.01270517, 31.23346844 ], [ 115.01249117, 31.23666036 ], [ 115.01326217, 31.24583415 ], [ 115.01313417, 31.24895308 ], [ 115.01837117, 31.25320898 ], [ 115.02393317, 31.25584792 ], [ 115.02798817, 31.25941284 ], [ 115.02731917, 31.26121979 ], [ 115.02804917, 31.26140379 ], [ 115.03320017, 31.26399473 ], [ 115.03529117, 31.26293875 ], [ 115.04830617, 31.25636391 ], [ 115.05286017, 31.24893408 ], [ 115.05309617, 31.2479991 ], [ 115.05324617, 31.24711712 ], [ 115.05368217, 31.24276722 ], [ 115.05347917, 31.23703635 ], [ 115.05333917, 31.23308045 ], [ 115.04990717, 31.2264756 ], [ 115.04407017, 31.22148471 ], [ 115.04271817, 31.21940376 ], [ 115.04063717, 31.21619984 ], [ 115.04063717, 31.20863901 ], [ 115.04100317, 31.20663806 ], [ 115.04278317, 31.19689328 ], [ 115.04257817, 31.19260138 ], [ 115.04244017, 31.18969745 ], [ 115.04229517, 31.18889447 ], [ 115.04213617, 31.18801349 ], [ 115.04168117, 31.18548055 ], [ 115.04154917, 31.18474856 ], [ 115.04145217, 31.18420958 ], [ 115.03968217, 31.18421358 ], [ 115.03476417, 31.1833476 ], [ 115.03450817, 31.18401658 ], [ 115.03443317, 31.18399458 ], [ 115.03313017, 31.18360459 ], [ 115.03280617, 31.18350759 ], [ 115.03236217, 31.1833746 ], [ 115.03094617, 31.1829706 ], [ 115.03032317, 31.1829886 ], [ 115.02884417, 31.1831566 ], [ 115.02821017, 31.1832396 ], [ 115.02789517, 31.1832806 ], [ 115.02662917, 31.18344559 ], [ 115.02569517, 31.18354659 ], [ 115.02560517, 31.1832516 ], [ 115.02543317, 31.18268361 ], [ 115.02517617, 31.18160064 ], [ 115.02513317, 31.18141164 ], [ 115.02482917, 31.18008967 ], [ 115.02456717, 31.1790337 ], [ 115.02437117, 31.17824471 ], [ 115.02428417, 31.17789372 ], [ 115.02417017, 31.17743373 ], [ 115.02377317, 31.17581377 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30167", "Name": "白果镇", "layer": "乡镇", "code": "421181103000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.98044117, 30.99671607 ], [ 114.98085075, 30.99604025 ], [ 114.98089465, 30.99535652 ], [ 114.98065961, 30.99413494 ], [ 114.97997417, 30.99319052 ], [ 114.97876758, 30.99241554 ], [ 114.97742243, 30.99196076 ], [ 114.976401451800555, 30.991957121681939 ], [ 114.97616317, 30.992006 ], [ 114.97590417, 30.992059 ], [ 114.97519517, 30.992205 ], [ 114.97409817, 30.99289698 ], [ 114.97325417, 30.99385396 ], [ 114.97307117, 30.99447894 ], [ 114.97313217, 30.99558192 ], [ 114.97334117, 30.9962519 ], [ 114.97337617, 30.99710688 ], [ 114.97337117, 30.99728688 ], [ 114.97335017, 30.99802786 ], [ 114.97340217, 30.99875985 ], [ 114.97350617, 30.99888784 ], [ 114.97371517, 30.99908584 ], [ 114.97396817, 30.99932983 ], [ 114.97420317, 30.99997182 ], [ 114.97425517, 31.0005908 ], [ 114.97430817, 31.0008428 ], [ 114.974408598133365, 31.000960537557045 ], [ 114.974515, 31.00036828 ], [ 114.9748279, 31.00031141 ], [ 114.97488769, 31.00033723 ], [ 114.97488767, 31.00060007 ], [ 114.975016556935032, 31.001183485561146 ], [ 114.97512717, 31.00118579 ], [ 114.97524017, 31.00118779 ], [ 114.97539717, 31.0009628 ], [ 114.97552717, 31.00023581 ], [ 114.97584117, 31.00017981 ], [ 114.97590217, 31.00020581 ], [ 114.97590217, 31.00046881 ], [ 114.97604117, 31.00110079 ], [ 114.97618017, 31.00122979 ], [ 114.976235052617525, 31.00123073084487 ], [ 114.9762508, 31.00122475 ], [ 114.97637238, 31.00102552 ], [ 114.97664146, 31.00060198 ], [ 114.97671026, 31.00010507 ], [ 114.9767282, 31.00008503 ], [ 114.97709294, 30.9996822 ], [ 114.97765698, 30.99907191 ], [ 114.97851596, 30.99838179 ], [ 114.97861162, 30.99831455 ], [ 114.98002661, 30.9974029 ], [ 114.98044117, 30.99671607 ] ] ], [ [ [ 114.982360820098009, 31.000087361756233 ], [ 114.98235294, 31.0001004 ], [ 114.98229115, 31.00033645 ], [ 114.98219648, 31.00048664 ], [ 114.98204901, 31.00056004 ], [ 114.98187564, 31.00055756 ], [ 114.98176206, 31.00050593 ], [ 114.98174513, 31.00032608 ], [ 114.98164052, 31.00025044 ], [ 114.98144124, 31.00023504 ], [ 114.98130175, 31.00019348 ], [ 114.9811543, 31.00009997 ], [ 114.98112042, 31.00008508 ], [ 114.98037315, 30.99979847 ], [ 114.98023514205542, 30.999758260221682 ], [ 114.97988217, 30.99996582 ], [ 114.97869817, 31.00456571 ], [ 114.97955217, 31.00810063 ], [ 114.97959317, 31.00850362 ], [ 114.98003217, 31.01293552 ], [ 114.98151317, 31.01668943 ], [ 114.98121717, 31.01980736 ], [ 114.97998017, 31.0227693 ], [ 114.97897017, 31.02469925 ], [ 114.97677517, 31.02784318 ], [ 114.97339617, 31.02938714 ], [ 114.972843103024076, 31.029206181045179 ], [ 114.97238891, 31.02950845 ], [ 114.9696803, 31.02862859 ], [ 114.96848347, 31.0274456 ], [ 114.96709432, 31.02536863 ], [ 114.96637388, 31.0234637 ], [ 114.96728496, 31.02216097 ], [ 114.96834452, 31.02072689 ], [ 114.97004495, 31.01830057 ], [ 114.97086041, 31.01537498 ], [ 114.97103496, 31.01361952 ], [ 114.97179856, 31.01091993 ], [ 114.97265779, 31.00844094 ], [ 114.97164151, 31.00622512 ], [ 114.96993257, 31.0040512 ], [ 114.96837902, 31.00191771 ], [ 114.96779714, 31.00008439 ], [ 114.96782307, 30.9999544 ], [ 114.96792772, 30.99986316 ], [ 114.96817889, 30.99973954 ], [ 114.96849982, 30.99960273 ], [ 114.96864734, 30.99939645 ], [ 114.96851779, 30.99924189 ], [ 114.96811817, 30.9989012 ], [ 114.96731989, 30.99842867 ], [ 114.96677273, 30.99822429 ], [ 114.96571427, 30.99793233 ], [ 114.96484616, 30.99766483 ], [ 114.96418634, 30.99743073 ], [ 114.96385743, 30.99714877 ], [ 114.96367504, 30.99696636 ], [ 114.96373487, 30.99668837 ], [ 114.96386149, 30.99626928 ], [ 114.96406489, 30.99559913 ], [ 114.96409981, 30.99518927 ], [ 114.96409984, 30.99488345 ], [ 114.96439489, 30.9946468 ], [ 114.96466405, 30.9942733 ], [ 114.96473285, 30.99393731 ], [ 114.9648814, 30.99344221 ], [ 114.96477677, 30.99314666 ], [ 114.96461233, 30.99293822 ], [ 114.96428242, 30.99275221 ], [ 114.96411697, 30.99265871 ], [ 114.96311033, 30.99166296 ], [ 114.96252928, 30.99072105 ], [ 114.96140102, 30.9891719 ], [ 114.96084482, 30.98871861 ], [ 114.96076707, 30.98869382 ], [ 114.9594652, 30.98820844 ], [ 114.95747833, 30.98817546 ], [ 114.955347653267822, 30.988421237162019 ], [ 114.95482817, 30.98853308 ], [ 114.95418517, 30.98867208 ], [ 114.95289717, 30.98903807 ], [ 114.95174817, 30.98984805 ], [ 114.95113917, 30.99069603 ], [ 114.95092117, 30.99141401 ], [ 114.95047817, 30.992223 ], [ 114.95022517, 30.99271098 ], [ 114.95043417, 30.99318097 ], [ 114.95104317, 30.99368296 ], [ 114.95132217, 30.99431595 ], [ 114.95117417, 30.99552292 ], [ 114.95113117, 30.9962719 ], [ 114.95108717, 30.99662989 ], [ 114.95116617, 30.99697089 ], [ 114.95258517, 30.99873285 ], [ 114.95283717, 30.99989482 ], [ 114.95280217, 30.99997582 ], [ 114.95276717, 31.00006382 ], [ 114.95273217, 31.00015281 ], [ 114.95270617, 31.00029481 ], [ 114.95274117, 31.0005988 ], [ 114.95286317, 31.00147778 ], [ 114.95304617, 31.00219477 ], [ 114.95280217, 31.00213177 ], [ 114.95735117, 31.00896161 ], [ 114.95494617, 31.01675843 ], [ 114.94951517, 31.02171432 ], [ 114.94516017, 31.02176032 ], [ 114.94533117, 31.02646721 ], [ 114.94760217, 31.03036012 ], [ 114.94773417, 31.03058611 ], [ 114.95545917, 31.03088011 ], [ 114.95460117, 31.03426303 ], [ 114.95512917, 31.03722996 ], [ 114.95569217, 31.04039589 ], [ 114.95923617, 31.04044089 ], [ 114.96043717, 31.04455879 ], [ 114.95998317, 31.05333759 ], [ 114.95071417, 31.06216039 ], [ 114.95339917, 31.06441034 ], [ 114.95889217, 31.06735127 ], [ 114.96438617, 31.07235015 ], [ 114.96970817, 31.07352613 ], [ 114.97520017, 31.07676105 ], [ 114.97388817, 31.08039297 ], [ 114.98058317, 31.08509686 ], [ 114.98126917, 31.09303568 ], [ 114.98876817, 31.09347667 ], [ 114.99394417, 31.09378166 ], [ 115.00873517, 31.09465264 ], [ 115.01400817, 31.09812156 ], [ 115.01931817, 31.09842355 ], [ 115.02137817, 31.09827956 ], [ 115.02813317, 31.09568162 ], [ 115.03089417, 31.09274169 ], [ 115.03448417, 31.08891977 ], [ 115.03860017, 31.08592384 ], [ 115.04034517, 31.08465287 ], [ 115.04699617, 31.08134495 ], [ 115.05008617, 31.08116095 ], [ 115.06137317, 31.08068396 ], [ 115.07585517, 31.07745204 ], [ 115.07909217, 31.07678505 ], [ 115.08181517, 31.07426411 ], [ 115.08027017, 31.07132418 ], [ 115.07820017, 31.06119441 ], [ 115.06670017, 31.05692951 ], [ 115.07441917, 31.05342759 ], [ 115.07837317, 31.05163463 ], [ 115.09056017, 31.05163463 ], [ 115.10034617, 31.05163463 ], [ 115.10875717, 31.04810471 ], [ 115.11336317, 31.04691974 ], [ 115.11757117, 31.04583677 ], [ 115.12918417, 31.04707574 ], [ 115.12935617, 31.04310483 ], [ 115.12861917, 31.0398869 ], [ 115.12763917, 31.035603 ], [ 115.11527917, 31.0313381 ], [ 115.11064417, 31.02880016 ], [ 115.10137517, 31.02850716 ], [ 115.10092317, 31.02789218 ], [ 115.10161017, 31.02612722 ], [ 115.09920717, 31.02333228 ], [ 115.09766217, 31.02171432 ], [ 115.09766217, 31.02024335 ], [ 115.09903517, 31.01891938 ], [ 115.09766217, 31.01744742 ], [ 115.09405717, 31.01862439 ], [ 115.09079517, 31.01891938 ], [ 115.09131017, 31.02009536 ], [ 115.08976517, 31.02171432 ], [ 115.08993717, 31.02347928 ], [ 115.08873517, 31.02509724 ], [ 115.09113817, 31.02730419 ], [ 115.09131017, 31.02730419 ], [ 115.08856417, 31.02833417 ], [ 115.08770517, 31.03024612 ], [ 115.08598917, 31.03068711 ], [ 115.08564517, 31.02833417 ], [ 115.08238417, 31.02803917 ], [ 115.07905417, 31.02742819 ], [ 115.07757717, 31.02715719 ], [ 115.07345717, 31.02774518 ], [ 115.07002417, 31.02892215 ], [ 115.06830717, 31.02450926 ], [ 115.06985217, 31.0227433 ], [ 115.07294217, 31.02127233 ], [ 115.07208417, 31.01906638 ], [ 115.07397217, 31.0180364 ], [ 115.07637617, 31.01685943 ], [ 115.07414417, 31.01597645 ], [ 115.07414417, 31.01421149 ], [ 115.07586117, 31.01229854 ], [ 115.07763817, 31.01236453 ], [ 115.07980917, 31.01244553 ], [ 115.08049517, 31.01082757 ], [ 115.08272717, 31.00994459 ], [ 115.08547417, 31.00862062 ], [ 115.08478717, 31.0052367 ], [ 115.08701917, 31.00317675 ], [ 115.08839217, 31.00714865 ], [ 115.08778817, 31.0094286 ], [ 115.09247117, 31.0137345 ], [ 115.09569017, 31.0139185 ], [ 115.10247017, 31.01024058 ], [ 115.10294217, 31.00744465 ], [ 115.10167917, 31.00189077 ], [ 115.10066617, 30.99743788 ], [ 115.11525717, 30.99677589 ], [ 115.12298217, 30.98883007 ], [ 115.12169517, 30.98279621 ], [ 115.12102217, 30.98156924 ], [ 115.11963517, 30.9790433 ], [ 115.12530017, 30.97359742 ], [ 115.12498017, 30.97246545 ], [ 115.12092417, 30.9616787 ], [ 115.11165417, 30.96462263 ], [ 115.10701917, 30.96565261 ], [ 115.09912317, 30.97227645 ], [ 115.09282317, 30.97640736 ], [ 115.08757817, 30.97981528 ], [ 115.07895117, 30.98213323 ], [ 115.07218717, 30.98399719 ], [ 115.06903117, 30.98486717 ], [ 115.06657317, 30.98389919 ], [ 115.06747517, 30.98176524 ], [ 115.06481417, 30.98228023 ], [ 115.06056517, 30.98239022 ], [ 115.05862917, 30.9834542 ], [ 115.05781917, 30.98382519 ], [ 115.05300717, 30.9833432 ], [ 115.04530517, 30.98713711 ], [ 115.04444617, 30.9876281 ], [ 115.04025817, 30.98965506 ], [ 115.03846417, 30.99052304 ], [ 115.03803417, 30.98868408 ], [ 115.03610317, 30.98739611 ], [ 115.03466217, 30.98831409 ], [ 115.03088617, 30.98743111 ], [ 115.02876317, 30.98625513 ], [ 115.02721817, 30.98566615 ], [ 115.02262617, 30.98500416 ], [ 115.02064017, 30.98600914 ], [ 115.01879517, 30.98442718 ], [ 115.01823717, 30.98214523 ], [ 115.01742117, 30.98045327 ], [ 115.01690717, 30.97754633 ], [ 115.01634417, 30.97685135 ], [ 115.01437417, 30.9744194 ], [ 115.01111317, 30.97430941 ], [ 115.00896717, 30.97519139 ], [ 115.00657317, 30.97554938 ], [ 115.00392617, 30.9787753 ], [ 114.99621017, 30.97801232 ], [ 114.99211017, 30.97830932 ], [ 114.98842017, 30.97801532 ], [ 114.98599517, 30.97492739 ], [ 114.98256217, 30.97551638 ], [ 114.97779017, 30.97934629 ], [ 114.97865217, 30.98068426 ], [ 114.97912817, 30.98128525 ], [ 114.97959317, 30.98184723 ], [ 114.98201517, 30.98242222 ], [ 114.98235517, 30.98232822 ], [ 114.98286817, 30.98239022 ], [ 114.98328717, 30.98240922 ], [ 114.98437617, 30.98277721 ], [ 114.98625717, 30.98375319 ], [ 114.98696317, 30.98412818 ], [ 114.98755617, 30.98508116 ], [ 114.98795617, 30.98579914 ], [ 114.98793917, 30.98667612 ], [ 114.98787017, 30.98736211 ], [ 114.98780917, 30.9876091 ], [ 114.98632817, 30.98849708 ], [ 114.98510817, 30.98935606 ], [ 114.98503017, 30.99009605 ], [ 114.98502117, 30.99045704 ], [ 114.98522117, 30.99074203 ], [ 114.98577017, 30.99096003 ], [ 114.98638917, 30.99131402 ], [ 114.98690317, 30.99164601 ], [ 114.98752117, 30.992236 ], [ 114.98753017, 30.99277698 ], [ 114.98731317, 30.99346397 ], [ 114.98631917, 30.99454494 ], [ 114.98620617, 30.99538492 ], [ 114.98649417, 30.99588891 ], [ 114.98679917, 30.9963089 ], [ 114.98700817, 30.99712888 ], [ 114.98550117, 30.99809486 ], [ 114.98475117, 30.99861285 ], [ 114.98443817, 30.99882784 ], [ 114.98384617, 30.99924484 ], [ 114.98352917, 30.99976682 ], [ 114.98339317, 30.99999082 ], [ 114.98333217, 31.00022681 ], [ 114.98323617, 31.00037681 ], [ 114.98308817, 31.00044981 ], [ 114.98291417, 31.00044781 ], [ 114.98280017, 31.00039481 ], [ 114.98278317, 31.00021481 ], [ 114.98267917, 31.00013881 ], [ 114.98247817, 31.00012282 ], [ 114.982360820098009, 31.000087361756233 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30168", "Name": "铁门岗乡", "layer": "乡镇", "code": "421181200000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.9326994, 31.00423238 ], [ 114.93231014, 31.00465475 ], [ 114.93095585, 31.00392628 ], [ 114.92961946, 31.00296685 ], [ 114.9283958, 31.00178725 ], [ 114.9279707, 31.00009184 ], [ 114.92791884, 30.99956422 ], [ 114.92787595, 30.99917651 ], [ 114.92787597, 30.99896763 ], [ 114.92765838, 30.99866211 ], [ 114.9274158, 30.99865945 ], [ 114.9271293, 30.99862086 ], [ 114.92699055, 30.99858807 ], [ 114.92686878, 30.99826942 ], [ 114.926778878682342, 30.997760993448491 ], [ 114.92670717, 30.99807486 ], [ 114.92652417, 30.99841485 ], [ 114.92632517, 30.99853685 ], [ 114.92607317, 30.99858385 ], [ 114.925691386650115, 30.998568897649484 ], [ 114.92564482, 30.99865581 ], [ 114.92544514, 30.998777 ], [ 114.925375509266786, 30.998790420448579 ], [ 114.92529917, 30.99899984 ], [ 114.92525517, 30.99939983 ], [ 114.92529017, 30.99962083 ], [ 114.92536017, 30.99985182 ], [ 114.92486217, 31.0008438 ], [ 114.92470817, 31.00115179 ], [ 114.92431417, 31.00193577 ], [ 114.92345717, 31.00364473 ], [ 114.92158017, 31.00679166 ], [ 114.92085017, 31.00883061 ], [ 114.92050017, 31.0094996 ], [ 114.91999917, 31.01045758 ], [ 114.91968917, 31.01204054 ], [ 114.91930717, 31.01346951 ], [ 114.91879417, 31.01462648 ], [ 114.91836817, 31.01530747 ], [ 114.91796917, 31.01575046 ], [ 114.91758617, 31.01610245 ], [ 114.91733417, 31.01642744 ], [ 114.91725617, 31.01649244 ], [ 114.91683917, 31.01683743 ], [ 114.9165057444783, 31.016617360014468 ], [ 114.91646633, 31.01666841 ], [ 114.91638841, 31.01673344 ], [ 114.91597187, 31.01707861 ], [ 114.91451458, 31.01611739 ], [ 114.91269154, 31.01508338 ], [ 114.91019196, 31.01353394 ], [ 114.90808373, 31.01232583 ], [ 114.90557553, 31.01094178 ], [ 114.90384858, 31.00990901 ], [ 114.90173065, 31.00861634 ], [ 114.90057712, 31.00817583 ], [ 114.89628108, 31.008481 ], [ 114.892867558653435, 31.008917142564954 ], [ 114.89036617, 31.00979459 ], [ 114.890075213850068, 31.00984955292439 ], [ 114.88951157, 31.01004699 ], [ 114.88673472, 31.01056968 ], [ 114.88344532, 31.01000441 ], [ 114.88010441, 31.0092108 ], [ 114.87842024, 31.00888578 ], [ 114.87671904, 31.00728838 ], [ 114.8729789, 31.00451371 ], [ 114.86923815, 31.00209029 ], [ 114.86595735, 31.00066542 ], [ 114.86499417, 31.00010959 ], [ 114.86415213, 30.99947193 ], [ 114.86355342, 30.99845378 ], [ 114.86357049, 30.99786415 ], [ 114.86337127, 30.99730822 ], [ 114.8629808, 30.99663512 ], [ 114.86255527, 30.99593899 ], [ 114.86197354, 30.99509273 ], [ 114.86134069, 30.99456321 ], [ 114.86059364, 30.9942614 ], [ 114.85997776, 30.99417462 ], [ 114.85882311, 30.99342347 ], [ 114.85798985, 30.99334635 ], [ 114.85729578, 30.99335936 ], [ 114.85652356, 30.99351516 ], [ 114.85454438, 30.99361319 ], [ 114.85327731, 30.99346336 ], [ 114.85102946, 30.99381566 ], [ 114.85010085, 30.99375723 ], [ 114.84960605, 30.99299488 ], [ 114.84896299, 30.99207538 ], [ 114.84843413, 30.9910921 ], [ 114.84821683, 30.98998739 ], [ 114.84878995, 30.98890496 ], [ 114.84951032, 30.9877478 ], [ 114.8503519, 30.98658682 ], [ 114.851286736355163, 30.986344227693479 ], [ 114.85243417, 30.98586614 ], [ 114.85493817, 30.98557315 ], [ 114.85649017, 30.98543615 ], [ 114.85687017, 30.98540315 ], [ 114.85907117, 30.98555815 ], [ 114.860238645742015, 30.985502555917048 ], [ 114.86145267, 30.98485804 ], [ 114.8627285, 30.9841721 ], [ 114.86337943, 30.9837072 ], [ 114.86415149, 30.98332739 ], [ 114.86535011, 30.98257629 ], [ 114.86542821, 30.98257638 ], [ 114.86595696, 30.98166055 ], [ 114.86597499, 30.98153064 ], [ 114.86632147, 30.98104434 ], [ 114.86663394, 30.9800153 ], [ 114.86667705, 30.97935974 ], [ 114.86626962, 30.97843781 ], [ 114.86594828, 30.97777382 ], [ 114.86575809, 30.97717894 ], [ 114.86585325, 30.97665636 ], [ 114.86625179, 30.9761941 ], [ 114.86630486, 30.97618317 ], [ 114.86686862, 30.97540428 ], [ 114.86867385, 30.97433794 ], [ 114.86963709, 30.97265596 ], [ 114.8696461, 30.97262399 ], [ 114.87112982, 30.9713173 ], [ 114.87247439, 30.96911792 ], [ 114.87254454, 30.96817454 ], [ 114.87119943, 30.9649521 ], [ 114.8681182, 30.96261021 ], [ 114.86570535, 30.96144812 ], [ 114.86311028, 30.95748326 ], [ 114.86142623, 30.95408108 ], [ 114.86136615, 30.95405202 ], [ 114.86048011, 30.95132944 ], [ 114.85867561, 30.94930016 ], [ 114.85804171, 30.94867564 ], [ 114.85719945, 30.94814376 ], [ 114.85658351, 30.94793999 ], [ 114.85494292, 30.94762977 ], [ 114.85464745, 30.94755337 ], [ 114.85351059, 30.94743073 ], [ 114.85228654, 30.94740887 ], [ 114.85101136, 30.94738888 ], [ 114.85058563, 30.94733324 ], [ 114.84983132, 30.94719212 ], [ 114.84852, 30.94712505 ], [ 114.84720963, 30.9472958 ], [ 114.84570785, 30.94752016 ], [ 114.84440643, 30.94746999 ], [ 114.84273929, 30.94729423 ], [ 114.84167224, 30.94730537 ], [ 114.8404048, 30.9470493 ], [ 114.83925856, 30.94702928 ], [ 114.838733229440933, 30.947048295587642 ], [ 114.83871917, 30.94708403 ], [ 114.83848117, 30.94769202 ], [ 114.83806017, 30.94966897 ], [ 114.83792717, 30.95029396 ], [ 114.83739917, 30.95137293 ], [ 114.83706117, 30.95172892 ], [ 114.83658517, 30.95196692 ], [ 114.83590917, 30.95207192 ], [ 114.835897287555014, 30.952071583386829 ], [ 114.83566495, 30.95218678 ], [ 114.83498857, 30.95229049 ], [ 114.8335737, 30.95224692 ], [ 114.83246242, 30.95221689 ], [ 114.83152904759767, 30.952199816583011 ], [ 114.83119717, 30.95227891 ], [ 114.831150116711754, 30.952279297588866 ], [ 114.83026586, 30.95248766 ], [ 114.829709076726544, 30.952492125195374 ], [ 114.82927417, 30.9525949 ], [ 114.829223848334678, 30.952594105028986 ], [ 114.82833883, 30.95280088 ], [ 114.82770557, 30.95278975 ], [ 114.82741898, 30.95263131 ], [ 114.82715847, 30.95224904 ], [ 114.82643804, 30.95122729 ], [ 114.82620359, 30.95077611 ], [ 114.82416431, 30.95063036 ], [ 114.821812374887884, 30.950845823473252 ], [ 114.82180117, 30.95084894 ], [ 114.82135617, 30.95097294 ], [ 114.82125317, 30.95370888 ], [ 114.82064617, 30.95486285 ], [ 114.82017917, 30.95574783 ], [ 114.82074217, 30.95641482 ], [ 114.82121817, 30.9573158 ], [ 114.82123617, 30.95859477 ], [ 114.82063817, 30.95901276 ], [ 114.820028233418185, 30.958959376351313 ], [ 114.81968515, 30.95919789 ], [ 114.81860789, 30.95910292 ], [ 114.81710682, 30.95810869 ], [ 114.81656871, 30.95786583 ], [ 114.816162946019745, 30.95785935319093 ], [ 114.81554417, 30.95808178 ], [ 114.81388117, 30.95840577 ], [ 114.81246017, 30.95947075 ], [ 114.81162017, 30.96108771 ], [ 114.81096217, 30.96417864 ], [ 114.81058117, 30.96506462 ], [ 114.80990517, 30.96544161 ], [ 114.80899617, 30.9658556 ], [ 114.80875317, 30.96670558 ], [ 114.80877917, 30.96736557 ], [ 114.80854517, 30.96805855 ], [ 114.80773117, 30.96820155 ], [ 114.80673417, 30.96845854 ], [ 114.80538217, 30.96933052 ], [ 114.80432617, 30.97001151 ], [ 114.803441960858422, 30.970094446706234 ], [ 114.80333874, 30.97016062 ], [ 114.802381924921775, 30.970249041368106 ], [ 114.80170917, 30.97051249 ], [ 114.80132817, 30.97128448 ], [ 114.80085217, 30.97166447 ], [ 114.80064417, 30.97237045 ], [ 114.80097317, 30.97306144 ], [ 114.80171117, 30.97356742 ], [ 114.80188317, 30.9744734 ], [ 114.80245517, 30.97510139 ], [ 114.80293217, 30.97576737 ], [ 114.80365117, 30.97574037 ], [ 114.80431817, 30.97594537 ], [ 114.80455217, 30.97636236 ], [ 114.80466517, 30.97806632 ], [ 114.80496017, 30.97963828 ], [ 114.80549717, 30.98139124 ], [ 114.80574017, 30.98417718 ], [ 114.80535917, 30.98550015 ], [ 114.80486517, 30.98587914 ], [ 114.80411117, 30.98661212 ], [ 114.80353917, 30.98707111 ], [ 114.80281217, 30.98791209 ], [ 114.80261217, 30.98862108 ], [ 114.80286417, 30.99017304 ], [ 114.80326217, 30.99126002 ], [ 114.80326717, 30.99232199 ], [ 114.80327117, 30.99316897 ], [ 114.80302917, 30.99449394 ], [ 114.80287317, 30.99538592 ], [ 114.80286417, 30.99578191 ], [ 114.80240517, 30.99613191 ], [ 114.80214517, 30.9962999 ], [ 114.80167717, 30.9964959 ], [ 114.80113117, 30.99668289 ], [ 114.80056817, 30.99677489 ], [ 114.80020301714238, 30.996789496114303 ], [ 114.80013529, 30.99681252 ], [ 114.79957121, 30.99690352 ], [ 114.7990332, 30.9969236 ], [ 114.79839902, 30.99682561 ], [ 114.79777387, 30.99671664 ], [ 114.7967931, 30.99622233 ], [ 114.79531654, 30.99492371 ], [ 114.7938851, 30.9936372 ], [ 114.792635, 30.99259487 ], [ 114.7923395, 30.99243251 ], [ 114.79196587, 30.99226904 ], [ 114.79151412, 30.99205647 ], [ 114.79096722, 30.99169186 ], [ 114.79073285, 30.9913617 ], [ 114.790373077459833, 30.99122351983457 ], [ 114.78984717, 30.99138801 ], [ 114.78914517, 30.992023 ], [ 114.78867717, 30.99257999 ], [ 114.78815717, 30.99307998 ], [ 114.78808817, 30.99319297 ], [ 114.78813117, 30.99340097 ], [ 114.78824417, 30.99359896 ], [ 114.78852117, 30.99369196 ], [ 114.78885917, 30.99375396 ], [ 114.78931017, 30.99380596 ], [ 114.78982217, 30.99393296 ], [ 114.79007317, 30.99397896 ], [ 114.79035917, 30.99402995 ], [ 114.79081917, 30.99431895 ], [ 114.79131217, 30.99474294 ], [ 114.79158117, 30.99528993 ], [ 114.79185917, 30.99584791 ], [ 114.79195417, 30.99680289 ], [ 114.79217117, 30.99717888 ], [ 114.79259517, 30.99741688 ], [ 114.79341917, 30.99745288 ], [ 114.79445017, 30.99809586 ], [ 114.79514417, 30.99881184 ], [ 114.79555117, 30.99914784 ], [ 114.79557717, 30.99942583 ], [ 114.79556817, 30.99962083 ], [ 114.79551717, 30.99998982 ], [ 114.79548217, 31.00015081 ], [ 114.79530017, 31.0005548 ], [ 114.79514417, 31.0009068 ], [ 114.79493617, 31.00140478 ], [ 114.79484117, 31.00170678 ], [ 114.79462417, 31.00170278 ], [ 114.79441617, 31.00206577 ], [ 114.79440717, 31.00223477 ], [ 114.79438117, 31.00237376 ], [ 114.79427717, 31.00289075 ], [ 114.79425117, 31.00301475 ], [ 114.79406117, 31.00306275 ], [ 114.79390517, 31.00314074 ], [ 114.79369717, 31.00292675 ], [ 114.79374017, 31.00254176 ], [ 114.79381817, 31.00193777 ], [ 114.793733084214281, 31.001820344583823 ], [ 114.79361592, 31.001818 ], [ 114.79340752, 31.00218046 ], [ 114.79339849, 31.0023504 ], [ 114.79337244, 31.00248928 ], [ 114.79326821, 31.00300582 ], [ 114.79324215, 31.0031287 ], [ 114.79320709, 31.00316563 ], [ 114.79305182, 31.00317638 ], [ 114.79289453, 31.00325509 ], [ 114.79268619, 31.0030399 ], [ 114.7927303, 31.00265619 ], [ 114.79280849, 31.00205261 ], [ 114.79268629, 31.00188552 ], [ 114.79213934, 31.00193065 ], [ 114.7907069, 31.00187851 ], [ 114.79039438, 31.00181808 ], [ 114.79011693, 31.00163578 ], [ 114.78987362, 31.00057504 ], [ 114.789755128800195, 31.000417218059617 ], [ 114.78958817, 31.00041481 ], [ 114.789496050183928, 31.000402103818473 ], [ 114.78898816, 31.00053077 ], [ 114.78857148, 31.00052417 ], [ 114.7879034, 31.00043126 ], [ 114.78730346, 31.00022653 ], [ 114.78718227, 31.00013741 ], [ 114.78716525, 31.0001074 ], [ 114.78594036, 30.99961898 ], [ 114.78524633, 30.99907434 ], [ 114.78415277, 30.99795652 ], [ 114.78357897, 30.99722519 ], [ 114.78223411, 30.99600916 ], [ 114.7809574, 30.99463835 ], [ 114.7797328, 30.99362344 ], [ 114.77797956, 30.99233512 ], [ 114.77665095, 30.99121626 ], [ 114.7759041, 30.99033595 ], [ 114.77494095, 30.98996413 ], [ 114.77449179888481, 30.989872794049958 ], [ 114.77227517, 30.99494093 ], [ 114.76927117, 31.00009181 ], [ 114.76872417, 31.0006138 ], [ 114.76549517, 31.00369673 ], [ 114.76249117, 31.00627167 ], [ 114.76077417, 31.00980259 ], [ 114.76086017, 31.0136275 ], [ 114.76387717, 31.01610345 ], [ 114.76489417, 31.01693743 ], [ 114.76841317, 31.01951237 ], [ 114.77480917, 31.02140633 ], [ 114.78425017, 31.02486325 ], [ 114.78488317, 31.02522724 ], [ 114.79000117, 31.02817317 ], [ 114.79159117, 31.03082011 ], [ 114.79300517, 31.03317505 ], [ 114.79480717, 31.03729296 ], [ 114.79386317, 31.04266184 ], [ 114.79355417, 31.04348782 ], [ 114.79171717, 31.0483977 ], [ 114.79291917, 31.05391258 ], [ 114.79863717, 31.05770249 ], [ 114.79971117, 31.05841447 ], [ 114.80467817, 31.0617064 ], [ 114.80982717, 31.06376435 ], [ 114.81589317, 31.06649129 ], [ 114.82029817, 31.06847124 ], [ 114.82794817, 31.07255015 ], [ 114.83258517, 31.07502309 ], [ 114.84235717, 31.08023397 ], [ 114.85626117, 31.08905477 ], [ 114.85806417, 31.09008375 ], [ 114.86344017, 31.0922407 ], [ 114.86756017, 31.09356367 ], [ 114.87064917, 31.09385766 ], [ 114.87408317, 31.09525563 ], [ 114.87451217, 31.09371266 ], [ 114.87477017, 31.09136072 ], [ 114.87554217, 31.08842078 ], [ 114.87708717, 31.08474487 ], [ 114.87820317, 31.08378989 ], [ 114.88275817, 31.0833969 ], [ 114.88841717, 31.08290791 ], [ 114.89476817, 31.07967299 ], [ 114.89933117, 31.07323213 ], [ 114.90688517, 31.07264415 ], [ 114.90794717, 31.07252015 ], [ 114.91066117, 31.07220316 ], [ 114.91246517, 31.07065819 ], [ 114.91563917, 31.06793926 ], [ 114.91907317, 31.0702922 ], [ 114.92319217, 31.07190916 ], [ 114.92429417, 31.06658729 ], [ 114.92799917, 31.06205739 ], [ 114.92970517, 31.06091342 ], [ 114.93194717, 31.05941045 ], [ 114.93555217, 31.05852847 ], [ 114.93853317, 31.05944345 ], [ 114.94334817, 31.06092142 ], [ 114.95071417, 31.06216039 ], [ 114.95998317, 31.05333759 ], [ 114.96043717, 31.04455879 ], [ 114.95923617, 31.04044089 ], [ 114.95569217, 31.04039589 ], [ 114.95512917, 31.03722996 ], [ 114.95460117, 31.03426303 ], [ 114.95545917, 31.03088011 ], [ 114.94773417, 31.03058611 ], [ 114.94760217, 31.03036012 ], [ 114.94533117, 31.02646721 ], [ 114.94516017, 31.02176032 ], [ 114.94951517, 31.02171432 ], [ 114.95494617, 31.01675843 ], [ 114.95735117, 31.00896161 ], [ 114.95280217, 31.00213177 ], [ 114.95194917, 31.00156078 ], [ 114.951904706168094, 31.001532433227936 ], [ 114.95192358, 31.00166892 ], [ 114.95215785, 31.00237401 ], [ 114.95210599, 31.00238513 ], [ 114.95186269, 31.00232267 ], [ 114.95101215, 31.00175396 ], [ 114.95039591, 31.0013606 ], [ 114.95009178, 31.0011654 ], [ 114.95007484, 31.0010505 ], [ 114.95016161, 31.00082244 ], [ 114.95018755, 31.00070745 ], [ 114.95019654, 31.0005925 ], [ 114.95008385, 31.00053479 ], [ 114.94977072, 31.00054748 ], [ 114.94944163, 31.00052323 ], [ 114.94925914, 31.00044369 ], [ 114.94906769, 31.00022424 ], [ 114.94901584, 31.00008744 ], [ 114.94890317, 30.99982684 ], [ 114.9487466, 30.99975723 ], [ 114.9484175, 30.99973397 ], [ 114.9470023, 30.99978002 ], [ 114.94380856, 30.99981268 ], [ 114.94210778, 30.99981109 ], [ 114.94194319, 30.99981741 ], [ 114.94167385, 30.99967402 ], [ 114.94166591, 30.99927727 ], [ 114.94165699, 30.99858269 ], [ 114.94136175, 30.99796663 ], [ 114.94061559, 30.99741139 ], [ 114.94046870229046, 30.997330407231956 ], [ 114.94040317, 30.99739188 ], [ 114.94028117, 30.99743088 ], [ 114.94001217, 30.99741088 ], [ 114.93958517, 30.99730388 ], [ 114.939394522897743, 30.997033945636055 ], [ 114.93938251, 30.99717486 ], [ 114.93960896, 30.99750425 ], [ 114.93949621, 30.9976114 ], [ 114.93937449, 30.9976496 ], [ 114.93910511, 30.99763111 ], [ 114.9386801, 30.99752496 ], [ 114.93845464, 30.99720556 ], [ 114.93860136, 30.99657366 ], [ 114.93871513, 30.99629362 ], [ 114.93854154, 30.99613103 ], [ 114.938269547375455, 30.995987285170816 ], [ 114.93817617, 30.99606991 ], [ 114.93768917, 30.99675089 ], [ 114.93737617, 30.99732188 ], [ 114.93740217, 30.99781287 ], [ 114.93750617, 30.99802586 ], [ 114.93753317, 30.99831886 ], [ 114.93734117, 30.99881984 ], [ 114.93571517, 30.99942383 ], [ 114.93538417, 30.99986382 ], [ 114.93516717, 31.00164178 ], [ 114.93459417, 31.00292475 ], [ 114.93359217, 31.00400573 ], [ 114.93320217, 31.00442672 ], [ 114.932746680351315, 31.004181175473235 ], [ 114.9326994, 31.00423238 ] ], [ [ 114.92386723, 31.02758325 ], [ 114.92425169, 31.02677225 ], [ 114.92445639, 31.02647117 ], [ 114.92485576, 31.02630776 ], [ 114.92508139, 31.02634045 ], [ 114.92515027, 31.02639733 ], [ 114.92514227, 31.02659423 ], [ 114.92510731, 31.02684813 ], [ 114.9251682, 31.02690502 ], [ 114.92527203, 31.02690688 ], [ 114.92546272, 31.02685467 ], [ 114.92570635, 31.02652055 ], [ 114.92596692, 31.02641227 ], [ 114.9261656, 31.02630107 ], [ 114.92647012, 31.02582594 ], [ 114.92666979, 31.02571774 ], [ 114.92689441, 31.02572143 ], [ 114.92718989, 31.02580998 ], [ 114.92748536, 31.02595549 ], [ 114.92761513, 31.02592933 ], [ 114.92794457, 31.02576496 ], [ 114.92851759, 31.02515551 ], [ 114.92884702, 31.0248772 ], [ 114.92912552, 31.02483382 ], [ 114.9296196, 31.02487708 ], [ 114.93004478, 31.02518027 ], [ 114.93078334, 31.02566188 ], [ 114.93101688, 31.02578646 ], [ 114.93138118, 31.02565097 ], [ 114.93181537, 31.02526253 ], [ 114.93202399, 31.02490041 ], [ 114.93189327, 31.02465476 ], [ 114.93154695, 31.02453936 ], [ 114.9310609, 31.02447915 ], [ 114.93087828, 31.02414962 ], [ 114.93074862, 31.0231314 ], [ 114.9307656, 31.0229215 ], [ 114.93166784, 31.02314698 ], [ 114.93183252, 31.02309276 ], [ 114.93196327, 31.02292565 ], [ 114.93217091, 31.02241962 ], [ 114.93221485, 31.02202678 ], [ 114.93237954, 31.0218876 ], [ 114.93270988, 31.02186608 ], [ 114.93319589, 31.02187929 ], [ 114.93377669, 31.02210022 ], [ 114.9341489, 31.02231048 ], [ 114.93460093, 31.02256658 ], [ 114.93510485, 31.02280559 ], [ 114.93540017, 31.02338275 ], [ 114.93568551, 31.02395193 ], [ 114.93732584, 31.02475759 ], [ 114.93778581, 31.02476476 ], [ 114.93834155, 31.02477274 ], [ 114.93896611, 31.02484056 ], [ 114.93921752, 31.02498601 ], [ 114.93931327, 31.02532363 ], [ 114.93930526, 31.02560548 ], [ 114.93946987, 31.02572111 ], [ 114.93973027, 31.02569663 ], [ 114.94039875, 31.02506074 ], [ 114.94089259, 31.0248699 ], [ 114.94144825, 31.02482185 ], [ 114.94203881, 31.02491764 ], [ 114.94252459, 31.0252345 ], [ 114.94268118, 31.02546205 ], [ 114.94254251, 31.0256862 ], [ 114.94161373, 31.02623471 ], [ 114.94075375, 31.02687101 ], [ 114.94021598, 31.02736975 ], [ 114.9401122, 31.02767876 ], [ 114.94010319, 31.02801658 ], [ 114.9401291, 31.02838332 ], [ 114.94012109, 31.02872214 ], [ 114.93998239, 31.02900224 ], [ 114.93965214, 31.02930569 ], [ 114.93941765, 31.02972488 ], [ 114.93977667, 31.03135927 ], [ 114.94009487, 31.03201229 ], [ 114.94011181, 31.03224712 ], [ 114.94034624, 31.03248753 ], [ 114.94060661, 31.03262895 ], [ 114.94115329, 31.03267388 ], [ 114.94148349, 31.03275419 ], [ 114.94166503, 31.03297571 ], [ 114.94183061, 31.03320325 ], [ 114.94191736, 31.03365682 ], [ 114.94163997, 31.03438394 ], [ 114.94137059, 31.03483121 ], [ 114.94136158, 31.03511306 ], [ 114.94135357, 31.03550785 ], [ 114.94127471, 31.03604169 ], [ 114.94117093, 31.03640868 ], [ 114.94072795, 31.03696422 ], [ 114.94019016, 31.03768883 ], [ 114.93995569, 31.03796711 ], [ 114.93995567, 31.03819298 ], [ 114.94007737, 31.03833567 ], [ 114.94033774, 31.03853806 ], [ 114.94075471, 31.03896701 ], [ 114.94087639, 31.0392796 ], [ 114.9407457, 31.0393628 ], [ 114.94019903, 31.03895908 ], [ 114.93958251, 31.03858146 ], [ 114.93939196, 31.03846588 ], [ 114.93925328, 31.03852111 ], [ 114.93925326, 31.03883093 ], [ 114.93921832, 31.03897191 ], [ 114.9390537, 31.0389962 ], [ 114.9387584, 31.03882285 ], [ 114.9383683, 31.03873162 ], [ 114.93820267, 31.03881387 ], [ 114.93806396, 31.03912195 ], [ 114.93796816, 31.03926104 ], [ 114.93773469, 31.03925847 ], [ 114.93734358, 31.03911125 ], [ 114.93709217, 31.03872892 ], [ 114.93677989, 31.03834769 ], [ 114.93620717, 31.03806986 ], [ 114.93553863, 31.03790311 ], [ 114.9348531, 31.0378593 ], [ 114.93429726, 31.03785124 ], [ 114.93390709, 31.03767499 ], [ 114.93320459, 31.03698753 ], [ 114.93281342, 31.03658639 ], [ 114.93258787, 31.03661074 ], [ 114.93228445, 31.03686008 ], [ 114.93221457, 31.03714002 ], [ 114.93224049, 31.03742182 ], [ 114.93213668, 31.03759089 ], [ 114.93174644, 31.03778239 ], [ 114.93105177, 31.03793837 ], [ 114.93052276, 31.03826898 ], [ 114.93035706, 31.03843614 ], [ 114.93030511, 31.03905686 ], [ 114.93021028, 31.03916694 ], [ 114.92975013, 31.03927356 ], [ 114.9288907, 31.0394557 ], [ 114.92837064, 31.03950342 ], [ 114.92821393, 31.03931975 ], [ 114.92801432, 31.0390112 ], [ 114.92783178, 31.03734742 ], [ 114.92781485, 31.03683074 ], [ 114.92757228, 31.03684107 ], [ 114.92743353, 31.03675031 ], [ 114.92732874, 31.0365066 ], [ 114.92713812, 31.03587622 ], [ 114.92691254, 31.03556071 ], [ 114.92653919, 31.03535933 ], [ 114.92604504, 31.03525105 ], [ 114.92516849, 31.03523819 ], [ 114.92469027, 31.03521681 ], [ 114.92433485, 31.03506934 ], [ 114.92404833, 31.03481084 ], [ 114.9238227, 31.03461124 ], [ 114.92320666, 31.03454402 ], [ 114.9225816, 31.03458973 ], [ 114.92225208, 31.03475501 ], [ 114.92204433, 31.0353709 ], [ 114.92189653, 31.03560093 ], [ 114.92173976, 31.03559311 ], [ 114.92158401, 31.0353934 ], [ 114.921627, 31.03468776 ], [ 114.92151423, 31.03389734 ], [ 114.92132353, 31.03369567 ], [ 114.92115877, 31.03355294 ], [ 114.92113282, 31.03338306 ], [ 114.92114985, 31.0327634 ], [ 114.92116791, 31.03183392 ], [ 114.92127177, 31.03163692 ], [ 114.92166222, 31.03147358 ], [ 114.92193086, 31.03119544 ], [ 114.92220049, 31.03083534 ], [ 114.92249506, 31.03078303 ], [ 114.92272972, 31.03058987 ], [ 114.92285055, 31.0304558 ], [ 114.92277267, 31.03037294 ], [ 114.92281662, 31.03021898 ], [ 114.92299835, 31.03010583 ], [ 114.92322404, 31.02976776 ], [ 114.92323306, 31.02938797 ], [ 114.92328499, 31.02923599 ], [ 114.92319814, 31.02908219 ], [ 114.92312927, 31.02873847 ], [ 114.92322114, 31.02858145 ], [ 114.92375537, 31.02799814 ], [ 114.92386723, 31.02758325 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30169", "Name": "铁路生活区", "layer": "乡镇", "code": "421181470000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.96843317, 31.15885916 ], [ 114.97228517, 31.15933715 ], [ 114.97286417, 31.15638922 ], [ 114.97259617, 31.15630722 ], [ 114.97261717, 31.15599523 ], [ 114.97116917, 31.15574723 ], [ 114.96917417, 31.15559124 ], [ 114.96892717, 31.15581123 ], [ 114.96843317, 31.15885916 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30170", "Name": "狮子峰林场", "layer": "乡镇", "code": "421181404000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.30116475620467, 31.384452061045266 ], [ 115.301736961, 31.38436878 ], [ 115.302834299823715, 31.384549580239501 ], [ 115.30297117, 31.38452993 ], [ 115.30932917, 31.38558691 ], [ 115.31397517, 31.38801585 ], [ 115.31812517, 31.3901738 ], [ 115.31896017, 31.39060779 ], [ 115.31914717, 31.39073379 ], [ 115.32295317, 31.39329573 ], [ 115.32564217, 31.39676565 ], [ 115.32833117, 31.40147854 ], [ 115.33173317, 31.40553845 ], [ 115.332690516195555, 31.40595161386247 ], [ 115.33311498499999, 31.405972825 ], [ 115.338080284, 31.40433907 ], [ 115.34507788, 31.401919305 ], [ 115.347299479, 31.401526637000099 ], [ 115.349721743, 31.40185454 ], [ 115.350112420108729, 31.401979555983552 ], [ 115.35106217, 31.40210953 ], [ 115.35597717, 31.40368649 ], [ 115.36000017, 31.40546345 ], [ 115.36258617, 31.40660542 ], [ 115.364983130404866, 31.407206929142514 ], [ 115.36802331299999, 31.407642393000099 ], [ 115.37057629, 31.405486189 ], [ 115.381889146, 31.397021998000099 ], [ 115.385614006002612, 31.395061500788326 ], [ 115.386364821794501, 31.394035216977734 ], [ 115.386580687880866, 31.393740148776473 ], [ 115.386664581621574, 31.393625474092815 ], [ 115.38718551, 31.3917278 ], [ 115.38679485, 31.38996446 ], [ 115.38450346, 31.38558382 ], [ 115.37881515, 31.37897937 ], [ 115.37757438, 31.37750777 ], [ 115.37194739, 31.37528449 ], [ 115.37057608, 31.37456611 ], [ 115.36998585, 31.37397791 ], [ 115.37011579, 31.37293209 ], [ 115.370115829342481, 31.372932041292373 ], [ 115.370115829342481, 31.372932041292369 ], [ 115.37011583, 31.372932036000101 ], [ 115.374870260934017, 31.367045856590586 ], [ 115.37724391, 31.36410718 ], [ 115.37770463, 31.36254032 ], [ 115.37763491, 31.36025111 ], [ 115.37685379, 31.3584863 ], [ 115.36809306, 31.35430123 ], [ 115.36691171, 31.35341688 ], [ 115.366621167833998, 31.352863100383388 ], [ 115.35687217, 31.35697457 ], [ 115.34725917, 31.36401041 ], [ 115.33695917, 31.37221822 ], [ 115.32666017, 31.37397718 ], [ 115.31773317, 31.37896006 ], [ 115.30116475620467, 31.384452061045266 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30171", "Name": "乘马岗镇", "layer": "乡镇", "code": "421181113000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.917523238227645, 31.483520267278688 ], [ 114.920090811418021, 31.482671089208697 ], [ 114.92012279668144, 31.482660510665362 ], [ 114.92587647, 31.47657982 ], [ 114.92972893, 31.47295111 ], [ 114.929729007686035, 31.472951061482576 ], [ 114.929729022, 31.472951048 ], [ 114.931300101, 31.471969860000101 ], [ 114.932166801461136, 31.471969337951997 ], [ 114.93223017, 31.4719299 ], [ 114.93327417, 31.4719309 ], [ 114.93419617, 31.47265088 ], [ 114.93484817, 31.47422084 ], [ 114.93504817, 31.47722977 ], [ 114.93570117, 31.47932272 ], [ 114.93785817, 31.48174467 ], [ 114.94100717, 31.48338363 ], [ 114.94473917, 31.48574457 ], [ 114.94971617, 31.49016747 ], [ 114.95365017, 31.49167944 ], [ 114.95568717, 31.4929904 ], [ 114.95610717, 31.49345539 ], [ 114.95693217, 31.49436737 ], [ 114.95849917, 31.49659332 ], [ 114.95975317, 31.4975123 ], [ 114.963694996699346, 31.498746310747268 ], [ 114.96691680799999, 31.4987961960001 ], [ 114.970839374956313, 31.498012466380356 ], [ 114.97227149, 31.49696658 ], [ 114.97345152, 31.49520148 ], [ 114.97489317, 31.48683369 ], [ 114.97717542, 31.4824538 ], [ 114.97907677, 31.48036157 ], [ 114.98005727, 31.47977378 ], [ 114.980057418083902, 31.479773779939336 ], [ 114.980057438, 31.479773768 ], [ 114.981619756, 31.479773130000101 ], [ 114.983581399025525, 31.479838251324104 ], [ 114.98437151, 31.47947795 ], [ 114.98574258, 31.47803907 ], [ 114.98828549, 31.47418306 ], [ 114.98979593, 31.47339961 ], [ 114.99201765, 31.47333385 ], [ 114.992017763002536, 31.473333890432784 ], [ 114.992017879, 31.473333887 ], [ 114.992386252562909, 31.473465691971668 ], [ 114.99313617, 31.47344586 ], [ 114.99405017, 31.47377485 ], [ 114.99744817, 31.4629971 ], [ 114.99843017, 31.45988018 ], [ 114.99955417, 31.45631226 ], [ 115.00848117, 31.44752547 ], [ 115.01068117, 31.43224082 ], [ 115.01255817, 31.41919913 ], [ 115.01328717, 31.41413024 ], [ 115.02450317, 31.40412148 ], [ 115.02839317, 31.40065056 ], [ 115.02600217, 31.39319973 ], [ 115.02171517, 31.37984204 ], [ 115.01466017, 31.35785755 ], [ 115.02013617, 31.35525961 ], [ 115.02702017, 31.35199369 ], [ 115.03320017, 31.34436987 ], [ 115.03285817, 31.33691504 ], [ 115.03251317, 31.32940421 ], [ 115.03221217, 31.32283937 ], [ 115.03182717, 31.31445756 ], [ 115.03526017, 31.31035066 ], [ 115.04050117, 31.30749272 ], [ 115.04290417, 31.3041198 ], [ 115.04230317, 31.30155286 ], [ 115.03440717, 31.30103887 ], [ 115.03217517, 31.29788595 ], [ 115.03192417, 31.29085011 ], [ 115.03174617, 31.28585722 ], [ 115.02564717, 31.28336128 ], [ 115.02049717, 31.28130733 ], [ 115.01689217, 31.27888739 ], [ 115.01895117, 31.27485048 ], [ 115.03320017, 31.26399473 ], [ 115.02804917, 31.26140379 ], [ 115.02731917, 31.26121979 ], [ 115.02798817, 31.25941284 ], [ 115.02393317, 31.25584792 ], [ 115.02026417, 31.25539993 ], [ 115.01912617, 31.25526093 ], [ 115.01466317, 31.25144502 ], [ 115.00642317, 31.24997805 ], [ 115.00299017, 31.25349997 ], [ 114.99612317, 31.25702189 ], [ 114.99063017, 31.25702189 ], [ 114.98754017, 31.25467395 ], [ 114.98822717, 31.24997805 ], [ 114.98651017, 31.24704312 ], [ 114.98067417, 31.24410719 ], [ 114.97277817, 31.24528116 ], [ 114.95732817, 31.2482171 ], [ 114.95629817, 31.24528116 ], [ 114.94704917, 31.24586015 ], [ 114.94222217, 31.24616214 ], [ 114.93707217, 31.24909708 ], [ 114.93511617, 31.25409096 ], [ 114.92962317, 31.26175778 ], [ 114.92880817, 31.26634368 ], [ 114.92990117, 31.27139256 ], [ 114.92992717, 31.27495748 ], [ 114.92993417, 31.27596545 ], [ 114.93466917, 31.28959314 ], [ 114.92957717, 31.29329205 ], [ 114.92780217, 31.29458102 ], [ 114.92460517, 31.29497101 ], [ 114.92059217, 31.295461 ], [ 114.91568617, 31.28755518 ], [ 114.90933417, 31.28388827 ], [ 114.90732917, 31.28295329 ], [ 114.90555717, 31.28212731 ], [ 114.90006417, 31.28359428 ], [ 114.89062317, 31.2866752 ], [ 114.88598817, 31.28564823 ], [ 114.88252917, 31.28742219 ], [ 114.88083817, 31.28828917 ], [ 114.88049517, 31.29313005 ], [ 114.87809217, 31.29870393 ], [ 114.88152517, 31.30545077 ], [ 114.87448717, 31.31072965 ], [ 114.87420017, 31.31139463 ], [ 114.87036717, 31.32026242 ], [ 114.87363017, 31.32451433 ], [ 114.86881217, 31.32734926 ], [ 114.86590617, 31.32905922 ], [ 114.87431717, 31.33345812 ], [ 114.88118417, 31.3343371 ], [ 114.88015417, 31.33946898 ], [ 114.87814017, 31.34574983 ], [ 114.87749917, 31.34774979 ], [ 114.87630417, 31.3514777 ], [ 114.88324517, 31.35354365 ], [ 114.88626017, 31.35851454 ], [ 114.89062617, 31.3557426 ], [ 114.89491817, 31.35808855 ], [ 114.89644317, 31.36381841 ], [ 114.89749317, 31.36776232 ], [ 114.89526117, 31.37597013 ], [ 114.89516717, 31.37704411 ], [ 114.89474617, 31.38183199 ], [ 114.89886617, 31.38373695 ], [ 114.90058317, 31.38886583 ], [ 114.90058317, 31.39148277 ], [ 114.90058317, 31.39546068 ], [ 114.89324517, 31.39410371 ], [ 114.89347017, 31.39808162 ], [ 114.89366917, 31.39934859 ], [ 114.89384617, 31.40047756 ], [ 114.89504717, 31.40399348 ], [ 114.89933917, 31.4115393 ], [ 114.90036917, 31.42296504 ], [ 114.90208517, 31.43146084 ], [ 114.90860617, 31.43643972 ], [ 114.91203917, 31.44932742 ], [ 114.91253417, 31.4503044 ], [ 114.91451717, 31.45421631 ], [ 114.91753217, 31.46016417 ], [ 114.91753317, 31.46926696 ], [ 114.91753317, 31.47334086 ], [ 114.91024717, 31.4801927 ], [ 114.91221017, 31.48228365 ], [ 114.91339117, 31.48333063 ], [ 114.91453817, 31.48353563 ], [ 114.91522417, 31.48365862 ], [ 114.917523238227645, 31.483520267278688 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_township_pg.30172", "Name": "盐田河镇", "layer": "乡镇", "code": "421181107000", "grade": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.262150176683136, 30.969368777949828 ], [ 115.26114336, 30.96946704 ], [ 115.25794882, 30.96900115 ], [ 115.25450422, 30.96601146 ], [ 115.25237754, 30.96302595 ], [ 115.25053783, 30.95706296 ], [ 115.24762213, 30.95269906 ], [ 115.24656263, 30.94971793 ], [ 115.24764776, 30.94536437 ], [ 115.24979952, 30.9407847 ], [ 115.25248178, 30.93689728 ], [ 115.25381739, 30.93392158 ], [ 115.2530452, 30.92910467 ], [ 115.25038964, 30.92565844 ], [ 115.24719682, 30.92312948 ], [ 115.24215352, 30.9221971 ], [ 115.23842229, 30.92195668 ], [ 115.23496762, 30.92080037 ], [ 115.22964769, 30.9180346 ], [ 115.224576638435423, 30.916827794635608 ], [ 115.22332417, 30.9179067 ], [ 115.22329817, 30.92455755 ], [ 115.22327317, 30.92868545 ], [ 115.22325617, 30.93235337 ], [ 115.22377617, 30.9355643 ], [ 115.22057717, 30.93830923 ], [ 115.21710917, 30.94036719 ], [ 115.21470817, 30.94196615 ], [ 115.21203817, 30.9442541 ], [ 115.20857117, 30.94585306 ], [ 115.208209523600559, 30.945565432306886 ], [ 115.20742213, 30.9459267 ], [ 115.20423691, 30.94339499 ], [ 115.20265692, 30.93972297 ], [ 115.20134638, 30.93467608 ], [ 115.19922839, 30.93123002 ], [ 115.19551354, 30.92869784 ], [ 115.190691841055511, 30.928460939620592 ], [ 115.18870017, 30.92861446 ], [ 115.18417717, 30.92998142 ], [ 115.18017517, 30.93157839 ], [ 115.17698717, 30.93180138 ], [ 115.176870240869434, 30.93175911889174 ], [ 115.17578449, 30.93183288 ], [ 115.17259919, 30.93067864 ], [ 115.17021972, 30.92677247 ], [ 115.16809361, 30.92447182 ], [ 115.16543736, 30.92285477 ], [ 115.15984717, 30.92214974 ], [ 115.15478611, 30.92189951 ], [ 115.15159097, 30.92097126 ], [ 115.14892592, 30.92050178 ], [ 115.1457401, 30.91934291 ], [ 115.145141996104712, 30.919059379136129 ], [ 115.14100817, 30.91839169 ], [ 115.13294017, 30.91721372 ], [ 115.13053717, 30.91986466 ], [ 115.12933517, 30.92163162 ], [ 115.12731117, 30.92524253 ], [ 115.12653917, 30.92848146 ], [ 115.12848817, 30.93190838 ], [ 115.12867517, 30.93496531 ], [ 115.12787617, 30.93902622 ], [ 115.12525217, 30.94180715 ], [ 115.12396517, 30.94453209 ], [ 115.12264117, 30.94990197 ], [ 115.12023717, 30.95505385 ], [ 115.11800617, 30.95755679 ], [ 115.12092417, 30.9616787 ], [ 115.12498017, 30.97246545 ], [ 115.12530017, 30.97359742 ], [ 115.11963517, 30.9790433 ], [ 115.12102217, 30.98156924 ], [ 115.12169517, 30.98279621 ], [ 115.12298217, 30.98883007 ], [ 115.11525717, 30.99677589 ], [ 115.10066617, 30.99743788 ], [ 115.10167917, 31.00189077 ], [ 115.10294217, 31.00744465 ], [ 115.10247017, 31.01024058 ], [ 115.09569017, 31.0139185 ], [ 115.09247117, 31.0137345 ], [ 115.08778817, 31.0094286 ], [ 115.08753417, 31.01038458 ], [ 115.08959317, 31.01215154 ], [ 115.09199717, 31.01435849 ], [ 115.09594517, 31.01435849 ], [ 115.09972217, 31.01229854 ], [ 115.10418517, 31.01185755 ], [ 115.10504317, 31.00979759 ], [ 115.10367017, 31.00626667 ], [ 115.10796117, 31.00803163 ], [ 115.10624517, 31.00361774 ], [ 115.10813317, 31.00332374 ], [ 115.10899117, 31.0009698 ], [ 115.11208117, 31.00611968 ], [ 115.11139417, 31.00832663 ], [ 115.11225317, 31.00832663 ], [ 115.11465617, 31.00626667 ], [ 115.11585817, 31.00641367 ], [ 115.11620117, 31.00817863 ], [ 115.11654417, 31.01097457 ], [ 115.11774617, 31.01141556 ], [ 115.12049317, 31.01038558 ], [ 115.12409717, 31.00876762 ], [ 115.12529917, 31.00994459 ], [ 115.12512717, 31.01171055 ], [ 115.12203717, 31.01273953 ], [ 115.11688817, 31.01479948 ], [ 115.12152317, 31.01597645 ], [ 115.12581417, 31.01465248 ], [ 115.12718717, 31.01685943 ], [ 115.12753117, 31.01862439 ], [ 115.12787417, 31.02039035 ], [ 115.13027717, 31.02053735 ], [ 115.13130717, 31.01788941 ], [ 115.13233717, 31.01980136 ], [ 115.13422517, 31.02009536 ], [ 115.13783017, 31.0183304 ], [ 115.14023417, 31.01641844 ], [ 115.14006217, 31.01553546 ], [ 115.13920417, 31.01082757 ], [ 115.13886017, 31.00788464 ], [ 115.13800217, 31.00376473 ], [ 115.13954717, 31.00214677 ], [ 115.13954717, 31.00008682 ], [ 115.14040517, 30.99714388 ], [ 115.14042517, 30.99718188 ], [ 115.14195017, 31.00008682 ], [ 115.14143517, 31.00405973 ], [ 115.14160717, 31.00685466 ], [ 115.14212217, 31.00906161 ], [ 115.14092017, 31.01229854 ], [ 115.14195017, 31.0137695 ], [ 115.14332417, 31.01553546 ], [ 115.14624217, 31.01627045 ], [ 115.14632817, 31.01414049 ], [ 115.15920317, 31.0053857 ], [ 115.16509217, 31.00202277 ], [ 115.16731117, 31.0007558 ], [ 115.17078217, 30.99877385 ], [ 115.18006017, 31.00001582 ], [ 115.18387617, 30.99943083 ], [ 115.18679417, 31.00126979 ], [ 115.18760517, 31.0093676 ], [ 115.19309817, 31.01731242 ], [ 115.19275517, 31.02378527 ], [ 115.20133817, 31.03025712 ], [ 115.21198117, 31.02819817 ], [ 115.21644417, 31.02525624 ], [ 115.22325517, 31.02840517 ], [ 115.22640017, 31.03496402 ], [ 115.23292417, 31.03643498 ], [ 115.24400517, 31.03981091 ], [ 115.25002217, 31.03909292 ], [ 115.24622817, 31.03356805 ], [ 115.24811617, 31.03003813 ], [ 115.24931817, 31.02739019 ], [ 115.25618417, 31.02636021 ], [ 115.26253617, 31.02459525 ], [ 115.26459517, 31.01988736 ], [ 115.25961717, 31.0094426 ], [ 115.25446717, 31.0010558 ], [ 115.25652717, 30.9963469 ], [ 115.25996117, 30.99237399 ], [ 115.26270717, 30.98589914 ], [ 115.26202417, 30.97986628 ], [ 115.27117517, 30.97346743 ], [ 115.27001817, 30.96804055 ], [ 115.26682117, 30.96894653 ], [ 115.26227817, 30.96938752 ], [ 115.262150176683136, 30.969368777949828 ] ] ] ] } } +] +} diff --git a/public/mapbox/geojson/县名称.geojson b/public/mapbox/geojson/县名称.geojson new file mode 100644 index 0000000..cdbecc5 --- /dev/null +++ b/public/mapbox/geojson/县名称.geojson @@ -0,0 +1,8 @@ +{ +"type": "FeatureCollection", +"name": "县名称", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_county_pt.1254", "Name": "麻城市", "pyname": "mcs", "mapid": "3", "kind": "4211", "zipcode": null, "telephone": "116", "admincode": "369571", "display_x": "N", "display_y": "0", "poi_id": null, "importance": null, "vadmincode": null, "chaincode": null, "prior_auth": null, "linkid": null, "side": null, "pid": null, "tel_type": null, "food_type": null, "airpt_code": null, "open_24h": null, "data_src": null, "mesh_id": null, "address": null }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 115.00333488, 31.17545951 ] ] } } +] +} diff --git a/public/mapbox/geojson/县界.geojson b/public/mapbox/geojson/县界.geojson new file mode 100644 index 0000000..d7e68e8 --- /dev/null +++ b/public/mapbox/geojson/县界.geojson @@ -0,0 +1,8 @@ +{ +"type": "FeatureCollection", +"name": "县界", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_county_boundary_pg.1942", "Name": "麻城市", "layer": "区县", "code": "421181000000", "grade": 3 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.98044117, 30.99671607 ], [ 114.98085075, 30.99604025 ], [ 114.98089465, 30.99535652 ], [ 114.98065961, 30.99413494 ], [ 114.97997417, 30.99319052 ], [ 114.97876758, 30.99241554 ], [ 114.97742243, 30.99196076 ], [ 114.97603337, 30.99195581 ], [ 114.97418485, 30.99234293 ], [ 114.97309162, 30.99303766 ], [ 114.97224946, 30.9939965 ], [ 114.97206704, 30.99462165 ], [ 114.97212773, 30.99572383 ], [ 114.97233695, 30.99639284 ], [ 114.97237076, 30.99724725 ], [ 114.97236576, 30.99742616 ], [ 114.97234477, 30.99816778 ], [ 114.97239653, 30.99889921 ], [ 114.97250115, 30.99902684 ], [ 114.97270941, 30.99922413 ], [ 114.97296151, 30.99946727 ], [ 114.97318668, 31.00008526 ], [ 114.97319564, 31.00010722 ], [ 114.97324741, 31.00072571 ], [ 114.9733002, 31.00097741 ], [ 114.97347358, 31.0011818 ], [ 114.97373366, 31.00131198 ], [ 114.97411532, 31.00131788 ], [ 114.97422892, 31.00132055 ], [ 114.9743844, 31.00109523 ], [ 114.974515, 31.00036828 ], [ 114.9748279, 31.00031141 ], [ 114.97488769, 31.00033723 ], [ 114.97488767, 31.00060007 ], [ 114.97502712, 31.0012313 ], [ 114.97516562, 31.00135982 ], [ 114.97533901, 31.00136132 ], [ 114.97592992, 31.00134662 ], [ 114.9762508, 31.00122475 ], [ 114.97637238, 31.00102552 ], [ 114.97664146, 31.00060198 ], [ 114.97671026, 31.00010507 ], [ 114.9767282, 31.00008503 ], [ 114.97709294, 30.9996822 ], [ 114.97765698, 30.99907191 ], [ 114.97851596, 30.99838179 ], [ 114.97861162, 30.99831455 ], [ 114.98002661, 30.9974029 ], [ 114.98044117, 30.99671607 ] ] ], [ [ [ 114.9326994, 31.00423238 ], [ 114.93231014, 31.00465475 ], [ 114.93095585, 31.00392628 ], [ 114.92961946, 31.00296685 ], [ 114.9283958, 31.00178725 ], [ 114.9279707, 31.00009184 ], [ 114.92791884, 30.99956422 ], [ 114.92787595, 30.99917651 ], [ 114.92787597, 30.99896763 ], [ 114.92765838, 30.99866211 ], [ 114.9274158, 30.99865945 ], [ 114.9271293, 30.99862086 ], [ 114.92699055, 30.99858807 ], [ 114.92686878, 30.99826942 ], [ 114.92674705, 30.99758099 ], [ 114.92673011, 30.9972492 ], [ 114.92662528, 30.99727733 ], [ 114.92621796, 30.99748575 ], [ 114.92594839, 30.99778093 ], [ 114.92582754, 30.99831478 ], [ 114.92564482, 30.99865581 ], [ 114.92544514, 30.998777 ], [ 114.92519454, 30.9988253 ], [ 114.92481217, 30.99880979 ], [ 114.9245346, 30.99893207 ], [ 114.92442176, 30.99924203 ], [ 114.92437779, 30.99964185 ], [ 114.92441272, 30.99986268 ], [ 114.92448259, 31.00009245 ], [ 114.92258221, 31.00388658 ], [ 114.92070766, 31.00703385 ], [ 114.9199785, 31.00907143 ], [ 114.9191275, 31.01069936 ], [ 114.91881778, 31.01228175 ], [ 114.91843615, 31.01371029 ], [ 114.9179247, 31.01486711 ], [ 114.91749917, 31.01554812 ], [ 114.91710062, 31.01599123 ], [ 114.91671805, 31.01634238 ], [ 114.91646633, 31.01666841 ], [ 114.91638841, 31.01673344 ], [ 114.91597187, 31.01707861 ], [ 114.91451458, 31.01611739 ], [ 114.91269154, 31.01508338 ], [ 114.91019196, 31.01353394 ], [ 114.90808373, 31.01232583 ], [ 114.90557553, 31.01094178 ], [ 114.90384858, 31.00990901 ], [ 114.90173065, 31.00861634 ], [ 114.90057712, 31.00817583 ], [ 114.89628108, 31.008481 ], [ 114.89266213, 31.00894339 ], [ 114.88951157, 31.01004699 ], [ 114.88673472, 31.01056968 ], [ 114.88344532, 31.01000441 ], [ 114.88010441, 31.0092108 ], [ 114.87842024, 31.00888578 ], [ 114.87671904, 31.00728838 ], [ 114.8729789, 31.00451371 ], [ 114.86923815, 31.00209029 ], [ 114.86595735, 31.00066542 ], [ 114.86499417, 31.00010959 ], [ 114.86415213, 30.99947193 ], [ 114.86355342, 30.99845378 ], [ 114.86357049, 30.99786415 ], [ 114.86337127, 30.99730822 ], [ 114.8629808, 30.99663512 ], [ 114.86255527, 30.99593899 ], [ 114.86197354, 30.99509273 ], [ 114.86134069, 30.99456321 ], [ 114.86059364, 30.9942614 ], [ 114.85997776, 30.99417462 ], [ 114.85882311, 30.99342347 ], [ 114.85798985, 30.99334635 ], [ 114.85729578, 30.99335936 ], [ 114.85652356, 30.99351516 ], [ 114.85454438, 30.99361319 ], [ 114.85327731, 30.99346336 ], [ 114.85102946, 30.99381566 ], [ 114.85010085, 30.99375723 ], [ 114.84960605, 30.99299488 ], [ 114.84896299, 30.99207538 ], [ 114.84843413, 30.9910921 ], [ 114.84821683, 30.98998739 ], [ 114.84878995, 30.98890496 ], [ 114.84951032, 30.9877478 ], [ 114.8503519, 30.98658682 ], [ 114.85150792, 30.98628683 ], [ 114.85404923, 30.98580501 ], [ 114.85598538, 30.98563799 ], [ 114.85818979, 30.98579606 ], [ 114.85983025, 30.98571937 ], [ 114.86145267, 30.98485804 ], [ 114.8627285, 30.9841721 ], [ 114.86337943, 30.9837072 ], [ 114.86415149, 30.98332739 ], [ 114.86535011, 30.98257629 ], [ 114.86542821, 30.98257638 ], [ 114.86595696, 30.98166055 ], [ 114.86597499, 30.98153064 ], [ 114.86632147, 30.98104434 ], [ 114.86663394, 30.9800153 ], [ 114.86667705, 30.97935974 ], [ 114.86626962, 30.97843781 ], [ 114.86594828, 30.97777382 ], [ 114.86575809, 30.97717894 ], [ 114.86585325, 30.97665636 ], [ 114.86625179, 30.9761941 ], [ 114.86630486, 30.97618317 ], [ 114.86686862, 30.97540428 ], [ 114.86867385, 30.97433794 ], [ 114.86963709, 30.97265596 ], [ 114.8696461, 30.97262399 ], [ 114.87112982, 30.9713173 ], [ 114.87247439, 30.96911792 ], [ 114.87254454, 30.96817454 ], [ 114.87119943, 30.9649521 ], [ 114.8681182, 30.96261021 ], [ 114.86570535, 30.96144812 ], [ 114.86311028, 30.95748326 ], [ 114.86142623, 30.95408108 ], [ 114.86136615, 30.95405202 ], [ 114.86048011, 30.95132944 ], [ 114.85867561, 30.94930016 ], [ 114.85804171, 30.94867564 ], [ 114.85719945, 30.94814376 ], [ 114.85658351, 30.94793999 ], [ 114.85494292, 30.94762977 ], [ 114.85464745, 30.94755337 ], [ 114.85351059, 30.94743073 ], [ 114.85228654, 30.94740887 ], [ 114.85101136, 30.94738888 ], [ 114.85058563, 30.94733324 ], [ 114.84983132, 30.94719212 ], [ 114.84852, 30.94712505 ], [ 114.84720963, 30.9472958 ], [ 114.84570785, 30.94752016 ], [ 114.84440643, 30.94746999 ], [ 114.84273929, 30.94729423 ], [ 114.84167224, 30.94730537 ], [ 114.8404048, 30.9470493 ], [ 114.83925856, 30.94702928 ], [ 114.838469, 30.94705786 ], [ 114.83785276, 30.94718767 ], [ 114.83756613, 30.94791773 ], [ 114.8370108, 30.9505172 ], [ 114.83648165, 30.95159361 ], [ 114.83614293, 30.95194979 ], [ 114.83566495, 30.95218678 ], [ 114.83498857, 30.95229049 ], [ 114.8335737, 30.95224692 ], [ 114.83246242, 30.95221689 ], [ 114.83149042, 30.95219911 ], [ 114.83026586, 30.95248766 ], [ 114.8296586, 30.95249253 ], [ 114.82833883, 30.95280088 ], [ 114.82770557, 30.95278975 ], [ 114.82741898, 30.95263131 ], [ 114.82715847, 30.95224904 ], [ 114.82643804, 30.95122729 ], [ 114.82620359, 30.95077611 ], [ 114.82416431, 30.95063036 ], [ 114.82143855, 30.95088007 ], [ 114.82040535, 30.95116396 ], [ 114.82030089, 30.95389816 ], [ 114.82026682, 30.95393807 ], [ 114.81969352, 30.95505134 ], [ 114.81922445, 30.95593394 ], [ 114.81978858, 30.95660261 ], [ 114.82026651, 30.95750298 ], [ 114.82028444, 30.95878126 ], [ 114.81968515, 30.95919789 ], [ 114.81860789, 30.95910292 ], [ 114.81710682, 30.95810869 ], [ 114.81656871, 30.95786583 ], [ 114.81571794, 30.95785225 ], [ 114.81458053, 30.95825889 ], [ 114.81291404, 30.95857962 ], [ 114.81149001, 30.95964038 ], [ 114.81064815, 30.96125489 ], [ 114.80998854, 30.96434287 ], [ 114.80960668, 30.96522866 ], [ 114.80892927, 30.96560421 ], [ 114.80801739, 30.96601633 ], [ 114.80777483, 30.96686539 ], [ 114.80780082, 30.96752505 ], [ 114.80756629, 30.96821722 ], [ 114.80675064, 30.96835768 ], [ 114.80575162, 30.96861376 ], [ 114.80333874, 30.97016062 ], [ 114.80157631, 30.97032349 ], [ 114.80071663, 30.97065783 ], [ 114.80033484, 30.97142873 ], [ 114.7998569, 30.9718077 ], [ 114.79964945, 30.97251294 ], [ 114.79997901, 30.97320309 ], [ 114.8007344, 30.97372206 ], [ 114.80089062, 30.9746158 ], [ 114.80146367, 30.97524541 ], [ 114.80194053, 30.97591183 ], [ 114.80266193, 30.97588609 ], [ 114.80333021, 30.97609212 ], [ 114.80356463, 30.97650929 ], [ 114.80367671, 30.97821248 ], [ 114.80397215, 30.97978308 ], [ 114.80451006, 30.98153699 ], [ 114.8047543, 30.98432178 ], [ 114.80437144, 30.98564334 ], [ 114.80387643, 30.98602125 ], [ 114.80312189, 30.98675251 ], [ 114.80254874, 30.98720925 ], [ 114.80181926, 30.98804951 ], [ 114.80161981, 30.98875675 ], [ 114.80187116, 30.99030827 ], [ 114.80227084, 30.99139632 ], [ 114.8022797, 30.99330322 ], [ 114.80203711, 30.99462803 ], [ 114.80188074, 30.99551924 ], [ 114.80187168, 30.99591399 ], [ 114.80141177, 30.996264 ], [ 114.80115125, 30.99643046 ], [ 114.80068234, 30.99662655 ], [ 114.80013529, 30.99681252 ], [ 114.79957121, 30.99690352 ], [ 114.7990332, 30.9969236 ], [ 114.79839902, 30.99682561 ], [ 114.79777387, 30.99671664 ], [ 114.7967931, 30.99622233 ], [ 114.79531654, 30.99492371 ], [ 114.7938851, 30.9936372 ], [ 114.792635, 30.99259487 ], [ 114.7923395, 30.99243251 ], [ 114.79196587, 30.99226904 ], [ 114.79151412, 30.99205647 ], [ 114.79096722, 30.99169186 ], [ 114.79073285, 30.9913617 ], [ 114.79033319, 30.9912082 ], [ 114.79002968, 30.99119076 ], [ 114.78976925, 30.99120536 ], [ 114.78970915, 30.99123026 ], [ 114.78883168, 30.99150282 ], [ 114.78812848, 30.99213643 ], [ 114.78765967, 30.99269244 ], [ 114.78750333, 30.99380356 ], [ 114.78784187, 30.99386601 ], [ 114.78829359, 30.99391863 ], [ 114.78880541, 30.99404629 ], [ 114.78905782, 30.99409163 ], [ 114.78934429, 30.99414402 ], [ 114.78938736, 30.99412909 ], [ 114.78980403, 30.99443253 ], [ 114.79029882, 30.99485801 ], [ 114.79056822, 30.99540509 ], [ 114.79084564, 30.99596318 ], [ 114.79094172, 30.99691777 ], [ 114.79115906, 30.99729387 ], [ 114.79158376, 30.99753238 ], [ 114.79240918, 30.99756861 ], [ 114.79344192, 30.99821383 ], [ 114.79413609, 30.9989295 ], [ 114.79454478, 30.99926595 ], [ 114.79457081, 30.99954382 ], [ 114.79456177, 30.9997397 ], [ 114.79450965, 31.0001084 ], [ 114.79447557, 31.00026925 ], [ 114.79429322, 31.00067273 ], [ 114.79413691, 31.00102428 ], [ 114.7939285, 31.00152066 ], [ 114.7938323, 31.00182233 ], [ 114.79361592, 31.001818 ], [ 114.79340752, 31.00218046 ], [ 114.79339849, 31.0023504 ], [ 114.79337244, 31.00248928 ], [ 114.79326821, 31.00300582 ], [ 114.79324215, 31.0031287 ], [ 114.79320709, 31.00316563 ], [ 114.79305182, 31.00317638 ], [ 114.79289453, 31.00325509 ], [ 114.79268619, 31.0030399 ], [ 114.7927303, 31.00265619 ], [ 114.79280849, 31.00205261 ], [ 114.79268629, 31.00188552 ], [ 114.79213934, 31.00193065 ], [ 114.7907069, 31.00187851 ], [ 114.79039438, 31.00181808 ], [ 114.79011693, 31.00163578 ], [ 114.78987362, 31.00057504 ], [ 114.78972639, 31.00037894 ], [ 114.78959617, 31.00037674 ], [ 114.78898816, 31.00053077 ], [ 114.78857148, 31.00052417 ], [ 114.7879034, 31.00043126 ], [ 114.78730346, 31.00022653 ], [ 114.78718227, 31.00013741 ], [ 114.78716525, 31.0001074 ], [ 114.78594036, 30.99961898 ], [ 114.78524633, 30.99907434 ], [ 114.78415277, 30.99795652 ], [ 114.78357897, 30.99722519 ], [ 114.78223411, 30.99600916 ], [ 114.7809574, 30.99463835 ], [ 114.7797328, 30.99362344 ], [ 114.77797956, 30.99233512 ], [ 114.77665095, 30.99121626 ], [ 114.7759041, 30.99033595 ], [ 114.77494095, 30.98996413 ], [ 114.77418507, 30.98981042 ], [ 114.77369854, 30.98941116 ], [ 114.77352538, 30.98891627 ], [ 114.77381184, 30.98737047 ], [ 114.77362887, 30.9846099 ], [ 114.77268312, 30.9807712 ], [ 114.77173626, 30.9786685 ], [ 114.77048606, 30.97708326 ], [ 114.76925299, 30.97501536 ], [ 114.76865453, 30.97351072 ], [ 114.76706544, 30.96882515 ], [ 114.766406, 30.96708465 ], [ 114.76569347, 30.96594077 ], [ 114.76438249, 30.96472752 ], [ 114.76350591, 30.96342367 ], [ 114.76265433, 30.9627395 ], [ 114.76167362, 30.96280684 ], [ 114.76115223, 30.96309136 ], [ 114.76082297, 30.96365783 ], [ 114.7606658, 30.9644103 ], [ 114.75921673, 30.96628539 ], [ 114.75772268, 30.96865625 ], [ 114.75765359, 30.96920789 ], [ 114.75796569, 30.97000657 ], [ 114.75912929, 30.97073173 ], [ 114.76035398, 30.97150395 ], [ 114.76123047, 30.97253286 ], [ 114.76169069, 30.97365748 ], [ 114.76187378, 30.97411133 ], [ 114.76204688, 30.97446323 ], [ 114.7621429, 30.97502696 ], [ 114.76189971, 30.97521769 ], [ 114.76117915, 30.97590585 ], [ 114.76081383, 30.97678712 ], [ 114.76037139, 30.97845288 ], [ 114.7600501, 30.97953207 ], [ 114.75965077, 30.98038635 ], [ 114.75921642, 30.98147148 ], [ 114.75921634, 30.98236395 ], [ 114.75912923, 30.98307749 ], [ 114.75931225, 30.98408899 ], [ 114.75965042, 30.98452892 ], [ 114.76020671, 30.98519983 ], [ 114.76044085, 30.9853109 ], [ 114.76069301, 30.985387 ], [ 114.76097019, 30.98536717 ], [ 114.76164766, 30.98526165 ], [ 114.76243724, 30.98511823 ], [ 114.76296763, 30.98510558 ], [ 114.76367915, 30.9853879 ], [ 114.76423555, 30.98581504 ], [ 114.76468687, 30.98639702 ], [ 114.76491298, 30.98720671 ], [ 114.76492994, 30.98787433 ], [ 114.76450451, 30.9887715 ], [ 114.7640271, 30.98913294 ], [ 114.76308035, 30.98933518 ], [ 114.76202958, 30.98936148 ], [ 114.7600323, 30.98859275 ], [ 114.75809618, 30.98834188 ], [ 114.7564643, 30.98881086 ], [ 114.75544878, 30.9893921 ], [ 114.7551526, 30.98990369 ], [ 114.75523958, 30.99065528 ], [ 114.75590876, 30.9919338 ], [ 114.75660297, 30.99331128 ], [ 114.75600455, 30.99487212 ], [ 114.75447575, 30.99656654 ], [ 114.75254799, 30.99731249 ], [ 114.75146367, 30.99729222 ], [ 114.74961426, 30.99708196 ], [ 114.747747, 30.99677589 ], [ 114.7452989, 30.99624107 ], [ 114.74316304, 30.99550557 ], [ 114.74093944, 30.99425655 ], [ 114.73933387, 30.99324545 ], [ 114.73717164, 30.99169092 ], [ 114.73442794, 30.98921034 ], [ 114.73429726, 30.98620215 ], [ 114.73375054, 30.98596552 ], [ 114.73191053, 30.98559159 ], [ 114.72993075, 30.98535278 ], [ 114.72713485, 30.98362253 ], [ 114.72522449, 30.98228966 ], [ 114.72310634, 30.98230029 ], [ 114.72288054, 30.98235844 ], [ 114.72141294, 30.98241465 ], [ 114.7206487, 30.98240133 ], [ 114.71963275, 30.98238227 ], [ 114.71904237, 30.98239282 ], [ 114.71763592, 30.98235621 ], [ 114.71623853, 30.98233165 ], [ 114.71471039, 30.98208142 ], [ 114.71319134, 30.98150246 ], [ 114.71175827, 30.98088748 ], [ 114.71143672, 30.98059703 ], [ 114.71114214, 30.98036052 ], [ 114.71061288, 30.98009932 ], [ 114.70995279, 30.98021905 ], [ 114.70950935, 30.98089821 ], [ 114.70925764, 30.98168606 ], [ 114.70854558, 30.98244951 ], [ 114.70855457, 30.98251047 ], [ 114.70854557, 30.98256245 ], [ 114.70832886, 30.98284856 ], [ 114.70723544, 30.9831418 ], [ 114.70673117, 30.98332636 ], [ 114.7054551, 30.98338204 ], [ 114.70459543, 30.98334525 ], [ 114.70391849, 30.98331321 ], [ 114.70338037, 30.98311708 ], [ 114.70281631, 30.98269414 ], [ 114.7021215, 30.98188061 ], [ 114.70114006, 30.98252467 ], [ 114.7004352, 30.98294247 ], [ 114.70027238, 30.98400009 ], [ 114.69863186, 30.98765743 ], [ 114.69327521, 30.99036838 ], [ 114.69033263, 30.99172252 ], [ 114.68711167, 30.99422064 ], [ 114.68388188, 30.9969478 ], [ 114.68065318, 31.00035969 ], [ 114.67874274, 31.00493162 ], [ 114.67708469, 31.01087824 ], [ 114.67731081, 31.01569401 ], [ 114.67941221, 31.01822862 ], [ 114.68232799, 31.02077477 ], [ 114.6854973, 31.02423404 ], [ 114.68893433, 31.02655366 ], [ 114.69290251, 31.02979007 ], [ 114.69581092, 31.03301947 ], [ 114.69764236, 31.03670245 ], [ 114.69813716, 31.04060244 ], [ 114.69544671, 31.04310424 ], [ 114.69168747, 31.04513924 ], [ 114.68714711, 31.04648028 ], [ 114.68258102, 31.04942677 ], [ 114.68041016, 31.05307666 ], [ 114.67877014, 31.05787996 ], [ 114.67687687, 31.06061394 ], [ 114.6760272, 31.06588155 ], [ 114.67914299, 31.07392617 ], [ 114.68311046, 31.07830941 ], [ 114.68683487, 31.07971396 ], [ 114.69243408, 31.07975333 ], [ 114.69645386, 31.07841055 ], [ 114.70018643, 31.07797904 ], [ 114.70607311, 31.07664542 ], [ 114.70901586, 31.07575208 ], [ 114.71274977, 31.07577856 ], [ 114.71647405, 31.0771807 ], [ 114.71913094, 31.07880415 ], [ 114.72311584, 31.08043673 ], [ 114.72577242, 31.08183092 ], [ 114.72949758, 31.08300583 ], [ 114.73349117, 31.08418013 ], [ 114.73801526, 31.08535988 ], [ 114.74173126, 31.0872181 ], [ 114.74184924, 31.08726207 ], [ 114.74423785, 31.08930074 ], [ 114.74745875, 31.09171949 ], [ 114.75026703, 31.0936898 ], [ 114.75318981, 31.0943002 ], [ 114.75508256, 31.09404498 ], [ 114.75833396, 31.09648305 ], [ 114.75750152, 31.09634273 ], [ 114.75667006, 31.09676912 ], [ 114.75502111, 31.09892226 ], [ 114.75435678, 31.09964062 ], [ 114.75386153, 31.10036206 ], [ 114.75352534, 31.10107755 ], [ 114.75220578, 31.10251537 ], [ 114.75062524, 31.10380229 ], [ 114.74971799, 31.10438279 ], [ 114.74805464, 31.10524608 ], [ 114.7472295, 31.10581769 ], [ 114.7467344, 31.10653826 ], [ 114.74540622, 31.10797542 ], [ 114.74408607, 31.10998134 ], [ 114.74417702, 31.11045108 ], [ 114.7467034, 31.118007 ], [ 114.74265908, 31.12261458 ], [ 114.74204789, 31.12554306 ], [ 114.73889615, 31.12975236 ], [ 114.73504332, 31.13174748 ], [ 114.73370775, 31.13381591 ], [ 114.73356257, 31.1367884 ], [ 114.73605811, 31.14094423 ], [ 114.73472958, 31.14180426 ], [ 114.7330663, 31.14266751 ], [ 114.7325705, 31.14338036 ], [ 114.73224262, 31.14410414 ], [ 114.73224255, 31.14481676 ], [ 114.73257831, 31.14553523 ], [ 114.73341782, 31.14624447 ], [ 114.7342494, 31.14638504 ], [ 114.73508101, 31.14667057 ], [ 114.73591263, 31.14710004 ], [ 114.73675225, 31.14781839 ], [ 114.73708807, 31.14852791 ], [ 114.73692007, 31.14924559 ], [ 114.73659212, 31.14996132 ], [ 114.73592831, 31.15067916 ], [ 114.73559938, 31.1514039 ], [ 114.73427283, 31.15283167 ], [ 114.73394392, 31.15354843 ], [ 114.73228865, 31.15498743 ], [ 114.73179286, 31.1557093 ], [ 114.73001175, 31.15780716 ], [ 114.73000251, 31.16063671 ], [ 114.73410069, 31.1668855 ], [ 114.7345872, 31.16990576 ], [ 114.7358894, 31.17289476 ], [ 114.7371916, 31.17657348 ], [ 114.73902371, 31.18048404 ], [ 114.74139381, 31.18508331 ], [ 114.74377331, 31.18785071 ], [ 114.74614304, 31.19084622 ], [ 114.74905203, 31.19453369 ], [ 114.7514313, 31.19753369 ], [ 114.75460003, 31.20144974 ], [ 114.75803836, 31.20513942 ], [ 114.75989727, 31.20721639 ], [ 114.7614599, 31.21180911 ], [ 114.76169469, 31.2161662 ], [ 114.76085175, 31.22028775 ], [ 114.760279, 31.2246384 ], [ 114.76319678, 31.22763582 ], [ 114.76638329, 31.2290345 ], [ 114.76824991, 31.23019349 ], [ 114.77170527, 31.23227966 ], [ 114.77436215, 31.23390159 ], [ 114.77834791, 31.23667974 ], [ 114.78099533, 31.2389889 ], [ 114.78391328, 31.2424471 ], [ 114.78789306, 31.24729543 ], [ 114.79504665, 31.254679 ], [ 114.79976952, 31.26456447 ], [ 114.80160967, 31.26893074 ], [ 114.80239094, 31.27168492 ], [ 114.80236567, 31.27420682 ], [ 114.80100271, 31.27809288 ], [ 114.79884042, 31.2801414 ], [ 114.79480377, 31.28286673 ], [ 114.7880748, 31.28832136 ], [ 114.78404628, 31.29081179 ], [ 114.77946236, 31.29467845 ], [ 114.77623192, 31.29717574 ], [ 114.77486088, 31.30129465 ], [ 114.77375728, 31.30472517 ], [ 114.77346259, 31.30861838 ], [ 114.77261121, 31.31342471 ], [ 114.77204728, 31.31685988 ], [ 114.77147421, 31.32189647 ], [ 114.77037072, 31.32555511 ], [ 114.76924203, 31.33173588 ], [ 114.76866908, 31.33608385 ], [ 114.76889491, 31.34066946 ], [ 114.77126493, 31.34549596 ], [ 114.77392171, 31.34780981 ], [ 114.77711747, 31.34966165 ], [ 114.7808413, 31.35175038 ], [ 114.78483593, 31.35452664 ], [ 114.78749191, 31.35660764 ], [ 114.78881192, 31.35822101 ], [ 114.79146813, 31.36099005 ], [ 114.79491492, 31.36399144 ], [ 114.79624311, 31.36652277 ], [ 114.79674671, 31.37019044 ], [ 114.79965484, 31.37364717 ], [ 114.80231982, 31.37526821 ], [ 114.80577543, 31.37758254 ], [ 114.80790255, 31.37942877 ], [ 114.80949059, 31.38172896 ], [ 114.81107055, 31.38494988 ], [ 114.81132291, 31.38678581 ], [ 114.81209515, 31.39091604 ], [ 114.81340566, 31.39344574 ], [ 114.8155238, 31.39666676 ], [ 114.81710383, 31.40011276 ], [ 114.81813662, 31.40447451 ], [ 114.81810215, 31.40905823 ], [ 114.81725996, 31.4138644 ], [ 114.81641785, 31.41775383 ], [ 114.81606169, 31.42246899 ], [ 114.8143864, 31.43147871 ], [ 114.81350924, 31.4352662 ], [ 114.81350914, 31.43642293 ], [ 114.8144208, 31.43921099 ], [ 114.8165739, 31.44405492 ], [ 114.82004632, 31.45446121 ], [ 114.82187788, 31.45820689 ], [ 114.824612403153367, 31.46104745250009 ], [ 114.824612442, 31.461047364 ], [ 114.82909189199999, 31.460719824000101 ], [ 114.83164318199999, 31.460982514000101 ], [ 114.834385705, 31.462418278 ], [ 114.836347546, 31.464117516 ], [ 114.840722666, 31.470851041000099 ], [ 114.843664835, 31.476702079000098 ], [ 114.845496142, 31.4783358970001 ], [ 114.847657102, 31.478531455000098 ], [ 114.85641489, 31.480164742000099 ], [ 114.864781885, 31.481536676000101 ], [ 114.86804497, 31.4812085310001 ], [ 114.870136370767298, 31.480489925229165 ], [ 114.87065703, 31.47911676 ], [ 114.87098786, 31.47362608 ], [ 114.87163862, 31.47277789 ], [ 114.871638635702851, 31.472777887163737 ], [ 114.871638688, 31.472777819 ], [ 114.878894225, 31.471467319000102 ], [ 114.881575994, 31.471662099000099 ], [ 114.884977644, 31.473230709000099 ], [ 114.888501743, 31.475159830000099 ], [ 114.891252182, 31.476597362000099 ], [ 114.895296268, 31.477184835000099 ], [ 114.900720089, 31.4776414080001 ], [ 114.90686481199999, 31.479011192 ], [ 114.90934686, 31.480254694000099 ], [ 114.91130798899999, 31.4823441240001 ], [ 114.912487784, 31.483389134 ], [ 114.914318877, 31.483716696 ], [ 114.91752118, 31.483520948 ], [ 114.92012279668144, 31.482660510665362 ], [ 114.92587647, 31.47657982 ], [ 114.92972893, 31.47295111 ], [ 114.929729007686049, 31.472951061482565 ], [ 114.929729022, 31.472951048 ], [ 114.931300101, 31.471969860000101 ], [ 114.932341042, 31.471969233 ], [ 114.933261116, 31.472687625 ], [ 114.933912635, 31.474256272 ], [ 114.934111959, 31.477264399 ], [ 114.934762408, 31.479355942 ], [ 114.936914524, 31.481772802 ], [ 114.940056169, 31.483406764000101 ], [ 114.943779836, 31.485760049000099 ], [ 114.94874335199999, 31.49017078 ], [ 114.952666161, 31.491673607000099 ], [ 114.954697091, 31.492980579000101 ], [ 114.955938256, 31.494354354000102 ], [ 114.95750031, 31.496575157000098 ], [ 114.958750366, 31.497490884000101 ], [ 114.962733609, 31.498731425000098 ], [ 114.96691680799999, 31.4987961960001 ], [ 114.970839374956313, 31.498012466380356 ], [ 114.97227149, 31.49696658 ], [ 114.97345152, 31.49520148 ], [ 114.97489317, 31.48683369 ], [ 114.97717542, 31.4824538 ], [ 114.97907677, 31.48036157 ], [ 114.98005727, 31.47977378 ], [ 114.980057418083902, 31.479773779939336 ], [ 114.980057438, 31.479773768 ], [ 114.981619756, 31.479773130000101 ], [ 114.983581399025525, 31.479838251324104 ], [ 114.98437151, 31.47947795 ], [ 114.98574258, 31.47803907 ], [ 114.98828549, 31.47418306 ], [ 114.98979593, 31.47339961 ], [ 114.99201765, 31.47333385 ], [ 114.992017763002536, 31.473333890432784 ], [ 114.992017879, 31.473333887 ], [ 114.992929449, 31.473660049 ], [ 114.994170682, 31.475162992 ], [ 114.995802189, 31.4796722130001 ], [ 114.995933239, 31.484837924 ], [ 114.996071577, 31.486471228 ], [ 114.99665333, 31.487322313000099 ], [ 115.002341046, 31.488579826 ], [ 115.004370459, 31.489479556 ], [ 115.005411556, 31.4902303060001 ], [ 115.00561170899999, 31.491473505 ], [ 115.004631115, 31.493761085000099 ], [ 114.996332221, 31.501996993 ], [ 114.996201621, 31.502977247 ], [ 114.996652843, 31.504023720000099 ], [ 115.004630941, 31.5068991220001 ], [ 115.006001789, 31.508077842 ], [ 115.009465539, 31.514743630000101 ], [ 115.01450076099999, 31.5225569290001 ], [ 115.017643087, 31.529551133 ], [ 115.018884692, 31.530532527 ], [ 115.02149773, 31.530727248000101 ], [ 115.023980426112274, 31.530334534298703 ], [ 115.024116947070056, 31.530219511883534 ], [ 115.024831609998728, 31.529617383238357 ], [ 115.02483093, 31.5260208 ], [ 115.02529157, 31.52432177 ], [ 115.0269842, 31.52262351 ], [ 115.026984221140069, 31.522623497006037 ], [ 115.026984265, 31.522623453000101 ], [ 115.032939869, 31.518962789000099 ], [ 115.037255124, 31.518244576 ], [ 115.039347151, 31.518375779000099 ], [ 115.04235182, 31.519159072 ], [ 115.04340299099999, 31.519446798 ], [ 115.044425294965734, 31.519035731520884 ], [ 115.044541, 31.51881555 ], [ 115.04455502, 31.51816661 ], [ 115.04444238, 31.51747993 ], [ 115.04449128, 31.51717386 ], [ 115.04467583, 31.51687052 ], [ 115.044675869591529, 31.516870504832973 ], [ 115.044675892, 31.516870468 ], [ 115.046515217834312, 31.516165842302488 ], [ 115.04679455, 31.5155754 ], [ 115.046794608835683, 31.515575362257316 ], [ 115.046794617, 31.515575345000101 ], [ 115.047119825, 31.5153667290001 ], [ 115.047510856, 31.515372959 ], [ 115.048463488, 31.515784057000101 ], [ 115.049218622, 31.516298549000101 ], [ 115.049664546, 31.5164486890001 ], [ 115.050104501, 31.51650786 ], [ 115.052005185, 31.515729497000098 ], [ 115.052818411, 31.515158134 ], [ 115.05368852399999, 31.5147946720001 ], [ 115.054674409, 31.5146040240001 ], [ 115.056291069, 31.513992447000099 ], [ 115.05736694, 31.513322826 ], [ 115.05760845899999, 31.513292453000101 ], [ 115.058436674, 31.514918964000099 ], [ 115.058794964, 31.515044406000101 ], [ 115.059097350868441, 31.514962972730387 ], [ 115.05940777, 31.51448762 ], [ 115.05990395, 31.51310207 ], [ 115.0602703, 31.51268359 ], [ 115.060270368402186, 31.512683545109823 ], [ 115.060270372, 31.512683541000101 ], [ 115.060734538, 31.512378917 ], [ 115.06181657, 31.512412396000101 ], [ 115.062913616, 31.512652879 ], [ 115.064101587, 31.512706322 ], [ 115.064543814868316, 31.512713759375622 ], [ 115.0647285, 31.51244562 ], [ 115.06508296, 31.51211122 ], [ 115.065082973524227, 31.512111215619694 ], [ 115.065083024, 31.512111168 ], [ 115.065411503, 31.512004778000101 ], [ 115.065848788, 31.512201222 ], [ 115.066800279, 31.512472062 ], [ 115.06780874099999, 31.512645891 ], [ 115.069060935, 31.5125345430001 ], [ 115.06981790499999, 31.512225795000099 ], [ 115.070441062, 31.512154173000098 ], [ 115.071330867, 31.512357275000099 ], [ 115.072091935, 31.511899619000101 ], [ 115.072903962, 31.511539932000101 ], [ 115.073725998, 31.5113382440001 ], [ 115.074137504216694, 31.511127943776007 ], [ 115.07471687, 31.51051459 ], [ 115.074716887445945, 31.51051458540287 ], [ 115.074716936, 31.510514534 ], [ 115.075318286, 31.5103560790001 ], [ 115.07629822299999, 31.510577307000101 ], [ 115.077184288, 31.510977618 ], [ 115.07777465267425, 31.511082192085663 ], [ 115.07790157, 31.51050225 ], [ 115.07844912, 31.50976299 ], [ 115.078449153280033, 31.509762987875668 ], [ 115.07844918799999, 31.509762941000101 ], [ 115.07911359, 31.509720533000099 ], [ 115.081064909, 31.5102363620001 ], [ 115.082246059, 31.50979284 ], [ 115.083206408, 31.5095804420001 ], [ 115.083701061, 31.509813206 ], [ 115.083743966, 31.5105520880001 ], [ 115.084049758, 31.510698948 ], [ 115.084608428, 31.510561759 ], [ 115.085410999, 31.510182536000102 ], [ 115.085570030033466, 31.510061453058356 ], [ 115.08575777, 31.50991851 ], [ 115.08575777319416, 31.509918509296412 ], [ 115.085757834, 31.509918463000101 ], [ 115.08613964, 31.509834360000099 ], [ 115.086504446, 31.509930244 ], [ 115.087323022, 31.510289985 ], [ 115.087957711, 31.5106477940001 ], [ 115.08874038099999, 31.510816620000099 ], [ 115.089767024, 31.510735475 ], [ 115.09062280099999, 31.51030344 ], [ 115.09111262499999, 31.510776336 ], [ 115.091980332, 31.511739161 ], [ 115.09270303, 31.5134999150001 ], [ 115.093099861, 31.5146347690001 ], [ 115.093166782, 31.515385672 ], [ 115.093070735, 31.516064582000102 ], [ 115.093070670690068, 31.516064625122443 ], [ 115.09307067, 31.51606463 ], [ 115.09264271, 31.51635159 ], [ 115.088745727464783, 31.517363805463635 ], [ 115.088286921, 31.5177957860001 ], [ 115.087654116, 31.518589818000098 ], [ 115.087296188, 31.519554779 ], [ 115.087114179, 31.520568698 ], [ 115.087200106, 31.520935631 ], [ 115.08896937, 31.520936270000099 ], [ 115.093094238, 31.5214599030001 ], [ 115.09648891099999, 31.522439093000099 ], [ 115.100873214, 31.525120901 ], [ 115.107741428, 31.530809617 ], [ 115.108852938, 31.5323461690001 ], [ 115.108913868, 31.533523083 ], [ 115.10819333, 31.534698483000099 ], [ 115.107686709100946, 31.535100872759461 ], [ 115.101855119217589, 31.539732690908277 ], [ 115.100352566, 31.541888921000101 ], [ 115.099892237, 31.544503525 ], [ 115.10048209199999, 31.5473794490001 ], [ 115.102575354, 31.550582955 ], [ 115.104859016, 31.5526108490001 ], [ 115.10538817, 31.553459055000101 ], [ 115.105449131, 31.554180029000101 ], [ 115.105449068913131, 31.554180067147691 ], [ 115.10544907, 31.55418008 ], [ 115.10459865, 31.5547026 ], [ 115.10139455, 31.55493018 ], [ 115.098580921559247, 31.556433147800121 ], [ 115.097469734, 31.557608775000102 ], [ 115.097209563, 31.559307592 ], [ 115.097339312, 31.56212041 ], [ 115.098711081, 31.566041451 ], [ 115.101134235, 31.569310989 ], [ 115.109243327, 31.574477937 ], [ 115.114800213, 31.577617156 ], [ 115.120617769, 31.579872821 ], [ 115.121667857, 31.580918934000099 ], [ 115.122519285, 31.587062623000101 ], [ 115.12198940899999, 31.589872902 ], [ 115.120096788, 31.595300616 ], [ 115.11918452899999, 31.598402554000099 ], [ 115.119185375, 31.600104507 ], [ 115.119766915, 31.600953099 ], [ 115.129248454, 31.604287524 ], [ 115.14337313199999, 31.606251033 ], [ 115.15330481, 31.606808409000099 ], [ 115.15886892, 31.606480643000101 ], [ 115.161942206, 31.605827392 ], [ 115.168210186, 31.603868208000101 ], [ 115.170171291403889, 31.602558933082779 ], [ 115.17135182, 31.60079523 ], [ 115.17174299, 31.59667608 ], [ 115.17141275, 31.59187162 ], [ 115.17194228, 31.58690381 ], [ 115.17377352, 31.58115049 ], [ 115.17488489, 31.57971162 ], [ 115.174884923792291, 31.579711593751696 ], [ 115.174884946, 31.579711565 ], [ 115.178669782, 31.5767716780001 ], [ 115.181681885, 31.574744233 ], [ 115.18566560799999, 31.573861315 ], [ 115.186646492584671, 31.573273055445764 ], [ 115.18710636, 31.57268393 ], [ 115.18736695, 31.57150845 ], [ 115.18684616, 31.56954668 ], [ 115.18631635, 31.56752189 ], [ 115.18664604, 31.56673652 ], [ 115.186646081791352, 31.566736484701003 ], [ 115.18664609299999, 31.566736458 ], [ 115.187496743, 31.5660179670001 ], [ 115.18997936, 31.5652972120001 ], [ 115.192071142, 31.564840695 ], [ 115.195993915, 31.5646429550001 ], [ 115.19814643, 31.565035218 ], [ 115.2006373, 31.5660158260001 ], [ 115.20180908499999, 31.5662114900001 ], [ 115.203120091121576, 31.565623375020326 ], [ 115.20423086, 31.56366108 ], [ 115.20566232, 31.55908633 ], [ 115.205662370618839, 31.559086277414032 ], [ 115.205662372, 31.559086273 ], [ 115.207172603, 31.557517352 ], [ 115.21011454, 31.556665049000099 ], [ 115.21428952799999, 31.556534774000099 ], [ 115.220434654, 31.557154667000098 ], [ 115.225537567, 31.5584625400001 ], [ 115.227628889, 31.558786881000099 ], [ 115.22965105199999, 31.5584610780001 ], [ 115.230171313224673, 31.558198389519401 ], [ 115.23050152, 31.55748066 ], [ 115.2301114, 31.55669452 ], [ 115.22794944, 31.5542775 ], [ 115.22592752, 31.55022454 ], [ 115.22481711, 31.54623813 ], [ 115.22468621, 31.54401524 ], [ 115.22507671, 31.54156376 ], [ 115.22514688, 31.54025693 ], [ 115.2242964, 31.53875347 ], [ 115.22226508, 31.53581121 ], [ 115.21985254, 31.52966784 ], [ 115.21834249, 31.52554894 ], [ 115.21612147, 31.52299909 ], [ 115.21396832, 31.52077812 ], [ 115.21337876, 31.51953663 ], [ 115.21278827, 31.51731426 ], [ 115.21285754, 31.51522261 ], [ 115.21317909, 31.51326022 ], [ 115.21389916, 31.51051538 ], [ 115.21409853, 31.50891381 ], [ 115.21357815, 31.50656158 ], [ 115.21252821, 31.50348886 ], [ 115.20860483, 31.4977361 ], [ 115.20736434, 31.49590682 ], [ 115.20684376, 31.49440339 ], [ 115.20691306, 31.49211584 ], [ 115.20769427, 31.49041711 ], [ 115.21011477, 31.48655771 ], [ 115.21148674, 31.48358482 ], [ 115.21259747, 31.47907286 ], [ 115.21311757, 31.47358143 ], [ 115.21291876, 31.46887508 ], [ 115.21161657, 31.46488838 ], [ 115.20952513, 31.46302527 ], [ 115.20749477, 31.45949646 ], [ 115.20678587, 31.4587747 ], [ 115.2064526, 31.45661871 ], [ 115.20553269, 31.45243737 ], [ 115.2050815, 31.44746782 ], [ 115.2057327, 31.44433037 ], [ 115.20691256, 31.44184645 ], [ 115.206912605511491, 31.44184639613373 ], [ 115.206912607, 31.441846393 ], [ 115.208735238, 31.439689169000101 ], [ 115.21095720081486, 31.437760301675826 ], [ 115.21337864, 31.43141854 ], [ 115.21507978, 31.42873799 ], [ 115.215079817641609, 31.428737958200706 ], [ 115.215079833, 31.428737934 ], [ 115.216780762, 31.4273010040001 ], [ 115.218473476, 31.4269727070001 ], [ 115.223246536, 31.428148491000101 ], [ 115.227559438, 31.429128257000102 ], [ 115.230441046, 31.428734985000101 ], [ 115.234033661, 31.427164976 ], [ 115.237886796, 31.4253346190001 ], [ 115.241419205, 31.424418451000101 ], [ 115.24364112799999, 31.4244835760001 ], [ 115.245792868, 31.424319573 ], [ 115.247163638415046, 31.423731600108876 ], [ 115.248524482224923, 31.422048188390946 ], [ 115.251844586, 31.417941098 ], [ 115.252785210598105, 31.417139026838697 ], [ 115.25487935, 31.41418506 ], [ 115.2549405, 31.41209358 ], [ 115.25376849, 31.40817206 ], [ 115.24631408, 31.39794448 ], [ 115.24494243, 31.39657094 ], [ 115.24455162, 31.39500238 ], [ 115.24507265, 31.3938257 ], [ 115.245072680357183, 31.393825686618637 ], [ 115.245072701, 31.39382564 ], [ 115.251643082, 31.390929426000099 ], [ 115.25313643, 31.390535076 ], [ 115.25500953, 31.3894436900001 ], [ 115.257560896, 31.389836415 ], [ 115.260197826, 31.391293545000099 ], [ 115.26357563, 31.3945403970001 ], [ 115.267949825, 31.3985278000001 ], [ 115.272782821, 31.401041503 ], [ 115.275924524, 31.40189187 ], [ 115.280108407, 31.401433993000101 ], [ 115.2845514, 31.3996026290001 ], [ 115.288604553209765, 31.397052531047255 ], [ 115.29219735, 31.39175658 ], [ 115.29566116, 31.38607066 ], [ 115.295661172195324, 31.386070654208307 ], [ 115.295661204, 31.3860706020001 ], [ 115.298143336, 31.384891811 ], [ 115.301736961, 31.38436878 ], [ 115.308081234, 31.3854140780001 ], [ 115.31271573399999, 31.387832752000101 ], [ 115.317690273, 31.390415571000101 ], [ 115.321673969, 31.393095177000099 ], [ 115.32435655, 31.3965590550001 ], [ 115.327039037, 31.401265618 ], [ 115.33043302199999, 31.405317058 ], [ 115.331803905, 31.405907309 ], [ 115.33311498499999, 31.405972825 ], [ 115.338080284, 31.40433907 ], [ 115.34507788, 31.401919305 ], [ 115.347299479, 31.401526637000099 ], [ 115.349721743, 31.40185454 ], [ 115.354627542, 31.403424387 ], [ 115.361225233, 31.406333159 ], [ 115.36436841699999, 31.40711888 ], [ 115.36802331299999, 31.407642393000099 ], [ 115.37057629, 31.405486189 ], [ 115.381889146, 31.397021998000099 ], [ 115.385614006002612, 31.39506150078833 ], [ 115.386364822519099, 31.394035215987291 ], [ 115.386664581621574, 31.393625474092815 ], [ 115.38718551, 31.3917278 ], [ 115.38679485, 31.38996446 ], [ 115.38450346, 31.38558382 ], [ 115.37881515, 31.37897937 ], [ 115.37757438, 31.37750777 ], [ 115.37194739, 31.37528449 ], [ 115.37057608, 31.37456611 ], [ 115.36998585, 31.37397791 ], [ 115.37011579, 31.37293209 ], [ 115.370115829342481, 31.372932041292369 ], [ 115.37011583, 31.372932036000101 ], [ 115.374870260934017, 31.367045856590586 ], [ 115.37724391, 31.36410718 ], [ 115.37770463, 31.36254032 ], [ 115.37763491, 31.36025111 ], [ 115.37685379, 31.3584863 ], [ 115.36809306, 31.35430123 ], [ 115.36691171, 31.35341688 ], [ 115.36626071, 31.35217606 ], [ 115.36646053, 31.35119515 ], [ 115.36646056569019, 31.351195132793766 ], [ 115.366460574, 31.351195092000101 ], [ 115.368354127, 31.350282216 ], [ 115.381229226, 31.346752912000099 ], [ 115.390259601, 31.345774012 ], [ 115.393463987, 31.34485964 ], [ 115.395295957, 31.343422939000099 ], [ 115.397649249, 31.340743828 ], [ 115.398950496, 31.339697277 ], [ 115.400322769, 31.339500519000101 ], [ 115.401374014, 31.339698641 ], [ 115.402225121, 31.341332268 ], [ 115.403336274, 31.343947669 ], [ 115.404378612, 31.344928664000101 ], [ 115.40713085199999, 31.3467591470001 ], [ 115.410656045, 31.3489823090001 ], [ 115.414910561, 31.351826411 ], [ 115.41634299, 31.352481404000098 ], [ 115.417193924827302, 31.352482164998953 ], [ 115.417705745397669, 31.351526912641674 ], [ 115.41817519346435, 31.350650741525754 ], [ 115.41889621, 31.34888704 ], [ 115.418896218730126, 31.348887038474917 ], [ 115.418896241, 31.348886984 ], [ 115.42039814499999, 31.348624608000101 ], [ 115.422299665, 31.348952586000099 ], [ 115.424132162, 31.350456245 ], [ 115.42602498799999, 31.351305348 ], [ 115.42830873299999, 31.351306430000101 ], [ 115.43099150899999, 31.350851483 ], [ 115.432824043, 31.349805668 ], [ 115.43462063299999, 31.349135806 ], [ 115.436452491, 31.348024283 ], [ 115.437694269231628, 31.346455993233349 ], [ 115.43926618, 31.34099877 ], [ 115.44154973, 31.32609432 ], [ 115.44233991, 31.32249916 ], [ 115.442339931107625, 31.322499101609935 ], [ 115.442339933, 31.322499093 ], [ 115.444041441, 31.317792204000099 ], [ 115.44573475599999, 31.316355204 ], [ 115.44835652, 31.315832965 ], [ 115.450249507, 31.316223983 ], [ 115.452402294, 31.317270471 ], [ 115.45456416499999, 31.319625645 ], [ 115.455415572, 31.320016526000099 ], [ 115.457047372, 31.31949366 ], [ 115.457638192, 31.318645419000099 ], [ 115.458098695, 31.317141110000101 ], [ 115.45845374362132, 31.312833113947452 ], [ 115.45848928, 31.31240193 ], [ 115.4565869, 31.30959132 ], [ 115.45528535, 31.30710613 ], [ 115.45489445, 31.30462315 ], [ 115.45476446, 31.30043946 ], [ 115.45404386, 31.29540473 ], [ 115.45221222, 31.28997864 ], [ 115.45123075, 31.28743142 ], [ 115.45129114, 31.28491358 ], [ 115.451291155604636, 31.284913558174985 ], [ 115.451291157, 31.284913500000101 ], [ 115.45227298, 31.283540297000101 ], [ 115.452435439, 31.28344271 ], [ 115.452765378, 31.28319857 ], [ 115.452934861, 31.28308101 ], [ 115.453121391, 31.282987481000099 ], [ 115.45346938199999, 31.282830355 ], [ 115.457568429, 31.280403162 ], [ 115.460902663, 31.278311357000099 ], [ 115.462283078, 31.276612596000099 ], [ 115.463124976, 31.273607025 ], [ 115.465617287, 31.269030501 ], [ 115.467639984, 31.2672656720001 ], [ 115.47078236349958, 31.266734501831756 ], [ 115.46776997, 31.26102278 ], [ 115.46483506, 31.2548306 ], [ 115.46217828, 31.24840948 ], [ 115.46004307, 31.24450877 ], [ 115.45711677, 31.23946276 ], [ 115.45472032, 31.23395949 ], [ 115.45259292, 31.22730956 ], [ 115.45179521, 31.22180828 ], [ 115.44993648, 31.2183687 ], [ 115.44699298, 31.21606939 ], [ 115.44406782, 31.21445909 ], [ 115.44032516, 31.21284756 ], [ 115.43659119, 31.21078078 ], [ 115.4325793, 31.20916691 ], [ 115.42884676, 31.20663852 ], [ 115.42484356, 31.20342172 ], [ 115.4224473, 31.20089507 ], [ 115.41924332, 31.19836785 ], [ 115.41657744, 31.19607145 ], [ 115.41337244, 31.19377196 ], [ 115.41097656, 31.19193621 ], [ 115.40910939, 31.18963723 ], [ 115.40617482, 31.18711006 ], [ 115.40270967, 31.18297493 ], [ 115.40031326, 31.17999291 ], [ 115.40032247, 31.17769907 ], [ 115.40325654, 31.17564475 ], [ 115.40646932, 31.17244253 ], [ 115.40915306, 31.17153331 ], [ 115.41182719, 31.17062042 ], [ 115.41476205, 31.16856463 ], [ 115.4142328, 31.16558673 ], [ 115.41211332, 31.16076665 ], [ 115.41105487, 31.15618232 ], [ 115.41079406, 31.15182742 ], [ 115.4108024, 31.14815934 ], [ 115.4100031, 31.14471766 ], [ 115.40761591, 31.14013179 ], [ 115.40521985, 31.13737522 ], [ 115.40256199, 31.13484772 ], [ 115.39855941, 31.13094314 ], [ 115.39643244, 31.12887418 ], [ 115.39375768, 31.12772399 ], [ 115.38976384, 31.12473446 ], [ 115.38696506, 31.12352713 ], [ 115.3857428, 31.12190954 ], [ 115.38476662, 31.11883069 ], [ 115.38530865, 31.1151854 ], [ 115.38784258, 31.1135232 ], [ 115.3906817, 31.11226896 ], [ 115.39309323, 31.11169576 ], [ 115.39816787, 31.1142851 ], [ 115.40460958, 31.11521391 ], [ 115.40405238, 31.11467501 ], [ 115.4038764, 31.1136725 ], [ 115.40386949, 31.11266205 ], [ 115.40448712, 31.10864745 ], [ 115.40431113, 31.10764494 ], [ 115.40429722, 31.10664348 ], [ 115.40360911, 31.10463237 ], [ 115.40310601, 31.10363477 ], [ 115.40174774, 31.10164253 ], [ 115.40123569, 31.10063497 ], [ 115.40070982, 31.09763453 ], [ 115.40036584, 31.09662903 ], [ 115.39985482, 31.09563051 ], [ 115.39917579, 31.09462998 ], [ 115.39816874, 31.09363445 ], [ 115.39581781, 31.09164753 ], [ 115.39229939, 31.08937522 ], [ 115.3912917, 31.08837999 ], [ 115.38797102, 31.08596736 ], [ 115.38532663, 31.08209667 ], [ 115.38240078, 31.07819247 ], [ 115.3768087, 31.0740528 ], [ 115.37388289, 31.07129592 ], [ 115.37042725, 31.06670494 ], [ 115.3690992, 31.06326332 ], [ 115.36697138, 31.05890321 ], [ 115.36512238, 31.05408717 ], [ 115.36353318, 31.04858131 ], [ 115.36088594, 31.0405514 ], [ 115.35505143, 31.03205867 ], [ 115.35055407, 31.01600401 ], [ 115.34897368, 31.00935247 ], [ 115.34499819, 31.00178054 ], [ 115.34261047, 30.99718739 ], [ 115.34129071, 30.99168395 ], [ 115.33997091, 30.98686714 ], [ 115.33918099, 30.98228126 ], [ 115.33840003, 30.9781531 ], [ 115.33734156, 30.97517379 ], [ 115.33548385, 30.97218797 ], [ 115.33309643, 30.96828572 ], [ 115.33150718, 30.96575919 ], [ 115.3285821, 30.96139531 ], [ 115.32566478, 30.95955693 ], [ 115.32166389, 30.95908789 ], [ 115.31793936, 30.95885018 ], [ 115.31394739, 30.95838105 ], [ 115.31100395, 30.95837259 ], [ 115.30461583, 30.95881404 ], [ 115.30142155, 30.95903557 ], [ 115.29689082, 30.95879544 ], [ 115.29236064, 30.95855293 ], [ 115.28809041, 30.95923003 ], [ 115.28276139, 30.96013198 ], [ 115.27902096, 30.96310101 ], [ 115.27554975, 30.96538274 ], [ 115.2718175, 30.96697576 ], [ 115.2688759, 30.96811589 ], [ 115.26568224, 30.96902406 ], [ 115.26114336, 30.96946704 ], [ 115.25794882, 30.96900115 ], [ 115.25450422, 30.96601146 ], [ 115.25237754, 30.96302595 ], [ 115.25053783, 30.95706296 ], [ 115.24762213, 30.95269906 ], [ 115.24656263, 30.94971793 ], [ 115.24764776, 30.94536437 ], [ 115.24979952, 30.9407847 ], [ 115.25248178, 30.93689728 ], [ 115.25381739, 30.93392158 ], [ 115.2530452, 30.92910467 ], [ 115.25038964, 30.92565844 ], [ 115.24719682, 30.92312948 ], [ 115.24215352, 30.9221971 ], [ 115.23842229, 30.92195668 ], [ 115.23496762, 30.92080037 ], [ 115.22964769, 30.9180346 ], [ 115.22379008, 30.91664061 ], [ 115.2221927, 30.91801255 ], [ 115.22216709, 30.92465964 ], [ 115.22214171, 30.9287852 ], [ 115.22212338, 30.93245004 ], [ 115.22264452, 30.93565957 ], [ 115.21944251, 30.93840125 ], [ 115.2159709, 30.94045471 ], [ 115.21356712, 30.94205024 ], [ 115.21089375, 30.94433387 ], [ 115.20742213, 30.9459267 ], [ 115.20423691, 30.94339499 ], [ 115.20265692, 30.93972297 ], [ 115.20134638, 30.93467608 ], [ 115.19922839, 30.93123002 ], [ 115.19551354, 30.92869784 ], [ 115.19044476, 30.9284488 ], [ 115.18752043, 30.92866773 ], [ 115.18298877, 30.93002702 ], [ 115.17897884, 30.93161587 ], [ 115.17578449, 30.93183288 ], [ 115.17259919, 30.93067864 ], [ 115.17021972, 30.92677247 ], [ 115.16809361, 30.92447182 ], [ 115.16543736, 30.92285477 ], [ 115.15984717, 30.92214974 ], [ 115.15478611, 30.92189951 ], [ 115.15159097, 30.92097126 ], [ 115.14892592, 30.92050178 ], [ 115.1457401, 30.91934291 ], [ 115.14281395, 30.91795577 ], [ 115.13964482, 30.91381701 ], [ 115.13858628, 30.91106293 ], [ 115.13861169, 30.90693737 ], [ 115.14022685, 30.90212876 ], [ 115.14211964, 30.89640619 ], [ 115.14080864, 30.8931919 ], [ 115.13602487, 30.89088069 ], [ 115.1317704, 30.88971409 ], [ 115.12751657, 30.88763649 ], [ 115.12301014, 30.88440878 ], [ 115.12082076, 30.88295114 ], [ 115.11685312, 30.87806287 ], [ 115.10845257, 30.86779396 ], [ 115.10525395, 30.86759718 ], [ 115.09782156, 30.86137395 ], [ 115.09673597, 30.86733033 ], [ 115.09510361, 30.87167761 ], [ 115.09321136, 30.87671159 ], [ 115.09106641, 30.88105814 ], [ 115.08837492, 30.88540199 ], [ 115.08627373, 30.88696659 ], [ 115.08464939, 30.88968054 ], [ 115.08293029, 30.89192593 ], [ 115.08101162, 30.89282433 ], [ 115.07924001, 30.89367184 ], [ 115.07800706, 30.89457909 ], [ 115.07752139, 30.89609154 ], [ 115.07710368, 30.89736309 ], [ 115.07688683, 30.89818976 ], [ 115.07679988, 30.8985716 ], [ 115.07640025, 30.89900564 ], [ 115.07608858, 30.89888394 ], [ 115.07461222, 30.89843235 ], [ 115.07271948, 30.89797124 ], [ 115.06953277, 30.89645822 ], [ 115.06526021, 30.89587341 ], [ 115.06303794, 30.89557143 ], [ 115.06100551, 30.8957751 ], [ 115.0578105, 30.89667032 ], [ 115.05484953, 30.89705387 ], [ 115.05466792, 30.89706516 ], [ 115.05424182, 30.89708387 ], [ 115.05392949, 30.89713437 ], [ 115.05377282, 30.89723958 ], [ 115.05264426, 30.89773925 ], [ 115.05155066, 30.89835784 ], [ 115.05113351, 30.89954691 ], [ 115.05085611, 30.89990021 ], [ 115.05060365, 30.9003694 ], [ 115.04992718, 30.9009893 ], [ 115.04884965, 30.90188181 ], [ 115.0484855, 30.90215235 ], [ 115.04835479, 30.90241745 ], [ 115.04843358, 30.90265216 ], [ 115.04859018, 30.90296568 ], [ 115.04887646, 30.90329594 ], [ 115.04917972, 30.90350424 ], [ 115.04945806, 30.90347373 ], [ 115.04986611, 30.90330106 ], [ 115.05148142, 30.90283037 ], [ 115.05243629, 30.90255282 ], [ 115.0527835, 30.9027351 ], [ 115.05326939, 30.90322297 ], [ 115.05379918, 30.90386768 ], [ 115.05418129, 30.90452964 ], [ 115.05430295, 30.90539793 ], [ 115.0541203, 30.90596691 ], [ 115.05411223, 30.90687539 ], [ 115.0538777, 30.90735551 ], [ 115.05339073, 30.9076072 ], [ 115.05292276, 30.90766998 ], [ 115.05199277, 30.90841419 ], [ 115.05136813, 30.90898498 ], [ 115.05072554, 30.90978369 ], [ 115.0499443, 30.91034281 ], [ 115.04904139, 30.91094216 ], [ 115.04806072, 30.91126886 ], [ 115.04740034, 30.91126215 ], [ 115.04684471, 30.91127324 ], [ 115.04635793, 30.91121225 ], [ 115.04574149, 30.91111655 ], [ 115.04486473, 30.9110144 ], [ 115.04413562, 30.91091497 ], [ 115.04364092, 30.91084505 ], [ 115.04324097, 30.91087587 ], [ 115.04293677, 30.91092149 ], [ 115.04254677, 30.91131609 ], [ 115.04181763, 30.91234007 ], [ 115.04076643, 30.91302796 ], [ 115.04005436, 30.91331637 ], [ 115.0396036, 30.91342232 ], [ 115.0393164, 30.91342896 ], [ 115.03910899, 30.9133035 ], [ 115.03872611, 30.91285663 ], [ 115.03781479, 30.91176836 ], [ 115.03725044, 30.91137389 ], [ 115.03667812, 30.91103043 ], [ 115.03594828, 30.91054843 ], [ 115.03504396, 30.91034869 ], [ 115.03434103, 30.91042634 ], [ 115.03136394, 30.9117179 ], [ 115.02894236, 30.91329512 ], [ 115.02664953, 30.91504406 ], [ 115.02482728, 30.91702773 ], [ 115.02283871, 30.91879807 ], [ 115.02270808, 30.91950301 ], [ 115.02269111, 30.91984386 ], [ 115.02282163, 30.92032322 ], [ 115.02312557, 30.92084009 ], [ 115.02366376, 30.92112047 ], [ 115.02381127, 30.92112007 ], [ 115.02439231, 30.92162321 ], [ 115.02581658, 30.92235698 ], [ 115.02682325, 30.92322082 ], [ 115.02696278, 30.92345531 ], [ 115.02735345, 30.92421485 ], [ 115.02761359, 30.92454697 ], [ 115.02800429, 30.92511562 ], [ 115.02842091, 30.92577516 ], [ 115.02918543, 30.92649177 ], [ 115.02987119, 30.92742048 ], [ 115.03020109, 30.92817819 ], [ 115.03047917, 30.92881012 ], [ 115.03045322, 30.92910901 ], [ 115.0293586, 30.92969545 ], [ 115.02540016, 30.93121989 ], [ 115.02352524, 30.93217736 ], [ 115.02197044, 30.93214461 ], [ 115.02067683, 30.93186834 ], [ 115.02003502, 30.9317322 ], [ 115.01979196, 30.93046662 ], [ 115.01921905, 30.92895411 ], [ 115.0187497, 30.92846571 ], [ 115.01818566, 30.9282944 ], [ 115.01736947, 30.92845661 ], [ 115.01626724, 30.92916833 ], [ 115.01518202, 30.92939831 ], [ 115.0139055, 30.92956289 ], [ 115.01247355, 30.92991085 ], [ 115.01118017, 30.92988865 ], [ 115.01065906, 30.92970629 ], [ 115.01043388, 30.92955004 ], [ 115.00965173, 30.92915558 ], [ 115.00868825, 30.92874967 ], [ 115.00781145, 30.92843447 ], [ 115.00694363, 30.92815922 ], [ 115.005746, 30.92814381 ], [ 115.00477356, 30.92814573 ], [ 115.0041837, 30.92835238 ], [ 115.00380101, 30.92947188 ], [ 115.00295104, 30.9305658 ], [ 115.00200448, 30.93116431 ], [ 115.00118845, 30.93163751 ], [ 114.99976469, 30.9318637 ], [ 114.9983818, 30.93195085 ], [ 114.993853, 30.93687867 ], [ 114.99171778, 30.93859918 ], [ 114.9889926, 30.94188355 ], [ 114.98875739, 30.94278873 ], [ 114.98717007, 30.94497626 ], [ 114.98589362, 30.94667313 ], [ 114.98525988, 30.94743859 ], [ 114.9843751, 30.94772609 ], [ 114.98389784, 30.94783846 ], [ 114.98334185, 30.948057 ], [ 114.98304592, 30.94818581 ], [ 114.98280378, 30.94848736 ], [ 114.98278582, 30.94880222 ], [ 114.98275183, 30.95010156 ], [ 114.9829421, 30.95047078 ], [ 114.98327188, 30.95070565 ], [ 114.9840271, 30.95093325 ], [ 114.98316789, 30.95496746 ], [ 114.98249118, 30.95695531 ], [ 114.98229187, 30.95736067 ], [ 114.98197895, 30.95802921 ], [ 114.9816062, 30.95924461 ], [ 114.98155438, 30.95931272 ], [ 114.98175361, 30.9598638 ], [ 114.9821611, 30.96026036 ], [ 114.98276885, 30.96060134 ], [ 114.98291632, 30.96060789 ], [ 114.98325507, 30.96070282 ], [ 114.98353304, 30.96093285 ], [ 114.98466983, 30.9615061 ], [ 114.98481727, 30.96171253 ], [ 114.98482622, 30.96183144 ], [ 114.98460899, 30.96223285 ], [ 114.9843489, 30.96269736 ], [ 114.9842273, 30.96323341 ], [ 114.98418442, 30.96359833 ], [ 114.98441853, 30.96395641 ], [ 114.9848001, 30.964412 ], [ 114.98549449, 30.96507152 ], [ 114.98588502, 30.96540814 ], [ 114.98623172, 30.96570092 ], [ 114.9871264, 30.966063 ], [ 114.98782978, 30.96627774 ], [ 114.98824621, 30.96667324 ], [ 114.98863672, 30.96716777 ], [ 114.98881903, 30.9673581 ], [ 114.98999962, 30.96782523 ], [ 114.99059839, 30.96788138 ], [ 114.99130079, 30.9677663 ], [ 114.99167442, 30.96756028 ], [ 114.99190059, 30.96747964 ], [ 114.99203907, 30.96754718 ], [ 114.99220444, 30.96777054 ], [ 114.99220441, 30.9680184 ], [ 114.9920041, 30.96867962 ], [ 114.99091994, 30.97083766 ], [ 114.98984787, 30.97135762 ], [ 114.98929091, 30.97161216 ], [ 114.98867118, 30.9718589 ], [ 114.98805546, 30.97184878 ], [ 114.98765595, 30.97176904 ], [ 114.98710002, 30.97153886 ], [ 114.98651024, 30.97101295 ], [ 114.98587164, 30.97046021 ], [ 114.98530774, 30.97012411 ], [ 114.9841809, 30.96974772 ], [ 114.98346649, 30.96999472 ], [ 114.98300313, 30.97057077 ], [ 114.98190101, 30.97211416 ], [ 114.98080793, 30.9726591 ], [ 114.97994797, 30.97344819 ], [ 114.97913189, 30.97371744 ], [ 114.97784746, 30.97405702 ], [ 114.97771692, 30.97417433 ], [ 114.97716184, 30.97482657 ], [ 114.97698837, 30.97590345 ], [ 114.97686663, 30.97786065 ], [ 114.97685863, 30.97819248 ], [ 114.97690144, 30.9786251 ], [ 114.97671905, 30.97907837 ], [ 114.97677183, 30.97948398 ], [ 114.97763065, 30.98081868 ], [ 114.9785682, 30.98197725 ], [ 114.98098045, 30.98254578 ], [ 114.98131923, 30.98245083 ], [ 114.98183137, 30.98251126 ], [ 114.98224785, 30.98252901 ], [ 114.98333286, 30.98289255 ], [ 114.98520791, 30.98386234 ], [ 114.98591129, 30.984236 ], [ 114.98650203, 30.98518665 ], [ 114.9869005, 30.98590303 ], [ 114.98688349, 30.98677957 ], [ 114.98681369, 30.98746537 ], [ 114.98675289, 30.98771241 ], [ 114.98527824, 30.98860435 ], [ 114.98406262, 30.9894665 ], [ 114.98398484, 30.9902063 ], [ 114.98397584, 30.99056612 ], [ 114.98417509, 30.99085135 ], [ 114.98472207, 30.99106758 ], [ 114.98533778, 30.99141952 ], [ 114.98585086, 30.99174977 ], [ 114.98646654, 30.99233757 ], [ 114.98647546, 30.99287723 ], [ 114.9862582, 30.99356548 ], [ 114.98526875, 30.99464883 ], [ 114.98515609, 30.99548868 ], [ 114.985442, 30.99599152 ], [ 114.98574584, 30.99641036 ], [ 114.985955, 30.99722925 ], [ 114.98593707, 30.99724829 ], [ 114.98445343, 30.99819821 ], [ 114.98370513, 30.99871816 ], [ 114.98339424, 30.99893496 ], [ 114.98280436, 30.99935349 ], [ 114.98235294, 31.0001004 ], [ 114.98229115, 31.00033645 ], [ 114.98219648, 31.00048664 ], [ 114.98204901, 31.00056004 ], [ 114.98187564, 31.00055756 ], [ 114.98176206, 31.00050593 ], [ 114.98174513, 31.00032608 ], [ 114.98164052, 31.00025044 ], [ 114.98144124, 31.00023504 ], [ 114.98130175, 31.00019348 ], [ 114.9811543, 31.00009997 ], [ 114.98112042, 31.00008508 ], [ 114.98037315, 30.99979847 ], [ 114.97994869, 30.9996748 ], [ 114.97948835, 30.99971014 ], [ 114.9788546, 31.00008579 ], [ 114.97767443, 31.00468563 ], [ 114.97852508, 31.00821706 ], [ 114.97900194, 31.01304784 ], [ 114.9804783, 31.01679529 ], [ 114.98018309, 31.01991135 ], [ 114.97853875, 31.02289048 ], [ 114.97541747, 31.02749292 ], [ 114.97238891, 31.02950845 ], [ 114.9696803, 31.02862859 ], [ 114.96848347, 31.0274456 ], [ 114.96709432, 31.02536863 ], [ 114.96637388, 31.0234637 ], [ 114.96728496, 31.02216097 ], [ 114.96834452, 31.02072689 ], [ 114.97004495, 31.01830057 ], [ 114.97086041, 31.01537498 ], [ 114.97103496, 31.01361952 ], [ 114.97179856, 31.01091993 ], [ 114.97265779, 31.00844094 ], [ 114.97164151, 31.00622512 ], [ 114.96993257, 31.0040512 ], [ 114.96837902, 31.00191771 ], [ 114.96779714, 31.00008439 ], [ 114.96782307, 30.9999544 ], [ 114.96792772, 30.99986316 ], [ 114.96817889, 30.99973954 ], [ 114.96849982, 30.99960273 ], [ 114.96864734, 30.99939645 ], [ 114.96851779, 30.99924189 ], [ 114.96811817, 30.9989012 ], [ 114.96731989, 30.99842867 ], [ 114.96677273, 30.99822429 ], [ 114.96571427, 30.99793233 ], [ 114.96484616, 30.99766483 ], [ 114.96418634, 30.99743073 ], [ 114.96385743, 30.99714877 ], [ 114.96367504, 30.99696636 ], [ 114.96373487, 30.99668837 ], [ 114.96386149, 30.99626928 ], [ 114.96406489, 30.99559913 ], [ 114.96409981, 30.99518927 ], [ 114.96409984, 30.99488345 ], [ 114.96439489, 30.9946468 ], [ 114.96466405, 30.9942733 ], [ 114.96473285, 30.99393731 ], [ 114.9648814, 30.99344221 ], [ 114.96477677, 30.99314666 ], [ 114.96461233, 30.99293822 ], [ 114.96428242, 30.99275221 ], [ 114.96411697, 30.99265871 ], [ 114.96311033, 30.99166296 ], [ 114.96252928, 30.99072105 ], [ 114.96140102, 30.9891719 ], [ 114.96084482, 30.98871861 ], [ 114.96076707, 30.98869382 ], [ 114.9594652, 30.98820844 ], [ 114.95747833, 30.98817546 ], [ 114.95521213, 30.98843687 ], [ 114.95324288, 30.98886733 ], [ 114.95195755, 30.98923612 ], [ 114.95081272, 30.99004827 ], [ 114.95020534, 30.99089715 ], [ 114.94997891, 30.99157127 ], [ 114.94998788, 30.99161522 ], [ 114.94954504, 30.99242474 ], [ 114.94929369, 30.99291302 ], [ 114.94950208, 30.99338128 ], [ 114.95010935, 30.99388262 ], [ 114.95038752, 30.99451462 ], [ 114.95023983, 30.99572125 ], [ 114.95019689, 30.99646991 ], [ 114.95015298, 30.9968278 ], [ 114.95023073, 30.99716842 ], [ 114.9516456, 30.99892616 ], [ 114.95189679, 31.0000869 ], [ 114.95186288, 31.00016693 ], [ 114.95182797, 31.00025596 ], [ 114.95179306, 31.00034499 ], [ 114.95176712, 31.00048597 ], [ 114.951802, 31.00078971 ], [ 114.95192358, 31.00166892 ], [ 114.95215785, 31.00237401 ], [ 114.95210599, 31.00238513 ], [ 114.95186269, 31.00232267 ], [ 114.95101215, 31.00175396 ], [ 114.95039591, 31.0013606 ], [ 114.95009178, 31.0011654 ], [ 114.95007484, 31.0010505 ], [ 114.95016161, 31.00082244 ], [ 114.95018755, 31.00070745 ], [ 114.95019654, 31.0005925 ], [ 114.95008385, 31.00053479 ], [ 114.94977072, 31.00054748 ], [ 114.94944163, 31.00052323 ], [ 114.94925914, 31.00044369 ], [ 114.94906769, 31.00022424 ], [ 114.94901584, 31.00008744 ], [ 114.94890317, 30.99982684 ], [ 114.9487466, 30.99975723 ], [ 114.9484175, 30.99973397 ], [ 114.9470023, 30.99978002 ], [ 114.94380856, 30.99981268 ], [ 114.94210778, 30.99981109 ], [ 114.94194319, 30.99981741 ], [ 114.94167385, 30.99967402 ], [ 114.94166591, 30.99927727 ], [ 114.94165699, 30.99858269 ], [ 114.94136175, 30.99796663 ], [ 114.94061559, 30.99741139 ], [ 114.93985143, 30.99699009 ], [ 114.93940049, 30.99696395 ], [ 114.93938251, 30.99717486 ], [ 114.93960896, 30.99750425 ], [ 114.93949621, 30.9976114 ], [ 114.93937449, 30.9976496 ], [ 114.93910511, 30.99763111 ], [ 114.9386801, 30.99752496 ], [ 114.93845464, 30.99720556 ], [ 114.93860136, 30.99657366 ], [ 114.93871513, 30.99629362 ], [ 114.93854154, 30.99613103 ], [ 114.9381684, 30.99593383 ], [ 114.93760367, 30.99600081 ], [ 114.93727438, 30.99629423 ], [ 114.9367884, 30.99697569 ], [ 114.93647604, 30.99754691 ], [ 114.93650194, 30.99803658 ], [ 114.9366057, 30.99824927 ], [ 114.93663161, 30.99854305 ], [ 114.93644099, 30.99904409 ], [ 114.93481842, 30.99964953 ], [ 114.93448808, 31.00009082 ], [ 114.93427138, 31.00186815 ], [ 114.93369846, 31.0031504 ], [ 114.9326994, 31.00423238 ] ], [ [ 114.92386723, 31.02758325 ], [ 114.92425169, 31.02677225 ], [ 114.92445639, 31.02647117 ], [ 114.92485576, 31.02630776 ], [ 114.92508139, 31.02634045 ], [ 114.92515027, 31.02639733 ], [ 114.92514227, 31.02659423 ], [ 114.92510731, 31.02684813 ], [ 114.9251682, 31.02690502 ], [ 114.92527203, 31.02690688 ], [ 114.92546272, 31.02685467 ], [ 114.92570635, 31.02652055 ], [ 114.92596692, 31.02641227 ], [ 114.9261656, 31.02630107 ], [ 114.92647012, 31.02582594 ], [ 114.92666979, 31.02571774 ], [ 114.92689441, 31.02572143 ], [ 114.92718989, 31.02580998 ], [ 114.92748536, 31.02595549 ], [ 114.92761513, 31.02592933 ], [ 114.92794457, 31.02576496 ], [ 114.92851759, 31.02515551 ], [ 114.92884702, 31.0248772 ], [ 114.92912552, 31.02483382 ], [ 114.9296196, 31.02487708 ], [ 114.93004478, 31.02518027 ], [ 114.93078334, 31.02566188 ], [ 114.93101688, 31.02578646 ], [ 114.93138118, 31.02565097 ], [ 114.93181537, 31.02526253 ], [ 114.93202399, 31.02490041 ], [ 114.93189327, 31.02465476 ], [ 114.93154695, 31.02453936 ], [ 114.9310609, 31.02447915 ], [ 114.93087828, 31.02414962 ], [ 114.93074862, 31.0231314 ], [ 114.9307656, 31.0229215 ], [ 114.93166784, 31.02314698 ], [ 114.93183252, 31.02309276 ], [ 114.93196327, 31.02292565 ], [ 114.93217091, 31.02241962 ], [ 114.93221485, 31.02202678 ], [ 114.93237954, 31.0218876 ], [ 114.93270988, 31.02186608 ], [ 114.93319589, 31.02187929 ], [ 114.93377669, 31.02210022 ], [ 114.9341489, 31.02231048 ], [ 114.93460093, 31.02256658 ], [ 114.93510485, 31.02280559 ], [ 114.93540017, 31.02338275 ], [ 114.93568551, 31.02395193 ], [ 114.93732584, 31.02475759 ], [ 114.93778581, 31.02476476 ], [ 114.93834155, 31.02477274 ], [ 114.93896611, 31.02484056 ], [ 114.93921752, 31.02498601 ], [ 114.93931327, 31.02532363 ], [ 114.93930526, 31.02560548 ], [ 114.93946987, 31.02572111 ], [ 114.93973027, 31.02569663 ], [ 114.94039875, 31.02506074 ], [ 114.94089259, 31.0248699 ], [ 114.94144825, 31.02482185 ], [ 114.94203881, 31.02491764 ], [ 114.94252459, 31.0252345 ], [ 114.94268118, 31.02546205 ], [ 114.94254251, 31.0256862 ], [ 114.94161373, 31.02623471 ], [ 114.94075375, 31.02687101 ], [ 114.94021598, 31.02736975 ], [ 114.9401122, 31.02767876 ], [ 114.94010319, 31.02801658 ], [ 114.9401291, 31.02838332 ], [ 114.94012109, 31.02872214 ], [ 114.93998239, 31.02900224 ], [ 114.93965214, 31.02930569 ], [ 114.93941765, 31.02972488 ], [ 114.93977667, 31.03135927 ], [ 114.94009487, 31.03201229 ], [ 114.94011181, 31.03224712 ], [ 114.94034624, 31.03248753 ], [ 114.94060661, 31.03262895 ], [ 114.94115329, 31.03267388 ], [ 114.94148349, 31.03275419 ], [ 114.94166503, 31.03297571 ], [ 114.94183061, 31.03320325 ], [ 114.94191736, 31.03365682 ], [ 114.94163997, 31.03438394 ], [ 114.94137059, 31.03483121 ], [ 114.94136158, 31.03511306 ], [ 114.94135357, 31.03550785 ], [ 114.94127471, 31.03604169 ], [ 114.94117093, 31.03640868 ], [ 114.94072795, 31.03696422 ], [ 114.94019016, 31.03768883 ], [ 114.93995569, 31.03796711 ], [ 114.93995567, 31.03819298 ], [ 114.94007737, 31.03833567 ], [ 114.94033774, 31.03853806 ], [ 114.94075471, 31.03896701 ], [ 114.94087639, 31.0392796 ], [ 114.9407457, 31.0393628 ], [ 114.94019903, 31.03895908 ], [ 114.93958251, 31.03858146 ], [ 114.93939196, 31.03846588 ], [ 114.93925328, 31.03852111 ], [ 114.93925326, 31.03883093 ], [ 114.93921832, 31.03897191 ], [ 114.9390537, 31.0389962 ], [ 114.9387584, 31.03882285 ], [ 114.9383683, 31.03873162 ], [ 114.93820267, 31.03881387 ], [ 114.93806396, 31.03912195 ], [ 114.93796816, 31.03926104 ], [ 114.93773469, 31.03925847 ], [ 114.93734358, 31.03911125 ], [ 114.93709217, 31.03872892 ], [ 114.93677989, 31.03834769 ], [ 114.93620717, 31.03806986 ], [ 114.93553863, 31.03790311 ], [ 114.9348531, 31.0378593 ], [ 114.93429726, 31.03785124 ], [ 114.93390709, 31.03767499 ], [ 114.93320459, 31.03698753 ], [ 114.93281342, 31.03658639 ], [ 114.93258787, 31.03661074 ], [ 114.93228445, 31.03686008 ], [ 114.93221457, 31.03714002 ], [ 114.93224049, 31.03742182 ], [ 114.93213668, 31.03759089 ], [ 114.93174644, 31.03778239 ], [ 114.93105177, 31.03793837 ], [ 114.93052276, 31.03826898 ], [ 114.93035706, 31.03843614 ], [ 114.93030511, 31.03905686 ], [ 114.93021028, 31.03916694 ], [ 114.92975013, 31.03927356 ], [ 114.9288907, 31.0394557 ], [ 114.92837064, 31.03950342 ], [ 114.92821393, 31.03931975 ], [ 114.92801432, 31.0390112 ], [ 114.92783178, 31.03734742 ], [ 114.92781485, 31.03683074 ], [ 114.92757228, 31.03684107 ], [ 114.92743353, 31.03675031 ], [ 114.92732874, 31.0365066 ], [ 114.92713812, 31.03587622 ], [ 114.92691254, 31.03556071 ], [ 114.92653919, 31.03535933 ], [ 114.92604504, 31.03525105 ], [ 114.92516849, 31.03523819 ], [ 114.92469027, 31.03521681 ], [ 114.92433485, 31.03506934 ], [ 114.92404833, 31.03481084 ], [ 114.9238227, 31.03461124 ], [ 114.92320666, 31.03454402 ], [ 114.9225816, 31.03458973 ], [ 114.92225208, 31.03475501 ], [ 114.92204433, 31.0353709 ], [ 114.92189653, 31.03560093 ], [ 114.92173976, 31.03559311 ], [ 114.92158401, 31.0353934 ], [ 114.921627, 31.03468776 ], [ 114.92151423, 31.03389734 ], [ 114.92132353, 31.03369567 ], [ 114.92115877, 31.03355294 ], [ 114.92113282, 31.03338306 ], [ 114.92114985, 31.0327634 ], [ 114.92116791, 31.03183392 ], [ 114.92127177, 31.03163692 ], [ 114.92166222, 31.03147358 ], [ 114.92193086, 31.03119544 ], [ 114.92220049, 31.03083534 ], [ 114.92249506, 31.03078303 ], [ 114.92272972, 31.03058987 ], [ 114.92285055, 31.0304558 ], [ 114.92277267, 31.03037294 ], [ 114.92281662, 31.03021898 ], [ 114.92299835, 31.03010583 ], [ 114.92322404, 31.02976776 ], [ 114.92323306, 31.02938797 ], [ 114.92328499, 31.02923599 ], [ 114.92319814, 31.02908219 ], [ 114.92312927, 31.02873847 ], [ 114.92322114, 31.02858145 ], [ 114.92375537, 31.02799814 ], [ 114.92386723, 31.02758325 ] ] ] ] } } +] +} diff --git a/public/mapbox/geojson/县道.geojson b/public/mapbox/geojson/县道.geojson new file mode 100644 index 0000000..f6bd47c --- /dev/null +++ b/public/mapbox/geojson/县道.geojson @@ -0,0 +1,512 @@ +{ +"type": "FeatureCollection", +"name": "县道", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.451126", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.607", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8748129, 31.41888674 ], [ 114.87500316, 31.4193168 ], [ 114.87524328, 31.41987687 ], [ 114.87532338, 31.42013688 ], [ 114.87537342, 31.42039685 ], [ 114.87549348, 31.42066689 ], [ 114.87558348, 31.42091691 ], [ 114.87609396, 31.42199714 ], [ 114.87637422, 31.42252728 ], [ 114.87651426, 31.4227674 ], [ 114.87666456, 31.42296756 ], [ 114.87682476, 31.42315769 ], [ 114.87717504, 31.42348803 ], [ 114.87804606, 31.42425893 ], [ 114.87822642, 31.4243991 ], [ 114.87871692, 31.42470965 ], [ 114.87946788, 31.42525041 ], [ 114.8801787, 31.42585107 ], [ 114.8803686, 31.42606104 ], [ 114.8807088, 31.42653102 ], [ 114.8810787, 31.42698102 ], [ 114.88123872, 31.42722101 ], [ 114.88136886, 31.42747103 ], [ 114.88158882, 31.42801094 ], [ 114.88166874, 31.42828089 ], [ 114.88171878, 31.42854086 ], [ 114.88182876, 31.4288208 ], [ 114.88218876, 31.43002059 ], [ 114.88217886, 31.43013057 ], [ 114.88218876, 31.43031053 ], [ 114.88227876, 31.43062049 ], [ 114.8826087, 31.43141037 ], [ 114.88272876, 31.43163038 ], [ 114.88279878, 31.4318403 ], [ 114.88307886, 31.43252025 ], [ 114.88320882, 31.43274021 ], [ 114.88326876, 31.43296017 ], [ 114.88338882, 31.43345009 ], [ 114.88339872, 31.43395998 ], [ 114.88337874, 31.4342199 ], [ 114.88328856, 31.43472971 ], [ 114.8830884, 31.43577938 ], [ 114.88300848, 31.43610927 ], [ 114.88293828, 31.43655914 ], [ 114.88293828, 31.43667911 ], [ 114.88292838, 31.43684907 ], [ 114.88293828, 31.4374689 ], [ 114.88290822, 31.43759886 ], [ 114.88285818, 31.43772882 ], [ 114.8827581, 31.43786877 ], [ 114.88253814, 31.43818859 ], [ 114.88201794, 31.43880828 ], [ 114.88168782, 31.43926805 ], [ 114.88159764, 31.43937798 ], [ 114.88146768, 31.43949795 ], [ 114.8812776, 31.43972781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.451127", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "3.422", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9492681, 31.44769439 ], [ 114.94919826, 31.44756452 ], [ 114.94897884, 31.44736494 ], [ 114.94877922, 31.44709535 ], [ 114.9485598, 31.44685572 ], [ 114.94830024, 31.44663621 ], [ 114.94819062, 31.44652641 ], [ 114.94809072, 31.44639663 ], [ 114.94799118, 31.44589695 ], [ 114.94798128, 31.44558713 ], [ 114.94792152, 31.44534732 ], [ 114.94791162, 31.44523739 ], [ 114.94796148, 31.44505739 ], [ 114.94809144, 31.4447873 ], [ 114.9483411, 31.44441713 ], [ 114.94879038, 31.44360668 ], [ 114.94894986, 31.44339626 ], [ 114.94904958, 31.443296 ], [ 114.9491691, 31.44267567 ], [ 114.94925856, 31.44161543 ], [ 114.94925856, 31.44125543 ], [ 114.94931832, 31.44091527 ], [ 114.94934802, 31.44047517 ], [ 114.94944774, 31.43994489 ], [ 114.94945764, 31.43978487 ], [ 114.94943766, 31.43906492 ], [ 114.94947744, 31.4385548 ], [ 114.94948734, 31.43821478 ], [ 114.94944738, 31.43770488 ], [ 114.94940742, 31.43755499 ], [ 114.94933758, 31.43739515 ], [ 114.94908828, 31.43695577 ], [ 114.94900854, 31.43650595 ], [ 114.94885896, 31.43603633 ], [ 114.94884888, 31.43586636 ], [ 114.94872918, 31.43541663 ], [ 114.94862946, 31.43475689 ], [ 114.94862946, 31.43461689 ], [ 114.9485895, 31.43444697 ], [ 114.94843992, 31.43408738 ], [ 114.94830024, 31.4338077 ], [ 114.94806102, 31.43323832 ], [ 114.94782162, 31.4327889 ], [ 114.9475923, 31.4324595 ], [ 114.9474627, 31.43236982 ], [ 114.94722348, 31.43223041 ], [ 114.94685466, 31.4318214 ], [ 114.94676484, 31.43174166 ], [ 114.9462864, 31.43145294 ], [ 114.94623654, 31.43138306 ], [ 114.9461568, 31.43119334 ], [ 114.94593756, 31.430844 ], [ 114.94578816, 31.43049449 ], [ 114.9455889, 31.42964534 ], [ 114.94547946, 31.42929573 ], [ 114.9453, 31.42887633 ], [ 114.9451506, 31.42856682 ], [ 114.94494144, 31.42782761 ], [ 114.9448617, 31.42764788 ], [ 114.9444828, 31.42702886 ], [ 114.94422342, 31.42662935 ], [ 114.94394388, 31.42614992 ], [ 114.94386414, 31.42594008 ], [ 114.94372446, 31.42545039 ], [ 114.94360458, 31.42512063 ], [ 114.94348488, 31.42447097 ], [ 114.943455, 31.42427103 ], [ 114.943455, 31.42408109 ], [ 114.9435747, 31.42332099 ], [ 114.9438141, 31.42241073 ], [ 114.94383408, 31.42221071 ], [ 114.94396386, 31.4217306 ], [ 114.94406358, 31.42123047 ], [ 114.94421334, 31.42075032 ], [ 114.94425312, 31.42051029 ], [ 114.9442632, 31.42027031 ], [ 114.94434294, 31.41976023 ], [ 114.94441278, 31.41956016 ], [ 114.94441278, 31.41931019 ], [ 114.9443928, 31.41908028 ], [ 114.94430298, 31.41886046 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.451128", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8802219, 31.47133977 ], [ 114.88027537610715, 31.471567633610587 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.452827", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2774333, 31.34007653 ], [ 115.27755318, 31.34018637 ], [ 115.27769304, 31.34030616 ], [ 115.27807248, 31.34052576 ], [ 115.27823232, 31.34065559 ], [ 115.27834212, 31.34075544 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.452829", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.207", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27882128, 31.34266425 ], [ 115.27885134, 31.3426742 ], [ 115.27905096, 31.34281397 ], [ 115.2794205, 31.34318351 ], [ 115.27986996, 31.34344298 ], [ 115.2800397, 31.34358279 ], [ 115.28010972, 31.34377265 ], [ 115.2802494, 31.34394248 ], [ 115.28028936, 31.34398239 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.452830", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "4.061", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.28028936, 31.34398239 ], [ 115.28043912, 31.34412221 ], [ 115.28077878, 31.34450178 ], [ 115.2809685, 31.34466153 ], [ 115.28141796, 31.34495102 ], [ 115.28351532, 31.34615868 ], [ 115.28370504, 31.34629845 ], [ 115.28424432, 31.34680776 ], [ 115.28442414, 31.34694758 ], [ 115.2848736, 31.34716709 ], [ 115.28534304, 31.34735658 ], [ 115.2855927, 31.34738633 ], [ 115.28614206, 31.3473159 ], [ 115.28672148, 31.34737535 ], [ 115.28760996, 31.34741418 ], [ 115.2878994, 31.34737373 ], [ 115.2887778, 31.34711237 ], [ 115.28930664, 31.34692152 ], [ 115.28953632, 31.34680119 ], [ 115.28974584, 31.34663091 ], [ 115.28992548, 31.34644065 ], [ 115.29031482, 31.34607012 ], [ 115.29102348, 31.34557913 ], [ 115.29124308, 31.34539881 ], [ 115.29143262, 31.34521854 ], [ 115.29160236, 31.34501834 ], [ 115.29174204, 31.3447982 ], [ 115.29205146, 31.34439779 ], [ 115.29213138, 31.3441677 ], [ 115.29218124, 31.34368778 ], [ 115.29226116, 31.3434977 ], [ 115.29245088, 31.34340743 ], [ 115.29269028, 31.34338704 ], [ 115.2935487, 31.34339564 ], [ 115.2941076, 31.34335473 ], [ 115.2943272, 31.34337435 ], [ 115.29449676, 31.34350404 ], [ 115.29459666, 31.34369385 ], [ 115.2946665, 31.34387367 ], [ 115.29482616, 31.34400336 ], [ 115.29503568, 31.34412297 ], [ 115.29549486, 31.34432219 ], [ 115.29571428, 31.3444418 ], [ 115.29595386, 31.3445214 ], [ 115.29620334, 31.34456096 ], [ 115.2964728, 31.34454053 ], [ 115.2972513, 31.34444927 ], [ 115.29803988, 31.344408 ], [ 115.29844902, 31.34428736 ], [ 115.29860868, 31.34431706 ], [ 115.29871848, 31.34439689 ], [ 115.29876834, 31.34450678 ], [ 115.29875844, 31.34464677 ], [ 115.29877842, 31.34479671 ], [ 115.298928, 31.34489643 ], [ 115.29911772, 31.34494611 ], [ 115.2992673, 31.34504583 ], [ 115.29941706, 31.34517552 ], [ 115.30002582, 31.34602431 ], [ 115.30036512, 31.34638364 ], [ 115.30102392, 31.34681244 ], [ 115.3015029, 31.34705157 ], [ 115.30193202, 31.34730083 ], [ 115.30236114, 31.34747007 ], [ 115.30258074, 31.34757969 ], [ 115.30282032, 31.34763927 ], [ 115.30305972, 31.34758887 ], [ 115.30326942, 31.34748857 ], [ 115.30369854, 31.34735784 ], [ 115.30405782, 31.34705729 ], [ 115.30425726, 31.34696697 ], [ 115.30449684, 31.34691657 ], [ 115.3050057, 31.34686568 ], [ 115.30523538, 31.34677532 ], [ 115.3054548, 31.34671493 ], [ 115.30570428, 31.3466945 ], [ 115.30596384, 31.34673405 ], [ 115.3064628, 31.34690316 ], [ 115.30666242, 31.34703281 ], [ 115.30699182, 31.34735222 ], [ 115.30720134, 31.34749181 ], [ 115.30794978, 31.34782049 ], [ 115.30820934, 31.34789001 ], [ 115.30849878, 31.34791953 ], [ 115.30880802, 31.347909 ], [ 115.30909746, 31.34787849 ], [ 115.3096164, 31.34787759 ], [ 115.30979604, 31.34792727 ], [ 115.31013534, 31.34808671 ], [ 115.31023524, 31.3482065 ], [ 115.31031498, 31.34835635 ], [ 115.31037492, 31.34852622 ], [ 115.31047482, 31.34899598 ], [ 115.31053458, 31.34913584 ], [ 115.31093382, 31.34952509 ], [ 115.31101374, 31.34962494 ], [ 115.31111346, 31.34967476 ], [ 115.31135304, 31.34970437 ], [ 115.31187198, 31.34972345 ], [ 115.31431692, 31.34974923 ], [ 115.31485584, 31.34976831 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.452831", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.700", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.273998, 31.33538159 ], [ 115.27405794, 31.33546151 ], [ 115.27421778, 31.33588118 ], [ 115.2742977, 31.33608102 ], [ 115.2743175, 31.33628091 ], [ 115.27438752, 31.3364408 ], [ 115.27454718, 31.33657058 ], [ 115.2747171, 31.33672038 ], [ 115.27481682, 31.33692018 ], [ 115.27509654, 31.33724981 ], [ 115.27519644, 31.33742963 ], [ 115.27532622, 31.33758942 ], [ 115.27551594, 31.3377192 ], [ 115.2757656, 31.33778895 ], [ 115.27600536, 31.33789871 ], [ 115.27619508, 31.33802849 ], [ 115.27666452, 31.33816799 ], [ 115.2768744, 31.33825776 ], [ 115.2769941, 31.33838759 ], [ 115.27700418, 31.3385675 ], [ 115.27692426, 31.3387475 ], [ 115.27663446, 31.33903766 ], [ 115.2766044, 31.33919759 ], [ 115.27682418, 31.33952726 ], [ 115.27688412, 31.33970712 ], [ 115.27698384, 31.33985697 ], [ 115.27728354, 31.33996668 ], [ 115.2774333, 31.34007653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.452872", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.330", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27834212, 31.34075544 ], [ 115.27851204, 31.34093522 ], [ 115.27873164, 31.34119491 ], [ 115.27880166, 31.3413048 ], [ 115.2787815, 31.34141478 ], [ 115.2786717, 31.34148485 ], [ 115.2783621, 31.34153511 ], [ 115.27825212, 31.34159519 ], [ 115.27799238, 31.34182532 ], [ 115.27785252, 31.34191541 ], [ 115.2778725, 31.34210531 ], [ 115.27794234, 31.34225516 ], [ 115.27813206, 31.34238494 ], [ 115.2785916, 31.34258447 ], [ 115.27882128, 31.34266425 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493033", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.339", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94434888, 31.46394996 ], [ 114.94449864, 31.46367974 ], [ 114.94469826, 31.46324949 ], [ 114.9447681, 31.46296941 ], [ 114.94480806, 31.46269937 ], [ 114.94490778, 31.46241924 ], [ 114.94503774, 31.46217912 ], [ 114.94524744, 31.46192892 ], [ 114.94532718, 31.46179887 ], [ 114.9454071, 31.4616888 ], [ 114.94554696, 31.46157864 ], [ 114.94565676, 31.46141849 ], [ 114.9458562, 31.46124821 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493034", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.665", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9458562, 31.46124821 ], [ 114.9460758, 31.46095787 ], [ 114.94614564, 31.46085774 ], [ 114.94630512, 31.46050751 ], [ 114.94639494, 31.46020736 ], [ 114.94640484, 31.45989735 ], [ 114.94638486, 31.45974741 ], [ 114.94632492, 31.45931748 ], [ 114.94622502, 31.45885767 ], [ 114.94621494, 31.45870769 ], [ 114.94623492, 31.4582477 ], [ 114.94619496, 31.45811774 ], [ 114.94613502, 31.45798782 ], [ 114.94595538, 31.45770815 ], [ 114.94581552, 31.45742838 ], [ 114.94565586, 31.45712864 ], [ 114.94558584, 31.45696875 ], [ 114.94555596, 31.4568288 ], [ 114.9455259, 31.45662882 ], [ 114.94571544, 31.45571856 ], [ 114.94569546, 31.45560858 ], [ 114.94543572, 31.45478904 ], [ 114.94541574, 31.45464905 ], [ 114.94542582, 31.45450905 ], [ 114.9454557, 31.45435902 ], [ 114.94556532, 31.45418883 ], [ 114.94608426, 31.45363803 ], [ 114.9463836, 31.45324757 ], [ 114.94671282, 31.45291709 ], [ 114.9468525, 31.45281687 ], [ 114.9469623, 31.45269668 ], [ 114.94706202, 31.45255655 ], [ 114.94711188, 31.45241646 ], [ 114.94714176, 31.45208643 ], [ 114.9471216, 31.45156646 ], [ 114.94704168, 31.45068662 ], [ 114.94704168, 31.45053663 ], [ 114.94706148, 31.4503866 ], [ 114.9471513, 31.45027644 ], [ 114.94728108, 31.45016624 ], [ 114.94756044, 31.44998583 ], [ 114.94767024, 31.44988571 ], [ 114.94792998, 31.44962543 ], [ 114.94813968, 31.44936524 ], [ 114.94828944, 31.4492351 ], [ 114.94840914, 31.449105 ], [ 114.94850904, 31.44895493 ], [ 114.94878876, 31.44849471 ], [ 114.94920816, 31.44801434 ], [ 114.9492582, 31.44783434 ], [ 114.94927818, 31.44771437 ], [ 114.9492681, 31.44769439 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493035", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.241", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94136916, 31.48193831 ], [ 114.94138914, 31.48181829 ], [ 114.94141902, 31.4817183 ], [ 114.94155888, 31.48148808 ], [ 114.94170846, 31.4812679 ], [ 114.94182816, 31.48111769 ], [ 114.94216746, 31.48077713 ], [ 114.94221732, 31.48071705 ], [ 114.94236708, 31.48044683 ], [ 114.94239714, 31.48033685 ], [ 114.94241712, 31.48021688 ], [ 114.9424173, 31.47987704 ], [ 114.9423579, 31.47917756 ], [ 114.94231812, 31.47873786 ], [ 114.94227834, 31.47855804 ], [ 114.9421887, 31.47824844 ], [ 114.94196982, 31.47748934 ], [ 114.94189008, 31.47725961 ], [ 114.94188018, 31.47714968 ], [ 114.94201032, 31.47636983 ], [ 114.9420204, 31.47614991 ], [ 114.94199052, 31.47586016 ], [ 114.94187118, 31.47533069 ], [ 114.94177146, 31.47519096 ], [ 114.94159218, 31.4748216 ], [ 114.94159236, 31.47471162 ], [ 114.94170216, 31.47427161 ], [ 114.9417621, 31.47416154 ], [ 114.9421014, 31.47379101 ], [ 114.94226106, 31.47341085 ], [ 114.942321, 31.47333075 ], [ 114.94248066, 31.47318045 ], [ 114.94262034, 31.47294029 ], [ 114.94279008, 31.47277001 ], [ 114.94285002, 31.47261993 ], [ 114.94282014, 31.4724501 ], [ 114.94269054, 31.4722805 ], [ 114.94250118, 31.47212097 ], [ 114.9424614, 31.47204114 ], [ 114.94236168, 31.47195141 ], [ 114.94229184, 31.4718516 ], [ 114.9422022, 31.47160194 ], [ 114.94214262, 31.47135219 ], [ 114.94208286, 31.47121242 ], [ 114.94201302, 31.47108264 ], [ 114.94172394, 31.47072332 ], [ 114.94161396, 31.47064344 ], [ 114.94151424, 31.47046358 ], [ 114.9415641, 31.47036354 ], [ 114.94168398, 31.47031337 ], [ 114.9422427, 31.47048243 ], [ 114.9423723, 31.47051213 ], [ 114.94250208, 31.47050187 ], [ 114.94263168, 31.47045161 ], [ 114.9427215, 31.47037142 ], [ 114.94278144, 31.47027134 ], [ 114.9428214, 31.47001142 ], [ 114.94279152, 31.46981157 ], [ 114.94272186, 31.4696718 ], [ 114.94261224, 31.46954211 ], [ 114.94252242, 31.46929227 ], [ 114.94231272, 31.46894258 ], [ 114.94226286, 31.46871263 ], [ 114.9422328, 31.46849267 ], [ 114.94217286, 31.46815278 ], [ 114.94218294, 31.46802273 ], [ 114.9422427, 31.46779269 ], [ 114.94232262, 31.46756256 ], [ 114.9423426, 31.46744255 ], [ 114.94232262, 31.46722259 ], [ 114.94232262, 31.46710257 ], [ 114.94250226, 31.46672237 ], [ 114.94274184, 31.46638203 ], [ 114.9428916, 31.46613183 ], [ 114.9429015, 31.46599184 ], [ 114.9430113, 31.4656317 ], [ 114.94316106, 31.4653815 ], [ 114.94328076, 31.46499135 ], [ 114.9433407, 31.46488128 ], [ 114.94349046, 31.46468108 ], [ 114.9438897, 31.46445054 ], [ 114.94390968, 31.46444051 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493036", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94390968, 31.46444051 ], [ 114.94404936, 31.46440032 ], [ 114.94415916, 31.46431019 ], [ 114.94434888, 31.46394996 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493037", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.627", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8812776, 31.43972781 ], [ 114.88115754, 31.43989773 ], [ 114.88080744, 31.44026754 ], [ 114.88052736, 31.44060734 ], [ 114.88046724, 31.44062732 ], [ 114.88037724, 31.44070728 ], [ 114.8803272, 31.44084723 ], [ 114.8803173, 31.4409272 ], [ 114.88029714, 31.44103718 ], [ 114.88029714, 31.44114716 ], [ 114.88028724, 31.44123711 ], [ 114.88026726, 31.44131708 ], [ 114.8802471, 31.44146706 ], [ 114.88021722, 31.44160701 ], [ 114.88020714, 31.44171695 ], [ 114.88017708, 31.44188691 ], [ 114.88013712, 31.44207686 ], [ 114.88011714, 31.44218684 ], [ 114.88010706, 31.44224678 ], [ 114.880077, 31.44235676 ], [ 114.88006692, 31.44241674 ], [ 114.88004694, 31.44252668 ], [ 114.88002696, 31.4426466 ], [ 114.88000698, 31.44275658 ], [ 114.87998682, 31.44287651 ], [ 114.87996684, 31.44302645 ], [ 114.87995676, 31.44314642 ], [ 114.87993678, 31.44324636 ], [ 114.8799168, 31.44334631 ], [ 114.87989664, 31.44343626 ], [ 114.87988674, 31.4435462 ], [ 114.87986658, 31.44362616 ], [ 114.8798466, 31.44370613 ], [ 114.87982662, 31.44379608 ], [ 114.87981654, 31.44387605 ], [ 114.87978648, 31.44397599 ], [ 114.8797764, 31.44403593 ], [ 114.87974634, 31.44419586 ], [ 114.87972636, 31.44429581 ], [ 114.87970638, 31.44441578 ], [ 114.87965634, 31.44463565 ], [ 114.87963618, 31.44474558 ], [ 114.87962628, 31.44485556 ], [ 114.8796162, 31.44494552 ], [ 114.87959622, 31.44504546 ], [ 114.87959622, 31.44511544 ], [ 114.87958614, 31.44539538 ], [ 114.87955608, 31.4455653 ], [ 114.87959604, 31.44591522 ], [ 114.87967614, 31.44628526 ], [ 114.87978612, 31.44710516 ], [ 114.8799564, 31.44791516 ], [ 114.88007646, 31.44898503 ], [ 114.8801364, 31.44914501 ], [ 114.8801364, 31.449335 ], [ 114.8801364, 31.44950492 ], [ 114.88015638, 31.4496149 ], [ 114.88016628, 31.44973487 ], [ 114.88018626, 31.44985484 ], [ 114.88018626, 31.45003479 ], [ 114.88018626, 31.45008479 ], [ 114.88017636, 31.45020476 ], [ 114.88016628, 31.45030475 ], [ 114.8801562, 31.45043471 ], [ 114.8801562, 31.45055468 ], [ 114.8801562, 31.45068464 ], [ 114.8801562, 31.45075461 ], [ 114.88016628, 31.45096458 ], [ 114.88018626, 31.45106453 ], [ 114.88020624, 31.45124453 ], [ 114.88023612, 31.45135451 ], [ 114.8802462, 31.45139447 ], [ 114.8802462, 31.45181436 ], [ 114.8802561, 31.45191435 ], [ 114.8802561, 31.45200431 ], [ 114.8802561, 31.45218426 ], [ 114.88026618, 31.45226427 ], [ 114.8802561, 31.45236422 ], [ 114.8802561, 31.45244423 ], [ 114.88024602, 31.45258418 ], [ 114.88022604, 31.45268412 ], [ 114.8801661, 31.45285409 ], [ 114.88011606, 31.45295403 ], [ 114.88007592, 31.45301402 ], [ 114.8800158, 31.45307391 ], [ 114.87990564, 31.45323371 ], [ 114.8798457, 31.45329365 ], [ 114.87968532, 31.45350339 ], [ 114.87964536, 31.45358331 ], [ 114.87960522, 31.45372326 ], [ 114.87957534, 31.45383324 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.493038", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.980", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87957534, 31.45383324 ], [ 114.87957516, 31.45394318 ], [ 114.87960522, 31.45403309 ], [ 114.87962502, 31.45409307 ], [ 114.87965508, 31.45417299 ], [ 114.87968496, 31.45425296 ], [ 114.87971502, 31.45432289 ], [ 114.8798448, 31.4546427 ], [ 114.88010436, 31.45513239 ], [ 114.88021416, 31.45543218 ], [ 114.88024404, 31.45560206 ], [ 114.88022388, 31.45579191 ], [ 114.88012362, 31.45620155 ], [ 114.88001346, 31.45640135 ], [ 114.87991302, 31.45680104 ], [ 114.8797728, 31.45719069 ], [ 114.8797125, 31.45740053 ], [ 114.87960216, 31.45784013 ], [ 114.87952188, 31.45827978 ], [ 114.87950118, 31.45922901 ], [ 114.87949974, 31.4608977 ], [ 114.87945942, 31.46136737 ], [ 114.8794686, 31.46251644 ], [ 114.87944844, 31.4627063 ], [ 114.87946824, 31.46287617 ], [ 114.87943818, 31.46299605 ], [ 114.8793381, 31.46318591 ], [ 114.87928788, 31.46337572 ], [ 114.87930768, 31.46351562 ], [ 114.87957732, 31.46424512 ], [ 114.8796468, 31.46490464 ], [ 114.87970638, 31.46532435 ], [ 114.87973626, 31.46560412 ], [ 114.87972618, 31.46574402 ], [ 114.87966588, 31.46607374 ], [ 114.87963546, 31.46648342 ], [ 114.87959496, 31.46732276 ], [ 114.87982338, 31.46922131 ], [ 114.88004262, 31.47023061 ], [ 114.88017222, 31.47090012 ], [ 114.8802219, 31.47133977 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500159", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.039", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92342874, 31.31610129 ], [ 114.92381826, 31.31598092 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500160", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9125409, 31.31526083 ], [ 114.91285086, 31.3151508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500161", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0404", "width": "55", "length": "0.012", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91242102, 31.31530083 ], [ 114.9125409, 31.31526083 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500162", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.155", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91285086, 31.3151508 ], [ 114.91298082, 31.31512079 ], [ 114.91364052, 31.31493075 ], [ 114.9144003, 31.31472069 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500163", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.440", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90784236, 31.31688105 ], [ 114.90821226, 31.31697092 ], [ 114.90843222, 31.31695089 ], [ 114.90878214, 31.31685086 ], [ 114.90944184, 31.31664084 ], [ 114.90951186, 31.31662082 ], [ 114.90958188, 31.31659085 ], [ 114.90965172, 31.31656083 ], [ 114.90972174, 31.31654085 ], [ 114.90988176, 31.31649081 ], [ 114.91002162, 31.31644082 ], [ 114.91204104, 31.31545086 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500164", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91204104, 31.31545086 ], [ 114.91242102, 31.31530083 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500309", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.177", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87498894, 31.32835259 ], [ 114.87497904, 31.32808263 ], [ 114.87494898, 31.32775274 ], [ 114.87490902, 31.32738284 ], [ 114.87485898, 31.32695291 ], [ 114.87485898, 31.32676296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500310", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.157", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87485808, 31.28856354 ], [ 114.87477798, 31.28862339 ], [ 114.87432726, 31.2892025 ], [ 114.8739066, 31.28971167 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500311", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.632", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8739066, 31.28971167 ], [ 114.87381642, 31.28981148 ], [ 114.87342582, 31.29016077 ], [ 114.87269448, 31.29087942 ], [ 114.87215358, 31.29156833 ], [ 114.87199338, 31.29187793 ], [ 114.871833, 31.29224751 ], [ 114.87172266, 31.29291698 ], [ 114.87155238, 31.29322658 ], [ 114.8712318, 31.29346602 ], [ 114.87033036, 31.2939846 ], [ 114.87010014, 31.29414422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500312", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87010014, 31.29414422 ], [ 114.86984976, 31.29430379 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500313", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.184", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88639482, 31.28511006 ], [ 114.88710582, 31.28493105 ], [ 114.88829706, 31.28482215 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500314", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.615", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9065892, 31.27159062 ], [ 114.9071292, 31.27123085 ], [ 114.90744924, 31.27100094 ], [ 114.90769926, 31.27076109 ], [ 114.90780924, 31.27049118 ], [ 114.90788934, 31.27029129 ], [ 114.90799932, 31.26986145 ], [ 114.90816942, 31.26913173 ], [ 114.90851916, 31.26773196 ], [ 114.90852906, 31.26743208 ], [ 114.90864894, 31.26698217 ], [ 114.90874902, 31.2665922 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500315", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.261", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90874902, 31.2665922 ], [ 114.90889878, 31.26626222 ], [ 114.90909858, 31.26599213 ], [ 114.90964812, 31.2649223 ], [ 114.90973812, 31.26465243 ], [ 114.90972822, 31.26442257 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500316", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.471", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90339906, 31.27471902 ], [ 114.90373908, 31.27444916 ], [ 114.90430914, 31.27384949 ], [ 114.90452928, 31.27329972 ], [ 114.90482916, 31.27294989 ], [ 114.90493932, 31.27275999 ], [ 114.90519924, 31.27253009 ], [ 114.90573924, 31.27212032 ], [ 114.90605928, 31.27197042 ], [ 114.9064992, 31.27165061 ], [ 114.9065892, 31.27159062 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500317", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.604", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90168456, 31.31738204 ], [ 114.90202458, 31.31720208 ], [ 114.9021846, 31.31710214 ], [ 114.9026544, 31.31688218 ], [ 114.90281442, 31.31682219 ], [ 114.9031044, 31.31673219 ], [ 114.90455394, 31.31627216 ], [ 114.90509376, 31.31614206 ], [ 114.90523362, 31.31614206 ], [ 114.9055335, 31.31617194 ], [ 114.90586344, 31.31624187 ], [ 114.90617322, 31.31631176 ], [ 114.90693282, 31.31658144 ], [ 114.90725268, 31.31667131 ], [ 114.9076026, 31.31679119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500318", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.025", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9076026, 31.31679119 ], [ 114.90784236, 31.31688105 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500319", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "1.184", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96160548, 31.32334269 ], [ 114.96165534, 31.32343256 ], [ 114.96188484, 31.32380196 ], [ 114.96198456, 31.32413168 ], [ 114.96201444, 31.32463145 ], [ 114.96201444, 31.32496139 ], [ 114.96199446, 31.32526131 ], [ 114.96199464, 31.32559121 ], [ 114.9619446, 31.32607118 ], [ 114.96191472, 31.3266011 ], [ 114.96184488, 31.32719109 ], [ 114.96184506, 31.32777092 ], [ 114.96170538, 31.32939074 ], [ 114.96172536, 31.33014048 ], [ 114.96177522, 31.33055025 ], [ 114.96189492, 31.33165968 ], [ 114.96198474, 31.3319894 ], [ 114.96207438, 31.33253898 ], [ 114.96223368, 31.33332824 ], [ 114.9623532, 31.33386765 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500320", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9623532, 31.33386765 ], [ 114.96237318, 31.33398758 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500321", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.171", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96237318, 31.33398758 ], [ 114.96240306, 31.33410741 ], [ 114.96246282, 31.33440711 ], [ 114.96264192, 31.33550615 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500322", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.596", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95614968, 31.32260429 ], [ 114.95821428, 31.32172026 ], [ 114.95845368, 31.32166977 ], [ 114.95877282, 31.32158913 ], [ 114.95920176, 31.32156821 ], [ 114.95954088, 31.3216475 ], [ 114.95973042, 31.32171707 ], [ 114.95996982, 31.32178655 ], [ 114.96022902, 31.321886 ], [ 114.96046842, 31.32202545 ], [ 114.96077766, 31.32227471 ], [ 114.9613362, 31.32291339 ], [ 114.96142602, 31.32306315 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500323", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96142602, 31.32306315 ], [ 114.96160548, 31.32334269 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500324", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.064", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99423426, 31.31342496 ], [ 114.99437376, 31.31325464 ], [ 114.99466266, 31.31298387 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500325", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87784302, 31.28611878 ], [ 114.87793302, 31.28596898 ], [ 114.87803328, 31.28589914 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500326", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.156", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87618018, 31.28773572 ], [ 114.8757696, 31.28796504 ], [ 114.87510864, 31.28836397 ], [ 114.87485808, 31.28856354 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500327", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.830", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8942061, 31.31685266 ], [ 114.89434614, 31.3169027 ], [ 114.89475618, 31.31709278 ], [ 114.89518638, 31.31741282 ], [ 114.8955264, 31.31770284 ], [ 114.89606658, 31.31811293 ], [ 114.89638662, 31.31834297 ], [ 114.8965965, 31.31846285 ], [ 114.89694624, 31.31860266 ], [ 114.8972562, 31.31868254 ], [ 114.89809572, 31.31880224 ], [ 114.89838552, 31.31883212 ], [ 114.8985756, 31.31884206 ], [ 114.8987754, 31.318862 ], [ 114.89916528, 31.31881191 ], [ 114.89950512, 31.31870189 ], [ 114.90116472, 31.31771193 ], [ 114.90168456, 31.31738204 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500328", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88237722, 31.32205218 ], [ 114.88269762, 31.32221243 ], [ 114.88289778, 31.32228263 ], [ 114.88325814, 31.32236295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500329", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.224", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8984991, 31.27601799 ], [ 114.89900922, 31.27586814 ], [ 114.90007914, 31.27564832 ], [ 114.90076926, 31.27549842 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500330", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.265", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90076926, 31.27549842 ], [ 114.90085926, 31.27548843 ], [ 114.90291918, 31.27490888 ], [ 114.90339906, 31.27471902 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500331", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.443", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9118065, 31.25828417 ], [ 114.91216632, 31.25767437 ], [ 114.91266636, 31.25704464 ], [ 114.91311618, 31.25639489 ], [ 114.91330626, 31.25611499 ], [ 114.91335612, 31.25604501 ], [ 114.91359624, 31.25572511 ], [ 114.91377606, 31.25551518 ], [ 114.91393608, 31.2553053 ], [ 114.91412616, 31.25506536 ], [ 114.91417602, 31.25501537 ], [ 114.914196, 31.25499539 ], [ 114.914286, 31.25491542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500332", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.377", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.914286, 31.25491542 ], [ 114.91441614, 31.25482547 ], [ 114.91465608, 31.25467553 ], [ 114.91486596, 31.25454548 ], [ 114.91518546, 31.25438528 ], [ 114.91536528, 31.25428515 ], [ 114.91547526, 31.25420505 ], [ 114.91557516, 31.25411501 ], [ 114.91566498, 31.25400498 ], [ 114.9157449, 31.25388497 ], [ 114.91582482, 31.25370497 ], [ 114.91595478, 31.25339501 ], [ 114.91605468, 31.25315502 ], [ 114.9162246, 31.25285501 ], [ 114.91636446, 31.25262501 ], [ 114.91651422, 31.25238498 ], [ 114.91658424, 31.25228495 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500333", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.274", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9193449, 31.31536626 ], [ 114.9195645, 31.31549595 ], [ 114.92028342, 31.31591499 ], [ 114.92098236, 31.316324 ], [ 114.9213618, 31.3165035 ], [ 114.92155152, 31.31656326 ], [ 114.92181108, 31.31656295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500334", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.550", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90972822, 31.26442257 ], [ 114.90972822, 31.2643926 ], [ 114.90967836, 31.26413282 ], [ 114.90960852, 31.26388302 ], [ 114.90962868, 31.2636132 ], [ 114.90966864, 31.26336332 ], [ 114.91028856, 31.26202389 ], [ 114.91063812, 31.26130398 ], [ 114.910758, 31.26111399 ], [ 114.91092774, 31.26072398 ], [ 114.91128702, 31.25984391 ], [ 114.91131708, 31.25975391 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500335", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.170", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91131708, 31.25975391 ], [ 114.91160652, 31.25896389 ], [ 114.9118065, 31.25828417 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500336", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.430", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9287607, 31.31745467 ], [ 114.92901036, 31.31767427 ], [ 114.92954946, 31.31828343 ], [ 114.93007866, 31.31876264 ], [ 114.93017856, 31.31886245 ], [ 114.93039816, 31.31898215 ], [ 114.93049806, 31.31905203 ], [ 114.93055782, 31.31909195 ], [ 114.93062784, 31.31911184 ], [ 114.93072756, 31.31914172 ], [ 114.9308973, 31.31917151 ], [ 114.93111708, 31.31923122 ], [ 114.93135666, 31.31931092 ], [ 114.93154638, 31.3193907 ], [ 114.9316263, 31.31941059 ], [ 114.93182592, 31.31947031 ], [ 114.93203562, 31.31954006 ], [ 114.9321555, 31.31957993 ], [ 114.93232524, 31.31961971 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500337", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.977", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93232524, 31.31961971 ], [ 114.93251496, 31.31967947 ], [ 114.93266472, 31.31973927 ], [ 114.93284436, 31.31983899 ], [ 114.93306414, 31.31997872 ], [ 114.93327384, 31.3201184 ], [ 114.93341352, 31.32021821 ], [ 114.93370314, 31.32041778 ], [ 114.93562014, 31.32169511 ], [ 114.93667836, 31.32235359 ], [ 114.93708786, 31.32261302 ], [ 114.9375969, 31.32303228 ], [ 114.93777672, 31.32315203 ], [ 114.9380163, 31.3232517 ], [ 114.93834588, 31.32335129 ], [ 114.93872496, 31.32343058 ], [ 114.93935334, 31.32360918 ], [ 114.94010124, 31.32383756 ], [ 114.94029078, 31.32389714 ], [ 114.9405102, 31.3240266 ], [ 114.94070964, 31.3241162 ], [ 114.94082934, 31.32413591 ], [ 114.94094904, 31.32414567 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500338", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.396", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88325814, 31.32236295 ], [ 114.88338828, 31.32237308 ], [ 114.88351842, 31.32236322 ], [ 114.88357854, 31.32235328 ], [ 114.88378878, 31.3223135 ], [ 114.88414914, 31.32219389 ], [ 114.88432932, 31.32212409 ], [ 114.88521024, 31.32178511 ], [ 114.88601106, 31.32147605 ], [ 114.8863815, 31.32130644 ], [ 114.88664178, 31.32114678 ], [ 114.88675194, 31.32105692 ], [ 114.8869521, 31.32085721 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500387", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.044", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88829706, 31.28482215 ], [ 114.88845708, 31.28481225 ], [ 114.88875732, 31.28476253 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500388", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.763", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88875732, 31.28476253 ], [ 114.88961808, 31.28461322 ], [ 114.89086854, 31.28423391 ], [ 114.89174856, 31.28401409 ], [ 114.8920686, 31.28400414 ], [ 114.89248854, 31.28402417 ], [ 114.89271858, 31.28397422 ], [ 114.89284872, 31.28386428 ], [ 114.89290866, 31.28361435 ], [ 114.8929587, 31.28303462 ], [ 114.89292864, 31.28269473 ], [ 114.89300874, 31.2823049 ], [ 114.89311872, 31.28212499 ], [ 114.89343876, 31.28178519 ], [ 114.89355882, 31.28162526 ], [ 114.8936688, 31.28120541 ], [ 114.89377878, 31.28099553 ], [ 114.89389884, 31.28089559 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500389", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.334", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94918764, 31.3228688 ], [ 114.94924758, 31.32285867 ], [ 114.9499557, 31.32274721 ], [ 114.95096316, 31.32274509 ], [ 114.9515316, 31.3227639 ], [ 114.95214, 31.32278262 ], [ 114.95253906, 31.32283181 ], [ 114.95266866, 31.32286151 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500390", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.345", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95266866, 31.32286151 ], [ 114.95351646, 31.32303971 ], [ 114.95381562, 31.32308907 ], [ 114.95461356, 31.32307737 ], [ 114.95481318, 31.32307697 ], [ 114.9550425, 31.32302652 ], [ 114.9555312, 31.32285552 ], [ 114.95601, 31.32266459 ], [ 114.95614968, 31.32260429 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500391", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.604", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94094904, 31.32414567 ], [ 114.94105884, 31.32415544 ], [ 114.9414777, 31.32410454 ], [ 114.94213596, 31.32397323 ], [ 114.94327302, 31.32376092 ], [ 114.9437916, 31.32364986 ], [ 114.94577646, 31.32333581 ], [ 114.9471729, 31.32315293 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500392", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.195", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9471729, 31.32315293 ], [ 114.94918764, 31.3228688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.500393", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.238", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9937857, 31.31552556 ], [ 114.99386544, 31.31508551 ], [ 114.99393528, 31.31429553 ], [ 114.99406488, 31.31378532 ], [ 114.99413454, 31.31360519 ], [ 114.99423426, 31.31342496 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501663", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.818", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0694496, 31.1890964 ], [ 115.06957938, 31.1891562 ], [ 115.06981896, 31.18930583 ], [ 115.07071734, 31.19002434 ], [ 115.07106672, 31.19033372 ], [ 115.07145606, 31.1906331 ], [ 115.07185548, 31.1909724 ], [ 115.07280372, 31.19196065 ], [ 115.07340258, 31.19262953 ], [ 115.07445072, 31.19370764 ], [ 115.07462046, 31.19391729 ], [ 115.07477022, 31.19414697 ], [ 115.07584806, 31.19583465 ], [ 115.07707584, 31.19782194 ], [ 115.07766462, 31.19874071 ], [ 115.0777944, 31.19891045 ], [ 115.07796414, 31.19903015 ], [ 115.07814396, 31.19911997 ], [ 115.07891328, 31.19976927 ], [ 115.0802622, 31.20081813 ], [ 115.08072174, 31.20119775 ], [ 115.08127128, 31.2017072 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501700", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.592", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08440886, 31.20356489 ], [ 115.0881462, 31.20433299 ], [ 115.08847596, 31.20438281 ], [ 115.08879582, 31.20447263 ], [ 115.09009488, 31.20473196 ], [ 115.09044462, 31.2048018 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501701", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.593", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09044462, 31.2048018 ], [ 115.09196346, 31.20512103 ], [ 115.09287282, 31.20528056 ], [ 115.09467156, 31.20563966 ], [ 115.09528122, 31.20577934 ], [ 115.09622046, 31.20596883 ], [ 115.09650036, 31.20602868 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501702", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.644", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09650036, 31.20602868 ], [ 115.09775946, 31.20628806 ], [ 115.09802928, 31.2063579 ], [ 115.09918848, 31.20658731 ], [ 115.1008884, 31.20695735 ], [ 115.10144838, 31.20705752 ], [ 115.1025588, 31.20729782 ], [ 115.10306892, 31.20739799 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501703", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.110", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08127128, 31.2017072 ], [ 115.0820406, 31.2024465 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501704", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.268", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0820406, 31.2024465 ], [ 115.08260022, 31.20296598 ], [ 115.08278994, 31.20312578 ], [ 115.0830198, 31.20327563 ], [ 115.08440886, 31.20356489 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501733", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.014", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11927522, 31.2100047 ], [ 115.11942534, 31.21000488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501767", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.835", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86302938, 31.14121154 ], [ 114.8630193, 31.14132152 ], [ 114.86278044, 31.14523053 ], [ 114.86275038, 31.14580023 ], [ 114.86265012, 31.14606002 ], [ 114.86248992, 31.14630972 ], [ 114.8620194, 31.146759 ], [ 114.86148876, 31.14718821 ], [ 114.86095812, 31.1475875 ], [ 114.8604876, 31.14793679 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501768", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.409", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8604876, 31.14793679 ], [ 114.85729314, 31.15040175 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501769", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.145", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85255356, 31.1535617 ], [ 114.85217286, 31.15386086 ], [ 114.85138122, 31.15439915 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501770", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.958", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85138122, 31.15439915 ], [ 114.8510907, 31.15454855 ], [ 114.8507901, 31.15468796 ], [ 114.84924696, 31.15531485 ], [ 114.84837522, 31.1557131 ], [ 114.84778392, 31.1560619 ], [ 114.84751338, 31.15624131 ], [ 114.8470425, 31.15666026 ], [ 114.84679194, 31.15684971 ], [ 114.84626094, 31.15716858 ], [ 114.84476784, 31.15794551 ], [ 114.84398628, 31.15828395 ], [ 114.84275382, 31.15874151 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501771", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.004", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86986884, 31.13454344 ], [ 114.86983878, 31.13457341 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501772", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.153", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86983878, 31.13457341 ], [ 114.86911734, 31.13542179 ], [ 114.86887704, 31.13568131 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501773", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.432", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85729314, 31.15040175 ], [ 114.85677222, 31.15082061 ], [ 114.85562976, 31.15157819 ], [ 114.85477818, 31.15206644 ], [ 114.85397646, 31.15249475 ], [ 114.85370592, 31.15265418 ], [ 114.8536458, 31.15270409 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501774", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.141", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8536458, 31.15270409 ], [ 114.85255356, 31.1535617 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501775", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.620", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84275382, 31.15874151 ], [ 114.84271386, 31.15876145 ], [ 114.84244332, 31.15887089 ], [ 114.84167166, 31.15929929 ], [ 114.84092016, 31.15976774 ], [ 114.8406597, 31.15988721 ], [ 114.840369, 31.15995665 ], [ 114.8393871, 31.16010483 ], [ 114.83904636, 31.16017418 ], [ 114.83872578, 31.16028357 ], [ 114.83843508, 31.16043297 ], [ 114.8381946, 31.16063241 ], [ 114.8377437, 31.16108138 ], [ 114.83754336, 31.16132091 ], [ 114.8373729, 31.16156049 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501776", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.901", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8373729, 31.16156049 ], [ 114.83725266, 31.16182014 ], [ 114.83718246, 31.16210985 ], [ 114.83716248, 31.16239965 ], [ 114.8372226, 31.16293947 ], [ 114.83719254, 31.1631993 ], [ 114.83713224, 31.16343906 ], [ 114.83703216, 31.16367873 ], [ 114.83668134, 31.16412788 ], [ 114.83647092, 31.1643374 ], [ 114.83625042, 31.16453693 ], [ 114.83552898, 31.16506536 ], [ 114.8353587, 31.16524496 ], [ 114.83510814, 31.16574423 ], [ 114.8349978, 31.16600393 ], [ 114.83479746, 31.16638337 ], [ 114.83470728, 31.16660306 ], [ 114.8346972, 31.16666304 ], [ 114.83465706, 31.16687283 ], [ 114.83450676, 31.16796201 ], [ 114.83452674, 31.16824187 ], [ 114.83460684, 31.16849189 ], [ 114.83462682, 31.1687618 ], [ 114.8346468, 31.16892173 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.501777", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.271", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86623374, 31.13655782 ], [ 114.86798586, 31.13609999 ], [ 114.86887704, 31.13568131 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.502264", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.094", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99467508, 31.18737978 ], [ 114.99474474, 31.18738959 ], [ 114.99533262, 31.18738779 ], [ 114.99566148, 31.18740683 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.502265", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.193", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04349324, 31.25198408 ], [ 115.04381238, 31.25164361 ], [ 115.044012, 31.25136335 ], [ 115.0441317, 31.25116319 ], [ 115.04427138, 31.25085309 ], [ 115.04434122, 31.25062305 ], [ 115.04440098, 31.250453 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.502266", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.039", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04440098, 31.250453 ], [ 115.04481012, 31.25046218 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.502267", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.109", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01041788, 31.19215082 ], [ 115.009551, 31.19218331 ], [ 115.0092819, 31.19220405 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.502268", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.109", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01043786, 31.19224068 ], [ 115.0095609, 31.19228321 ], [ 115.00930188, 31.19229396 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504056", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.388", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90856956, 31.14278204 ], [ 114.90847956, 31.14323186 ], [ 114.90848946, 31.14357161 ], [ 114.9085692, 31.14416115 ], [ 114.90884856, 31.1452902 ], [ 114.90898824, 31.14622949 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504057", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0408", "width": "55", "length": "0.114", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90898824, 31.14622949 ], [ 114.90886836, 31.14667931 ], [ 114.90869826, 31.14722907 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504058", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.538", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89384808, 31.16578856 ], [ 114.8932377, 31.1660181 ], [ 114.89311764, 31.16606801 ], [ 114.89301756, 31.16611791 ], [ 114.89274756, 31.16621772 ], [ 114.89257746, 31.16628756 ], [ 114.89233734, 31.1664074 ], [ 114.89210712, 31.16648723 ], [ 114.89206716, 31.16650716 ], [ 114.891867, 31.16658704 ], [ 114.891687, 31.16665688 ], [ 114.89156694, 31.16670678 ], [ 114.89132682, 31.16680659 ], [ 114.8911767, 31.16686649 ], [ 114.8910966, 31.16689641 ], [ 114.8910066, 31.16696634 ], [ 114.8909166, 31.16704626 ], [ 114.89087646, 31.16709626 ], [ 114.8908365, 31.16716619 ], [ 114.89080662, 31.16724615 ], [ 114.89075658, 31.16742611 ], [ 114.89057676, 31.16810583 ], [ 114.8904468, 31.16857568 ], [ 114.89034672, 31.16890553 ], [ 114.89032674, 31.16893554 ], [ 114.89030676, 31.16899548 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504353", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.304", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89697864, 31.16551955 ], [ 114.8969286, 31.16552954 ], [ 114.89677866, 31.16554952 ], [ 114.89663862, 31.16555951 ], [ 114.89653872, 31.16555946 ], [ 114.89640858, 31.16553948 ], [ 114.89621868, 31.16553948 ], [ 114.89603868, 31.16553944 ], [ 114.89591862, 31.16553944 ], [ 114.89580864, 31.16552945 ], [ 114.89555862, 31.16554938 ], [ 114.89526864, 31.16553939 ], [ 114.8948487, 31.16554929 ], [ 114.89453856, 31.16556905 ], [ 114.89438844, 31.16558894 ], [ 114.89424822, 31.16561886 ], [ 114.8940882, 31.16567871 ], [ 114.89384808, 31.16578856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504354", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.577", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90700932, 31.15542605 ], [ 114.90687936, 31.15555614 ], [ 114.90660972, 31.15575626 ], [ 114.9065199, 31.15588626 ], [ 114.90645996, 31.15602626 ], [ 114.9063399, 31.15653606 ], [ 114.90626988, 31.15671597 ], [ 114.90587964, 31.15771529 ], [ 114.90571962, 31.15801508 ], [ 114.90525954, 31.15916433 ], [ 114.90462918, 31.16072327 ], [ 114.904539, 31.16125292 ], [ 114.90432894, 31.16161269 ], [ 114.90250878, 31.16294168 ], [ 114.90062886, 31.16378097 ], [ 114.89965884, 31.16411069 ], [ 114.89941872, 31.16425059 ], [ 114.89931864, 31.16435049 ], [ 114.89920866, 31.16443046 ], [ 114.8987286, 31.16481017 ], [ 114.89860872, 31.16492006 ], [ 114.89849856, 31.16502 ], [ 114.89840856, 31.16509992 ], [ 114.89831856, 31.16514992 ], [ 114.89819868, 31.16519987 ], [ 114.89774868, 31.16533973 ], [ 114.89747868, 31.16540966 ], [ 114.89713866, 31.16548958 ], [ 114.89697864, 31.16551955 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504355", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.714", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90869826, 31.14722907 ], [ 114.90837858, 31.14780899 ], [ 114.90796872, 31.14870872 ], [ 114.90790878, 31.14892863 ], [ 114.90786882, 31.14915849 ], [ 114.90776874, 31.14999806 ], [ 114.90774822, 31.15162701 ], [ 114.90767838, 31.15313645 ], [ 114.90759846, 31.15351638 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504356", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.221", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90759846, 31.15351638 ], [ 114.90735888, 31.15412631 ], [ 114.907239, 31.15479614 ], [ 114.90717906, 31.15512603 ], [ 114.90700932, 31.15542605 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504515", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15766004, 31.13524755 ], [ 115.1576802, 31.13477784 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504516", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.089", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1576802, 31.13477784 ], [ 115.15777038, 31.13487797 ], [ 115.15794066, 31.13501819 ], [ 115.15808088, 31.13510841 ], [ 115.15842162, 31.13524895 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504517", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.296", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1576802, 31.13477784 ], [ 115.15764006, 31.13460788 ], [ 115.15750002, 31.13359821 ], [ 115.1574399, 31.13336822 ], [ 115.15734972, 31.1331182 ], [ 115.15722966, 31.13291808 ], [ 115.15708926, 31.13276792 ], [ 115.15700916, 31.13258787 ], [ 115.156899, 31.13222787 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504518", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15893552, 31.10447646 ], [ 115.1591859, 31.10403717 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504519", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.111", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.156899, 31.13222787 ], [ 115.15667868, 31.13150787 ], [ 115.1565885, 31.13126784 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504544", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.107", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1565885, 31.13126784 ], [ 115.15651848, 31.13104784 ], [ 115.15646844, 31.13081789 ], [ 115.15644846, 31.130568 ], [ 115.15644846, 31.13031816 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504545", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.096", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16164092, 31.10134302 ], [ 115.16237244, 31.10074466 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504546", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.364", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16237244, 31.10074466 ], [ 115.1636751, 31.09965759 ], [ 115.16391558, 31.09936815 ], [ 115.16413608, 31.09902876 ], [ 115.16424624, 31.09884903 ], [ 115.16441652, 31.09848953 ], [ 115.16453676, 31.09832982 ], [ 115.16467716, 31.0981802 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504830", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.340", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13052666, 31.21151594 ], [ 115.13061684, 31.21155603 ], [ 115.13079702, 31.21168617 ], [ 115.13094714, 31.21184624 ], [ 115.13255922, 31.21365767 ], [ 115.13278962, 31.21395786 ], [ 115.13362086, 31.21486871 ], [ 115.13436192, 31.21568942 ], [ 115.1353134, 31.21668041 ], [ 115.13551356, 31.21697057 ], [ 115.13564388, 31.21714067 ], [ 115.13609442, 31.21773102 ], [ 115.13652498, 31.21834136 ], [ 115.13672532, 31.2186015 ], [ 115.13687544, 31.21887159 ], [ 115.13727612, 31.2194619 ], [ 115.13764656, 31.22008209 ], [ 115.13803716, 31.22068239 ], [ 115.1384877, 31.22142264 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504831", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.210", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1384877, 31.22142264 ], [ 115.1386479, 31.22159283 ], [ 115.13877804, 31.22194284 ], [ 115.13886822, 31.22279253 ], [ 115.13895822, 31.2232424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504832", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.636", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13895822, 31.2232424 ], [ 115.13909826, 31.22417214 ], [ 115.13923848, 31.2252318 ], [ 115.1393085, 31.22545176 ], [ 115.13932848, 31.22576163 ], [ 115.13940858, 31.22632148 ], [ 115.13944854, 31.227381 ], [ 115.13950848, 31.22766095 ], [ 115.13966868, 31.22819087 ], [ 115.13976894, 31.22839094 ], [ 115.13986902, 31.22865095 ], [ 115.13992896, 31.22889089 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504833", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.245", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14188214, 31.24026927 ], [ 115.14190212, 31.24052915 ], [ 115.14191202, 31.2420384 ], [ 115.14199176, 31.24402749 ], [ 115.14203172, 31.24445733 ], [ 115.14214152, 31.24653642 ], [ 115.14221154, 31.24736613 ], [ 115.14237174, 31.24821596 ], [ 115.14255174, 31.24940562 ], [ 115.1427321, 31.24999562 ], [ 115.14275208, 31.25007558 ], [ 115.14309246, 31.25140547 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504834", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.063", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14309246, 31.25140547 ], [ 115.14324258, 31.25190546 ], [ 115.14325266, 31.25195546 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504835", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.003", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11942534, 31.21000488 ], [ 115.1194554, 31.21000493 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504836", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.220", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1194554, 31.21000493 ], [ 115.11974574, 31.21007517 ], [ 115.12046646, 31.2101559 ], [ 115.12056654, 31.21018601 ], [ 115.12097694, 31.21022642 ], [ 115.1215074, 31.21031696 ], [ 115.12172772, 31.21033716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504837", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.080", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12172772, 31.21033716 ], [ 115.1225586, 31.21041803 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504936", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.887", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13992896, 31.22889089 ], [ 115.14025944, 31.22986095 ], [ 115.14031956, 31.23014094 ], [ 115.14058002, 31.23088106 ], [ 115.14090078, 31.23189122 ], [ 115.14100086, 31.23229122 ], [ 115.14129138, 31.23312143 ], [ 115.14137166, 31.23336146 ], [ 115.14141162, 31.23417119 ], [ 115.1414919, 31.235031 ], [ 115.14160206, 31.23602082 ], [ 115.14169224, 31.23670068 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.504937", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.397", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14169224, 31.23670068 ], [ 115.14176244, 31.23727061 ], [ 115.14185244, 31.23829026 ], [ 115.14188232, 31.23939974 ], [ 115.14188232, 31.24008936 ], [ 115.14188214, 31.24026927 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507166", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.296", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24458744, 31.32848934 ], [ 115.24485744, 31.32855936 ], [ 115.24504752, 31.32865935 ], [ 115.24526748, 31.32872937 ], [ 115.24550742, 31.32876938 ], [ 115.24620744, 31.32898943 ], [ 115.24692762, 31.32931946 ], [ 115.24745754, 31.32949946 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507167", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "4.257", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24745754, 31.32949946 ], [ 115.24770756, 31.32956948 ], [ 115.24796766, 31.32960948 ], [ 115.2481977, 31.32966951 ], [ 115.24863762, 31.3298595 ], [ 115.24885776, 31.32992952 ], [ 115.24920768, 31.32997956 ], [ 115.24933782, 31.33001957 ], [ 115.24999788, 31.33036958 ], [ 115.25062788, 31.33078956 ], [ 115.2512379, 31.33110956 ], [ 115.25204808, 31.33136961 ], [ 115.25251806, 31.3316096 ], [ 115.252938, 31.33176962 ], [ 115.25338818, 31.33189962 ], [ 115.2538281, 31.33209965 ], [ 115.25398812, 31.33214964 ], [ 115.25440824, 31.33218969 ], [ 115.25478822, 31.33227974 ], [ 115.25539824, 31.33235975 ], [ 115.25601834, 31.33253979 ], [ 115.25639832, 31.33269981 ], [ 115.2565884, 31.3327598 ], [ 115.25678838, 31.33279985 ], [ 115.25689836, 31.33275984 ], [ 115.2570384, 31.33261989 ], [ 115.2573183, 31.33227996 ], [ 115.25765832, 31.33199007 ], [ 115.2578583, 31.3318701 ], [ 115.25828832, 31.33169019 ], [ 115.2587682, 31.33152027 ], [ 115.25934834, 31.3312104 ], [ 115.25963832, 31.33115042 ], [ 115.25987826, 31.33116045 ], [ 115.26008832, 31.33125045 ], [ 115.26030828, 31.33130049 ], [ 115.26048828, 31.33126049 ], [ 115.26066828, 31.33114056 ], [ 115.26076836, 31.33095057 ], [ 115.26080832, 31.33074065 ], [ 115.2607383, 31.33054067 ], [ 115.26057828, 31.33037066 ], [ 115.26043824, 31.33017068 ], [ 115.26036822, 31.32996075 ], [ 115.26026814, 31.32975074 ], [ 115.26008796, 31.32907088 ], [ 115.26005808, 31.32864095 ], [ 115.26007806, 31.32848097 ], [ 115.26021792, 31.328361 ], [ 115.26038802, 31.32826106 ], [ 115.26054804, 31.3281311 ], [ 115.26070788, 31.32798111 ], [ 115.26082794, 31.32784116 ], [ 115.26091794, 31.32778118 ], [ 115.26101784, 31.32778122 ], [ 115.26109794, 31.32783122 ], [ 115.261308, 31.3280312 ], [ 115.26149808, 31.32817119 ], [ 115.26163794, 31.32830115 ], [ 115.26171804, 31.32843116 ], [ 115.26203808, 31.32867114 ], [ 115.26224814, 31.32879116 ], [ 115.2624681, 31.32896112 ], [ 115.26262812, 31.32933107 ], [ 115.26309828, 31.32974106 ], [ 115.26320826, 31.32989105 ], [ 115.2634482, 31.33007105 ], [ 115.26362838, 31.33022103 ], [ 115.26381828, 31.33031103 ], [ 115.26398838, 31.33044104 ], [ 115.26431832, 31.33072103 ], [ 115.26447834, 31.330881 ], [ 115.26457842, 31.33109097 ], [ 115.26465852, 31.33131093 ], [ 115.2647685, 31.33175085 ], [ 115.2648486, 31.33197081 ], [ 115.2650187, 31.33263074 ], [ 115.26500862, 31.33283067 ], [ 115.26503868, 31.33302062 ], [ 115.26518844, 31.33316043 ], [ 115.26537816, 31.33328022 ], [ 115.26546816, 31.33333013 ], [ 115.26575778, 31.33350977 ], [ 115.26610734, 31.33376937 ], [ 115.26674652, 31.33381874 ], [ 115.26718608, 31.33391832 ], [ 115.26732594, 31.3338582 ], [ 115.26773544, 31.33359797 ], [ 115.26788538, 31.33346787 ], [ 115.26794532, 31.33332788 ], [ 115.2679653, 31.33316795 ], [ 115.2679653, 31.33297805 ], [ 115.26799536, 31.33279809 ], [ 115.26827508, 31.33246797 ], [ 115.26857478, 31.3321878 ], [ 115.26867468, 31.3320078 ], [ 115.26867468, 31.33178789 ], [ 115.26866478, 31.33112819 ], [ 115.26864498, 31.33096826 ], [ 115.26865488, 31.33078835 ], [ 115.26877476, 31.33064831 ], [ 115.2689346, 31.3305282 ], [ 115.26904458, 31.33035819 ], [ 115.26913458, 31.33015817 ], [ 115.26924438, 31.32999815 ], [ 115.26938424, 31.32991805 ], [ 115.269534, 31.32994793 ], [ 115.2696339, 31.33006776 ], [ 115.26968394, 31.33021766 ], [ 115.26975378, 31.33033754 ], [ 115.26991362, 31.33036742 ], [ 115.27010334, 31.33030725 ], [ 115.27028316, 31.33021712 ], [ 115.27050294, 31.32994707 ], [ 115.2706329, 31.32989694 ], [ 115.27076268, 31.32993681 ], [ 115.27082262, 31.3300467 ], [ 115.27086258, 31.33032656 ], [ 115.27093242, 31.33050642 ], [ 115.2708525, 31.33083636 ], [ 115.27092234, 31.3309962 ], [ 115.27105212, 31.33114605 ], [ 115.27115202, 31.33132587 ], [ 115.27122186, 31.33151573 ], [ 115.27145154, 31.33227519 ], [ 115.27155126, 31.33278491 ], [ 115.2716112, 31.33295478 ], [ 115.2717111, 31.33311462 ], [ 115.27186086, 31.33325439 ], [ 115.27198074, 31.33333427 ], [ 115.27205058, 31.33337418 ], [ 115.27221042, 31.33352399 ], [ 115.2723402, 31.33369377 ], [ 115.27265988, 31.33402335 ], [ 115.27268976, 31.33418328 ], [ 115.27261974, 31.33432328 ], [ 115.27263972, 31.33454315 ], [ 115.27271964, 31.334733 ], [ 115.27280946, 31.33487286 ], [ 115.27302924, 31.33496264 ], [ 115.273269, 31.3349724 ], [ 115.27351866, 31.33502217 ], [ 115.27374834, 31.33513193 ], [ 115.27392816, 31.3352717 ], [ 115.273998, 31.33538159 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507838", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.181", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88820598, 31.17070373 ], [ 114.88798584, 31.17066359 ], [ 114.88767552, 31.17061337 ], [ 114.8874354, 31.17056324 ], [ 114.88716522, 31.17047306 ], [ 114.88678488, 31.17035282 ], [ 114.88637466, 31.17026255 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507839", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0408", "width": "55", "length": "0.097", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8892066, 31.1707944 ], [ 114.88912668, 31.17082437 ], [ 114.88904658, 31.17083427 ], [ 114.8889465, 31.17081425 ], [ 114.88870638, 31.17078405 ], [ 114.88820598, 31.17070373 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507840", "Name": "X212", "pyname": "x212", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.227", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89030676, 31.16899548 ], [ 114.89018688, 31.16923538 ], [ 114.89009688, 31.16943527 ], [ 114.88994676, 31.16970513 ], [ 114.88984686, 31.16990502 ], [ 114.88980672, 31.169975 ], [ 114.88967676, 31.17022484 ], [ 114.88951674, 31.17041469 ], [ 114.88934664, 31.17063452 ], [ 114.8892066, 31.1707944 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507841", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.725", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98757066, 31.18924026 ], [ 114.98781978, 31.18909959 ], [ 114.98809878, 31.1889888 ], [ 114.98830812, 31.18888823 ], [ 114.98853726, 31.18879755 ], [ 114.98868666, 31.18873712 ], [ 114.98887602, 31.18865661 ], [ 114.98909526, 31.18855599 ], [ 114.98938416, 31.18842518 ], [ 114.9897528, 31.18825418 ], [ 114.99074928, 31.18782137 ], [ 114.99110802, 31.18766036 ], [ 114.99124752, 31.18759997 ], [ 114.99139692, 31.18754957 ], [ 114.99152652, 31.18751919 ], [ 114.99174576, 31.18749854 ], [ 114.99258258, 31.18745601 ], [ 114.9928119, 31.18745534 ], [ 114.9930909, 31.18744449 ], [ 114.99332004, 31.18743383 ], [ 114.99432642, 31.18738082 ], [ 114.99467508, 31.18737978 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507842", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92917074, 31.22803355 ], [ 114.92925066, 31.22773353 ], [ 114.92929062, 31.22768349 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507843", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.060", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91658424, 31.25228495 ], [ 114.91670412, 31.25214491 ], [ 114.91715358, 31.25185461 ], [ 114.91786278, 31.25141415 ], [ 114.91823232, 31.25120387 ], [ 114.91848198, 31.25107368 ], [ 114.91863174, 31.25099354 ], [ 114.9188616, 31.25080337 ], [ 114.91894152, 31.25068335 ], [ 114.9190713, 31.25042339 ], [ 114.91915122, 31.25013345 ], [ 114.91924122, 31.2497136 ], [ 114.91927128, 31.24947371 ], [ 114.91928154, 31.24902398 ], [ 114.91935138, 31.24852416 ], [ 114.9194115, 31.24819427 ], [ 114.9195114, 31.2479343 ], [ 114.91958124, 31.24776429 ], [ 114.91989102, 31.2471743 ], [ 114.92002098, 31.24686434 ], [ 114.92006094, 31.24654443 ], [ 114.92003106, 31.24616468 ], [ 114.91993116, 31.24563503 ], [ 114.91984134, 31.24511537 ], [ 114.91985142, 31.24492547 ], [ 114.9199812, 31.24474542 ], [ 114.92020098, 31.24458527 ], [ 114.92072046, 31.24423494 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.507844", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.886", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94016676, 31.22484602 ], [ 114.94042614, 31.2247656 ], [ 114.94108476, 31.22455455 ], [ 114.94158372, 31.22442374 ], [ 114.94213254, 31.22435282 ], [ 114.94238184, 31.22429243 ], [ 114.94267128, 31.22417201 ], [ 114.9431004, 31.22384139 ], [ 114.94338966, 31.22357103 ], [ 114.94363914, 31.22329073 ], [ 114.94431774, 31.2225399 ], [ 114.94471698, 31.22207946 ], [ 114.94482678, 31.22189933 ], [ 114.9450264, 31.22145923 ], [ 114.94513602, 31.22127909 ], [ 114.94533564, 31.22106885 ], [ 114.94557522, 31.22084858 ], [ 114.94615392, 31.22034782 ], [ 114.946623, 31.21994718 ], [ 114.94671282, 31.21987707 ], [ 114.9468525, 31.21978685 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508269", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.192", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24268718, 31.32791924 ], [ 115.24279734, 31.32792927 ], [ 115.24300722, 31.32796928 ], [ 115.24322736, 31.32805928 ], [ 115.24395744, 31.32827933 ], [ 115.2441774, 31.32837932 ], [ 115.24440744, 31.32844934 ], [ 115.24458744, 31.32848934 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508270", "Name": "发展路", "pyname": "fzl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.118", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21969704, 31.32640886 ], [ 115.22063844, 31.32710996 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508387", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.860", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16691258, 31.28709164 ], [ 115.1674335, 31.28778234 ], [ 115.16778414, 31.2882228 ], [ 115.16807466, 31.28851323 ], [ 115.1684253, 31.28880375 ], [ 115.16855562, 31.28899392 ], [ 115.16868594, 31.2891341 ], [ 115.16885622, 31.28922437 ], [ 115.16900652, 31.2892146 ], [ 115.16945742, 31.28905548 ], [ 115.16960754, 31.28899577 ], [ 115.16976792, 31.28895603 ], [ 115.16996826, 31.28896638 ], [ 115.1703891, 31.2890171 ], [ 115.17085998, 31.28903798 ], [ 115.17112044, 31.28902844 ], [ 115.17138108, 31.28898893 ], [ 115.17164154, 31.2889194 ], [ 115.1718921, 31.28880992 ], [ 115.17254334, 31.28845127 ], [ 115.17297426, 31.28843205 ], [ 115.17311448, 31.28840231 ], [ 115.17342516, 31.28833292 ], [ 115.17351534, 31.28831307 ], [ 115.17360552, 31.28829327 ], [ 115.17375582, 31.28827352 ], [ 115.17416658, 31.28826429 ], [ 115.17447726, 31.28826483 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508445", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.958", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17447726, 31.28826483 ], [ 115.17450732, 31.2882449 ], [ 115.17455736, 31.28822501 ], [ 115.1745975, 31.28820512 ], [ 115.17464754, 31.28817519 ], [ 115.17473772, 31.28812538 ], [ 115.17479784, 31.28810549 ], [ 115.17485796, 31.28806562 ], [ 115.17492816, 31.28803578 ], [ 115.17503832, 31.28796599 ], [ 115.17510852, 31.28792616 ], [ 115.17514848, 31.28788625 ], [ 115.17541902, 31.28777676 ], [ 115.17584994, 31.28756765 ], [ 115.17609042, 31.28746811 ], [ 115.17665148, 31.28730921 ], [ 115.17694218, 31.28726975 ], [ 115.17816456, 31.287182 ], [ 115.18133076, 31.28686781 ], [ 115.18164126, 31.28686835 ], [ 115.18260318, 31.28701001 ], [ 115.18346484, 31.28715149 ], [ 115.18400574, 31.28730242 ], [ 115.1841861, 31.2873827 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508446", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.218", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19847594, 31.31124395 ], [ 115.19847594, 31.31143385 ], [ 115.19849592, 31.31155382 ], [ 115.1985159, 31.31162379 ], [ 115.1985258, 31.3116638 ], [ 115.19855586, 31.31171379 ], [ 115.19861598, 31.31180384 ], [ 115.198686, 31.3118739 ], [ 115.19889642, 31.31205413 ], [ 115.19897652, 31.31212424 ], [ 115.19911674, 31.31224439 ], [ 115.19925696, 31.31233452 ], [ 115.199397, 31.31241471 ], [ 115.19948718, 31.31245485 ], [ 115.19958744, 31.312485 ], [ 115.19971758, 31.31252519 ], [ 115.1998578, 31.31256537 ], [ 115.19997804, 31.31257554 ], [ 115.20009828, 31.31258576 ], [ 115.20029862, 31.31258607 ], [ 115.20043884, 31.3125863 ], [ 115.20059904, 31.31257658 ], [ 115.20080946, 31.3125669 ], [ 115.20098982, 31.31256722 ], [ 115.20109998, 31.31257739 ], [ 115.20127026, 31.31259764 ], [ 115.20142056, 31.31264786 ], [ 115.20149058, 31.31266797 ], [ 115.20154062, 31.31269803 ], [ 115.2016308, 31.31273817 ], [ 115.20176094, 31.3128383 ], [ 115.20200142, 31.31301857 ], [ 115.2022518, 31.31316887 ], [ 115.20239202, 31.31324906 ], [ 115.20250218, 31.31329923 ], [ 115.20267246, 31.31336943 ], [ 115.2029529, 31.31345984 ], [ 115.20306306, 31.31349998 ], [ 115.20314316, 31.31353013 ], [ 115.20355374, 31.3136807 ], [ 115.20376416, 31.31377097 ], [ 115.20403452, 31.31390133 ], [ 115.20426492, 31.31401163 ], [ 115.20481572, 31.31431232 ], [ 115.20501606, 31.31442261 ], [ 115.20510624, 31.3144727 ], [ 115.2052965, 31.31458295 ], [ 115.20554688, 31.31473325 ], [ 115.20571716, 31.31483346 ], [ 115.2059175, 31.31492373 ], [ 115.20604764, 31.31499389 ], [ 115.2063081, 31.31512425 ], [ 115.20651834, 31.31525453 ], [ 115.20721944, 31.31574534 ], [ 115.20737964, 31.31585555 ], [ 115.20763992, 31.31604585 ], [ 115.2078903, 31.3162461 ], [ 115.20807066, 31.31635635 ], [ 115.20815076, 31.31640644 ], [ 115.20825084, 31.31644658 ], [ 115.20838116, 31.31650674 ], [ 115.20848124, 31.31654688 ], [ 115.20892206, 31.31666753 ], [ 115.20902214, 31.31668769 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508447", "Name": "三河口正街", "pyname": "shkzj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.206", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22771766, 31.32913811 ], [ 115.22802744, 31.32932796 ], [ 115.22821734, 31.32948785 ], [ 115.2283572, 31.32958775 ], [ 115.22865708, 31.32982755 ], [ 115.22871702, 31.32989753 ], [ 115.228917, 31.33036733 ], [ 115.22906712, 31.33052735 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508448", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.099", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22906712, 31.33052735 ], [ 115.22912706, 31.33056735 ], [ 115.22937708, 31.33065735 ], [ 115.22940714, 31.33066734 ], [ 115.22947716, 31.33067733 ], [ 115.22950704, 31.33068737 ], [ 115.22957706, 31.33067738 ], [ 115.2296271, 31.33065735 ], [ 115.22983716, 31.33057739 ], [ 115.23002706, 31.33052744 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508449", "Name": "发展路", "pyname": "fzl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.596", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22063844, 31.32710996 ], [ 115.2209889, 31.32736034 ], [ 115.22297178, 31.32872271 ], [ 115.22330226, 31.32887315 ], [ 115.22347254, 31.32891342 ], [ 115.22378304, 31.32898385 ], [ 115.22407356, 31.32900432 ], [ 115.2243441, 31.32900477 ], [ 115.22557584, 31.32892647 ], [ 115.2261864, 31.32889709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508450", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2261864, 31.32889709 ], [ 115.22719764, 31.32887814 ], [ 115.22727774, 31.3289082 ], [ 115.22736774, 31.32893826 ], [ 115.22771766, 31.32913811 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508451", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.029", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16672214, 31.28688135 ], [ 115.16691258, 31.28709164 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508452", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20902214, 31.31668769 ], [ 115.20917244, 31.31670789 ], [ 115.20934272, 31.31672819 ], [ 115.209513, 31.31674844 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508453", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.604", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.209513, 31.31674844 ], [ 115.20973332, 31.31678876 ], [ 115.2099738, 31.31682912 ], [ 115.21003392, 31.31683925 ], [ 115.21030428, 31.31690963 ], [ 115.21061478, 31.31702006 ], [ 115.21070496, 31.31705021 ], [ 115.2108252, 31.31711033 ], [ 115.21094526, 31.31715051 ], [ 115.21101546, 31.31717063 ], [ 115.21115568, 31.31721081 ], [ 115.21128582, 31.31723102 ], [ 115.21143612, 31.31724128 ], [ 115.21171656, 31.31726171 ], [ 115.21189692, 31.31727197 ], [ 115.2122274, 31.31728254 ], [ 115.212528, 31.31729303 ], [ 115.21279854, 31.31730342 ], [ 115.21292868, 31.31733362 ], [ 115.21299888, 31.31735373 ], [ 115.21304892, 31.3173738 ], [ 115.21307898, 31.31739383 ], [ 115.21317906, 31.31745395 ], [ 115.21328922, 31.31755407 ], [ 115.21333926, 31.3176141 ], [ 115.2133893, 31.31768417 ], [ 115.21344942, 31.31780418 ], [ 115.2134694, 31.31785418 ], [ 115.21352952, 31.31809412 ], [ 115.2135594, 31.31822408 ], [ 115.21357938, 31.31828411 ], [ 115.21359954, 31.31834409 ], [ 115.21360944, 31.31839404 ], [ 115.21362942, 31.31841407 ], [ 115.21366956, 31.31849408 ], [ 115.21373958, 31.31858417 ], [ 115.21381968, 31.3186842 ], [ 115.21391994, 31.31876435 ], [ 115.21405008, 31.31886447 ], [ 115.2142002, 31.31898467 ], [ 115.21432044, 31.31908479 ], [ 115.21439046, 31.31913488 ], [ 115.21444068, 31.31917493 ], [ 115.21447074, 31.31919495 ], [ 115.21453068, 31.31922501 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508454", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.214", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15830642, 31.28344772 ], [ 115.15837644, 31.28351783 ], [ 115.15859694, 31.28357817 ], [ 115.15888746, 31.28362866 ], [ 115.15952862, 31.28366979 ], [ 115.16050044, 31.28369148 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508455", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.487", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14620664, 31.25811713 ], [ 115.14660732, 31.25869749 ], [ 115.14704796, 31.25938788 ], [ 115.14734838, 31.2598881 ], [ 115.14759876, 31.26042824 ], [ 115.1478792, 31.26093845 ], [ 115.14799926, 31.26111854 ], [ 115.14884058, 31.26246926 ], [ 115.14895074, 31.26272931 ], [ 115.14920112, 31.26356937 ], [ 115.14939138, 31.26441929 ], [ 115.14960162, 31.2652593 ], [ 115.14976182, 31.2660792 ], [ 115.14987198, 31.26663914 ], [ 115.15002228, 31.26718917 ], [ 115.15053294, 31.26881939 ], [ 115.15103388, 31.27015976 ], [ 115.1512641, 31.27067996 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508456", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.382", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1512641, 31.27067996 ], [ 115.1513442, 31.27092998 ], [ 115.15137426, 31.27120992 ], [ 115.15144428, 31.27228961 ], [ 115.15148442, 31.27254957 ], [ 115.15149432, 31.2727995 ], [ 115.15145418, 31.27410896 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508457", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.584", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18643934, 31.29862199 ], [ 115.1863992, 31.29887183 ], [ 115.1863992, 31.29914169 ], [ 115.18645932, 31.29941169 ], [ 115.18656948, 31.29967179 ], [ 115.1870202, 31.30040223 ], [ 115.1871903, 31.30061238 ], [ 115.18740072, 31.30082258 ], [ 115.18764102, 31.30100285 ], [ 115.18790148, 31.30115319 ], [ 115.18818192, 31.30129355 ], [ 115.18925346, 31.30178499 ], [ 115.18951392, 31.30187535 ], [ 115.18978446, 31.30194573 ], [ 115.19005482, 31.30197615 ], [ 115.19035542, 31.30197665 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508458", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.405", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19035542, 31.30197665 ], [ 115.190766, 31.30198731 ], [ 115.1915373, 31.30202853 ], [ 115.19180784, 31.30208897 ], [ 115.1920683, 31.30222928 ], [ 115.19276922, 31.30277009 ], [ 115.19359038, 31.30347096 ], [ 115.19372052, 31.30366109 ], [ 115.19383068, 31.30386111 ], [ 115.1939808, 31.30406123 ], [ 115.19420112, 31.30423151 ], [ 115.19495226, 31.30468241 ], [ 115.19517258, 31.3048427 ], [ 115.19534286, 31.30504281 ], [ 115.19545302, 31.30528284 ], [ 115.19562312, 31.30579278 ], [ 115.19578332, 31.30600293 ], [ 115.1960337, 31.30615323 ], [ 115.19685486, 31.30658429 ], [ 115.19710524, 31.30674462 ], [ 115.19730558, 31.3069248 ], [ 115.1974557, 31.30712496 ], [ 115.19757576, 31.30738497 ], [ 115.197786, 31.307895 ], [ 115.19804628, 31.3083851 ], [ 115.19813628, 31.30864506 ], [ 115.19821638, 31.30890503 ], [ 115.19833644, 31.30945488 ], [ 115.19844624, 31.31028455 ], [ 115.19847594, 31.31124395 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508459", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.776", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15145418, 31.27410896 ], [ 115.15147416, 31.27437891 ], [ 115.15153428, 31.27464891 ], [ 115.15160448, 31.27487895 ], [ 115.15204512, 31.27597934 ], [ 115.15240566, 31.27675968 ], [ 115.15258602, 31.27724987 ], [ 115.15270626, 31.27749998 ], [ 115.15287654, 31.27772021 ], [ 115.15308696, 31.27792046 ], [ 115.15377816, 31.27851149 ], [ 115.15425894, 31.27888215 ], [ 115.1549802, 31.27938323 ], [ 115.15545108, 31.27975394 ], [ 115.15560138, 31.27985415 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508460", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.497", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15560138, 31.27985415 ], [ 115.15613238, 31.28020497 ], [ 115.15659318, 31.28044568 ], [ 115.1568036, 31.28051601 ], [ 115.157034, 31.28063639 ], [ 115.15707414, 31.28070645 ], [ 115.15716432, 31.28096651 ], [ 115.15775544, 31.28227713 ], [ 115.15790556, 31.28258732 ], [ 115.15814604, 31.2832175 ], [ 115.15823622, 31.28337761 ], [ 115.15830642, 31.28344772 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508461", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1841861, 31.2873827 ], [ 115.18424622, 31.28741276 ], [ 115.18446672, 31.28758308 ], [ 115.18467714, 31.2877634 ], [ 115.18484742, 31.28797359 ], [ 115.18498764, 31.28821376 ], [ 115.1859591, 31.29083438 ], [ 115.18594902, 31.29108426 ], [ 115.18569846, 31.29210333 ], [ 115.1856783, 31.29235322 ], [ 115.18572852, 31.29260319 ], [ 115.18591878, 31.2931733 ], [ 115.18685028, 31.29578388 ], [ 115.18693056, 31.29603395 ], [ 115.18697052, 31.29627393 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508462", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.267", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18697052, 31.29627393 ], [ 115.1869905, 31.29654384 ], [ 115.18693038, 31.29680363 ], [ 115.18643934, 31.29862199 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.508463", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16050044, 31.28369148 ], [ 115.16104152, 31.28370242 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509792", "Name": "X214", "pyname": "x214", "kind_num": "1", "kind": "0408", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33876938, 30.98834442 ], [ 115.33893894, 30.98836409 ], [ 115.33919832, 30.98840355 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509793", "Name": "X214", "pyname": "x214", "kind_num": "1", "kind": "0408", "width": "55", "length": "0.197", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33919832, 30.98840355 ], [ 115.33950774, 30.98844293 ], [ 115.34029596, 30.98856132 ], [ 115.340441541003287, 30.988584779129358 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509891", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.082", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08597468, 30.91690494 ], [ 115.08598476, 30.91681503 ], [ 115.08607476, 30.91647524 ], [ 115.08609474, 30.91638533 ], [ 115.08610482, 30.91629537 ], [ 115.08610482, 30.9162654 ], [ 115.08610482, 30.91623543 ], [ 115.08608484, 30.91620546 ], [ 115.08606486, 30.91619547 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509893", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.075", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0784343, 30.89503305 ], [ 115.07838426, 30.89497316 ], [ 115.07836428, 30.89488325 ], [ 115.07835438, 30.8948333 ], [ 115.07835438, 30.89474334 ], [ 115.07836446, 30.89468336 ], [ 115.07836446, 30.89466338 ], [ 115.07840424, 30.89460335 ], [ 115.07851422, 30.89452325 ], [ 115.07859396, 30.89445318 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509931", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "1.858", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.078293, 30.90501702 ], [ 115.07836284, 30.90496694 ], [ 115.0784028, 30.9049169 ], [ 115.07848272, 30.90481686 ], [ 115.07856264, 30.90476678 ], [ 115.07865246, 30.90473672 ], [ 115.07885208, 30.90470643 ], [ 115.07898186, 30.90469626 ], [ 115.07914152, 30.90460613 ], [ 115.07929128, 30.90448598 ], [ 115.07939118, 30.90441591 ], [ 115.079481, 30.90435584 ], [ 115.07950098, 30.90433581 ], [ 115.07951106, 30.90431583 ], [ 115.07952096, 30.90429581 ], [ 115.07952096, 30.90427583 ], [ 115.07950098, 30.90426584 ], [ 115.07946102, 30.9042459 ], [ 115.07944122, 30.90425594 ], [ 115.07931126, 30.90433608 ], [ 115.07917158, 30.90442622 ], [ 115.07908176, 30.90446631 ], [ 115.07899194, 30.90448638 ], [ 115.07891202, 30.90448652 ], [ 115.07878224, 30.90447671 ], [ 115.07824314, 30.90444741 ], [ 115.07820318, 30.90444746 ], [ 115.07815332, 30.90445754 ], [ 115.07809338, 30.90450758 ], [ 115.07799366, 30.90462764 ], [ 115.07790384, 30.9046977 ], [ 115.077744, 30.90480786 ], [ 115.07769414, 30.90481794 ], [ 115.07765418, 30.90481799 ], [ 115.0776342, 30.904808 ], [ 115.07759424, 30.90478806 ], [ 115.07757426, 30.90476813 ], [ 115.07756436, 30.90474815 ], [ 115.07756436, 30.9046982 ], [ 115.07758434, 30.9046082 ], [ 115.07761422, 30.90444827 ], [ 115.07761422, 30.90435831 ], [ 115.07759442, 30.90420846 ], [ 115.07757444, 30.9041285 ], [ 115.07753448, 30.90401865 ], [ 115.07749452, 30.90390876 ], [ 115.07747454, 30.90385881 ], [ 115.07754456, 30.90354894 ], [ 115.0776045, 30.90339891 ], [ 115.07768442, 30.90326891 ], [ 115.07777424, 30.90313886 ], [ 115.07779422, 30.90308886 ], [ 115.07780412, 30.90306888 ], [ 115.07778414, 30.90291899 ], [ 115.07775426, 30.90286908 ], [ 115.0777143, 30.90277917 ], [ 115.0777044, 30.9027492 ], [ 115.07769432, 30.90267927 ], [ 115.07768442, 30.9026493 ], [ 115.07768442, 30.90257933 ], [ 115.0776945, 30.90232949 ], [ 115.0776945, 30.90213959 ], [ 115.07767452, 30.90198974 ], [ 115.07765454, 30.90190982 ], [ 115.0775748, 30.90172001 ], [ 115.07756472, 30.90166007 ], [ 115.07756472, 30.90164009 ], [ 115.0775748, 30.90162006 ], [ 115.0775847, 30.90160008 ], [ 115.07762466, 30.90158006 ], [ 115.07767452, 30.90157997 ], [ 115.07773446, 30.90161988 ], [ 115.0778043, 30.90167973 ], [ 115.07793408, 30.90182949 ], [ 115.07796414, 30.90188939 ], [ 115.07798394, 30.90193934 ], [ 115.07799402, 30.90202925 ], [ 115.07798394, 30.90212924 ], [ 115.07794398, 30.90223922 ], [ 115.07796396, 30.90229916 ], [ 115.07798394, 30.90234906 ], [ 115.07804388, 30.90242894 ], [ 115.07812362, 30.90255876 ], [ 115.07821344, 30.90265857 ], [ 115.0782435, 30.90268854 ], [ 115.07828346, 30.90270848 ], [ 115.07831334, 30.90271842 ], [ 115.0783632, 30.90272832 ], [ 115.07839326, 30.90273831 ], [ 115.07844312, 30.90272823 ], [ 115.0784631, 30.9027182 ], [ 115.07848308, 30.90268818 ], [ 115.07849298, 30.9026682 ], [ 115.07849298, 30.90259823 ], [ 115.078473, 30.9025283 ], [ 115.07844312, 30.90244842 ], [ 115.07838318, 30.90238853 ], [ 115.0782534, 30.90229875 ], [ 115.07821362, 30.90224885 ], [ 115.07819364, 30.90217892 ], [ 115.07819364, 30.902009 ], [ 115.07818374, 30.90191909 ], [ 115.07816376, 30.90182918 ], [ 115.0781337, 30.90173927 ], [ 115.07809392, 30.9016094 ], [ 115.07806386, 30.90145955 ], [ 115.07809392, 30.90133958 ], [ 115.07813388, 30.90119958 ], [ 115.07818374, 30.9010896 ], [ 115.07829354, 30.90092954 ], [ 115.07836356, 30.9008295 ], [ 115.07838354, 30.90077951 ], [ 115.07841342, 30.90072951 ], [ 115.07856318, 30.90041951 ], [ 115.07859324, 30.90031952 ], [ 115.0786332, 30.90013961 ], [ 115.07867316, 30.89998962 ], [ 115.07872302, 30.8999196 ], [ 115.0787529, 30.8998796 ], [ 115.0788429, 30.89979954 ], [ 115.07893272, 30.89970945 ], [ 115.07898258, 30.89959947 ], [ 115.07905242, 30.89939949 ], [ 115.07918238, 30.89913948 ], [ 115.07933214, 30.89885945 ], [ 115.07947182, 30.89860943 ], [ 115.0794819, 30.8985894 ], [ 115.0794918, 30.89856942 ], [ 115.07954184, 30.89852937 ], [ 115.07966154, 30.89846925 ], [ 115.07984136, 30.89839905 ], [ 115.0799211, 30.89835896 ], [ 115.07994108, 30.89833898 ], [ 115.07996106, 30.89831895 ], [ 115.07997114, 30.89829893 ], [ 115.07998104, 30.89823899 ], [ 115.07998104, 30.89816901 ], [ 115.07996106, 30.89804913 ], [ 115.07989122, 30.89786931 ], [ 115.07983146, 30.89769953 ], [ 115.07973156, 30.89736986 ], [ 115.07962176, 30.89715012 ], [ 115.07947218, 30.89687049 ], [ 115.07928246, 30.89636109 ], [ 115.07921262, 30.89621129 ], [ 115.07892318, 30.89571197 ], [ 115.07852412, 30.89515284 ], [ 115.07848416, 30.89510294 ], [ 115.0784343, 30.89503305 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509932", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07704434, 30.91158468 ], [ 115.07722398, 30.91134456 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.509933", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "1.656", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07722398, 30.91134456 ], [ 115.07743368, 30.91098452 ], [ 115.07753358, 30.91084443 ], [ 115.07765346, 30.91075434 ], [ 115.07770332, 30.91072428 ], [ 115.0779429, 30.91067397 ], [ 115.07801274, 30.91064391 ], [ 115.07809266, 30.91058384 ], [ 115.0781526, 30.91051382 ], [ 115.07817258, 30.91046382 ], [ 115.07823234, 30.91021385 ], [ 115.07836212, 30.9100338 ], [ 115.07843214, 30.9099038 ], [ 115.07844204, 30.90983382 ], [ 115.07843214, 30.90975386 ], [ 115.07835222, 30.90960405 ], [ 115.07827248, 30.90943427 ], [ 115.07819256, 30.90930444 ], [ 115.07810274, 30.90920463 ], [ 115.07807286, 30.90917471 ], [ 115.0780329, 30.90915477 ], [ 115.07799294, 30.90914483 ], [ 115.07790312, 30.90912498 ], [ 115.07768352, 30.90912525 ], [ 115.07744394, 30.90915554 ], [ 115.07734404, 30.9091757 ], [ 115.07709456, 30.90925598 ], [ 115.0769547, 30.90929612 ], [ 115.07685498, 30.90931628 ], [ 115.07675508, 30.90929639 ], [ 115.07671512, 30.90928644 ], [ 115.07666526, 30.90925656 ], [ 115.07660532, 30.90919667 ], [ 115.07654556, 30.9091068 ], [ 115.07642568, 30.90883712 ], [ 115.0763859, 30.90870725 ], [ 115.07637582, 30.90866729 ], [ 115.07637582, 30.90862733 ], [ 115.07637582, 30.90852738 ], [ 115.0763958, 30.90843743 ], [ 115.07644584, 30.90833739 ], [ 115.07679522, 30.90799715 ], [ 115.07699484, 30.907787 ], [ 115.07708466, 30.90772692 ], [ 115.07717466, 30.90767684 ], [ 115.0773642, 30.90762662 ], [ 115.07741424, 30.90760655 ], [ 115.07744412, 30.90759651 ], [ 115.07747418, 30.90757649 ], [ 115.07750406, 30.90755646 ], [ 115.07752404, 30.90752645 ], [ 115.07754402, 30.90749648 ], [ 115.0775541, 30.90701673 ], [ 115.07757408, 30.90692678 ], [ 115.07761386, 30.90687674 ], [ 115.07764392, 30.90683673 ], [ 115.07773374, 30.90677666 ], [ 115.07781366, 30.90673656 ], [ 115.07796342, 30.90669638 ], [ 115.0782129, 30.90666609 ], [ 115.07833278, 30.90666591 ], [ 115.07841252, 30.90666582 ], [ 115.07851242, 30.90668567 ], [ 115.07860224, 30.90672554 ], [ 115.07870214, 30.90678534 ], [ 115.07880186, 30.90682521 ], [ 115.07889168, 30.90683507 ], [ 115.07895162, 30.90682499 ], [ 115.07899158, 30.90681495 ], [ 115.07904144, 30.90679488 ], [ 115.0790814, 30.90677486 ], [ 115.07916132, 30.90671478 ], [ 115.07923116, 30.90665471 ], [ 115.07927112, 30.90659472 ], [ 115.07937102, 30.90637472 ], [ 115.07945076, 30.90623468 ], [ 115.07954076, 30.90610467 ], [ 115.07958072, 30.90605463 ], [ 115.07968044, 30.90597453 ], [ 115.07975028, 30.90592449 ], [ 115.07991012, 30.90581442 ], [ 115.08009012, 30.90566448 ], [ 115.0802901, 30.90553448 ], [ 115.08044994, 30.90543453 ], [ 115.08055002, 30.90535452 ], [ 115.0807599, 30.90522456 ], [ 115.08081984, 30.90517457 ], [ 115.08082992, 30.9051446 ], [ 115.08082992, 30.90511458 ], [ 115.08082992, 30.9050946 ], [ 115.08079986, 30.90506463 ], [ 115.08077988, 30.90504465 ], [ 115.08074982, 30.90503466 ], [ 115.08071994, 30.90503466 ], [ 115.08067998, 30.90503466 ], [ 115.08060996, 30.9050447 ], [ 115.08053004, 30.9050847 ], [ 115.08040008, 30.90514469 ], [ 115.08023016, 30.90527465 ], [ 115.08015006, 30.90533463 ], [ 115.08003018, 30.90541464 ], [ 115.07996016, 30.90545465 ], [ 115.0799202, 30.90548462 ], [ 115.07984028, 30.90551463 ], [ 115.07980032, 30.90552467 ], [ 115.07976036, 30.9055347 ], [ 115.0797204, 30.90552476 ], [ 115.07968062, 30.90552485 ], [ 115.07962068, 30.90548493 ], [ 115.07944104, 30.90535524 ], [ 115.07930118, 30.90529548 ], [ 115.07921136, 30.9052656 ], [ 115.07899176, 30.90519594 ], [ 115.07888196, 30.9051761 ], [ 115.07876226, 30.90518627 ], [ 115.07857254, 30.9052265 ], [ 115.07847264, 30.9052566 ], [ 115.07836284, 30.90531672 ], [ 115.07821308, 30.90543683 ], [ 115.07812326, 30.90548696 ], [ 115.07798358, 30.90554708 ], [ 115.07783382, 30.90558726 ], [ 115.077654, 30.90562749 ], [ 115.07762412, 30.90563753 ], [ 115.07758416, 30.90563757 ], [ 115.0775442, 30.90562763 ], [ 115.07752422, 30.90561764 ], [ 115.07749434, 30.90558771 ], [ 115.07747436, 30.90550779 ], [ 115.07748444, 30.90548781 ], [ 115.07749434, 30.90544781 ], [ 115.07751432, 30.90541779 ], [ 115.0775343, 30.90540776 ], [ 115.0775442, 30.90538778 ], [ 115.07759424, 30.90536771 ], [ 115.07770404, 30.9053376 ], [ 115.0778538, 30.90532739 ], [ 115.07799348, 30.90532721 ], [ 115.07804334, 30.90531717 ], [ 115.0780833, 30.90531708 ], [ 115.07810328, 30.90530709 ], [ 115.07812326, 30.90529706 ], [ 115.07814324, 30.90518708 ], [ 115.07815332, 30.90515711 ], [ 115.0781832, 30.90509712 ], [ 115.078293, 30.90501702 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510438", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.846", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99466266, 31.31298387 ], [ 114.99469272, 31.3129638 ], [ 114.99506136, 31.31267283 ], [ 114.9960978, 31.31192007 ], [ 114.99727356, 31.31097696 ], [ 114.9979014, 31.31054532 ], [ 114.99810066, 31.31038481 ], [ 114.99828012, 31.31018433 ], [ 114.99856902, 31.30976363 ], [ 114.99914718, 31.3087023 ], [ 114.99962544, 31.30789118 ], [ 115.00000416, 31.30718036 ], [ 115.00004394, 31.30710026 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510439", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.857", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00004394, 31.30710026 ], [ 115.00016364, 31.30696994 ], [ 115.00028316, 31.30678967 ], [ 115.00038288, 31.30657943 ], [ 115.00074162, 31.3059686 ], [ 115.00093098, 31.30553822 ], [ 115.00103052, 31.30535795 ], [ 115.00111026, 31.30512782 ], [ 115.00122996, 31.3049475 ], [ 115.00193754, 31.30367589 ], [ 115.00204716, 31.30342565 ], [ 115.00304364, 31.30161336 ], [ 115.00333254, 31.30100271 ], [ 115.00356186, 31.30037222 ], [ 115.0036614, 31.30004205 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510440", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.485", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0036614, 31.30004205 ], [ 115.00401024, 31.29888141 ], [ 115.00414974, 31.29851111 ], [ 115.00440876, 31.29764063 ], [ 115.0049169, 31.2966995 ], [ 115.00527564, 31.29590871 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510441", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.681", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00831494, 31.286183 ], [ 115.00839468, 31.28602284 ], [ 115.0085043, 31.2857726 ], [ 115.00857396, 31.2855125 ], [ 115.00856406, 31.28524263 ], [ 115.00853418, 31.28497286 ], [ 115.00842456, 31.28445338 ], [ 115.0083549, 31.28421366 ], [ 115.00828524, 31.28369409 ], [ 115.00813566, 31.2830748 ], [ 115.008066, 31.28283509 ], [ 115.00800624, 31.28257535 ], [ 115.00801614, 31.28206554 ], [ 115.0080561, 31.28174559 ], [ 115.00813584, 31.28146547 ], [ 115.00828542, 31.2810552 ], [ 115.00837506, 31.28083506 ], [ 115.00852446, 31.28058473 ], [ 115.00866414, 31.28022446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510442", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.178", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01963802, 31.26310106 ], [ 115.02008658, 31.26295989 ], [ 115.02059472, 31.26284852 ], [ 115.02144198, 31.26271622 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510443", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.278", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01274042, 31.27078688 ], [ 115.01327862, 31.27056543 ], [ 115.01374698, 31.27041414 ], [ 115.01414568, 31.27025309 ], [ 115.01429508, 31.27014275 ], [ 115.01448462, 31.27006224 ], [ 115.01504262, 31.26985079 ], [ 115.01517222, 31.26976047 ], [ 115.01528184, 31.26962021 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510444", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.282", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0368201, 31.25885508 ], [ 115.037757, 31.25798294 ], [ 115.03795644, 31.25783246 ], [ 115.03809594, 31.25768216 ], [ 115.0382556, 31.25754194 ], [ 115.03841526, 31.25743164 ], [ 115.03894392, 31.25710076 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510445", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.687", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03894392, 31.25710076 ], [ 115.03898388, 31.25696076 ], [ 115.03904382, 31.25681069 ], [ 115.03912356, 31.25662061 ], [ 115.03926324, 31.25635047 ], [ 115.03958256, 31.25598003 ], [ 115.03974204, 31.2558098 ], [ 115.0400214, 31.25551937 ], [ 115.04032074, 31.25518893 ], [ 115.0407297, 31.25479829 ], [ 115.04123856, 31.25424753 ], [ 115.04183706, 31.25367662 ], [ 115.04279484, 31.25272514 ], [ 115.04328372, 31.2522044 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510446", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04328372, 31.2522044 ], [ 115.04349324, 31.25198408 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510447", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.191", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02144198, 31.26271622 ], [ 115.02162144, 31.26268575 ], [ 115.02211968, 31.2625944 ], [ 115.02260802, 31.26246309 ], [ 115.02335556, 31.26223112 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510448", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.359", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02335556, 31.26223112 ], [ 115.0243821, 31.26175848 ], [ 115.02540864, 31.26131582 ], [ 115.02591696, 31.26108452 ], [ 115.02622602, 31.26098372 ], [ 115.02667458, 31.26079256 ], [ 115.0269237, 31.26072186 ], [ 115.02741204, 31.2605406 ], [ 115.02763128, 31.26043004 ], [ 115.02788058, 31.26035939 ], [ 115.02809982, 31.26027884 ], [ 115.02883728, 31.26012683 ], [ 115.02959472, 31.26002477 ], [ 115.02987372, 31.260024 ], [ 115.03132884, 31.25986002 ], [ 115.0327143, 31.25973623 ], [ 115.03301328, 31.25967543 ], [ 115.03392012, 31.25958291 ], [ 115.03446822, 31.25950142 ], [ 115.03474722, 31.25949062 ], [ 115.0356042, 31.25939819 ], [ 115.0358832, 31.25933744 ], [ 115.0361424, 31.25926674 ], [ 115.03638162, 31.25915613 ], [ 115.0368201, 31.25885508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510632", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.802", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82841412, 31.17369816 ], [ 114.82840386, 31.1748975 ], [ 114.82838388, 31.17516732 ], [ 114.82835382, 31.17527721 ], [ 114.82835382, 31.17532716 ], [ 114.8282937, 31.17551697 ], [ 114.82824348, 31.17565683 ], [ 114.82812324, 31.17597642 ], [ 114.82786278, 31.17662564 ], [ 114.82737156, 31.17783411 ], [ 114.82724124, 31.17851352 ], [ 114.82716114, 31.17882321 ], [ 114.82703082, 31.17910284 ], [ 114.82694064, 31.17927258 ], [ 114.82683048, 31.17938234 ], [ 114.82654986, 31.17958173 ], [ 114.8262993, 31.17970121 ], [ 114.82618914, 31.179771 ], [ 114.82608888, 31.17988076 ], [ 114.82604874, 31.17994065 ], [ 114.82602876, 31.18003056 ], [ 114.82602876, 31.1801405 ], [ 114.82605882, 31.18028049 ], [ 114.8260788, 31.18036046 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510694", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86951244, 31.33556442 ], [ 114.86961252, 31.3354346 ], [ 114.869853, 31.33498505 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510695", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.231", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83023716, 31.30229399 ], [ 114.83025714, 31.30236401 ], [ 114.83039736, 31.30270412 ], [ 114.83048754, 31.30285424 ], [ 114.83075808, 31.30304468 ], [ 114.83090838, 31.3031849 ], [ 114.83145954, 31.30364574 ], [ 114.8317101, 31.30389612 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510843", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.122", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8341149, 31.30058178 ], [ 114.83341362, 31.30150032 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510844", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85307484, 31.30117866 ], [ 114.8529447, 31.30117848 ], [ 114.85264428, 31.30133805 ], [ 114.85244394, 31.30143773 ], [ 114.8519232, 31.3017269 ], [ 114.85144242, 31.30198614 ], [ 114.8512221, 31.30209581 ], [ 114.85100178, 31.30220547 ], [ 114.85086156, 31.30221528 ], [ 114.85076148, 31.30221515 ], [ 114.85061118, 31.30220498 ], [ 114.85048104, 31.30216484 ], [ 114.85032084, 31.30210467 ], [ 114.85012068, 31.30201449 ], [ 114.84988038, 31.30188426 ], [ 114.8493096, 31.30158371 ], [ 114.8491494, 31.30150356 ], [ 114.84886914, 31.30135331 ], [ 114.8485788, 31.30122303 ], [ 114.8484186, 31.30114289 ], [ 114.84811818, 31.3010226 ], [ 114.84774774, 31.30084224 ], [ 114.8473773, 31.30067187 ], [ 114.84717714, 31.3005717 ], [ 114.84691668, 31.30045146 ], [ 114.8465763, 31.30030112 ], [ 114.84614574, 31.3000907 ], [ 114.8459256, 31.29998049 ], [ 114.84586548, 31.29994044 ], [ 114.8456151, 31.2998202 ], [ 114.84533484, 31.29967994 ], [ 114.84501444, 31.29952964 ], [ 114.84458388, 31.29931922 ], [ 114.84439362, 31.29923903 ], [ 114.84422352, 31.29915888 ], [ 114.84405324, 31.29909872 ], [ 114.84388296, 31.2990885 ], [ 114.8436126, 31.29905817 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510845", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.295", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8317101, 31.30389612 ], [ 114.832161, 31.30422683 ], [ 114.83257176, 31.30455749 ], [ 114.8329827, 31.3049381 ], [ 114.83339346, 31.30540866 ], [ 114.83385444, 31.30581938 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510846", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83385444, 31.30581938 ], [ 114.83399466, 31.30593957 ], [ 114.83422524, 31.30617992 ], [ 114.83443566, 31.30646022 ], [ 114.83459586, 31.30674039 ], [ 114.83474616, 31.30705058 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510847", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.555", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83718102, 31.31043399 ], [ 114.837201, 31.310604 ], [ 114.83723106, 31.31135379 ], [ 114.83752158, 31.31228403 ], [ 114.83770194, 31.31263422 ], [ 114.83804268, 31.31312472 ], [ 114.83811288, 31.31328479 ], [ 114.83816292, 31.31346483 ], [ 114.83823294, 31.31364488 ], [ 114.83860356, 31.31419532 ], [ 114.83888418, 31.31456562 ], [ 114.8392548, 31.31500608 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510848", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.242", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8392548, 31.31500608 ], [ 114.8399559, 31.31585694 ], [ 114.84029646, 31.31621739 ], [ 114.8404968, 31.31637768 ], [ 114.84093762, 31.3166183 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510849", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.242", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84735822, 31.32802485 ], [ 114.84753858, 31.32821507 ], [ 114.84826974, 31.32893601 ], [ 114.84842994, 31.32914616 ], [ 114.8486904, 31.32951647 ], [ 114.84890082, 31.32975672 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510850", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.412", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86984976, 31.29430379 ], [ 114.86961936, 31.2944634 ], [ 114.86924874, 31.29462284 ], [ 114.86898846, 31.29468246 ], [ 114.86884824, 31.29472229 ], [ 114.86852766, 31.29476184 ], [ 114.8681673, 31.29476139 ], [ 114.86796696, 31.29474119 ], [ 114.86780676, 31.294701 ], [ 114.86731626, 31.29447051 ], [ 114.86707596, 31.29443024 ], [ 114.86666538, 31.29431981 ], [ 114.8662548, 31.29426932 ], [ 114.8660946, 31.29426914 ], [ 114.8659443, 31.29428894 ], [ 114.86588436, 31.29430883 ], [ 114.8657841, 31.29437867 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510851", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.274", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85668978, 31.3009533 ], [ 114.85663974, 31.30096325 ], [ 114.8559489, 31.30102233 ], [ 114.85537794, 31.30115157 ], [ 114.85512756, 31.30125116 ], [ 114.85495746, 31.30136091 ], [ 114.85479708, 31.3014906 ], [ 114.8546268, 31.30155036 ], [ 114.85441656, 31.30156008 ], [ 114.8542263, 31.30149992 ], [ 114.85402614, 31.30137972 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510852", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.095", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85402614, 31.30137972 ], [ 114.85392606, 31.30132964 ], [ 114.85356552, 31.30119927 ], [ 114.853185, 31.30116881 ], [ 114.85307484, 31.30117866 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510853", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.268", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83554734, 31.2985148 ], [ 114.8352669, 31.29890423 ], [ 114.83490618, 31.29948342 ], [ 114.8346558, 31.29984293 ], [ 114.83455554, 31.30001267 ], [ 114.83448552, 31.30015253 ], [ 114.83440542, 31.30026237 ], [ 114.8341149, 31.30058178 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510854", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.421", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84890082, 31.32975672 ], [ 114.8492214, 31.3300971 ], [ 114.85005264, 31.33119807 ], [ 114.85083402, 31.33202904 ], [ 114.85117458, 31.33249943 ], [ 114.8512347, 31.33262948 ], [ 114.85130472, 31.33290947 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510855", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.306", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85130472, 31.33290947 ], [ 114.85129464, 31.3330694 ], [ 114.85119456, 31.33332909 ], [ 114.85105416, 31.33372874 ], [ 114.8510241, 31.33383863 ], [ 114.85101402, 31.33395855 ], [ 114.85104408, 31.33407857 ], [ 114.85119438, 31.33433871 ], [ 114.85120446, 31.33446867 ], [ 114.8511843, 31.33467855 ], [ 114.85104408, 31.33508814 ], [ 114.85092384, 31.33538784 ], [ 114.85082358, 31.3355376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510856", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.267", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8243166, 31.27457466 ], [ 114.8242563, 31.2756341 ], [ 114.82430634, 31.27590405 ], [ 114.82444656, 31.27616415 ], [ 114.82529778, 31.27758489 ], [ 114.8258286, 31.27837536 ], [ 114.82594884, 31.27866543 ], [ 114.8259789, 31.2788754 ], [ 114.82599888, 31.27906535 ], [ 114.82603884, 31.27965512 ], [ 114.8260689, 31.28018495 ], [ 114.8260788, 31.2805548 ], [ 114.82605882, 31.28073467 ], [ 114.82602876, 31.28083461 ], [ 114.8260086, 31.28090454 ], [ 114.8259285, 31.28108432 ], [ 114.82581834, 31.28127408 ], [ 114.82541748, 31.28183316 ], [ 114.82531722, 31.28197293 ], [ 114.8250969, 31.28228244 ], [ 114.8249565, 31.28250213 ], [ 114.82489638, 31.28266197 ], [ 114.82484634, 31.28285178 ], [ 114.82482636, 31.28301171 ], [ 114.82482618, 31.28325161 ], [ 114.82484616, 31.28351148 ], [ 114.82489638, 31.28378148 ], [ 114.82494642, 31.28400144 ], [ 114.8251266, 31.2847214 ], [ 114.82519662, 31.2849914 ], [ 114.82524666, 31.2851714 ], [ 114.82531686, 31.28531144 ], [ 114.82532676, 31.28533146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510857", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.945", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82799436, 31.2647949 ], [ 114.82782408, 31.2649146 ], [ 114.8275737, 31.26503412 ], [ 114.8273532, 31.26517371 ], [ 114.8272029, 31.2653534 ], [ 114.82717284, 31.26542333 ], [ 114.82716276, 31.26550329 ], [ 114.82715286, 31.26562322 ], [ 114.82714278, 31.26571313 ], [ 114.82714278, 31.26601301 ], [ 114.82712262, 31.26635285 ], [ 114.82703208, 31.26936132 ], [ 114.82700202, 31.26965117 ], [ 114.8269419, 31.26993093 ], [ 114.82685154, 31.27020066 ], [ 114.8267313, 31.27047035 ], [ 114.82661106, 31.27073004 ], [ 114.82645086, 31.27098969 ], [ 114.82623036, 31.27119921 ], [ 114.82570944, 31.27153824 ], [ 114.82494804, 31.27213674 ], [ 114.8248278, 31.27225649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510858", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.414", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82884414, 31.29876288 ], [ 114.8288742, 31.29882291 ], [ 114.82898454, 31.29916293 ], [ 114.82921494, 31.29971315 ], [ 114.82954578, 31.30061333 ], [ 114.82971606, 31.3010235 ], [ 114.83000658, 31.3016738 ], [ 114.8301369, 31.3020239 ], [ 114.83023716, 31.30229399 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510859", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.606", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84093762, 31.3166183 ], [ 114.84138834, 31.31685896 ], [ 114.84219978, 31.31735009 ], [ 114.84237006, 31.31748036 ], [ 114.84251028, 31.31763053 ], [ 114.8428809, 31.31821094 ], [ 114.84313146, 31.31856122 ], [ 114.84321156, 31.31874131 ], [ 114.84374238, 31.32051156 ], [ 114.8439627, 31.32116172 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510860", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.842", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8439627, 31.32116172 ], [ 114.84405288, 31.32138177 ], [ 114.84416304, 31.32159188 ], [ 114.84462384, 31.32220244 ], [ 114.845886, 31.32371399 ], [ 114.84599616, 31.32389412 ], [ 114.84606618, 31.32409415 ], [ 114.8462064, 31.32475416 ], [ 114.8464368, 31.32567423 ], [ 114.84664704, 31.32636431 ], [ 114.8468373, 31.32726426 ], [ 114.8469174, 31.32748431 ], [ 114.84704772, 31.32767448 ], [ 114.84735822, 31.32802485 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510861", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.379", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8657841, 31.29437867 ], [ 114.86568402, 31.29455844 ], [ 114.86556378, 31.29473817 ], [ 114.86535336, 31.29485783 ], [ 114.86510298, 31.29490751 ], [ 114.86488266, 31.29492722 ], [ 114.8646825, 31.29491696 ], [ 114.86456226, 31.29489684 ], [ 114.8644422, 31.29484671 ], [ 114.86438208, 31.29480666 ], [ 114.86429208, 31.29474659 ], [ 114.8639517, 31.29449634 ], [ 114.86374128, 31.29436616 ], [ 114.86360124, 31.29430599 ], [ 114.863481, 31.29427589 ], [ 114.86337084, 31.29427575 ], [ 114.86323062, 31.29428556 ], [ 114.86312046, 31.29432539 ], [ 114.86298024, 31.29438519 ], [ 114.86284002, 31.29455489 ], [ 114.86270988, 31.29478461 ], [ 114.86268972, 31.29484455 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510862", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.170", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86268972, 31.29484455 ], [ 114.86226888, 31.29578343 ], [ 114.86207862, 31.29615297 ], [ 114.86199852, 31.29625283 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510863", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.229", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8248278, 31.27225649 ], [ 114.82471764, 31.2723563 ], [ 114.82454718, 31.27260591 ], [ 114.82443702, 31.27290561 ], [ 114.82440696, 31.27321539 ], [ 114.82435674, 31.27382505 ], [ 114.82433658, 31.27422483 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510864", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.039", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82433658, 31.27422483 ], [ 114.8243166, 31.27457466 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510865", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.870", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82532676, 31.28533146 ], [ 114.82538688, 31.2854315 ], [ 114.82549704, 31.28557163 ], [ 114.82615818, 31.28636232 ], [ 114.82678908, 31.28728293 ], [ 114.82690932, 31.28749304 ], [ 114.82695936, 31.28770301 ], [ 114.82689924, 31.28828265 ], [ 114.82687908, 31.2888024 ], [ 114.8267691, 31.29081165 ], [ 114.82661898, 31.29188112 ], [ 114.82656894, 31.2923309 ], [ 114.82655904, 31.29255086 ], [ 114.82660908, 31.29275088 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510866", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.620", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8436126, 31.29905817 ], [ 114.84341244, 31.29902793 ], [ 114.842511, 31.29884681 ], [ 114.8420502, 31.29876603 ], [ 114.84170946, 31.29870546 ], [ 114.84027666, 31.29845306 ], [ 114.83982576, 31.29836229 ], [ 114.83961534, 31.29830195 ], [ 114.83930466, 31.29818144 ], [ 114.83780166, 31.29751899 ], [ 114.83757126, 31.29743862 ], [ 114.83742096, 31.29740838 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510961", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83474616, 31.30705058 ], [ 114.83494668, 31.30747079 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.510962", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.396", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83494668, 31.30747079 ], [ 114.8350869, 31.30777098 ], [ 114.83527716, 31.30812122 ], [ 114.83560782, 31.30858166 ], [ 114.83574822, 31.30885184 ], [ 114.8359986, 31.30915221 ], [ 114.8362992, 31.30946267 ], [ 114.83665002, 31.30992315 ], [ 114.83680032, 31.3100334 ], [ 114.8369706, 31.31013371 ], [ 114.837111, 31.31026394 ], [ 114.83718102, 31.31043399 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511139", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "3.322", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8239107, 31.22158721 ], [ 114.82388064, 31.22186702 ], [ 114.82389072, 31.22221685 ], [ 114.82393068, 31.22254679 ], [ 114.82426116, 31.22495622 ], [ 114.82413084, 31.22648523 ], [ 114.82414074, 31.22679506 ], [ 114.82429104, 31.22742506 ], [ 114.82465176, 31.22863515 ], [ 114.82472178, 31.22893512 ], [ 114.82472178, 31.22922497 ], [ 114.82467174, 31.22951472 ], [ 114.82459146, 31.22978445 ], [ 114.82453134, 31.23007421 ], [ 114.82452126, 31.23039402 ], [ 114.82468164, 31.23136391 ], [ 114.82474176, 31.23167387 ], [ 114.82483176, 31.23196394 ], [ 114.82485192, 31.2321339 ], [ 114.82500222, 31.23241407 ], [ 114.82525278, 31.23287433 ], [ 114.82557336, 31.23341474 ], [ 114.82572366, 31.23357494 ], [ 114.82589394, 31.23368523 ], [ 114.82608438, 31.23375552 ], [ 114.82656534, 31.23385637 ], [ 114.82684596, 31.23388688 ], [ 114.82728678, 31.23390771 ], [ 114.82775784, 31.23391856 ], [ 114.82788816, 31.23393881 ], [ 114.82804836, 31.23393912 ], [ 114.82825878, 31.23395946 ], [ 114.82847928, 31.23403988 ], [ 114.82870986, 31.23422019 ], [ 114.82895034, 31.23447057 ], [ 114.82908048, 31.2347007 ], [ 114.82916076, 31.23497075 ], [ 114.82924086, 31.23544068 ], [ 114.82932096, 31.23575073 ], [ 114.8295213, 31.2362109 ], [ 114.82979184, 31.23672116 ], [ 114.8300523, 31.23717143 ], [ 114.83038278, 31.2377517 ], [ 114.83049294, 31.23801176 ], [ 114.830523, 31.23824171 ], [ 114.830523, 31.23842162 ], [ 114.83043282, 31.23870134 ], [ 114.83041284, 31.23880124 ], [ 114.83039268, 31.23894114 ], [ 114.83042274, 31.23906111 ], [ 114.83051292, 31.23927117 ], [ 114.83071326, 31.23964134 ], [ 114.83082342, 31.23977148 ], [ 114.8309937, 31.23997169 ], [ 114.83108388, 31.24015173 ], [ 114.83102376, 31.24031157 ], [ 114.8308434, 31.2404112 ], [ 114.83035236, 31.24052033 ], [ 114.83010198, 31.24058985 ], [ 114.82920018, 31.24104813 ], [ 114.82905996, 31.24110785 ], [ 114.8289498, 31.24117764 ], [ 114.82885962, 31.24126746 ], [ 114.82879932, 31.24137731 ], [ 114.82879932, 31.24151721 ], [ 114.8288094, 31.24171715 ], [ 114.82884936, 31.24195709 ], [ 114.8288895, 31.24228703 ], [ 114.82891956, 31.24254695 ], [ 114.82895952, 31.24274693 ], [ 114.82903962, 31.24302692 ], [ 114.82908966, 31.24330686 ], [ 114.8290596, 31.24358667 ], [ 114.82896942, 31.24386639 ], [ 114.82869888, 31.24441566 ], [ 114.82857864, 31.24470533 ], [ 114.82847838, 31.24501502 ], [ 114.828318, 31.24563444 ], [ 114.82826778, 31.24592424 ], [ 114.82823772, 31.24622403 ], [ 114.8282676, 31.24734359 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511140", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.060", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8346468, 31.16892173 ], [ 114.83458668, 31.16916149 ], [ 114.83446644, 31.16944116 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511141", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.807", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83446644, 31.16944116 ], [ 114.83437626, 31.1696109 ], [ 114.83422596, 31.16982051 ], [ 114.83401554, 31.16998008 ], [ 114.83390538, 31.17002985 ], [ 114.83361468, 31.17013925 ], [ 114.83231202, 31.17055671 ], [ 114.83121996, 31.17089462 ], [ 114.83050842, 31.17105329 ], [ 114.83009766, 31.1711625 ], [ 114.82995744, 31.1712422 ], [ 114.8297769, 31.17136181 ], [ 114.82938612, 31.17169094 ], [ 114.82906554, 31.1720202 ], [ 114.82888518, 31.17225974 ], [ 114.82861446, 31.17280896 ], [ 114.8285844, 31.17293888 ], [ 114.82854444, 31.1730687 ], [ 114.82845426, 31.17339837 ], [ 114.82842402, 31.1736182 ], [ 114.82841412, 31.17369816 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511142", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.160", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82592652, 31.20317987 ], [ 114.8259366, 31.20332985 ], [ 114.8259366, 31.20355971 ], [ 114.82588638, 31.20378953 ], [ 114.82574616, 31.20399918 ], [ 114.82537536, 31.20448824 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511143", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.400", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82537536, 31.20448824 ], [ 114.82436304, 31.2057158 ], [ 114.8242428, 31.20591546 ], [ 114.82426278, 31.20610541 ], [ 114.82438302, 31.20649547 ], [ 114.82452324, 31.20729539 ], [ 114.8246334, 31.20775538 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511144", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.117", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8246334, 31.20775538 ], [ 114.82480368, 31.20846534 ], [ 114.82483374, 31.20873525 ], [ 114.82484382, 31.20879524 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511145", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.431", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82484382, 31.20879524 ], [ 114.82496388, 31.21078451 ], [ 114.82498386, 31.21142423 ], [ 114.82510392, 31.21349346 ], [ 114.8251239, 31.2143531 ], [ 114.82501356, 31.2169316 ], [ 114.82490322, 31.21751111 ], [ 114.82468272, 31.21840026 ], [ 114.8239107, 31.22158721 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511146", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.400", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8282676, 31.24734359 ], [ 114.82829766, 31.24804329 ], [ 114.82828758, 31.24831316 ], [ 114.82824744, 31.24844303 ], [ 114.8281974, 31.24851291 ], [ 114.82815726, 31.24856282 ], [ 114.8280471, 31.24866258 ], [ 114.82772634, 31.2488919 ], [ 114.82739568, 31.24911123 ], [ 114.82725546, 31.24923098 ], [ 114.82713522, 31.24936071 ], [ 114.82701498, 31.24949045 ], [ 114.82689474, 31.24964016 ], [ 114.82680456, 31.24977993 ], [ 114.82673436, 31.24991975 ], [ 114.82668432, 31.25005961 ], [ 114.82665426, 31.25023947 ], [ 114.82664418, 31.25041938 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511147", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.199", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82664418, 31.25041938 ], [ 114.82664418, 31.25082915 ], [ 114.82664418, 31.25109906 ], [ 114.826644, 31.25139885 ], [ 114.82667388, 31.25167871 ], [ 114.82671384, 31.25187864 ], [ 114.82680402, 31.25219864 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511148", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.883", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8260788, 31.18036046 ], [ 114.82617906, 31.18070048 ], [ 114.82631928, 31.18110053 ], [ 114.82636932, 31.18130051 ], [ 114.82639938, 31.18154045 ], [ 114.8263893, 31.1817803 ], [ 114.8261688, 31.18298936 ], [ 114.82609878, 31.18323915 ], [ 114.82595838, 31.1834588 ], [ 114.82548732, 31.18372781 ], [ 114.82532712, 31.18383743 ], [ 114.82522686, 31.18394723 ], [ 114.82511652, 31.18410693 ], [ 114.82503642, 31.18441662 ], [ 114.82507638, 31.18471659 ], [ 114.82534692, 31.1862564 ], [ 114.82534692, 31.18646628 ], [ 114.8253669, 31.18694612 ], [ 114.82536672, 31.18764582 ], [ 114.82536672, 31.18786569 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.511149", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.002", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82536672, 31.18786569 ], [ 114.82536672, 31.18807562 ], [ 114.82536672, 31.18868532 ], [ 114.8253867, 31.18899524 ], [ 114.82545672, 31.18957511 ], [ 114.8254668, 31.18984502 ], [ 114.82535646, 31.19009468 ], [ 114.82500582, 31.19053383 ], [ 114.8249457, 31.19059368 ], [ 114.82455474, 31.19101277 ], [ 114.82419402, 31.19135193 ], [ 114.82389342, 31.19160128 ], [ 114.8235327, 31.19179055 ], [ 114.82315182, 31.19196978 ], [ 114.8218992, 31.19252724 ], [ 114.82179894, 31.19258705 ], [ 114.82168878, 31.19276673 ], [ 114.8215986, 31.19291654 ], [ 114.82149834, 31.19310626 ], [ 114.82138818, 31.19333594 ], [ 114.82124778, 31.19370552 ], [ 114.82116768, 31.19398524 ], [ 114.82112754, 31.19416511 ], [ 114.82110738, 31.19454486 ], [ 114.82111746, 31.19475479 ], [ 114.82115742, 31.1949248 ], [ 114.82119756, 31.19501484 ], [ 114.82125768, 31.19519484 ], [ 114.82172856, 31.19591538 ], [ 114.82215948, 31.19653589 ], [ 114.82318134, 31.19767718 ], [ 114.82341174, 31.19798745 ], [ 114.82431354, 31.19919863 ], [ 114.82470432, 31.1998091 ], [ 114.82490466, 31.20008936 ], [ 114.82507512, 31.20037952 ], [ 114.82519518, 31.2006996 ], [ 114.82576632, 31.20254987 ], [ 114.82587648, 31.20278994 ], [ 114.82590654, 31.20292994 ], [ 114.82592652, 31.20317987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.512755", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.294", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98105916, 31.35298032 ], [ 114.98122854, 31.3528599 ], [ 114.98144778, 31.35270933 ], [ 114.98202594, 31.3522479 ], [ 114.9825141, 31.35180659 ], [ 114.9829227, 31.35148547 ], [ 114.98303214, 31.35137517 ], [ 114.98311188, 31.35128495 ], [ 114.98313186, 31.35125489 ], [ 114.98315184, 31.35123482 ], [ 114.98316174, 31.35119481 ], [ 114.98317164, 31.35113478 ], [ 114.98318172, 31.35109478 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.512756", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.123", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8698485, 31.41092363 ], [ 114.86991852, 31.41119363 ], [ 114.86989836, 31.41168341 ], [ 114.86984814, 31.4120232 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.512757", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "4.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94430298, 31.41886046 ], [ 114.94422324, 31.41869063 ], [ 114.94401372, 31.41851103 ], [ 114.94378422, 31.41843143 ], [ 114.94327518, 31.41831231 ], [ 114.94304568, 31.41820269 ], [ 114.94269648, 31.41793332 ], [ 114.94259658, 31.41790353 ], [ 114.94215756, 31.41757431 ], [ 114.9418782, 31.41734481 ], [ 114.94172844, 31.41720509 ], [ 114.94147896, 31.41683559 ], [ 114.94137924, 31.41666576 ], [ 114.94118952, 31.41588623 ], [ 114.94105992, 31.41535653 ], [ 114.94104984, 31.41514656 ], [ 114.94098, 31.41483674 ], [ 114.94096002, 31.41442683 ], [ 114.94088028, 31.41397706 ], [ 114.94072062, 31.41376736 ], [ 114.94048104, 31.41358781 ], [ 114.94022166, 31.41351824 ], [ 114.93971262, 31.41326916 ], [ 114.93954306, 31.41311945 ], [ 114.93932346, 31.41296987 ], [ 114.93895428, 31.41264051 ], [ 114.93873468, 31.41250092 ], [ 114.93853506, 31.41232128 ], [ 114.93832554, 31.41217166 ], [ 114.93787644, 31.41200246 ], [ 114.93728784, 31.41192348 ], [ 114.9370083, 31.41191394 ], [ 114.93674892, 31.41185441 ], [ 114.93649944, 31.41176481 ], [ 114.93625986, 31.41158526 ], [ 114.93526212, 31.41114705 ], [ 114.93509238, 31.41105737 ], [ 114.93452358, 31.41086837 ], [ 114.93307674, 31.41048096 ], [ 114.9328872, 31.41039128 ], [ 114.93269748, 31.41024165 ], [ 114.93256788, 31.41003191 ], [ 114.93239814, 31.40990226 ], [ 114.93195912, 31.40945312 ], [ 114.93177948, 31.40909352 ], [ 114.93169974, 31.40885372 ], [ 114.93168984, 31.40864379 ], [ 114.9315003, 31.40772435 ], [ 114.93143046, 31.40726459 ], [ 114.93137052, 31.40701475 ], [ 114.93134064, 31.40678489 ], [ 114.93134064, 31.40657492 ], [ 114.93135054, 31.40637498 ], [ 114.9313905, 31.40617496 ], [ 114.9313905, 31.40572505 ], [ 114.93161028, 31.404515 ], [ 114.93167004, 31.40428496 ], [ 114.93171, 31.40402499 ], [ 114.93174996, 31.40376498 ], [ 114.93176004, 31.40349503 ], [ 114.93182988, 31.403255 ], [ 114.93188982, 31.40246507 ], [ 114.93186984, 31.40222517 ], [ 114.93186984, 31.40199522 ], [ 114.93170028, 31.40079584 ], [ 114.93158058, 31.3997963 ], [ 114.93150084, 31.39928658 ], [ 114.93152082, 31.39879667 ], [ 114.93159066, 31.39852662 ], [ 114.93172044, 31.39830648 ], [ 114.9322095, 31.39767581 ], [ 114.9325488, 31.39728534 ], [ 114.93298782, 31.39669476 ], [ 114.93316746, 31.39627455 ], [ 114.93330714, 31.39609437 ], [ 114.93339696, 31.39587428 ], [ 114.93347688, 31.39564419 ], [ 114.93352674, 31.39537419 ], [ 114.9337764, 31.39469397 ], [ 114.93376632, 31.39447401 ], [ 114.93368658, 31.39404426 ], [ 114.9334272, 31.39315497 ], [ 114.93339732, 31.39296507 ], [ 114.9331878, 31.39229561 ], [ 114.933078, 31.39207583 ], [ 114.93301806, 31.391906 ], [ 114.9329682, 31.39170611 ], [ 114.93279864, 31.39129652 ], [ 114.93242946, 31.3906473 ], [ 114.9322797, 31.39013768 ], [ 114.93216, 31.38961806 ], [ 114.93211014, 31.38914826 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.512758", "Name": "乘马北路", "pyname": "cmbl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97987296, 31.3539233 ], [ 114.9806205, 31.35332142 ], [ 114.98105916, 31.35298032 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513347", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.129", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79993848, 31.05722223 ], [ 114.80065002, 31.05651384 ], [ 114.80083038, 31.05634424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513348", "Name": "宋铁大桥", "pyname": "stdq", "kind_num": "1", "kind": "0408", "width": "55", "length": "0.440", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7968927, 31.06019556 ], [ 114.79701276, 31.0600958 ], [ 114.79792446, 31.0592277 ], [ 114.79873608, 31.05843953 ], [ 114.79935744, 31.05781092 ], [ 114.7994676, 31.05771116 ], [ 114.79993848, 31.05722223 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513374", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.347", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79351698, 31.0641687 ], [ 114.79408794, 31.06353983 ], [ 114.79430826, 31.06321034 ], [ 114.7948893, 31.06249155 ], [ 114.79536, 31.06185255 ], [ 114.79553028, 31.06170284 ], [ 114.79560048, 31.06161302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513375", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.151", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79560048, 31.06161302 ], [ 114.79565052, 31.06155312 ], [ 114.7958109, 31.06143338 ], [ 114.79638168, 31.06078452 ], [ 114.79658202, 31.06054494 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513376", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79658202, 31.06054494 ], [ 114.7965921, 31.06052496 ], [ 114.79672242, 31.06034523 ], [ 114.7968927, 31.06019556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513377", "Name": "铁门大道", "pyname": "tmdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8463135, 31.03988508 ], [ 114.84658404, 31.03979562 ], [ 114.84665424, 31.03976574 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513378", "Name": "铁门大道", "pyname": "tmdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.099", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84848808, 31.03833992 ], [ 114.84890892, 31.03797087 ], [ 114.84903906, 31.03783119 ], [ 114.84917946, 31.03767149 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513379", "Name": "铁门大道", "pyname": "tmdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.093", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84917946, 31.03767149 ], [ 114.8497704, 31.03700283 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513430", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.605", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80083038, 31.05634424 ], [ 114.8011209, 31.05603486 ], [ 114.80124114, 31.05592515 ], [ 114.80139144, 31.05581544 ], [ 114.80156172, 31.0557258 ], [ 114.8020326, 31.0555467 ], [ 114.80366592, 31.05503982 ], [ 114.80394654, 31.05497034 ], [ 114.80423706, 31.05485096 ], [ 114.80452776, 31.05478148 ], [ 114.8069826, 31.0540163 ], [ 114.80755392, 31.05384737 ], [ 114.80919714, 31.05330062 ], [ 114.8111712, 31.05267444 ], [ 114.81231348, 31.05230666 ], [ 114.81308514, 31.05207819 ], [ 114.81650208, 31.05097484 ], [ 114.81832584, 31.05036842 ], [ 114.81930774, 31.05005031 ], [ 114.81994908, 31.04981159 ], [ 114.82194312, 31.04897558 ], [ 114.82590132, 31.04723354 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513431", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.603", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86613312, 31.0197227 ], [ 114.86680416, 31.01917383 ], [ 114.86707434, 31.01899424 ], [ 114.86720466, 31.01888448 ], [ 114.86730474, 31.01878463 ], [ 114.8673348, 31.0187547 ], [ 114.86745504, 31.01860494 ], [ 114.86787552, 31.01803578 ], [ 114.86813598, 31.01768631 ], [ 114.86850642, 31.01718708 ], [ 114.86876688, 31.01683761 ], [ 114.86901726, 31.01650812 ], [ 114.8692275, 31.01622854 ], [ 114.86956806, 31.01579919 ], [ 114.86987838, 31.01538983 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513467", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.685", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82590132, 31.04723354 ], [ 114.82999974, 31.04543192 ], [ 114.83102196, 31.04499407 ], [ 114.83229456, 31.04440677 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513468", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.643", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83272548, 31.04423766 ], [ 114.83292582, 31.04414807 ], [ 114.83396802, 31.04376021 ], [ 114.8347296, 31.04348175 ], [ 114.83546112, 31.04324325 ], [ 114.83901846, 31.04215038 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513469", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.739", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83901846, 31.04215038 ], [ 114.84027108, 31.04176289 ], [ 114.84140328, 31.04139519 ], [ 114.8459328, 31.04001428 ], [ 114.8463135, 31.03988508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513470", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.719", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8497704, 31.03700283 ], [ 114.85013094, 31.03643358 ], [ 114.85050156, 31.03599429 ], [ 114.8507019, 31.03571471 ], [ 114.8513427, 31.03488599 ], [ 114.851493, 31.03471629 ], [ 114.85166328, 31.03442667 ], [ 114.85172322, 31.03436678 ], [ 114.8519736, 31.03401731 ], [ 114.85215396, 31.03378767 ], [ 114.85222398, 31.0337078 ], [ 114.8523642, 31.03351808 ], [ 114.85257444, 31.03324848 ], [ 114.85273482, 31.03302879 ], [ 114.85286496, 31.03282908 ], [ 114.85305522, 31.03256948 ], [ 114.85328562, 31.03228994 ], [ 114.85345572, 31.03205027 ], [ 114.85363608, 31.03181064 ], [ 114.8537862, 31.03161093 ], [ 114.85389636, 31.03146117 ], [ 114.85399662, 31.03131137 ], [ 114.85414674, 31.03112169 ], [ 114.854247, 31.03099187 ], [ 114.85435716, 31.0308521 ], [ 114.85439712, 31.03080219 ], [ 114.85443726, 31.03073226 ], [ 114.8545674, 31.0305825 ], [ 114.85467756, 31.03042275 ], [ 114.8548878, 31.03012319 ], [ 114.85506816, 31.02988356 ], [ 114.85522836, 31.02968385 ], [ 114.85545876, 31.02937434 ], [ 114.85568898, 31.0290548 ], [ 114.85596942, 31.02865538 ], [ 114.85626984, 31.028216 ], [ 114.85656036, 31.02763676 ], [ 114.85687086, 31.0271774 ], [ 114.85698102, 31.02707759 ], [ 114.85741158, 31.02670832 ], [ 114.85759176, 31.02656859 ], [ 114.85850292, 31.02582011 ], [ 114.8588334, 31.0255407 ], [ 114.85920384, 31.02525131 ], [ 114.85971468, 31.02483213 ], [ 114.86006514, 31.02456272 ], [ 114.86015514, 31.02449288 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513471", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.778", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86015514, 31.02449288 ], [ 114.86027538, 31.02440306 ], [ 114.86056572, 31.02416352 ], [ 114.86087622, 31.02391404 ], [ 114.86125674, 31.02362465 ], [ 114.86141694, 31.02348492 ], [ 114.86165724, 31.02329534 ], [ 114.86206782, 31.02296603 ], [ 114.86257848, 31.02256683 ], [ 114.86340954, 31.0219182 ], [ 114.86376, 31.0216388 ], [ 114.86404044, 31.02138927 ], [ 114.8643207, 31.02116972 ], [ 114.8647914, 31.0207905 ], [ 114.8651919, 31.02048117 ], [ 114.86552238, 31.02023169 ], [ 114.86599308, 31.0198325 ], [ 114.86613312, 31.0197227 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513472", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.029", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83229456, 31.04440677 ], [ 114.83257518, 31.04429733 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.513473", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.016", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83257518, 31.04429733 ], [ 114.83272548, 31.04423766 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514219", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.308", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17283656, 30.96145548 ], [ 115.1729667, 30.96119588 ], [ 115.17302682, 30.96087615 ], [ 115.17305706, 30.95946707 ], [ 115.17307722, 30.95897738 ], [ 115.17303708, 30.95870747 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514220", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17303708, 30.95870747 ], [ 115.1729469, 30.95846744 ], [ 115.17290694, 30.95824748 ], [ 115.17291684, 30.95810762 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514229", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.375", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18930476, 31.00217094 ], [ 115.18931466, 31.00214097 ], [ 115.18930476, 31.00184114 ], [ 115.1891748, 31.00093155 ], [ 115.1890947, 31.00063158 ], [ 115.1890146, 31.00000181 ], [ 115.18889436, 30.99939192 ], [ 115.18884432, 30.99905204 ], [ 115.18869402, 30.99886187 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514230", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.504", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18869402, 30.99886187 ], [ 115.18827318, 30.99843131 ], [ 115.18823322, 30.99837128 ], [ 115.18816302, 30.99821126 ], [ 115.18801272, 30.99786116 ], [ 115.18780248, 30.99731112 ], [ 115.18769232, 30.99695112 ], [ 115.18754202, 30.99635118 ], [ 115.18723152, 30.99553106 ], [ 115.1871012, 30.995231 ], [ 115.18699104, 30.99500091 ], [ 115.1868708, 30.99473087 ], [ 115.18682076, 30.99462084 ], [ 115.18675074, 30.99450078 ], [ 115.18672068, 30.99442077 ], [ 115.18666056, 30.99430071 ], [ 115.18660044, 30.99415068 ], [ 115.18653024, 30.99396069 ], [ 115.18649028, 30.9937707 ], [ 115.18628994, 30.99219125 ], [ 115.18619994, 30.99167136 ], [ 115.18590942, 30.99103124 ], [ 115.18560882, 30.990591 ], [ 115.18535844, 30.99014082 ], [ 115.18499772, 30.98965046 ], [ 115.18474734, 30.98938019 ], [ 115.18450686, 30.98920986 ], [ 115.18423632, 30.98905947 ], [ 115.1840961, 30.98893928 ], [ 115.18391574, 30.98867913 ], [ 115.18382556, 30.9884391 ], [ 115.18381566, 30.98832917 ], [ 115.18373538, 30.98805921 ], [ 115.18374546, 30.98771942 ], [ 115.1837856, 30.98741967 ], [ 115.1837856, 30.98729975 ], [ 115.18376562, 30.98718977 ], [ 115.18364538, 30.98696972 ], [ 115.18353522, 30.98682959 ], [ 115.18342506, 30.98663951 ], [ 115.18321464, 30.98615945 ], [ 115.18302438, 30.98557944 ], [ 115.1827839, 30.9849894 ], [ 115.1817021, 30.98253897 ], [ 115.18130142, 30.98158884 ], [ 115.18068024, 30.98032853 ], [ 115.18054002, 30.98002847 ], [ 115.18029954, 30.9796083 ], [ 115.1801793, 30.9793982 ], [ 115.18011918, 30.97926819 ], [ 115.1800992, 30.97919817 ], [ 115.18006914, 30.97908819 ], [ 115.18000902, 30.97877828 ], [ 115.17995898, 30.97839843 ], [ 115.17990894, 30.97798857 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514231", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.026", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17990894, 30.97798857 ], [ 115.17990894, 30.9779586 ], [ 115.17987888, 30.97775867 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514234", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.488", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19610138, 30.95090307 ], [ 115.19629182, 30.95087337 ], [ 115.19703288, 30.9506045 ], [ 115.19722314, 30.95058479 ], [ 115.19740332, 30.95052503 ], [ 115.1980344, 30.95024603 ], [ 115.19853498, 30.95006679 ], [ 115.19888562, 30.94987739 ], [ 115.19901576, 30.9497976 ], [ 115.19933616, 30.94947819 ], [ 115.19949654, 30.94929851 ], [ 115.19979696, 30.94904907 ], [ 115.20031788, 30.94860006 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514235", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.583", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20023958, 30.9394661 ], [ 115.2002196, 30.93942609 ], [ 115.20022968, 30.93924623 ], [ 115.20027972, 30.93905642 ], [ 115.2002898, 30.93893649 ], [ 115.20025974, 30.93881652 ], [ 115.20015966, 30.93859652 ], [ 115.20006948, 30.93827657 ], [ 115.20008964, 30.93811668 ], [ 115.2001197, 30.93802682 ], [ 115.20023994, 30.93779709 ], [ 115.20040014, 30.93759747 ], [ 115.20045018, 30.93743763 ], [ 115.20046026, 30.93734768 ], [ 115.20041022, 30.93706778 ], [ 115.20031014, 30.93678783 ], [ 115.20031014, 30.93663794 ], [ 115.20037026, 30.93639813 ], [ 115.20038034, 30.93630822 ], [ 115.20037026, 30.93622826 ], [ 115.20019008, 30.93582825 ], [ 115.2001701, 30.93577826 ], [ 115.20016002, 30.93556838 ], [ 115.20013014, 30.93548837 ], [ 115.20002988, 30.93533829 ], [ 115.20001998, 30.93524834 ], [ 115.20005994, 30.93515847 ], [ 115.20014022, 30.93507864 ], [ 115.20029034, 30.9349589 ], [ 115.20042066, 30.93479919 ], [ 115.2004707, 30.93475928 ], [ 115.20053082, 30.9347294 ], [ 115.2007011, 30.93473961 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514236", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.228", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2007011, 30.93473961 ], [ 115.20076104, 30.93477971 ], [ 115.20084114, 30.93494972 ], [ 115.20092124, 30.93502977 ], [ 115.20108162, 30.93509993 ], [ 115.2011817, 30.93510011 ], [ 115.2012618, 30.93508022 ], [ 115.201422, 30.93499049 ], [ 115.201427546890244, 30.934988653722833 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514912", "Name": "映山红路", "pyname": "yshl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.176", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1830557, 31.07644709 ], [ 115.18299558, 31.07617709 ], [ 115.18277526, 31.07487758 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514913", "Name": "映山红路", "pyname": "yshl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.110", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18277526, 31.07487758 ], [ 115.1826453, 31.07405795 ], [ 115.18257528, 31.07390796 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514914", "Name": "映山红路", "pyname": "yshl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.205", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18257528, 31.07390796 ], [ 115.18243506, 31.07359787 ], [ 115.18238484, 31.07335788 ], [ 115.18229484, 31.07272806 ], [ 115.18236486, 31.07209856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514915", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.129", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18571268, 31.05362475 ], [ 115.18575264, 31.05345492 ], [ 115.18588296, 31.05281547 ], [ 115.18588296, 31.05269555 ], [ 115.18586298, 31.05258557 ], [ 115.18580286, 31.05248549 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514916", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.830", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18580286, 31.05248549 ], [ 115.18573266, 31.05234545 ], [ 115.18566264, 31.0521654 ], [ 115.18557246, 31.05183542 ], [ 115.18548228, 31.05166532 ], [ 115.18536204, 31.05150521 ], [ 115.18525188, 31.05132507 ], [ 115.18518168, 31.05110507 ], [ 115.18514172, 31.05085514 ], [ 115.18512156, 31.0506152 ], [ 115.18514172, 31.05036536 ], [ 115.18521192, 31.04983575 ], [ 115.18548246, 31.04936645 ], [ 115.18577298, 31.04890718 ], [ 115.18586316, 31.04868744 ], [ 115.18599348, 31.04823789 ], [ 115.18602354, 31.0479881 ], [ 115.18591338, 31.04694842 ], [ 115.18593336, 31.04665857 ], [ 115.18600356, 31.04636886 ], [ 115.18614378, 31.04605926 ], [ 115.18640442, 31.04534007 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514917", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.113", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18923438, 31.00319015 ], [ 115.1892846, 31.00274051 ], [ 115.18930476, 31.00217094 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514918", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.284", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18640442, 31.04534007 ], [ 115.18659468, 31.04505054 ], [ 115.18673508, 31.04474094 ], [ 115.1867952, 31.04452116 ], [ 115.18683516, 31.04422137 ], [ 115.18689528, 31.04394161 ], [ 115.18699554, 31.04370189 ], [ 115.18712586, 31.04341227 ], [ 115.18727616, 31.04302271 ], [ 115.1873262, 31.04288289 ], [ 115.18733628, 31.04273295 ], [ 115.18729614, 31.04257298 ], [ 115.18706574, 31.04211281 ], [ 115.18695558, 31.04193272 ], [ 115.1868654, 31.04173265 ], [ 115.1867853, 31.04150261 ], [ 115.18668504, 31.04110265 ], [ 115.18651476, 31.04047265 ], [ 115.18652484, 31.04033274 ], [ 115.1865549, 31.04023284 ], [ 115.18661502, 31.04014298 ], [ 115.18672518, 31.04001324 ], [ 115.18681536, 31.03981349 ], [ 115.18688556, 31.03957373 ], [ 115.18690554, 31.03936385 ], [ 115.18690554, 31.03921395 ], [ 115.18686558, 31.03893401 ], [ 115.18681536, 31.03877399 ], [ 115.1867052, 31.03853391 ], [ 115.186635, 31.0383639 ], [ 115.186545, 31.03811384 ], [ 115.18650486, 31.03786391 ], [ 115.18656498, 31.03708437 ], [ 115.18655508, 31.03688448 ], [ 115.18658514, 31.03664463 ], [ 115.1866953, 31.03620512 ], [ 115.1867655, 31.03578554 ], [ 115.18682562, 31.03564572 ], [ 115.18684578, 31.03533594 ], [ 115.18689582, 31.03519613 ], [ 115.18695594, 31.03504632 ], [ 115.1874171, 31.03416774 ], [ 115.18753734, 31.03377822 ], [ 115.18760754, 31.03360844 ], [ 115.18772778, 31.03343874 ], [ 115.1877978, 31.03325901 ], [ 115.18780788, 31.03305917 ], [ 115.187778, 31.03264935 ], [ 115.18778808, 31.03223967 ], [ 115.18765794, 31.03078041 ], [ 115.18766802, 31.03057053 ], [ 115.18777836, 31.02976125 ], [ 115.18775838, 31.0293315 ], [ 115.18777854, 31.02914169 ], [ 115.18774848, 31.02891179 ], [ 115.18768836, 31.02873179 ], [ 115.18747794, 31.02835167 ], [ 115.1874279, 31.0281917 ], [ 115.18736778, 31.02808167 ], [ 115.18725762, 31.02796152 ], [ 115.1871975, 31.02781154 ], [ 115.18717752, 31.02745176 ], [ 115.18720776, 31.02687216 ], [ 115.18726788, 31.02666242 ], [ 115.18735806, 31.02646271 ], [ 115.1874783, 31.02627303 ], [ 115.1875584, 31.02606333 ], [ 115.18767882, 31.02555389 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514919", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.003", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18767882, 31.02555389 ], [ 115.18777908, 31.02530423 ], [ 115.18790922, 31.02507459 ], [ 115.1880696, 31.024895 ], [ 115.1881497, 31.02469524 ], [ 115.1882199, 31.02426558 ], [ 115.1882199, 31.02405566 ], [ 115.18812972, 31.02362577 ], [ 115.18812972, 31.02338588 ], [ 115.18820982, 31.02313613 ], [ 115.18839018, 31.02291653 ], [ 115.18859052, 31.02272699 ], [ 115.18874082, 31.02253731 ], [ 115.18903134, 31.02144836 ], [ 115.1891316, 31.02125864 ], [ 115.1892216, 31.02106887 ], [ 115.18928172, 31.02089904 ], [ 115.18932186, 31.02068921 ], [ 115.18941204, 31.02045948 ], [ 115.18954218, 31.02024983 ], [ 115.18966242, 31.02004013 ], [ 115.18972254, 31.01981036 ], [ 115.1897526, 31.01961051 ], [ 115.18980264, 31.01941067 ], [ 115.18988292, 31.01921091 ], [ 115.19009316, 31.01885145 ], [ 115.1902035, 31.01863172 ], [ 115.19049402, 31.0178826 ], [ 115.19069436, 31.01704335 ], [ 115.19091468, 31.01646402 ], [ 115.19100486, 31.01591444 ], [ 115.19102484, 31.0157046 ], [ 115.19099478, 31.01548464 ], [ 115.19102484, 31.01523485 ], [ 115.19111502, 31.01497515 ], [ 115.19115516, 31.0146854 ], [ 115.19107524, 31.01407569 ], [ 115.19116542, 31.01351621 ], [ 115.19131572, 31.01328662 ], [ 115.19145612, 31.01301702 ], [ 115.19155638, 31.01275737 ], [ 115.19155638, 31.01248755 ], [ 115.19146638, 31.01185782 ], [ 115.19145648, 31.01152802 ], [ 115.1914365, 31.01117823 ], [ 115.19136648, 31.01082836 ], [ 115.1913564, 31.01054855 ], [ 115.19137656, 31.01026874 ], [ 115.19147682, 31.00967933 ], [ 115.19154702, 31.00907984 ], [ 115.19156718, 31.00880007 ], [ 115.19155728, 31.00851023 ], [ 115.19147718, 31.00823028 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514920", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.616", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19147718, 31.00823028 ], [ 115.1913069, 31.00796019 ], [ 115.19107668, 31.00766004 ], [ 115.1901954, 31.00642947 ], [ 115.18955442, 31.00548906 ], [ 115.1894043, 31.00520903 ], [ 115.18929414, 31.00492904 ], [ 115.18919406, 31.0043493 ], [ 115.18917408, 31.00402949 ], [ 115.18920432, 31.00336997 ], [ 115.18923438, 31.00319015 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.514921", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "3.044", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18513938, 31.07332211 ], [ 115.18513938, 31.07330208 ], [ 115.18522956, 31.07316231 ], [ 115.18552008, 31.07290293 ], [ 115.18560018, 31.07274318 ], [ 115.18564032, 31.07243345 ], [ 115.18570044, 31.07229363 ], [ 115.1858106, 31.07221385 ], [ 115.18638156, 31.07210472 ], [ 115.18662186, 31.07203515 ], [ 115.18699248, 31.07179584 ], [ 115.18718274, 31.07173617 ], [ 115.18733304, 31.07175638 ], [ 115.18742322, 31.07184642 ], [ 115.1874432, 31.07213627 ], [ 115.1875233, 31.07226627 ], [ 115.18767342, 31.07233643 ], [ 115.1878437, 31.0723367 ], [ 115.18803396, 31.07237693 ], [ 115.18820424, 31.0724771 ], [ 115.18838442, 31.07260728 ], [ 115.18889508, 31.07303771 ], [ 115.18900524, 31.07318778 ], [ 115.18932564, 31.07371784 ], [ 115.18945578, 31.07384793 ], [ 115.18961598, 31.07391813 ], [ 115.18976628, 31.07395832 ], [ 115.18992648, 31.07395854 ], [ 115.1900568, 31.07400872 ], [ 115.19016678, 31.07411879 ], [ 115.1903871, 31.0744089 ], [ 115.1904573, 31.07457887 ], [ 115.1905572, 31.07518857 ], [ 115.19068734, 31.07558849 ], [ 115.19077734, 31.07577848 ], [ 115.19090766, 31.07594858 ], [ 115.19136828, 31.0763889 ], [ 115.19152848, 31.07649906 ], [ 115.19170866, 31.07656926 ], [ 115.19210934, 31.07658983 ], [ 115.19231958, 31.07662011 ], [ 115.19294058, 31.07677091 ], [ 115.19311086, 31.07676114 ], [ 115.19321094, 31.07666138 ], [ 115.19321094, 31.07652147 ], [ 115.1931609, 31.07622164 ], [ 115.193151, 31.07583189 ], [ 115.19318106, 31.07565207 ], [ 115.1932914, 31.07550231 ], [ 115.19358192, 31.07530287 ], [ 115.193682, 31.07518313 ], [ 115.19373222, 31.07503328 ], [ 115.19374212, 31.07487339 ], [ 115.19377218, 31.07474357 ], [ 115.19387244, 31.07464376 ], [ 115.19401266, 31.07461397 ], [ 115.19419302, 31.07460425 ], [ 115.1943732, 31.07461451 ], [ 115.19479386, 31.07472503 ], [ 115.1950041, 31.0747653 ], [ 115.19542476, 31.07474595 ], [ 115.1958555, 31.07478654 ], [ 115.19605566, 31.07482677 ], [ 115.1964063, 31.07501717 ], [ 115.19659656, 31.07506739 ], [ 115.1968068, 31.0750677 ], [ 115.1974179, 31.07491871 ], [ 115.19761806, 31.07484905 ], [ 115.19782848, 31.07481935 ], [ 115.19829918, 31.07482002 ], [ 115.19876988, 31.07476076 ], [ 115.1992206, 31.07472143 ], [ 115.199451, 31.07475176 ], [ 115.20037242, 31.07502288 ], [ 115.20057258, 31.07506316 ], [ 115.20073296, 31.07507337 ], [ 115.20084312, 31.07500358 ], [ 115.20087318, 31.0748837 ], [ 115.2007029, 31.07464362 ], [ 115.20063288, 31.07449364 ], [ 115.20054288, 31.07413377 ], [ 115.20043272, 31.07399369 ], [ 115.2003024, 31.0739036 ], [ 115.20018234, 31.07380347 ], [ 115.20011232, 31.07365349 ], [ 115.20006228, 31.07348352 ], [ 115.19986194, 31.07296359 ], [ 115.19974188, 31.07280357 ], [ 115.19908092, 31.07233292 ], [ 115.19872038, 31.07219252 ], [ 115.19859024, 31.07209239 ], [ 115.19852022, 31.07196239 ], [ 115.19840016, 31.07148255 ], [ 115.19834004, 31.07131259 ], [ 115.19822988, 31.07115252 ], [ 115.19758908, 31.07053206 ], [ 115.19746884, 31.07045192 ], [ 115.19714844, 31.07038154 ], [ 115.19703828, 31.07030144 ], [ 115.19698824, 31.07018142 ], [ 115.19706834, 31.06990175 ], [ 115.19715852, 31.06981193 ], [ 115.19728884, 31.06977215 ], [ 115.19743896, 31.06975239 ], [ 115.19758926, 31.0697726 ], [ 115.1977095, 31.06983272 ], [ 115.19789976, 31.06999287 ], [ 115.19801982, 31.07003301 ], [ 115.1984205, 31.0700736 ], [ 115.19856072, 31.07007378 ], [ 115.19876106, 31.07001411 ], [ 115.19893134, 31.07000439 ], [ 115.19910144, 31.0700246 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515130", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0404", "width": "55", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92264916, 31.02025316 ], [ 114.92276904, 31.02030306 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515131", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92244936, 31.02016334 ], [ 114.9226092, 31.02023322 ], [ 114.92264916, 31.02025316 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515132", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.036", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92276904, 31.02030306 ], [ 114.92294904, 31.02038294 ], [ 114.92310888, 31.02044279 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515133", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.324", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92310888, 31.02044279 ], [ 114.92371836, 31.02064236 ], [ 114.92451684, 31.02090116 ], [ 114.9252453, 31.02110982 ], [ 114.92543502, 31.02116945 ], [ 114.92559468, 31.02119919 ], [ 114.92632314, 31.02133788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515137", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.316", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86987838, 31.01538983 ], [ 114.87011886, 31.0149504 ], [ 114.8705694, 31.0143213 ], [ 114.87110022, 31.01365238 ], [ 114.87122046, 31.01346261 ], [ 114.8715909, 31.01296338 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515138", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.807", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8715909, 31.01296338 ], [ 114.87170106, 31.01282361 ], [ 114.8724522, 31.01185508 ], [ 114.87265254, 31.01158548 ], [ 114.87270258, 31.01147564 ], [ 114.87299292, 31.0110962 ], [ 114.87373398, 31.01010768 ], [ 114.87384414, 31.00999788 ], [ 114.87392424, 31.00986806 ], [ 114.87431484, 31.00932887 ], [ 114.8744952, 31.0091292 ], [ 114.87484566, 31.00861994 ], [ 114.87493584, 31.0085501 ], [ 114.87499578, 31.00847022 ], [ 114.8752863, 31.00810077 ], [ 114.87540654, 31.00784112 ], [ 114.8755266, 31.00772133 ], [ 114.87592728, 31.00717215 ], [ 114.876164219403677, 31.006876779347621 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515139", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.221", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91009074, 31.01352426 ], [ 114.91012062, 31.0135442 ], [ 114.910310444462425, 31.013607386165134 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515141", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.235", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91667923627115, 31.016392651889465 ], [ 114.91720434, 31.01683829 ], [ 114.91752402, 31.01706797 ], [ 114.91811334, 31.0174974 ], [ 114.9183432, 31.01766714 ], [ 114.91851294, 31.01779697 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515142", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.460", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91851294, 31.01779697 ], [ 114.9185529, 31.01782694 ], [ 114.91888266, 31.01806661 ], [ 114.91919244, 31.01827631 ], [ 114.91942212, 31.01844605 ], [ 114.91968186, 31.01863581 ], [ 114.91998174, 31.01883552 ], [ 114.92014158, 31.01894537 ], [ 114.92047116, 31.01914508 ], [ 114.92071092, 31.01929484 ], [ 114.92098074, 31.0194446 ], [ 114.92126046, 31.01959436 ], [ 114.9216201, 31.01978403 ], [ 114.92215974, 31.02003356 ], [ 114.92244936, 31.02016334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515143", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.873", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92632314, 31.02133788 ], [ 114.92685198, 31.02145691 ], [ 114.92817912, 31.02172457 ], [ 114.92843868, 31.02182406 ], [ 114.92865828, 31.02192365 ], [ 114.92895762, 31.02219302 ], [ 114.92917722, 31.02235259 ], [ 114.92934678, 31.02244227 ], [ 114.92959626, 31.02259176 ], [ 114.929766, 31.02265148 ], [ 114.92986572, 31.02267128 ], [ 114.9303348, 31.02280043 ], [ 114.93046458, 31.02282023 ], [ 114.93086364, 31.0229195 ], [ 114.93166194, 31.02313802 ], [ 114.931683987977479, 31.023141663365685 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515144", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95753262, 31.03481385 ], [ 114.95762244, 31.03484364 ], [ 114.9579117, 31.03490304 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515187", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.510", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9473196, 31.02949868 ], [ 114.94755882, 31.02969798 ], [ 114.94784808, 31.02982727 ], [ 114.94812726, 31.02999651 ], [ 114.94953324, 31.03100258 ], [ 114.95078982, 31.03156935 ], [ 114.95148786, 31.03192751 ], [ 114.95173716, 31.03201688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515188", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.724", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95173716, 31.03201688 ], [ 114.9520563, 31.03210616 ], [ 114.95221596, 31.03211583 ], [ 114.95250522, 31.03208528 ], [ 114.95306376, 31.03191423 ], [ 114.95322342, 31.03182396 ], [ 114.95341296, 31.03175363 ], [ 114.95345274, 31.03174355 ], [ 114.9534927, 31.03172348 ], [ 114.95355264, 31.03171335 ], [ 114.95364228, 31.03171317 ], [ 114.95379204, 31.03173288 ], [ 114.95394162, 31.03176254 ], [ 114.95401146, 31.03178243 ], [ 114.95411118, 31.03181217 ], [ 114.95426076, 31.03188188 ], [ 114.95442042, 31.03196148 ], [ 114.95457, 31.03207115 ], [ 114.9546897, 31.03221083 ], [ 114.95490912, 31.03254023 ], [ 114.95559744, 31.03348838 ], [ 114.95595654, 31.03403738 ], [ 114.95603646, 31.03413719 ], [ 114.95614608, 31.03422692 ], [ 114.95699406, 31.03463502 ], [ 114.95724336, 31.03472444 ], [ 114.95753262, 31.03481385 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515189", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.253", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9462117, 31.02745145 ], [ 114.9463413, 31.02757119 ], [ 114.9464412, 31.02769098 ], [ 114.94652094, 31.02782076 ], [ 114.94658088, 31.02796062 ], [ 114.94685052, 31.02867986 ], [ 114.94712988, 31.02921918 ], [ 114.9473196, 31.02949868 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515190", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.241", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94386666, 31.02754541 ], [ 114.9441561, 31.02743498 ], [ 114.94481454, 31.02727392 ], [ 114.94540332, 31.02717294 ], [ 114.94570266, 31.02716246 ], [ 114.94586232, 31.02720215 ], [ 114.946002, 31.0272719 ], [ 114.94612188, 31.02736163 ], [ 114.9462117, 31.02745145 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515191", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.870", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9579117, 31.03490304 ], [ 114.95823102, 31.03496235 ], [ 114.9585102, 31.03498179 ], [ 114.95895912, 31.03504088 ], [ 114.95930832, 31.03506014 ], [ 114.95959758, 31.03509956 ], [ 114.9600465, 31.03511864 ], [ 114.96063492, 31.03510748 ], [ 114.96078468, 31.03510716 ], [ 114.9616125, 31.03508552 ], [ 114.96166236, 31.03507544 ], [ 114.96212118, 31.03505447 ], [ 114.96271914, 31.03506284 ], [ 114.963048, 31.0350519 ], [ 114.96354642, 31.03506054 ], [ 114.96374568, 31.03504997 ], [ 114.96461274, 31.03506756 ], [ 114.96471246, 31.03506729 ], [ 114.96486186, 31.03503687 ], [ 114.9650712, 31.03505631 ], [ 114.96627702, 31.03506293 ], [ 114.9665562, 31.03501221 ], [ 114.96686508, 31.03503134 ], [ 114.9669747, 31.03502103 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515192", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.036", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99432012, 31.04027154 ], [ 114.99468876, 31.04022047 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515193", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.608", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.902616783557718, 31.009157188028997 ], [ 114.90262308, 31.00916768 ], [ 114.90280308, 31.0093776 ], [ 114.90298308, 31.00970741 ], [ 114.9033132, 31.01005724 ], [ 114.90392304, 31.01059701 ], [ 114.90406308, 31.01068697 ], [ 114.9043131, 31.01081693 ], [ 114.90460308, 31.01086692 ], [ 114.90479298, 31.01091687 ], [ 114.90533298, 31.01124677 ], [ 114.90566292, 31.01141669 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515194", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.486", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90566292, 31.01141669 ], [ 114.9059529, 31.01150664 ], [ 114.9063129, 31.01167656 ], [ 114.90671286, 31.01184653 ], [ 114.90742278, 31.01206644 ], [ 114.90775272, 31.01219636 ], [ 114.90909156, 31.01295515 ], [ 114.90922152, 31.01301504 ], [ 114.90958116, 31.01320472 ], [ 114.91009074, 31.01352426 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515196", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.499", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94055853375788, 31.0270520579361 ], [ 114.94059354, 31.02705122 ], [ 114.9407433, 31.02707093 ], [ 114.9408729, 31.02711071 ], [ 114.94101276, 31.02720044 ], [ 114.9410826, 31.02729026 ], [ 114.94129212, 31.02776973 ], [ 114.94136196, 31.02786954 ], [ 114.94156158, 31.02801917 ], [ 114.94168146, 31.02807893 ], [ 114.94178118, 31.02808878 ], [ 114.94191096, 31.02806853 ], [ 114.9424398, 31.02792768 ], [ 114.94286874, 31.02782702 ], [ 114.94386666, 31.02754541 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515197", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97542606, 31.03438802 ], [ 114.97568508, 31.03439729 ], [ 114.9759144, 31.0344566 ], [ 114.97630302, 31.03457544 ], [ 114.9767514, 31.03481403 ], [ 114.97724964, 31.03510248 ], [ 114.97772808, 31.03534098 ], [ 114.97861494, 31.0358682 ], [ 114.97918284, 31.03617641 ], [ 114.98002002, 31.03665377 ], [ 114.98078718, 31.03713135 ], [ 114.98136516, 31.03742952 ], [ 114.98196312, 31.03779762 ], [ 114.98277024, 31.03822512 ], [ 114.98318874, 31.03848378 ], [ 114.98424498, 31.03908048 ], [ 114.98453406, 31.03925954 ], [ 114.9846336, 31.0393692 ], [ 114.9849027, 31.03948836 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515198", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.408", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9849027, 31.03948836 ], [ 114.98526144, 31.03962728 ], [ 114.98543082, 31.03971678 ], [ 114.98564016, 31.03977614 ], [ 114.98581962, 31.03988558 ], [ 114.98631786, 31.04025395 ], [ 114.98647716, 31.04035344 ], [ 114.9868359, 31.04049236 ], [ 114.98760324, 31.04075007 ], [ 114.98794218, 31.04094897 ], [ 114.98828094, 31.04104797 ], [ 114.98846022, 31.04106746 ], [ 114.98865966, 31.04103695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515199", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.556", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98865966, 31.04103695 ], [ 114.98883912, 31.04096648 ], [ 114.98934726, 31.04070525 ], [ 114.98952672, 31.0406648 ], [ 114.98990544, 31.04063375 ], [ 114.99038388, 31.04070237 ], [ 114.99071274, 31.04070147 ], [ 114.99161958, 31.04060904 ], [ 114.99216768, 31.04053754 ], [ 114.99273576, 31.04043606 ], [ 114.99388182, 31.04030286 ], [ 114.99411096, 31.04029215 ], [ 114.99432012, 31.04027154 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515200", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.280", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85097298, 31.35534201 ], [ 114.85107306, 31.35549213 ], [ 114.85120338, 31.3557323 ], [ 114.85139364, 31.35622248 ], [ 114.85140372, 31.35645243 ], [ 114.8514336, 31.35656246 ], [ 114.8517342, 31.35719277 ], [ 114.85176426, 31.3573028 ], [ 114.8519646, 31.35770298 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515201", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.174", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86984814, 31.4120232 ], [ 114.86969766, 31.41299268 ], [ 114.86971764, 31.41323262 ], [ 114.86984778, 31.41356265 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515202", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "6.746", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8519646, 31.35770298 ], [ 114.85210482, 31.35809313 ], [ 114.85239534, 31.35879342 ], [ 114.85267578, 31.35998354 ], [ 114.85280592, 31.36042364 ], [ 114.85302624, 31.36108383 ], [ 114.85318662, 31.36142399 ], [ 114.8532066, 31.36162397 ], [ 114.85308636, 31.36198365 ], [ 114.85287594, 31.36240319 ], [ 114.8526855, 31.36287272 ], [ 114.85262538, 31.36312256 ], [ 114.85255536, 31.36363227 ], [ 114.85254528, 31.36389219 ], [ 114.85255518, 31.36414217 ], [ 114.8528358, 31.36576217 ], [ 114.85301598, 31.36646228 ], [ 114.85320642, 31.36692249 ], [ 114.8539878, 31.36840344 ], [ 114.85433844, 31.36900388 ], [ 114.85453878, 31.36939407 ], [ 114.85476918, 31.36975439 ], [ 114.8554404, 31.37069511 ], [ 114.85588104, 31.37121558 ], [ 114.85598112, 31.37135567 ], [ 114.85612134, 31.37151582 ], [ 114.8563017, 31.37167602 ], [ 114.85674234, 31.37196659 ], [ 114.85765386, 31.37244782 ], [ 114.85835496, 31.37287869 ], [ 114.85941678, 31.37359005 ], [ 114.86059866, 31.37443155 ], [ 114.8608791, 31.37464188 ], [ 114.86148984, 31.37506254 ], [ 114.86197044, 31.37534303 ], [ 114.86372256, 31.37624478 ], [ 114.86413314, 31.37649521 ], [ 114.86452356, 31.37682555 ], [ 114.86621574, 31.37842715 ], [ 114.86637594, 31.37859729 ], [ 114.86651616, 31.37878742 ], [ 114.86660634, 31.37899748 ], [ 114.86669652, 31.37929754 ], [ 114.86674656, 31.37993748 ], [ 114.86682684, 31.38175724 ], [ 114.86682702, 31.3821572 ], [ 114.86680704, 31.38244709 ], [ 114.86666682, 31.38289686 ], [ 114.86661678, 31.38309675 ], [ 114.86650662, 31.38339659 ], [ 114.8662764, 31.38389622 ], [ 114.86570526, 31.38541502 ], [ 114.86526444, 31.38668402 ], [ 114.86454282, 31.38906222 ], [ 114.86435238, 31.38984171 ], [ 114.86406186, 31.39046109 ], [ 114.86399166, 31.39068092 ], [ 114.8639715, 31.39090083 ], [ 114.86401164, 31.39111085 ], [ 114.8641218, 31.39133094 ], [ 114.86426202, 31.39155108 ], [ 114.86458242, 31.39197147 ], [ 114.8663853, 31.39420361 ], [ 114.86650554, 31.39436376 ], [ 114.86655558, 31.39451379 ], [ 114.8665455, 31.39465374 ], [ 114.86659554, 31.39519365 ], [ 114.86660544, 31.39572353 ], [ 114.86667564, 31.39617353 ], [ 114.86668554, 31.39630349 ], [ 114.86645496, 31.39722288 ], [ 114.86635488, 31.39761263 ], [ 114.86633472, 31.39780253 ], [ 114.86623446, 31.39834221 ], [ 114.8661945, 31.39849211 ], [ 114.86613438, 31.39863201 ], [ 114.86610414, 31.39890188 ], [ 114.86610414, 31.39901186 ], [ 114.86620422, 31.39990173 ], [ 114.8662143, 31.4000717 ], [ 114.86616408, 31.40044155 ], [ 114.86611404, 31.40061143 ], [ 114.86612394, 31.40078139 ], [ 114.86616408, 31.4009514 ], [ 114.86640438, 31.40153159 ], [ 114.86645442, 31.40198154 ], [ 114.86638404, 31.40289113 ], [ 114.86628378, 31.40394053 ], [ 114.86622348, 31.40425031 ], [ 114.86611314, 31.4051198 ], [ 114.8660631, 31.40531964 ], [ 114.86605284, 31.40575943 ], [ 114.8660028, 31.40617932 ], [ 114.86611314, 31.40660948 ], [ 114.86618334, 31.40682957 ], [ 114.86648394, 31.40749998 ], [ 114.86661426, 31.40771018 ], [ 114.86695482, 31.40813075 ], [ 114.86714526, 31.40832105 ], [ 114.86775618, 31.40878185 ], [ 114.86812662, 31.40910221 ], [ 114.8687172, 31.40965269 ], [ 114.86920788, 31.40993322 ], [ 114.86940804, 31.4101134 ], [ 114.86955816, 31.4103335 ], [ 114.8698485, 31.41092363 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515204", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.628", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00334694, 31.04200323 ], [ 115.00366572, 31.04197227 ], [ 115.00379532, 31.04193191 ], [ 115.00408422, 31.04193105 ], [ 115.00445286, 31.04192993 ], [ 115.00561872, 31.0418964 ], [ 115.00743204, 31.04188092 ], [ 115.00766118, 31.04190023 ], [ 115.00811946, 31.04189883 ], [ 115.00901622, 31.04185617 ], [ 115.00935498, 31.04186513 ], [ 115.009893, 31.04184353 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.515208", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.026", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99468876, 31.04022047 ], [ 114.99485832, 31.04018996 ], [ 114.99495786, 31.04020967 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.520714", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.897", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8758497, 31.12777643 ], [ 114.8749983, 31.12850484 ], [ 114.87487806, 31.12860461 ], [ 114.87485808, 31.12862459 ], [ 114.87474792, 31.12871436 ], [ 114.87465774, 31.12879419 ], [ 114.87456756, 31.12887402 ], [ 114.87434724, 31.12908359 ], [ 114.87411684, 31.12926318 ], [ 114.87363606, 31.12970225 ], [ 114.87315528, 31.13010135 ], [ 114.87292488, 31.13032091 ], [ 114.87268458, 31.13052048 ], [ 114.8718933, 31.13123895 ], [ 114.871743, 31.13143857 ], [ 114.87163266, 31.13165826 ], [ 114.87127158, 31.13265681 ], [ 114.87103092, 31.13318601 ], [ 114.87024954, 31.13409429 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.520715", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.062", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87024954, 31.13409429 ], [ 114.87000906, 31.13437379 ], [ 114.86986884, 31.13454344 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527913", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.495", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.789073032366318, 31.358493213849403 ], [ 114.78907728, 31.35846861 ], [ 114.7891275, 31.35822876 ], [ 114.7891374, 31.35810884 ], [ 114.78919752, 31.35777903 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527914", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.099", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78919752, 31.35777903 ], [ 114.78922758, 31.35761915 ], [ 114.78923766, 31.35756915 ], [ 114.78926772, 31.35746925 ], [ 114.78928788, 31.35736931 ], [ 114.78933792, 31.35719943 ], [ 114.78938796, 31.35708954 ], [ 114.78941802, 31.35700958 ], [ 114.78946806, 31.35691971 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527915", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.525", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85082358, 31.3355376 ], [ 114.85074348, 31.33567742 ], [ 114.8505831, 31.33601703 ], [ 114.8505129, 31.33617683 ], [ 114.85038258, 31.33654646 ], [ 114.8503725, 31.33674635 ], [ 114.85041264, 31.33739619 ], [ 114.85041246, 31.33831586 ], [ 114.85044252, 31.33855584 ], [ 114.85049256, 31.33879587 ], [ 114.85066284, 31.33949594 ], [ 114.85088334, 31.33992618 ], [ 114.85127394, 31.34055668 ], [ 114.85156446, 31.34094705 ], [ 114.85165464, 31.34112714 ], [ 114.85167462, 31.34130714 ], [ 114.85159452, 31.34145695 ], [ 114.85148436, 31.34158673 ], [ 114.85140426, 31.34173658 ], [ 114.85139418, 31.34210643 ], [ 114.85136412, 31.34230632 ], [ 114.85124388, 31.34273603 ], [ 114.85128402, 31.34295603 ], [ 114.85141416, 31.34315619 ], [ 114.8515344, 31.34335631 ], [ 114.85174482, 31.34425644 ], [ 114.85179486, 31.34462643 ], [ 114.85185498, 31.34488644 ], [ 114.85204524, 31.34545659 ], [ 114.85210536, 31.34570661 ], [ 114.8521554, 31.34595663 ], [ 114.85216548, 31.3462166 ], [ 114.85212534, 31.34647647 ], [ 114.85168452, 31.34744546 ], [ 114.851394, 31.34822472 ], [ 114.85127376, 31.3483545 ], [ 114.85100322, 31.34848401 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527916", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.450", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85100322, 31.34848401 ], [ 114.85069272, 31.34864345 ], [ 114.85054242, 31.34881314 ], [ 114.85038204, 31.34912279 ], [ 114.850332, 31.34927264 ], [ 114.85029186, 31.34957252 ], [ 114.85023174, 31.34970234 ], [ 114.85014156, 31.34982218 ], [ 114.8501115, 31.34996208 ], [ 114.84985104, 31.35181113 ], [ 114.8498811, 31.35201111 ], [ 114.84994122, 31.35222117 ], [ 114.8499513, 31.3522412 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527917", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88283766, 31.12046766 ], [ 114.88267746, 31.12060748 ], [ 114.8822271, 31.12113686 ], [ 114.88152672, 31.12197593 ], [ 114.88103622, 31.12249518 ], [ 114.87977478, 31.12397312 ], [ 114.87839328, 31.12553093 ], [ 114.87797298, 31.12592031 ], [ 114.87664098, 31.12709792 ], [ 114.8758497, 31.12777643 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527918", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.151", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99495786, 31.04020967 ], [ 114.99502752, 31.04021943 ], [ 114.99536628, 31.04035835 ], [ 114.99578478, 31.04046702 ], [ 114.99598404, 31.04051639 ], [ 114.9964722, 31.04055486 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527919", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.657", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9964722, 31.04055486 ], [ 114.99672132, 31.04057412 ], [ 114.99690078, 31.04063352 ], [ 114.99792696, 31.04118009 ], [ 114.99832548, 31.04143875 ], [ 114.99880356, 31.04165718 ], [ 114.9990228, 31.04172648 ], [ 114.99947118, 31.04182508 ], [ 114.99971022, 31.04186432 ], [ 114.999999, 31.04188344 ], [ 115.00018848, 31.04189285 ], [ 115.00037784, 31.04191229 ], [ 115.00077636, 31.04199104 ], [ 115.00134426, 31.04200931 ], [ 115.00159338, 31.04205854 ], [ 115.00246026, 31.04204589 ], [ 115.00292844, 31.04202447 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527920", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00292844, 31.04202447 ], [ 115.00306794, 31.04202407 ], [ 115.00334694, 31.04200323 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527941", "Name": "X202", "pyname": "x202", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.389", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07859396, 30.89445318 ], [ 115.07861394, 30.89437322 ], [ 115.07863392, 30.89431323 ], [ 115.078653757245007, 30.894103226359519 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527947", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17273612, 30.96299439 ], [ 115.17262596, 30.96266436 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527948", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.090", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17262596, 30.96266436 ], [ 115.17254586, 30.96246434 ], [ 115.17254586, 30.96231444 ], [ 115.17262596, 30.96187484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527949", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17262596, 30.96187484 ], [ 115.17268608, 30.96170505 ], [ 115.17283656, 30.96145548 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527950", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.142", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17346746, 30.96410508 ], [ 115.17307668, 30.96361463 ], [ 115.17273612, 30.96299439 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527951", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.393", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17547122, 30.96718695 ], [ 115.17535098, 30.96702684 ], [ 115.1747298, 30.96617616 ], [ 115.17443928, 30.96564597 ], [ 115.17421896, 30.96531576 ], [ 115.1739684, 30.96503546 ], [ 115.17377814, 30.96474525 ], [ 115.1735877, 30.96429516 ], [ 115.17349752, 30.96414509 ], [ 115.17346746, 30.96410508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527952", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17559146, 30.96733707 ], [ 115.17547122, 30.96718695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527953", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.097", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17987888, 30.97775867 ], [ 115.17984882, 30.97759874 ], [ 115.17971868, 30.97731866 ], [ 115.17945822, 30.97697841 ], [ 115.1792478, 30.97668816 ], [ 115.17907752, 30.976448 ], [ 115.17888708, 30.97611788 ], [ 115.1787069, 30.97570779 ], [ 115.17859656, 30.97529784 ], [ 115.17854652, 30.97498793 ], [ 115.17852654, 30.9744882 ], [ 115.17848658, 30.97431824 ], [ 115.17836634, 30.97406813 ], [ 115.17819606, 30.97380798 ], [ 115.17780528, 30.97331757 ], [ 115.17751476, 30.97291725 ], [ 115.17739452, 30.9726972 ], [ 115.1772642, 30.97244709 ], [ 115.17711408, 30.97203705 ], [ 115.17699384, 30.97155713 ], [ 115.17682356, 30.97058742 ], [ 115.17660324, 30.96928782 ], [ 115.17649308, 30.96868797 ], [ 115.17646302, 30.96849803 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527954", "Name": "王家冲街", "pyname": "wjcj", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17646302, 30.96849803 ], [ 115.17644304, 30.96842801 ], [ 115.17641298, 30.96836802 ], [ 115.17633288, 30.96823793 ], [ 115.1760123, 30.96782757 ], [ 115.1759421, 30.96774752 ], [ 115.17583194, 30.96764735 ], [ 115.17559146, 30.96733707 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527955", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "2.243", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17291684, 30.95810762 ], [ 115.17344802, 30.95807859 ], [ 115.1741493, 30.95796996 ], [ 115.17453, 30.95788068 ], [ 115.17484068, 30.95775135 ], [ 115.17518142, 30.95746214 ], [ 115.1756523, 30.9569733 ], [ 115.1759529, 30.95665403 ], [ 115.17645402, 30.95623521 ], [ 115.17711534, 30.95584664 ], [ 115.17776658, 30.95551805 ], [ 115.17826752, 30.95505923 ], [ 115.17868854, 30.95466026 ], [ 115.17885882, 30.95450064 ], [ 115.17898914, 30.95433099 ], [ 115.17914934, 30.95417138 ], [ 115.17937992, 30.95404187 ], [ 115.17982074, 30.95390277 ], [ 115.18056216, 30.95356433 ], [ 115.18084278, 30.95346492 ], [ 115.18160418, 30.95332641 ], [ 115.18185474, 30.95325689 ], [ 115.1821053, 30.95315744 ], [ 115.18294698, 30.95298905 ], [ 115.18317738, 30.95290953 ], [ 115.18364826, 30.95287043 ], [ 115.18410924, 30.95287128 ], [ 115.18431966, 30.95285166 ], [ 115.1846703, 30.95277237 ], [ 115.18501104, 30.95281296 ], [ 115.18521138, 30.95285333 ], [ 115.1854218, 30.95285369 ], [ 115.18609302, 30.95270501 ], [ 115.18631352, 30.95260547 ], [ 115.18650396, 30.95257586 ], [ 115.18682454, 30.95256645 ], [ 115.18714512, 30.95247708 ], [ 115.18747578, 30.95246772 ], [ 115.18766622, 30.95243807 ], [ 115.18807698, 30.95241885 ], [ 115.1882775, 30.95236926 ], [ 115.18847784, 30.95233965 ], [ 115.1888886, 30.95235036 ], [ 115.18908894, 30.95233074 ], [ 115.1892693, 30.95224115 ], [ 115.18963002, 30.95200197 ], [ 115.18984044, 30.95190239 ], [ 115.19057196, 30.95166389 ], [ 115.19164404, 30.9512561 ], [ 115.19208504, 30.95121695 ], [ 115.1922753, 30.95118729 ], [ 115.19251578, 30.95109779 ], [ 115.1928765, 30.95100851 ], [ 115.19301672, 30.95095878 ], [ 115.19347752, 30.95071961 ], [ 115.19373798, 30.95061003 ], [ 115.1937981, 30.95062011 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527956", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.227", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1937981, 30.95062011 ], [ 115.19383806, 30.95063015 ], [ 115.19401842, 30.9507503 ], [ 115.19420868, 30.95083053 ], [ 115.19452908, 30.95083098 ], [ 115.19498988, 30.9508916 ], [ 115.19510994, 30.95089173 ], [ 115.19547048, 30.95089223 ], [ 115.1958411, 30.95094272 ], [ 115.19610138, 30.95090307 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527957", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "1.097", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20031788, 30.94860006 ], [ 115.2001377, 30.94834005 ], [ 115.20001746, 30.94820996 ], [ 115.1999775, 30.94816995 ], [ 115.19977716, 30.94805979 ], [ 115.19971704, 30.94800975 ], [ 115.19968716, 30.94792974 ], [ 115.19969706, 30.94783983 ], [ 115.19972712, 30.94774992 ], [ 115.19976726, 30.94767005 ], [ 115.19991756, 30.94749036 ], [ 115.20005778, 30.94727072 ], [ 115.20006786, 30.94721078 ], [ 115.20010782, 30.9471309 ], [ 115.20028818, 30.94685132 ], [ 115.20032832, 30.94675146 ], [ 115.20034848, 30.94651166 ], [ 115.20032832, 30.9464217 ], [ 115.2003384, 30.9463218 ], [ 115.20036846, 30.94620192 ], [ 115.20043866, 30.94610207 ], [ 115.20058896, 30.94591239 ], [ 115.20065898, 30.94580259 ], [ 115.20073926, 30.94543296 ], [ 115.20071928, 30.94514316 ], [ 115.20067932, 30.94484333 ], [ 115.20063918, 30.94474334 ], [ 115.20057924, 30.94465334 ], [ 115.20046908, 30.94458323 ], [ 115.20023868, 30.94444305 ], [ 115.19975808, 30.94428249 ], [ 115.19946774, 30.9440822 ], [ 115.19938764, 30.94396214 ], [ 115.1993376, 30.94385216 ], [ 115.19931744, 30.94370222 ], [ 115.19937774, 30.94335248 ], [ 115.1994879, 30.94296291 ], [ 115.1994879, 30.94265309 ], [ 115.1995581, 30.94231338 ], [ 115.1996283, 30.94216358 ], [ 115.19973846, 30.94204379 ], [ 115.1999487, 30.94166435 ], [ 115.20014904, 30.94150473 ], [ 115.20034938, 30.94125516 ], [ 115.2004095, 30.94114532 ], [ 115.20044964, 30.94101545 ], [ 115.20046962, 30.94087554 ], [ 115.20043974, 30.9405857 ], [ 115.20043974, 30.94046577 ], [ 115.20047988, 30.940196 ], [ 115.20048978, 30.94005609 ], [ 115.20048978, 30.94001613 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527958", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.066", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20048978, 30.94001613 ], [ 115.2004698, 30.93992613 ], [ 115.20042984, 30.93979617 ], [ 115.20025956, 30.93952608 ], [ 115.20023958, 30.9394661 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527959", "Name": "X214", "pyname": "x214", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.483", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3317357, 30.98256165 ], [ 115.33214466, 30.98335037 ], [ 115.332444, 30.98385945 ], [ 115.33265352, 30.98416887 ], [ 115.33287294, 30.98448824 ], [ 115.33322214, 30.98506721 ], [ 115.33356126, 30.98560622 ], [ 115.33377078, 30.98591559 ], [ 115.33412988, 30.98637464 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527960", "Name": "X214", "pyname": "x214", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.551", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33412988, 30.98637464 ], [ 115.33431942, 30.98662412 ], [ 115.33436928, 30.986654 ], [ 115.33450896, 30.98688359 ], [ 115.33467852, 30.98708312 ], [ 115.33517748, 30.98778174 ], [ 115.33530708, 30.98795139 ], [ 115.33542678, 30.98805111 ], [ 115.33561632, 30.98816069 ], [ 115.33581594, 30.98824025 ], [ 115.33607532, 30.9882897 ], [ 115.33622508, 30.98830941 ], [ 115.33628484, 30.98830928 ], [ 115.33636476, 30.98830914 ], [ 115.33651434, 30.98829884 ], [ 115.33681368, 30.98827827 ], [ 115.33700322, 30.98826792 ], [ 115.33708314, 30.98826774 ], [ 115.33735242, 30.98828723 ], [ 115.33807098, 30.98829582 ], [ 115.33853988, 30.9883149 ], [ 115.33876938, 30.98834442 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527996", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.445", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19910144, 31.0700246 ], [ 115.19926182, 31.07006478 ], [ 115.19938188, 31.07016491 ], [ 115.19984268, 31.07025549 ], [ 115.1999928, 31.0703157 ], [ 115.20088398, 31.07099651 ], [ 115.20104418, 31.07105667 ], [ 115.20122454, 31.0710969 ], [ 115.20139482, 31.0711671 ], [ 115.20195552, 31.0714677 ], [ 115.20205578, 31.07155779 ], [ 115.2021258, 31.07164784 ], [ 115.20241614, 31.07211791 ], [ 115.20256626, 31.07244789 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527997", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.349", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20256626, 31.07244789 ], [ 115.20267642, 31.07269787 ], [ 115.20276642, 31.07299779 ], [ 115.20280656, 31.07309778 ], [ 115.20280656, 31.0731777 ], [ 115.20292662, 31.07335775 ], [ 115.20307674, 31.07350787 ], [ 115.20315702, 31.07355795 ], [ 115.20324702, 31.07357807 ], [ 115.2033372, 31.07354823 ], [ 115.20339732, 31.07347835 ], [ 115.2034173, 31.07339843 ], [ 115.20337734, 31.07327846 ], [ 115.20336744, 31.07316852 ], [ 115.20344754, 31.0728389 ], [ 115.20352764, 31.07264913 ], [ 115.20360792, 31.07257929 ], [ 115.203708, 31.07252948 ], [ 115.20379818, 31.07250963 ], [ 115.20390834, 31.07252975 ], [ 115.20428886, 31.07278013 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527998", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.225", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20428886, 31.07278013 ], [ 115.20447912, 31.07290032 ], [ 115.20500994, 31.07315093 ], [ 115.20525024, 31.07325119 ], [ 115.20537048, 31.07326136 ], [ 115.20549054, 31.07323157 ], [ 115.20569088, 31.0731219 ], [ 115.20580104, 31.07309207 ], [ 115.2060615, 31.07304243 ], [ 115.20619164, 31.07304261 ], [ 115.20643194, 31.07313288 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.527999", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.231", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20643194, 31.07313288 ], [ 115.2070929, 31.07336364 ], [ 115.20736326, 31.07354387 ], [ 115.20746334, 31.07364395 ], [ 115.20750348, 31.07375397 ], [ 115.2075735, 31.07426378 ], [ 115.20767358, 31.07467368 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528000", "Name": "映山红路", "pyname": "yshl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.709", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18236486, 31.07209856 ], [ 115.18236486, 31.07207858 ], [ 115.18235496, 31.07182869 ], [ 115.1823249, 31.07164874 ], [ 115.18226478, 31.07146869 ], [ 115.18214454, 31.07037906 ], [ 115.18210458, 31.07013912 ], [ 115.18208442, 31.06985927 ], [ 115.18210458, 31.06957946 ], [ 115.18217478, 31.06931972 ], [ 115.18247538, 31.0683308 ], [ 115.18256556, 31.06750145 ], [ 115.18254558, 31.06724153 ], [ 115.18249536, 31.06701158 ], [ 115.1823852, 31.06671152 ], [ 115.18235514, 31.06657157 ], [ 115.18235514, 31.06644161 ], [ 115.18235514, 31.06642163 ], [ 115.18236522, 31.06636169 ], [ 115.18236522, 31.06632173 ], [ 115.18239528, 31.06622183 ], [ 115.18242534, 31.06613192 ], [ 115.18250544, 31.06599215 ], [ 115.1825355, 31.06594224 ], [ 115.1826057, 31.06585242 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528001", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.495", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1826057, 31.06585242 ], [ 115.18288632, 31.06555308 ], [ 115.18296642, 31.06538334 ], [ 115.18302654, 31.06522355 ], [ 115.1830467, 31.06513364 ], [ 115.18307676, 31.06501376 ], [ 115.18309674, 31.06488384 ], [ 115.1831268, 31.06466402 ], [ 115.18313688, 31.06452411 ], [ 115.18313688, 31.0643942 ], [ 115.18310682, 31.0641143 ], [ 115.18310682, 31.06405431 ], [ 115.18310682, 31.06393439 ], [ 115.18310682, 31.06384443 ], [ 115.1831268, 31.06378449 ], [ 115.18313688, 31.06370457 ], [ 115.18317702, 31.06359473 ], [ 115.18328718, 31.06330506 ], [ 115.18338744, 31.06302543 ], [ 115.18340742, 31.06297548 ], [ 115.18342758, 31.06294551 ], [ 115.1834976, 31.0628957 ], [ 115.18365798, 31.06278603 ], [ 115.18375824, 31.06271628 ], [ 115.18377822, 31.06267632 ], [ 115.18380828, 31.06263641 ], [ 115.18381836, 31.06261643 ], [ 115.18381836, 31.06258646 ], [ 115.18382826, 31.0625465 ], [ 115.18381836, 31.06244655 ], [ 115.18373808, 31.06220652 ], [ 115.1837181, 31.06214649 ], [ 115.1837181, 31.06204655 ], [ 115.1837181, 31.06198661 ], [ 115.18376832, 31.06183676 ], [ 115.1837883, 31.06174685 ], [ 115.18379838, 31.06168691 ], [ 115.1837883, 31.06159695 ], [ 115.18376832, 31.06154691 ], [ 115.1837181, 31.06139693 ], [ 115.1837082, 31.06133694 ], [ 115.1837082, 31.06129694 ], [ 115.1837181, 31.061237 ], [ 115.18372818, 31.06120703 ], [ 115.18374816, 31.06114713 ], [ 115.1837883, 31.0610772 ], [ 115.18382844, 31.06101735 ], [ 115.18387848, 31.06095746 ], [ 115.18391862, 31.06093752 ], [ 115.1842392, 31.06077822 ], [ 115.1843193, 31.06074839 ], [ 115.18444962, 31.0606587 ], [ 115.18462008, 31.06047911 ], [ 115.18474032, 31.06033938 ], [ 115.18480044, 31.06024956 ], [ 115.1848305, 31.06017963 ], [ 115.1849106, 31.0599999 ], [ 115.1850609, 31.05962037 ], [ 115.18510104, 31.05951053 ], [ 115.18512102, 31.05939065 ], [ 115.18514118, 31.05928071 ], [ 115.18515108, 31.05924075 ], [ 115.18517124, 31.05920084 ], [ 115.18518114, 31.05918086 ], [ 115.18522128, 31.05912096 ], [ 115.18531146, 31.05907115 ], [ 115.18541172, 31.05901139 ], [ 115.1856522, 31.0589019 ], [ 115.18583256, 31.05881226 ], [ 115.18591266, 31.05876245 ], [ 115.18597278, 31.05868262 ], [ 115.18598286, 31.05865265 ], [ 115.18599294, 31.05863267 ], [ 115.18600284, 31.05858272 ], [ 115.18601292, 31.05852278 ], [ 115.18601292, 31.05843282 ], [ 115.1860329, 31.05807305 ], [ 115.18604298, 31.05794318 ], [ 115.18604298, 31.05753341 ], [ 115.18604316, 31.05728352 ], [ 115.18604316, 31.05718358 ], [ 115.186023, 31.0570736 ], [ 115.1860131, 31.05700362 ], [ 115.18587288, 31.05663359 ], [ 115.18585272, 31.0565336 ], [ 115.18583274, 31.05643361 ], [ 115.18582266, 31.05637362 ], [ 115.18582266, 31.05629366 ], [ 115.18580268, 31.05603374 ], [ 115.18581276, 31.05589383 ], [ 115.18582266, 31.05576392 ], [ 115.1858628, 31.05555408 ], [ 115.185933, 31.05529434 ], [ 115.18594308, 31.05522441 ], [ 115.18594308, 31.05515444 ], [ 115.18594308, 31.05508446 ], [ 115.1858628, 31.05472451 ], [ 115.18583274, 31.0544546 ], [ 115.18580286, 31.05407471 ], [ 115.18571268, 31.05362475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528002", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.214", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1830557, 31.07644709 ], [ 115.1834562, 31.07630763 ], [ 115.18368642, 31.076168 ], [ 115.18394688, 31.07595848 ], [ 115.1840871, 31.07582879 ], [ 115.18467822, 31.07517012 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528003", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.089", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18523928, 31.07411168 ], [ 115.18523928, 31.07403171 ], [ 115.1851293, 31.07346197 ], [ 115.18513938, 31.07332211 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528004", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.082", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18467822, 31.07517012 ], [ 115.18520922, 31.07459129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528005", "Name": "X211", "pyname": "x211", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.054", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18520922, 31.07459129 ], [ 115.18525926, 31.07442146 ], [ 115.18523928, 31.07411168 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528006", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16725242, 31.09588619 ], [ 115.16763312, 31.0954172 ], [ 115.16778342, 31.09529754 ], [ 115.16797386, 31.09520795 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528007", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "130", "length": "0.064", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1830557, 31.07644709 ], [ 115.18238466, 31.07640614 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528008", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "130", "length": "0.351", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18238466, 31.07640614 ], [ 115.1822745, 31.07639597 ], [ 115.18209414, 31.07641563 ], [ 115.1819037, 31.07649519 ], [ 115.18177338, 31.07663487 ], [ 115.18167312, 31.07679462 ], [ 115.18119216, 31.07802294 ], [ 115.18081128, 31.07904161 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528009", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "130", "length": "0.297", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18081128, 31.07904161 ], [ 115.1805807, 31.07966081 ], [ 115.18026984, 31.0808295 ], [ 115.18010946, 31.08163874 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528010", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.261", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17990894, 31.08319736 ], [ 115.17989886, 31.0832973 ], [ 115.1798787, 31.08388689 ], [ 115.1798787, 31.08457647 ], [ 115.17984846, 31.0847463 ], [ 115.17979842, 31.08491609 ], [ 115.1797383, 31.08504591 ], [ 115.17964812, 31.08520566 ], [ 115.17953778, 31.08533535 ], [ 115.17941754, 31.08543507 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528011", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.027", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18010946, 31.08163874 ], [ 115.18006932, 31.0818785 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528012", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.148", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18006932, 31.0818785 ], [ 115.17995898, 31.08262784 ], [ 115.17990894, 31.08319736 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528013", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.010", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17941754, 31.08543507 ], [ 115.17933744, 31.08549488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528014", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.027", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17933744, 31.08549488 ], [ 115.17922728, 31.08557466 ], [ 115.17910704, 31.08563438 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528015", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.174", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17910704, 31.08563438 ], [ 115.17865614, 31.08587342 ], [ 115.17770412, 31.08632139 ], [ 115.17752376, 31.08642098 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528016", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.025", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17752376, 31.08642098 ], [ 115.17730326, 31.08655053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528017", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.250", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17730326, 31.08655053 ], [ 115.17679224, 31.08685937 ], [ 115.17620112, 31.08721806 ], [ 115.17556986, 31.08767661 ], [ 115.17521904, 31.08791583 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528018", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.210", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17521904, 31.08791583 ], [ 115.17498864, 31.08807531 ], [ 115.17436746, 31.0884939 ], [ 115.17380622, 31.08880269 ], [ 115.17341544, 31.08899183 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528019", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.329", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17341544, 31.08899183 ], [ 115.1728443, 31.0892706 ], [ 115.1720325, 31.08968888 ], [ 115.1717319, 31.08987819 ], [ 115.17149142, 31.09008762 ], [ 115.17137118, 31.0902273 ], [ 115.17123096, 31.0904469 ], [ 115.17108048, 31.09068648 ], [ 115.1709903, 31.09095617 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528020", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.383", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1709903, 31.09095617 ], [ 115.17096024, 31.09105602 ], [ 115.17093018, 31.09123589 ], [ 115.17081984, 31.09206515 ], [ 115.17075972, 31.0926447 ], [ 115.17065946, 31.09305425 ], [ 115.17057936, 31.09330395 ], [ 115.17045912, 31.09354358 ], [ 115.17029874, 31.09376313 ], [ 115.17007824, 31.09396262 ], [ 115.16983776, 31.09413209 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528021", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16983776, 31.09413209 ], [ 115.16968746, 31.09423172 ], [ 115.16949702, 31.09434129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528022", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.174", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16949702, 31.09434129 ], [ 115.16862528, 31.09480943 ], [ 115.16797386, 31.09520795 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528050", "Name": "铁门大道", "pyname": "tmdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.090", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84665424, 31.03976574 ], [ 114.8467644, 31.03971597 ], [ 114.84693486, 31.03962638 ], [ 114.84738576, 31.03925738 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528051", "Name": "铁门大道", "pyname": "tmdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.146", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84738576, 31.03925738 ], [ 114.84796698, 31.03878875 ], [ 114.84848808, 31.03833992 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528052", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.356", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9669747, 31.03502103 ], [ 114.9671142, 31.03500065 ], [ 114.96749292, 31.03491965 ], [ 114.96770226, 31.03488909 ], [ 114.96794148, 31.03489845 ], [ 114.9681906, 31.03485777 ], [ 114.97051278, 31.03462148 ], [ 114.97066218, 31.03460109 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528053", "Name": "X305", "pyname": "x305", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.459", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97066218, 31.03460109 ], [ 114.97087152, 31.03456055 ], [ 114.97121046, 31.03454961 ], [ 114.9717087, 31.03447824 ], [ 114.97393116, 31.03425225 ], [ 114.97492782, 31.03431944 ], [ 114.97542606, 31.03438802 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528054", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.246", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79351698, 31.0641687 ], [ 114.79304628, 31.06450787 ], [ 114.79275576, 31.06476734 ], [ 114.79176414, 31.0654256 ], [ 114.79152366, 31.06557518 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528055", "Name": "X208", "pyname": "x208", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79152366, 31.06557518 ], [ 114.79111308, 31.06584446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528056", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86302938, 31.14121154 ], [ 114.86302938, 31.14118157 ], [ 114.86305926, 31.14094163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528057", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.648", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86305926, 31.14094163 ], [ 114.8633496, 31.1383931 ], [ 114.86347992, 31.13800362 ], [ 114.8637906, 31.13757437 ], [ 114.86416122, 31.13725509 ], [ 114.86468196, 31.13703581 ], [ 114.86501226, 31.13692623 ], [ 114.86606364, 31.1365976 ], [ 114.86623374, 31.13655782 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528058", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86984778, 31.41356265 ], [ 114.86993796, 31.41380268 ], [ 114.8701581, 31.41414279 ], [ 114.87027816, 31.41429291 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528059", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.779", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87027816, 31.41429291 ], [ 114.8704083, 31.414383 ], [ 114.87057858, 31.41444321 ], [ 114.87097908, 31.41434372 ], [ 114.87140964, 31.41419432 ], [ 114.87164004, 31.41416462 ], [ 114.87188034, 31.41417488 ], [ 114.87214062, 31.41423518 ], [ 114.87237084, 31.41431546 ], [ 114.87257118, 31.41441567 ], [ 114.87276126, 31.41454586 ], [ 114.87294144, 31.41472599 ], [ 114.87318174, 31.41509616 ], [ 114.87332196, 31.41528624 ], [ 114.8736222, 31.41592637 ], [ 114.87392226, 31.41666648 ], [ 114.87441258, 31.41796658 ], [ 114.8748129, 31.41888674 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528060", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.307", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8499513, 31.3522412 ], [ 114.8502717, 31.35325145 ], [ 114.85083276, 31.35490191 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528061", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85083276, 31.35490191 ], [ 114.85091286, 31.35524193 ], [ 114.85097298, 31.35534201 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528108", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.535", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86517786, 31.33857924 ], [ 114.86525796, 31.33849937 ], [ 114.86535804, 31.33837949 ], [ 114.8655483, 31.3381697 ], [ 114.8656284, 31.33808982 ], [ 114.86570832, 31.33798992 ], [ 114.8657985, 31.33792004 ], [ 114.86597868, 31.33778022 ], [ 114.86616894, 31.33763046 ], [ 114.8662989, 31.3375406 ], [ 114.86659932, 31.33736096 ], [ 114.86667942, 31.33732104 ], [ 114.8668695, 31.33721124 ], [ 114.86704968, 31.33711143 ], [ 114.86730006, 31.33697171 ], [ 114.86753028, 31.33683198 ], [ 114.86763036, 31.33678208 ], [ 114.86811078, 31.33651262 ], [ 114.86843118, 31.33633298 ], [ 114.86879154, 31.33613345 ], [ 114.8690619, 31.3359638 ], [ 114.86919204, 31.33586394 ], [ 114.8693121, 31.33577412 ], [ 114.86944242, 31.33565429 ], [ 114.86951244, 31.33556442 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528109", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.845", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86410506, 31.34564492 ], [ 114.86414502, 31.34562498 ], [ 114.86421522, 31.34558507 ], [ 114.86427534, 31.34555514 ], [ 114.86437542, 31.34549534 ], [ 114.86449566, 31.3454255 ], [ 114.86455578, 31.34538558 ], [ 114.86464578, 31.34531574 ], [ 114.86476602, 31.34519595 ], [ 114.86487618, 31.34504615 ], [ 114.8649363, 31.34493626 ], [ 114.86495628, 31.34487632 ], [ 114.8650164, 31.3446965 ], [ 114.86503656, 31.34444661 ], [ 114.86502666, 31.34432664 ], [ 114.86501658, 31.34423669 ], [ 114.8649966, 31.34410673 ], [ 114.86497662, 31.34397677 ], [ 114.86496654, 31.3438968 ], [ 114.86495664, 31.34376684 ], [ 114.86493666, 31.34362685 ], [ 114.86491668, 31.34350688 ], [ 114.8649066, 31.34336693 ], [ 114.86488662, 31.34322698 ], [ 114.86487654, 31.34318697 ], [ 114.86485656, 31.34309702 ], [ 114.86484666, 31.34295707 ], [ 114.8648067, 31.34275709 ], [ 114.86477664, 31.34254716 ], [ 114.86476674, 31.34240721 ], [ 114.8647167, 31.34198732 ], [ 114.86469672, 31.34184737 ], [ 114.86467674, 31.34169738 ], [ 114.86466666, 31.34156747 ], [ 114.86465676, 31.34147747 ], [ 114.8646267, 31.34127753 ], [ 114.86458674, 31.34097761 ], [ 114.86457684, 31.34081768 ], [ 114.86454678, 31.34060771 ], [ 114.8645268, 31.34045777 ], [ 114.86449674, 31.34024784 ], [ 114.86447676, 31.34012787 ], [ 114.86446686, 31.33993793 ], [ 114.86446686, 31.33973804 ], [ 114.864507, 31.33949819 ], [ 114.86454696, 31.33937826 ], [ 114.86459718, 31.33926837 ], [ 114.86475738, 31.33903869 ], [ 114.86486754, 31.33889888 ], [ 114.86499768, 31.33873904 ], [ 114.8650677, 31.33865912 ], [ 114.86512782, 31.3386192 ], [ 114.86517786, 31.33857924 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528110", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.619", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85083276, 31.35490191 ], [ 114.85097298, 31.35485214 ], [ 114.85117332, 31.3547625 ], [ 114.8512635, 31.35473267 ], [ 114.85137366, 31.3546829 ], [ 114.85144386, 31.35464303 ], [ 114.85160406, 31.35458331 ], [ 114.85167426, 31.35454344 ], [ 114.85176444, 31.35451361 ], [ 114.85193472, 31.35443391 ], [ 114.852015, 31.35440403 ], [ 114.852105, 31.35436421 ], [ 114.85221534, 31.35431439 ], [ 114.85233558, 31.35425463 ], [ 114.85244574, 31.35420482 ], [ 114.8525559, 31.35416504 ], [ 114.85260594, 31.35413511 ], [ 114.85272618, 31.35409533 ], [ 114.8528664, 31.35402558 ], [ 114.85294668, 31.35399575 ], [ 114.85311696, 31.35392604 ], [ 114.85317708, 31.35389616 ], [ 114.85334736, 31.35383645 ], [ 114.85364796, 31.35370698 ], [ 114.85375812, 31.3536672 ], [ 114.85401858, 31.35354764 ], [ 114.854229, 31.35346803 ], [ 114.8544594, 31.35336845 ], [ 114.85454958, 31.35332862 ], [ 114.85487016, 31.3531992 ], [ 114.8549904, 31.3531394 ], [ 114.85512072, 31.35308963 ], [ 114.85532106, 31.35299999 ], [ 114.85549134, 31.35293033 ], [ 114.85565154, 31.35286058 ], [ 114.8558319, 31.35279092 ], [ 114.85601226, 31.35271127 ], [ 114.85617264, 31.35264152 ], [ 114.85649322, 31.35250211 ], [ 114.85671354, 31.35241251 ], [ 114.85685376, 31.35236274 ], [ 114.85700406, 31.35229299 ], [ 114.85711422, 31.35225312 ], [ 114.85735452, 31.35215349 ], [ 114.85758492, 31.35206381 ], [ 114.857685, 31.35201395 ], [ 114.85817568, 31.35180465 ], [ 114.85836594, 31.35171497 ], [ 114.85858626, 31.35161529 ], [ 114.85873656, 31.3515455 ], [ 114.85896678, 31.35142584 ], [ 114.85906704, 31.35136599 ], [ 114.85916712, 31.35131613 ], [ 114.85932732, 31.35120638 ], [ 114.85958778, 31.35103677 ], [ 114.85968786, 31.35095694 ], [ 114.85989828, 31.35078729 ], [ 114.85998846, 31.35070746 ], [ 114.86006856, 31.35062759 ], [ 114.86015856, 31.35052773 ], [ 114.86023884, 31.35045789 ], [ 114.8603589, 31.35031808 ], [ 114.86054934, 31.35011841 ], [ 114.86064942, 31.3500186 ], [ 114.86067948, 31.34998863 ], [ 114.86070954, 31.34994872 ], [ 114.8608998, 31.34972903 ], [ 114.86112012, 31.34947941 ], [ 114.8612904, 31.34927975 ], [ 114.86142072, 31.34912994 ], [ 114.86156094, 31.3489602 ], [ 114.86179116, 31.34871063 ], [ 114.86201166, 31.34846102 ], [ 114.86223198, 31.34818139 ], [ 114.86238228, 31.3479617 ], [ 114.86246238, 31.34783187 ], [ 114.86263266, 31.34751219 ], [ 114.86266272, 31.3474523 ], [ 114.8631336, 31.34657327 ], [ 114.86324376, 31.3463835 ], [ 114.863364, 31.34621372 ], [ 114.86343402, 31.34614383 ], [ 114.86355426, 31.34602404 ], [ 114.86359422, 31.34599412 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528111", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.062", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86359422, 31.34599412 ], [ 114.86361438, 31.34597414 ], [ 114.86372454, 31.34589431 ], [ 114.86390472, 31.34576462 ], [ 114.86410506, 31.34564492 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528124", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.223", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10306892, 31.20739799 ], [ 115.10324892, 31.20741806 ], [ 115.10402922, 31.20756831 ], [ 115.10436924, 31.20766839 ], [ 115.10486946, 31.20774854 ], [ 115.10514954, 31.20782864 ], [ 115.10534952, 31.2078587 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528125", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.858", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10534952, 31.2078587 ], [ 115.10543952, 31.20786873 ], [ 115.10774028, 31.20835941 ], [ 115.11089118, 31.20920028 ], [ 115.11250164, 31.20958076 ], [ 115.11354186, 31.20981107 ], [ 115.11404208, 31.20993122 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528126", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.389", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11404208, 31.20993122 ], [ 115.11441216, 31.21002135 ], [ 115.11555246, 31.21018178 ], [ 115.11574254, 31.21024181 ], [ 115.11653292, 31.21037213 ], [ 115.11705294, 31.2102324 ], [ 115.11802386, 31.21003337 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528127", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.120", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11802386, 31.21003337 ], [ 115.1182341, 31.20999363 ], [ 115.11862452, 31.20996402 ], [ 115.11900486, 31.20996443 ], [ 115.11927522, 31.2100047 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528128", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.390", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1225586, 31.21041803 ], [ 115.12500102, 31.21078041 ], [ 115.12506114, 31.21079049 ], [ 115.12661274, 31.21099205 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528129", "Name": "阎公大道", "pyname": "ygdd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.376", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12661274, 31.21099205 ], [ 115.12794402, 31.21117335 ], [ 115.12862478, 31.21122407 ], [ 115.12930554, 31.21133472 ], [ 115.12972584, 31.21137518 ], [ 115.13052666, 31.21151594 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528130", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.435", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14325266, 31.25195546 ], [ 115.14335274, 31.25255531 ], [ 115.14343284, 31.25288525 ], [ 115.1437131, 31.25374529 ], [ 115.14431376, 31.25575521 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528131", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.070", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14431376, 31.25575521 ], [ 115.14449394, 31.25636523 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528132", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.110", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14449394, 31.25636523 ], [ 115.14457422, 31.25648529 ], [ 115.14469428, 31.25657543 ], [ 115.14486456, 31.25660571 ], [ 115.14504492, 31.25659599 ], [ 115.14522528, 31.25663627 ], [ 115.1453655, 31.25675646 ], [ 115.14540546, 31.25683647 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528133", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.165", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14540546, 31.25683647 ], [ 115.1454456, 31.25693651 ], [ 115.14565584, 31.25726667 ], [ 115.14570588, 31.25742669 ], [ 115.14571596, 31.25757663 ], [ 115.14580614, 31.25771667 ], [ 115.14594636, 31.25782688 ], [ 115.14609648, 31.25795706 ], [ 115.14620664, 31.25811713 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528134", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16104152, 31.28370242 ], [ 115.16125194, 31.28371281 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528135", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.635", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16125194, 31.28371281 ], [ 115.16162256, 31.28374346 ], [ 115.1618832, 31.28380389 ], [ 115.16209344, 31.28395419 ], [ 115.16251428, 31.28429484 ], [ 115.16351616, 31.28491638 ], [ 115.16399712, 31.28523714 ], [ 115.1642376, 31.28538749 ], [ 115.16502906, 31.28576877 ], [ 115.16582052, 31.28619002 ], [ 115.166061, 31.28633037 ], [ 115.1662914, 31.28649075 ], [ 115.16672214, 31.28688135 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528136", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.524", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21453068, 31.31922501 ], [ 115.2146709, 31.3193052 ], [ 115.21478106, 31.31937536 ], [ 115.21486116, 31.31943543 ], [ 115.21499148, 31.3195356 ], [ 115.21509156, 31.31963568 ], [ 115.2152118, 31.3197458 ], [ 115.21528182, 31.31982585 ], [ 115.21532196, 31.31988588 ], [ 115.21540188, 31.32001593 ], [ 115.21558224, 31.32033602 ], [ 115.21569222, 31.32050612 ], [ 115.2158625, 31.32072626 ], [ 115.21593252, 31.32083628 ], [ 115.21597266, 31.32092628 ], [ 115.21598256, 31.32094631 ], [ 115.21599264, 31.32104625 ], [ 115.21601244, 31.32135608 ], [ 115.2160425, 31.32164597 ], [ 115.2161424, 31.32217575 ], [ 115.21630242, 31.32277565 ], [ 115.21655262, 31.32340565 ], [ 115.21657278, 31.32344565 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528137", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.449", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21657278, 31.32344565 ], [ 115.21667286, 31.32363569 ], [ 115.21693314, 31.3241058 ], [ 115.21703322, 31.32425588 ], [ 115.21714338, 31.32441599 ], [ 115.21726344, 31.32454608 ], [ 115.21748376, 31.32476631 ], [ 115.21758384, 31.3248564 ], [ 115.2178443, 31.32506669 ], [ 115.21826496, 31.32538718 ], [ 115.21947672, 31.32624861 ], [ 115.21969704, 31.32640886 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528138", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.012", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2312471, 31.32975771 ], [ 115.231347, 31.32969773 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528139", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.231347, 31.32969773 ], [ 115.23171708, 31.3294878 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528140", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "1.120", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23171708, 31.3294878 ], [ 115.23217698, 31.32921789 ], [ 115.23256704, 31.32904797 ], [ 115.23275694, 31.32899802 ], [ 115.23299706, 31.32898803 ], [ 115.23451716, 31.32903816 ], [ 115.23473712, 31.32902822 ], [ 115.23595716, 31.32884835 ], [ 115.23616704, 31.3287584 ], [ 115.23639708, 31.32860846 ], [ 115.23706704, 31.32812862 ], [ 115.23729708, 31.32798867 ], [ 115.23801708, 31.32762881 ], [ 115.2382671, 31.32752886 ], [ 115.2385371, 31.32747891 ], [ 115.23886704, 31.32750893 ], [ 115.23975714, 31.32764901 ], [ 115.2403272, 31.32775904 ], [ 115.24058712, 31.32774905 ], [ 115.24081716, 31.32765909 ], [ 115.24102722, 31.32762912 ], [ 115.24117716, 31.32771912 ], [ 115.24130712, 31.32781911 ], [ 115.24146714, 31.32788913 ], [ 115.24165722, 31.32792914 ], [ 115.2420273, 31.32795915 ], [ 115.24259718, 31.32790925 ], [ 115.24268718, 31.32791924 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528141", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23002706, 31.33052744 ], [ 115.23019716, 31.33040747 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528142", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.269", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05616596, 31.17220443 ], [ 115.05604626, 31.17258455 ], [ 115.05602628, 31.17265457 ], [ 115.05595644, 31.17282462 ], [ 115.0558767, 31.17302469 ], [ 115.05583674, 31.17314475 ], [ 115.05578688, 31.17341475 ], [ 115.05573702, 31.17359475 ], [ 115.05566736, 31.17404475 ], [ 115.05564738, 31.17419469 ], [ 115.05558762, 31.17466463 ], [ 115.05555756, 31.17505455 ], [ 115.05552768, 31.17517457 ], [ 115.05545784, 31.17553457 ], [ 115.05531834, 31.17588471 ], [ 115.05509892, 31.17635496 ], [ 115.05492936, 31.17667518 ], [ 115.05472992, 31.17711542 ], [ 115.05457026, 31.17735567 ], [ 115.05447054, 31.17743586 ], [ 115.05410154, 31.17766653 ], [ 115.05362274, 31.17788744 ], [ 115.05316392, 31.1781083 ], [ 115.0529445, 31.17829865 ], [ 115.05288474, 31.17848873 ], [ 115.05248586, 31.17929922 ], [ 115.05235608, 31.17968933 ], [ 115.05230622, 31.18004928 ], [ 115.05229632, 31.18020926 ], [ 115.05224646, 31.18040924 ], [ 115.05222648, 31.18054923 ], [ 115.05217662, 31.18105913 ], [ 115.05211686, 31.18153905 ], [ 115.052067, 31.18188902 ], [ 115.05199716, 31.18221905 ], [ 115.05187746, 31.18251915 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528143", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05187746, 31.18251915 ], [ 115.05184758, 31.1826092 ], [ 115.05175776, 31.18273934 ], [ 115.0517079, 31.1827694 ], [ 115.05160818, 31.18288959 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528144", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.152", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05160818, 31.18288959 ], [ 115.05185766, 31.18289904 ], [ 115.05196728, 31.18290881 ], [ 115.05239622, 31.18298792 ], [ 115.05251592, 31.18302765 ], [ 115.05270546, 31.18308723 ], [ 115.05293478, 31.18317669 ], [ 115.05312432, 31.18325625 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528145", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.896", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05312432, 31.18325625 ], [ 115.05431124, 31.18375359 ], [ 115.05444084, 31.18379333 ], [ 115.05455064, 31.18386303 ], [ 115.05463038, 31.18392288 ], [ 115.05476016, 31.18404254 ], [ 115.0548498, 31.18417232 ], [ 115.0552089, 31.18465134 ], [ 115.05552822, 31.18508051 ], [ 115.05588732, 31.18549959 ], [ 115.05638592, 31.18616829 ], [ 115.05649572, 31.18631801 ], [ 115.05666528, 31.18662752 ], [ 115.05678498, 31.18679721 ], [ 115.05683484, 31.18685706 ], [ 115.05703428, 31.18705659 ], [ 115.05751308, 31.18744544 ], [ 115.05782232, 31.18763471 ], [ 115.05790206, 31.18766454 ], [ 115.05807162, 31.18772417 ], [ 115.05848058, 31.18779329 ], [ 115.0594083, 31.18798125 ], [ 115.0600266, 31.18807994 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528211", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.591", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9468525, 31.21978685 ], [ 114.9472017, 31.21968632 ], [ 114.94786032, 31.21951523 ], [ 114.94833912, 31.21937447 ], [ 114.9485886, 31.21933406 ], [ 114.94860858, 31.21931403 ], [ 114.94925712, 31.21914299 ], [ 114.94963638, 31.21902239 ], [ 114.94987578, 31.21890206 ], [ 114.95022516, 31.2185916 ], [ 114.95068416, 31.21812104 ], [ 114.95111328, 31.21766051 ], [ 114.95145258, 31.21727009 ], [ 114.95176182, 31.21690973 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528212", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.028", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95176182, 31.21690973 ], [ 114.95188152, 31.2167696 ], [ 114.95193156, 31.21669953 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528213", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.152", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95193156, 31.21669953 ], [ 114.95275974, 31.21552868 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528214", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.014", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95275974, 31.21552868 ], [ 114.95277972, 31.21550865 ], [ 114.95344842, 31.21459794 ], [ 114.95392722, 31.21394733 ], [ 114.95423664, 31.21355696 ], [ 114.95469546, 31.21298636 ], [ 114.95514456, 31.21248573 ], [ 114.95565342, 31.21191504 ], [ 114.95599254, 31.21146464 ], [ 114.9563817, 31.21106409 ], [ 114.95695014, 31.21056311 ], [ 114.95742876, 31.21016207 ], [ 114.95757834, 31.21002176 ], [ 114.95780748, 31.20982124 ], [ 114.95812662, 31.2095705 ], [ 114.95846556, 31.20923979 ], [ 114.9585453, 31.2090197 ], [ 114.9585453, 31.20879983 ], [ 114.95846556, 31.20839028 ], [ 114.95845566, 31.20834033 ], [ 114.95848554, 31.20813036 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528215", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95848554, 31.20813036 ], [ 114.95859534, 31.20794015 ], [ 114.95895426, 31.20763937 ], [ 114.9591735, 31.20741891 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528216", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.169", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98601636, 31.18996463 ], [ 114.9861159, 31.18992435 ], [ 114.9865245, 31.18974318 ], [ 114.98675364, 31.18960256 ], [ 114.98688324, 31.1895522 ], [ 114.9869628, 31.18953195 ], [ 114.9870924, 31.1894816 ], [ 114.98733162, 31.18936095 ], [ 114.98757066, 31.18924026 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528217", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.159", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98357502, 31.19122139 ], [ 114.98364486, 31.19121122 ], [ 114.98379426, 31.19117076 ], [ 114.98399352, 31.1910602 ], [ 114.98407326, 31.19102001 ], [ 114.98419278, 31.19091966 ], [ 114.98447178, 31.19065898 ], [ 114.9847209, 31.19053829 ], [ 114.98490036, 31.19045778 ], [ 114.98494014, 31.19043767 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528218", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98494014, 31.19043767 ], [ 114.98518926, 31.19032697 ], [ 114.98553792, 31.19017599 ], [ 114.98580702, 31.19005521 ], [ 114.98601636, 31.18996463 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528219", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.892", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9591735, 31.20741891 ], [ 114.95960226, 31.20696801 ], [ 114.96018042, 31.20642675 ], [ 114.96055914, 31.20612593 ], [ 114.9620643, 31.20539229 ], [ 114.96287178, 31.20497037 ], [ 114.96344004, 31.20466905 ], [ 114.96460626, 31.20398631 ], [ 114.96522438, 31.20361484 ], [ 114.96557322, 31.20343403 ], [ 114.9657327, 31.20336365 ], [ 114.96619116, 31.20322248 ], [ 114.96662982, 31.2030914 ], [ 114.96694878, 31.20292062 ], [ 114.96741732, 31.20260954 ], [ 114.96781602, 31.20233864 ], [ 114.96799548, 31.20220823 ], [ 114.9680952, 31.20213798 ], [ 114.96854376, 31.20181695 ], [ 114.96866346, 31.2017067 ], [ 114.96876318, 31.2015965 ], [ 114.96879306, 31.20153647 ], [ 114.96911202, 31.20096591 ], [ 114.9693714, 31.20042551 ], [ 114.96947094, 31.20021536 ], [ 114.96965058, 31.19981513 ], [ 114.96980016, 31.19948492 ], [ 114.9698898, 31.19936472 ], [ 114.96999942, 31.19926451 ], [ 114.97022874, 31.19911398 ], [ 114.97064742, 31.19886297 ], [ 114.97095648, 31.19870223 ], [ 114.97114584, 31.19860179 ], [ 114.9713451, 31.19853128 ], [ 114.97165416, 31.19846049 ], [ 114.97232196, 31.19832882 ], [ 114.9730695, 31.1981769 ], [ 114.97339854, 31.19805608 ], [ 114.97351806, 31.19799578 ], [ 114.97361778, 31.19790555 ], [ 114.97366764, 31.19779548 ], [ 114.9736977, 31.19767547 ], [ 114.97375746, 31.19742545 ], [ 114.97380732, 31.19728541 ], [ 114.97386708, 31.19708534 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528220", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97386708, 31.19708534 ], [ 114.97389714, 31.19697536 ], [ 114.97399686, 31.1967752 ], [ 114.97414626, 31.19660487 ], [ 114.97429584, 31.19648454 ], [ 114.97456512, 31.19624397 ], [ 114.974874, 31.19595327 ], [ 114.97509342, 31.19576283 ], [ 114.97531266, 31.19560232 ], [ 114.97543236, 31.19553203 ], [ 114.97585104, 31.19531103 ], [ 114.97614012, 31.19516033 ], [ 114.97638924, 31.19503977 ], [ 114.97685778, 31.19479862 ], [ 114.9776154, 31.1944068 ], [ 114.97785462, 31.19428625 ], [ 114.9778845, 31.19427617 ], [ 114.97816368, 31.19409554 ], [ 114.9784128, 31.19390496 ], [ 114.978951, 31.19334377 ], [ 114.97917042, 31.19315324 ], [ 114.97923018, 31.19307309 ], [ 114.97941954, 31.19295263 ], [ 114.9796188, 31.19284215 ], [ 114.9797385, 31.19279184 ], [ 114.97985802, 31.19276151 ], [ 114.98039622, 31.19250015 ], [ 114.98061546, 31.19239958 ], [ 114.9809544, 31.1922387 ], [ 114.9813531, 31.19203773 ], [ 114.9822099, 31.19167535 ], [ 114.9823296, 31.19163498 ], [ 114.98271804, 31.19154386 ], [ 114.98279778, 31.19149364 ], [ 114.98313654, 31.19134266 ], [ 114.983316, 31.19129217 ], [ 114.98357502, 31.19122139 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528221", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.228", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93312228, 31.22579777 ], [ 114.93329184, 31.22569751 ], [ 114.93359118, 31.22553708 ], [ 114.93387072, 31.22539668 ], [ 114.93399042, 31.22534646 ], [ 114.93428976, 31.22530596 ], [ 114.93461898, 31.22535537 ], [ 114.9349284, 31.22549478 ], [ 114.93515772, 31.22560431 ], [ 114.93526752, 31.22566412 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528222", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.503", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93526752, 31.22566412 ], [ 114.93553698, 31.22581356 ], [ 114.93582624, 31.225923 ], [ 114.93611568, 31.22599248 ], [ 114.93637506, 31.22605197 ], [ 114.9365646, 31.22607164 ], [ 114.93673434, 31.22606138 ], [ 114.93712332, 31.22593074 ], [ 114.93776196, 31.22568977 ], [ 114.93831078, 31.22549892 ], [ 114.93910908, 31.22518766 ], [ 114.93969786, 31.22498673 ], [ 114.94016676, 31.22484602 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528223", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.088", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93233406, 31.22620893 ], [ 114.93245376, 31.22614877 ], [ 114.93307242, 31.22582783 ], [ 114.93312228, 31.22579777 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528224", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.118", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92929062, 31.22768349 ], [ 114.92937036, 31.22763336 ], [ 114.92967978, 31.22748293 ], [ 114.92991918, 31.22732259 ], [ 114.93013878, 31.22718228 ], [ 114.93032832, 31.227102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528225", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.215", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93032832, 31.227102 ], [ 114.93048798, 31.22703176 ], [ 114.931386, 31.22668035 ], [ 114.93191484, 31.22641958 ], [ 114.93233406, 31.22620893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528226", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.953", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92072046, 31.24423494 ], [ 114.92076042, 31.24421492 ], [ 114.9208902, 31.24413486 ], [ 114.92114994, 31.24395468 ], [ 114.92129988, 31.24386459 ], [ 114.92133984, 31.24383458 ], [ 114.92182926, 31.24308447 ], [ 114.92211906, 31.24238454 ], [ 114.9221691, 31.24218456 ], [ 114.92229888, 31.24172466 ], [ 114.92233902, 31.24108494 ], [ 114.92237898, 31.24075509 ], [ 114.9224589, 31.24058508 ], [ 114.92260884, 31.24032507 ], [ 114.92302842, 31.23971496 ], [ 114.92336808, 31.23920489 ], [ 114.92371764, 31.23873477 ], [ 114.92390754, 31.23845474 ], [ 114.92426718, 31.23783473 ], [ 114.924447, 31.23736479 ], [ 114.9247368, 31.23662486 ], [ 114.92500662, 31.23594495 ], [ 114.9251364, 31.23552501 ], [ 114.92519652, 31.23498524 ], [ 114.9252264, 31.2347853 ], [ 114.92529642, 31.23463532 ], [ 114.92548614, 31.23436527 ], [ 114.92589582, 31.23372519 ], [ 114.92617554, 31.23335511 ], [ 114.92628534, 31.23321507 ], [ 114.92637534, 31.23312503 ], [ 114.92713458, 31.23238464 ], [ 114.92755398, 31.23196443 ], [ 114.92777358, 31.23164421 ], [ 114.92807292, 31.23110394 ], [ 114.92870166, 31.22952363 ], [ 114.92901108, 31.22852355 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528227", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92901108, 31.22852355 ], [ 114.92903106, 31.22846357 ], [ 114.92917074, 31.22803355 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528228", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.742", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89389884, 31.28089559 ], [ 114.8940288, 31.2808356 ], [ 114.8942088, 31.28081562 ], [ 114.89454882, 31.28090562 ], [ 114.89478876, 31.28094563 ], [ 114.89496876, 31.28092565 ], [ 114.89526882, 31.28082575 ], [ 114.89547888, 31.28069579 ], [ 114.89566896, 31.28037597 ], [ 114.89591898, 31.28000612 ], [ 114.89629896, 31.2794064 ], [ 114.8964489, 31.27889664 ], [ 114.89650902, 31.27809699 ], [ 114.89656914, 31.27750722 ], [ 114.89671908, 31.27715739 ], [ 114.89684904, 31.27696745 ], [ 114.89698908, 31.27684752 ], [ 114.8975091, 31.27652771 ], [ 114.8978592, 31.27630784 ], [ 114.89801922, 31.27621788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528229", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89801922, 31.27621788 ], [ 114.89820912, 31.27609796 ], [ 114.8984991, 31.27601799 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528230", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.094", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99375582, 31.3163654 ], [ 114.99373584, 31.31623548 ], [ 114.99371586, 31.31600562 ], [ 114.99373584, 31.31578562 ], [ 114.9937857, 31.31552556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528231", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.824", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99319728, 31.32361463 ], [ 114.99322734, 31.32351455 ], [ 114.99352632, 31.32288392 ], [ 114.99379524, 31.32248328 ], [ 114.9939747, 31.32203288 ], [ 114.99404454, 31.32178277 ], [ 114.99408432, 31.32153275 ], [ 114.99401466, 31.32127301 ], [ 114.99397488, 31.32003353 ], [ 114.99388524, 31.31898413 ], [ 114.99390522, 31.31774451 ], [ 114.9938055, 31.31701502 ], [ 114.9937956, 31.31671514 ], [ 114.99375582, 31.3163654 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528232", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.862", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9889221, 31.33007487 ], [ 114.98954994, 31.32981311 ], [ 114.98979906, 31.32971244 ], [ 114.99018768, 31.32947138 ], [ 114.9902874, 31.32934115 ], [ 114.99063624, 31.32902025 ], [ 114.99118416, 31.32831888 ], [ 114.99142338, 31.32807827 ], [ 114.99158286, 31.32789786 ], [ 114.9919515, 31.32741699 ], [ 114.99216084, 31.3270065 ], [ 114.9923601, 31.32655605 ], [ 114.99269904, 31.32527553 ], [ 114.99278868, 31.32508532 ], [ 114.9930279, 31.32425489 ], [ 114.99307776, 31.32401481 ], [ 114.99319728, 31.32361463 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528233", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.387", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.985773, 31.3354422 ], [ 114.98595246, 31.33533173 ], [ 114.98621148, 31.335201 ], [ 114.9864507, 31.33504035 ], [ 114.9868692, 31.33466928 ], [ 114.98702868, 31.33445891 ], [ 114.98712822, 31.33422869 ], [ 114.9871383, 31.33399874 ], [ 114.98717808, 31.33373868 ], [ 114.98719806, 31.33333877 ], [ 114.98721804, 31.33288886 ], [ 114.98721804, 31.33260896 ], [ 114.98720814, 31.33246901 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528234", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.371", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98720814, 31.33246901 ], [ 114.98717826, 31.33208925 ], [ 114.98710842, 31.33157963 ], [ 114.98704866, 31.33135985 ], [ 114.98703876, 31.33113993 ], [ 114.98707872, 31.33096988 ], [ 114.98722812, 31.3308495 ], [ 114.98743746, 31.33074893 ], [ 114.9876666, 31.33066829 ], [ 114.9882147, 31.33038681 ], [ 114.98880258, 31.33012518 ], [ 114.9889221, 31.33007487 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528235", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.078", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92381826, 31.31598092 ], [ 114.92458722, 31.31574012 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528236", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.244", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92458722, 31.31574012 ], [ 114.92469702, 31.31571002 ], [ 114.92487666, 31.31568981 ], [ 114.92495658, 31.31567973 ], [ 114.92500662, 31.31567969 ], [ 114.92505648, 31.31568959 ], [ 114.9253461, 31.31574926 ], [ 114.9258753, 31.31580861 ], [ 114.9269337, 31.31596733 ], [ 114.92708346, 31.31604716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528237", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.225", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92708346, 31.31604716 ], [ 114.92740296, 31.31620673 ], [ 114.92805186, 31.31677575 ], [ 114.92859096, 31.31730491 ], [ 114.9287607, 31.31745467 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528238", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.124", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92181108, 31.31656295 ], [ 114.92249004, 31.31635226 ], [ 114.9230493, 31.31621168 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528239", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9230493, 31.31621168 ], [ 114.92342874, 31.31610129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528240", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.179", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87257622, 31.33244876 ], [ 114.87261618, 31.3324088 ], [ 114.87279636, 31.33215909 ], [ 114.8729967, 31.3318094 ], [ 114.87318678, 31.33159965 ], [ 114.87335706, 31.33148985 ], [ 114.8734872, 31.33143999 ], [ 114.8736573, 31.33139022 ], [ 114.87383748, 31.33137038 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528241", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.039", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87383748, 31.33137038 ], [ 114.87395772, 31.33136052 ], [ 114.87407778, 31.33133064 ], [ 114.87416796, 31.33131075 ], [ 114.87423798, 31.33129082 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528242", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87423798, 31.33129082 ], [ 114.87427794, 31.33128087 ], [ 114.87457836, 31.3311312 ], [ 114.87473856, 31.33101141 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528243", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.305", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87473856, 31.33101141 ], [ 114.87475854, 31.33099143 ], [ 114.87490866, 31.33083164 ], [ 114.87496878, 31.33074173 ], [ 114.8750289, 31.33061186 ], [ 114.87505896, 31.33053189 ], [ 114.87508902, 31.33044198 ], [ 114.8751189, 31.33027206 ], [ 114.875109, 31.32991215 ], [ 114.87508902, 31.32969224 ], [ 114.87507894, 31.32952227 ], [ 114.87498894, 31.32835259 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528244", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.311", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87485898, 31.32676296 ], [ 114.87485898, 31.32664299 ], [ 114.87497904, 31.32623327 ], [ 114.8750793, 31.32598347 ], [ 114.87521934, 31.32561371 ], [ 114.8754897, 31.32495423 ], [ 114.87578004, 31.32423477 ], [ 114.87585024, 31.32410486 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528245", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.542", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87585024, 31.32410486 ], [ 114.87592026, 31.32398498 ], [ 114.8761206, 31.32370526 ], [ 114.87631068, 31.32352553 ], [ 114.87658104, 31.32332586 ], [ 114.87708162, 31.32306648 ], [ 114.87803256, 31.32262755 ], [ 114.87861324, 31.32236826 ], [ 114.87918384, 31.3220889 ], [ 114.87981456, 31.32179964 ], [ 114.88012488, 31.32169002 ], [ 114.88031514, 31.32163022 ], [ 114.88055544, 31.32158049 ], [ 114.88060548, 31.32158054 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528246", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.180", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88060548, 31.32158054 ], [ 114.88074552, 31.32157068 ], [ 114.8809959, 31.32157091 ], [ 114.88119606, 31.32159111 ], [ 114.88159638, 31.32169151 ], [ 114.8818167, 31.3217717 ], [ 114.8819868, 31.32184185 ], [ 114.88237722, 31.32205218 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528247", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.142", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8869521, 31.32085721 ], [ 114.8871024, 31.32064742 ], [ 114.88725252, 31.32032769 ], [ 114.8873526, 31.32005787 ], [ 114.88744278, 31.31965809 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528248", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.307", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88744278, 31.31965809 ], [ 114.88749282, 31.31941824 ], [ 114.88763304, 31.31901851 ], [ 114.88772304, 31.31883864 ], [ 114.88787334, 31.31863889 ], [ 114.8879835, 31.31853903 ], [ 114.88809348, 31.31845916 ], [ 114.88821372, 31.31838932 ], [ 114.88849398, 31.31827961 ], [ 114.88865418, 31.31824977 ], [ 114.8889645, 31.31821013 ], [ 114.88912452, 31.31820018 ], [ 114.88968468, 31.31817039 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528249", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.477", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88968468, 31.31817039 ], [ 114.88977468, 31.31817044 ], [ 114.88995468, 31.31816049 ], [ 114.89012478, 31.31816058 ], [ 114.89029488, 31.31815064 ], [ 114.89064498, 31.3180808 ], [ 114.89081508, 31.31803089 ], [ 114.89104512, 31.31795102 ], [ 114.8911452, 31.31790107 ], [ 114.89130522, 31.31780117 ], [ 114.89143518, 31.31772125 ], [ 114.89173542, 31.31748144 ], [ 114.8921955, 31.31713175 ], [ 114.89241564, 31.31701191 ], [ 114.89270562, 31.31689203 ], [ 114.8929857, 31.31680221 ], [ 114.8931459, 31.31677224 ], [ 114.89328594, 31.31675231 ], [ 114.89361606, 31.31675244 ], [ 114.89374602, 31.31676248 ], [ 114.89389596, 31.31678255 ], [ 114.89404608, 31.31681261 ], [ 114.8942061, 31.31685266 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528250", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.103", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87784302, 31.28611878 ], [ 114.87743226, 31.28679783 ], [ 114.87735198, 31.28694764 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528251", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.023", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87735198, 31.28694764 ], [ 114.87731202, 31.28699759 ], [ 114.87720186, 31.28710739 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528252", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.126", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.878574, 31.28571995 ], [ 114.87933522, 31.28547101 ], [ 114.87949542, 31.28541125 ], [ 114.87964554, 31.28539145 ], [ 114.8798259, 31.28537169 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528253", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87720186, 31.28710739 ], [ 114.87707154, 31.28721714 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528254", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.103", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87707154, 31.28721714 ], [ 114.87704148, 31.28724707 ], [ 114.87622032, 31.28771579 ], [ 114.87618018, 31.28773572 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528255", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.056", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8798259, 31.28537169 ], [ 114.87993606, 31.28539181 ], [ 114.8800761, 31.28545197 ], [ 114.88035654, 31.28558225 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528256", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.604", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88035654, 31.28558225 ], [ 114.8806269, 31.28570249 ], [ 114.88091724, 31.28582277 ], [ 114.88114746, 31.285913 ], [ 114.88125762, 31.28594315 ], [ 114.88215888, 31.28599422 ], [ 114.88239918, 31.28599454 ], [ 114.88300992, 31.28598531 ], [ 114.88427172, 31.28588694 ], [ 114.88464216, 31.28582741 ], [ 114.88498272, 31.28567792 ], [ 114.8852331, 31.28547839 ], [ 114.88556358, 31.2853289 ], [ 114.88622454, 31.2851498 ], [ 114.88639482, 31.28511006 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528257", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.280", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.869853, 31.33498505 ], [ 114.87004326, 31.33459539 ], [ 114.87024342, 31.33430573 ], [ 114.8703336, 31.33418589 ], [ 114.87056382, 31.33397619 ], [ 114.87096432, 31.33367672 ], [ 114.87123468, 31.33348704 ], [ 114.87136482, 31.3333772 ], [ 114.87173526, 31.3330977 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528258", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.108", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87173526, 31.3330977 ], [ 114.87196548, 31.33292796 ], [ 114.87230586, 31.33267839 ], [ 114.87257622, 31.33244876 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528259", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.354", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91609878, 31.31424959 ], [ 114.91658802, 31.31410914 ], [ 114.9167979, 31.31407895 ], [ 114.9170076, 31.31409875 ], [ 114.91725726, 31.31415851 ], [ 114.9176268, 31.31432816 ], [ 114.91846596, 31.31483729 ], [ 114.9193449, 31.31536626 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528260", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.132", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9144003, 31.31472069 ], [ 114.91571916, 31.31434994 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528261", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91571916, 31.31434994 ], [ 114.91605882, 31.31425962 ], [ 114.91609878, 31.31424959 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528262", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.274", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99775326, 31.19277803 ], [ 114.9975441, 31.19277866 ], [ 114.99734484, 31.19278923 ], [ 114.99718536, 31.19278973 ], [ 114.99706584, 31.19277006 ], [ 114.99694614, 31.19273046 ], [ 114.99689646, 31.19271062 ], [ 114.9968367, 31.19269082 ], [ 114.99674688, 31.19262111 ], [ 114.9967071, 31.19258124 ], [ 114.99665724, 31.19253143 ], [ 114.99659748, 31.19243166 ], [ 114.9965676, 31.19238176 ], [ 114.9965478, 31.19232186 ], [ 114.99651792, 31.19226197 ], [ 114.99649794, 31.19220207 ], [ 114.99646806, 31.19208219 ], [ 114.99645816, 31.19199228 ], [ 114.9964182, 31.1917325 ], [ 114.99635844, 31.19137286 ], [ 114.99631866, 31.1911331 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528263", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.132", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99775326, 31.19277803 ], [ 114.99835104, 31.19272623 ], [ 114.99912828, 31.19268393 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528264", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.707", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99912828, 31.19268393 ], [ 114.99954678, 31.19266269 ], [ 114.99999516, 31.19266134 ], [ 115.00128054, 31.19263749 ], [ 115.0014798, 31.19262687 ], [ 115.0020378, 31.19261522 ], [ 115.00273512, 31.19259312 ], [ 115.00404048, 31.19253926 ], [ 115.00509654, 31.19250609 ], [ 115.00536564, 31.1924853 ], [ 115.00617276, 31.19245295 ], [ 115.0065315, 31.1924219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528265", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99581088, 31.18817601 ], [ 114.995781, 31.18803615 ], [ 114.99572124, 31.18772646 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528266", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.036", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99572124, 31.18772646 ], [ 114.99566148, 31.18740683 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528267", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99631866, 31.1911331 ], [ 114.99617934, 31.19035388 ], [ 114.99614946, 31.19015408 ], [ 114.99612948, 31.19007416 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528268", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.213", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99612948, 31.19007416 ], [ 114.9960996, 31.18990433 ], [ 114.99605982, 31.18965458 ], [ 114.99602994, 31.18943475 ], [ 114.9959304, 31.18887531 ], [ 114.99585066, 31.1883858 ], [ 114.99581088, 31.18817601 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528269", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.105", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02182808, 31.19011875 ], [ 115.02155898, 31.19018949 ], [ 115.02115038, 31.19028066 ], [ 115.02076176, 31.19037174 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528270", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.108", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02186786, 31.19019858 ], [ 115.02160884, 31.19026932 ], [ 115.02119034, 31.19036049 ], [ 115.02080172, 31.19045157 ], [ 115.02078174, 31.19046165 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528271", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.035", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0222266, 31.19011758 ], [ 115.02186786, 31.19019858 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528272", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.035", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02217674, 31.19002776 ], [ 115.0219674, 31.19007834 ], [ 115.02182808, 31.19011875 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528273", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.129", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00930188, 31.19229396 ], [ 115.0085943, 31.192326 ], [ 115.00794648, 31.19235786 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528274", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.136", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00794648, 31.19235786 ], [ 115.00784694, 31.19236812 ], [ 115.00709958, 31.19241029 ], [ 115.00670088, 31.19245142 ], [ 115.0065315, 31.1924219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528275", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.129", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0092819, 31.19220405 ], [ 115.0085844, 31.19223605 ], [ 115.00793658, 31.19226791 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528276", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.136", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00793658, 31.19226791 ], [ 115.00783704, 31.19227821 ], [ 115.0070796, 31.19232038 ], [ 115.00668108, 31.19236151 ], [ 115.0065315, 31.1924219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528277", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "55", "length": "0.010", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00793658, 31.19226791 ], [ 115.00794648, 31.19235786 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528278", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.311", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.014663, 31.19185868 ], [ 115.0146432, 31.19186871 ], [ 115.01352702, 31.19211185 ], [ 115.01242092, 31.19214501 ], [ 115.0116237, 31.19218731 ], [ 115.01144424, 31.1921978 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528279", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.096", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01144424, 31.1921978 ], [ 115.0107966, 31.19221967 ], [ 115.01043786, 31.19224068 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528280", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.310", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0146531, 31.19177876 ], [ 115.01460324, 31.19178888 ], [ 115.01350704, 31.19202194 ], [ 115.01241102, 31.1920551 ], [ 115.0116138, 31.19208737 ], [ 115.01143434, 31.1920979 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528281", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.097", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01143434, 31.1920979 ], [ 115.0107867, 31.19212976 ], [ 115.01041788, 31.19215082 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528282", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "55", "length": "0.011", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01143434, 31.1920979 ], [ 115.01144424, 31.1921978 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528283", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.067", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0153407, 31.1917068 ], [ 115.014663, 31.19185868 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528284", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.066", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01532072, 31.19161689 ], [ 115.01526096, 31.19162706 ], [ 115.0146531, 31.19177876 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528285", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "30", "length": "0.010", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01532072, 31.19161689 ], [ 115.0153407, 31.1917068 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528286", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.067", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01599842, 31.19146497 ], [ 115.01584902, 31.19149539 ], [ 115.01532072, 31.19161689 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528287", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.067", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0160184, 31.19155488 ], [ 115.0153407, 31.1917068 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528288", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "30", "length": "0.010", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01599842, 31.19146497 ], [ 115.0160184, 31.19155488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528289", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.192", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02078174, 31.19046165 ], [ 115.02064224, 31.19049203 ], [ 115.0202835, 31.19056304 ], [ 115.01961588, 31.1907249 ], [ 115.01909766, 31.19083632 ], [ 115.01896806, 31.1908667 ], [ 115.01882856, 31.19089707 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528290", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.278", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01882856, 31.19089707 ], [ 115.01730378, 31.19125131 ], [ 115.01613792, 31.19152455 ], [ 115.0160184, 31.19155488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528291", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.194", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02076176, 31.19037174 ], [ 115.02060246, 31.19040221 ], [ 115.02024372, 31.19048321 ], [ 115.01957592, 31.19064503 ], [ 115.01906778, 31.19074646 ], [ 115.0189182, 31.19078687 ], [ 115.01879868, 31.1908172 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528292", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0402", "width": "55", "length": "0.276", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01879868, 31.1908172 ], [ 115.017264, 31.19117148 ], [ 115.01609814, 31.19144472 ], [ 115.01599842, 31.19146497 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528293", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "30", "length": "0.009", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01879868, 31.1908172 ], [ 115.01882856, 31.19089707 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528294", "Name": null, "pyname": null, "kind_num": "1", "kind": "0404", "width": "30", "length": "0.010", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02076176, 31.19037174 ], [ 115.02078174, 31.19046165 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528295", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00866414, 31.28022446 ], [ 115.0087338, 31.28005436 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528296", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.145", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00441866, 31.2915825 ], [ 115.00460802, 31.29135201 ], [ 115.00540524, 31.29058998 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528297", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.567", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00540524, 31.29058998 ], [ 115.00617258, 31.28992799 ], [ 115.006302, 31.28973768 ], [ 115.0067106, 31.2890967 ], [ 115.00682022, 31.28884646 ], [ 115.00706934, 31.28838588 ], [ 115.00827516, 31.28624312 ], [ 115.00831494, 31.286183 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528298", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.445", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00527564, 31.29590871 ], [ 115.00541514, 31.29548841 ], [ 115.00537536, 31.29510866 ], [ 115.00521588, 31.29468926 ], [ 115.00497666, 31.29419007 ], [ 115.0042194, 31.29305261 ], [ 115.00413966, 31.29282293 ], [ 115.00415964, 31.29233301 ], [ 115.00417944, 31.29217299 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528299", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.071", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00417944, 31.29217299 ], [ 115.00418952, 31.29209298 ], [ 115.0042392, 31.29188292 ], [ 115.00433892, 31.29167268 ], [ 115.00441866, 31.2915825 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528300", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.592", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98548356, 31.34054111 ], [ 114.98550354, 31.34031116 ], [ 114.98549364, 31.34006127 ], [ 114.98546376, 31.33986147 ], [ 114.98528448, 31.33914228 ], [ 114.98520474, 31.33873265 ], [ 114.98513508, 31.3381931 ], [ 114.9851052, 31.33777334 ], [ 114.98511528, 31.33731348 ], [ 114.98513526, 31.33669365 ], [ 114.98517504, 31.33632362 ], [ 114.98529474, 31.33585346 ], [ 114.98542434, 31.33565312 ], [ 114.985773, 31.3354422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528301", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "2.033", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96264192, 31.33550615 ], [ 114.96268188, 31.3358459 ], [ 114.96270168, 31.33611576 ], [ 114.96270168, 31.33640561 ], [ 114.96270168, 31.33667552 ], [ 114.9627015, 31.33687541 ], [ 114.9626916, 31.33700541 ], [ 114.96267162, 31.33722537 ], [ 114.96265164, 31.33734534 ], [ 114.96264174, 31.33748534 ], [ 114.96261168, 31.33786523 ], [ 114.9625917, 31.33810521 ], [ 114.96257172, 31.33835514 ], [ 114.96255174, 31.33848515 ], [ 114.96255174, 31.33864508 ], [ 114.96251178, 31.33910498 ], [ 114.96251178, 31.33929492 ], [ 114.96252168, 31.33959476 ], [ 114.96252168, 31.33970469 ], [ 114.96254166, 31.33992456 ], [ 114.96255156, 31.3400345 ], [ 114.96257154, 31.34016437 ], [ 114.96260142, 31.34027426 ], [ 114.96262122, 31.34039414 ], [ 114.9626412, 31.34051402 ], [ 114.96273084, 31.34087361 ], [ 114.96277062, 31.34097347 ], [ 114.9628005, 31.34110334 ], [ 114.96285036, 31.34124315 ], [ 114.9629301, 31.34145281 ], [ 114.96298986, 31.34162259 ], [ 114.96303972, 31.34175242 ], [ 114.96310938, 31.34197211 ], [ 114.96318912, 31.34218181 ], [ 114.963219, 31.34228166 ], [ 114.96325878, 31.34238152 ], [ 114.96328866, 31.34248142 ], [ 114.96332862, 31.34262123 ], [ 114.96338838, 31.34280101 ], [ 114.96341826, 31.34288088 ], [ 114.96345804, 31.3429707 ], [ 114.96347802, 31.34303064 ], [ 114.96359754, 31.34328021 ], [ 114.96368718, 31.34349986 ], [ 114.96378672, 31.3437695 ], [ 114.96387654, 31.34400912 ], [ 114.96402594, 31.34432867 ], [ 114.96412566, 31.34446835 ], [ 114.96425526, 31.34461802 ], [ 114.96442464, 31.34474753 ], [ 114.96462408, 31.34488694 ], [ 114.9648633, 31.34504628 ], [ 114.96493296, 31.34508606 ], [ 114.96524202, 31.34528519 ], [ 114.96569058, 31.34559393 ], [ 114.9658002, 31.34567363 ], [ 114.96590982, 31.34574329 ], [ 114.96598956, 31.34580309 ], [ 114.96626856, 31.34599227 ], [ 114.96640824, 31.3460919 ], [ 114.96654774, 31.3461815 ], [ 114.9667272, 31.34630097 ], [ 114.96683682, 31.34637068 ], [ 114.96690648, 31.34642049 ], [ 114.96693636, 31.34644038 ], [ 114.96703608, 31.34652012 ], [ 114.9671457, 31.34658978 ], [ 114.96721554, 31.3466396 ], [ 114.96746466, 31.34681888 ], [ 114.9676839, 31.34696823 ], [ 114.96810258, 31.34723702 ], [ 114.96831192, 31.34734641 ], [ 114.96847122, 31.34741598 ], [ 114.96871044, 31.34748528 ], [ 114.96896964, 31.34752457 ], [ 114.96937824, 31.34755346 ], [ 114.96951774, 31.34754311 ], [ 114.96978684, 31.34754234 ], [ 114.96990654, 31.34753204 ], [ 114.97006602, 31.34753159 ], [ 114.97032504, 31.34751084 ], [ 114.97046454, 31.34749046 ], [ 114.97060404, 31.34748011 ], [ 114.97088304, 31.34744933 ], [ 114.97108248, 31.34741877 ], [ 114.97128174, 31.34739821 ], [ 114.97157064, 31.34735739 ], [ 114.97172022, 31.34735699 ], [ 114.97184982, 31.34734664 ], [ 114.9720093, 31.34734619 ], [ 114.97212882, 31.34734583 ], [ 114.97225842, 31.34733548 ], [ 114.97241772, 31.34733503 ], [ 114.97253742, 31.34732472 ], [ 114.97268682, 31.34732427 ], [ 114.97294602, 31.34730357 ], [ 114.97321512, 31.34730281 ], [ 114.97348422, 31.34734209 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528302", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.293", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97348422, 31.34734209 ], [ 114.97389282, 31.34743092 ], [ 114.97412196, 31.34750027 ], [ 114.9743214, 31.34757974 ], [ 114.97467024, 31.34772873 ], [ 114.97496922, 31.34791787 ], [ 114.97516848, 31.3480773 ], [ 114.97541778, 31.34826662 ], [ 114.97556718, 31.34839617 ], [ 114.9756669, 31.34846592 ], [ 114.97574664, 31.34853567 ], [ 114.97586616, 31.34862536 ], [ 114.97602564, 31.34874488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528303", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9853239, 31.34121125 ], [ 114.98534388, 31.34116125 ], [ 114.98540382, 31.34096114 ], [ 114.98548356, 31.34054111 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528304", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97602564, 31.34874488 ], [ 114.97627494, 31.34885418 ], [ 114.97635468, 31.34888397 ], [ 114.97644432, 31.34891372 ], [ 114.97649418, 31.34892357 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528305", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.354", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97649418, 31.34892357 ], [ 114.97654404, 31.34893343 ], [ 114.97663368, 31.34896317 ], [ 114.9767532, 31.34899283 ], [ 114.97686282, 31.34901254 ], [ 114.97698252, 31.3490322 ], [ 114.97711212, 31.34905182 ], [ 114.97724154, 31.34906145 ], [ 114.97738122, 31.34907108 ], [ 114.97752072, 31.34906069 ], [ 114.97765014, 31.34905034 ], [ 114.97778964, 31.34901996 ], [ 114.97792932, 31.34897955 ], [ 114.97805874, 31.3489292 ], [ 114.97818834, 31.34885886 ], [ 114.97831794, 31.34879847 ], [ 114.97844736, 31.34871815 ], [ 114.97855698, 31.34863782 ], [ 114.9786567, 31.34854755 ], [ 114.97875624, 31.34845728 ], [ 114.97883598, 31.34834708 ], [ 114.97891572, 31.34823687 ], [ 114.97898538, 31.34811668 ], [ 114.97905522, 31.34800647 ], [ 114.97911498, 31.34788632 ], [ 114.97915476, 31.34775623 ], [ 114.97920462, 31.34762609 ], [ 114.9792345, 31.34749604 ], [ 114.9792642, 31.34736594 ], [ 114.97929408, 31.3472259 ], [ 114.97933404, 31.34709576 ], [ 114.97937382, 31.34696567 ], [ 114.9794136, 31.34683557 ], [ 114.97944348, 31.34669549 ], [ 114.97948344, 31.34656539 ], [ 114.97952322, 31.34642531 ], [ 114.9795531, 31.34628522 ], [ 114.97959288, 31.34615513 ], [ 114.97963266, 31.34602503 ], [ 114.97966254, 31.34589494 ], [ 114.9797025, 31.34575485 ], [ 114.97973238, 31.34561477 ], [ 114.97977216, 31.34548472 ], [ 114.97980204, 31.34534468 ], [ 114.979842, 31.34521463 ], [ 114.97987188, 31.34507463 ], [ 114.97991184, 31.34494458 ], [ 114.97995162, 31.3448045 ], [ 114.97999158, 31.34467445 ], [ 114.98003136, 31.34453441 ], [ 114.98007132, 31.34440436 ], [ 114.98011128, 31.34427431 ], [ 114.98016114, 31.3441542 ], [ 114.98021082, 31.34403414 ], [ 114.98028066, 31.34391399 ], [ 114.9803505, 31.34380383 ], [ 114.98043024, 31.34369367 ], [ 114.98050998, 31.3435935 ], [ 114.98059962, 31.34349329 ], [ 114.98068944, 31.34339307 ], [ 114.98079906, 31.34330285 ], [ 114.98090868, 31.34321258 ], [ 114.9810282, 31.34313225 ], [ 114.9811479, 31.34305197 ], [ 114.98126742, 31.34298168 ], [ 114.98139702, 31.34291135 ], [ 114.98153652, 31.34286099 ], [ 114.9816762, 31.34281064 ], [ 114.9818157, 31.34276028 ], [ 114.9819552, 31.34271992 ], [ 114.9821046, 31.34266952 ], [ 114.98224428, 31.34263914 ], [ 114.98239368, 31.34259873 ], [ 114.98253318, 31.34255837 ], [ 114.98268276, 31.34252799 ], [ 114.98283216, 31.34248758 ], [ 114.98298174, 31.34245716 ], [ 114.98312124, 31.3424168 ], [ 114.98326074, 31.34237643 ], [ 114.98340024, 31.34234606 ], [ 114.98353992, 31.34230569 ], [ 114.98368932, 31.34226533 ], [ 114.98382882, 31.34222496 ], [ 114.9839784, 31.34218455 ], [ 114.9841179, 31.34214419 ], [ 114.9842574, 31.34209383 ], [ 114.984387, 31.34204348 ], [ 114.9845166, 31.34199317 ], [ 114.98462622, 31.34192288 ], [ 114.98473584, 31.34186262 ], [ 114.98482548, 31.34179238 ], [ 114.98490522, 31.34172218 ], [ 114.98497506, 31.34165202 ], [ 114.9850449, 31.34158187 ], [ 114.98510466, 31.34151176 ], [ 114.98515452, 31.34143166 ], [ 114.98520438, 31.34136155 ], [ 114.9853239, 31.34121125 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528306", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.350", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98318172, 31.35109478 ], [ 114.98316174, 31.35099483 ], [ 114.98313186, 31.3509249 ], [ 114.98294214, 31.34988554 ], [ 114.98283252, 31.34956586 ], [ 114.98277276, 31.34943603 ], [ 114.98268294, 31.34929631 ], [ 114.98255334, 31.34901668 ], [ 114.9823638, 31.34847722 ], [ 114.98232402, 31.34834735 ], [ 114.98230404, 31.34805741 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528307", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.829", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98230404, 31.34805741 ], [ 114.98230404, 31.34802744 ], [ 114.98243346, 31.34759711 ], [ 114.98284188, 31.34697602 ], [ 114.98290164, 31.34684588 ], [ 114.98302116, 31.34666552 ], [ 114.98322042, 31.34643498 ], [ 114.98374854, 31.34589359 ], [ 114.98387814, 31.34572331 ], [ 114.9840576, 31.34553291 ], [ 114.9841971, 31.34533262 ], [ 114.9843069, 31.34509241 ], [ 114.98436666, 31.34488235 ], [ 114.98436666, 31.3446924 ], [ 114.98441652, 31.34430243 ], [ 114.98444658, 31.34381256 ], [ 114.9845364, 31.34330253 ], [ 114.98510466, 31.34182163 ], [ 114.9851844, 31.34156148 ], [ 114.9853239, 31.34121125 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528308", "Name": "乘马北路", "pyname": "cmbl", "kind_num": "1", "kind": "0401", "width": "55", "length": "2.652", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95860938, 31.36535415 ], [ 114.95932722, 31.36492251 ], [ 114.96066318, 31.36421952 ], [ 114.96092238, 31.36409892 ], [ 114.96117168, 31.36391838 ], [ 114.96143088, 31.36372781 ], [ 114.96167028, 31.3635173 ], [ 114.96199932, 31.36313664 ], [ 114.96204918, 31.36308656 ], [ 114.96221874, 31.36293617 ], [ 114.96231846, 31.36285598 ], [ 114.96246804, 31.36275563 ], [ 114.96260754, 31.36267535 ], [ 114.96273714, 31.36262504 ], [ 114.962787, 31.36260492 ], [ 114.96288672, 31.36258467 ], [ 114.96311604, 31.36255412 ], [ 114.96346488, 31.36255326 ], [ 114.96360456, 31.3625529 ], [ 114.96391362, 31.36258211 ], [ 114.9642027, 31.36263138 ], [ 114.96440196, 31.36267085 ], [ 114.9645915, 31.36269038 ], [ 114.96479076, 31.36270986 ], [ 114.9649902, 31.36270937 ], [ 114.96516966, 31.36269893 ], [ 114.96545874, 31.36265825 ], [ 114.96560832, 31.36261788 ], [ 114.96580776, 31.36254741 ], [ 114.96598722, 31.362467 ], [ 114.96622644, 31.36241642 ], [ 114.96646566, 31.36247582 ], [ 114.96717342, 31.36288388 ], [ 114.96770172, 31.36310244 ], [ 114.9686388, 31.36331003 ], [ 114.96896784, 31.36334918 ], [ 114.9692868, 31.36336839 ], [ 114.96964572, 31.3634075 ], [ 114.96996468, 31.36338671 ], [ 114.97026384, 31.36329599 ], [ 114.97052304, 31.36315541 ], [ 114.97101156, 31.36288428 ], [ 114.9717096, 31.36238276 ], [ 114.97190904, 31.36216239 ], [ 114.9726069, 31.36162086 ], [ 114.97280634, 31.36143047 ], [ 114.97343436, 31.36090892 ], [ 114.9740622, 31.36035735 ], [ 114.97436118, 31.35994664 ], [ 114.97464036, 31.35951603 ], [ 114.97476996, 31.35929571 ], [ 114.97501908, 31.35882515 ], [ 114.97528818, 31.35837456 ], [ 114.97588614, 31.35756317 ], [ 114.9764643, 31.35684177 ], [ 114.97698252, 31.35633048 ], [ 114.97773006, 31.35571862 ], [ 114.97880664, 31.35478595 ], [ 114.9790158, 31.35465545 ], [ 114.97918536, 31.35449502 ], [ 114.97934484, 31.35432461 ], [ 114.9795441, 31.3542041 ], [ 114.97987296, 31.3539233 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528309", "Name": "乘马北路", "pyname": "cmbl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.391", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94433664, 31.37205267 ], [ 114.9449454, 31.37149175 ], [ 114.94554408, 31.37097083 ], [ 114.94613286, 31.3705899 ], [ 114.94668168, 31.37035905 ], [ 114.9471009, 31.37025839 ], [ 114.94736028, 31.37025798 ], [ 114.94767978, 31.37021748 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528310", "Name": "乘马北路", "pyname": "cmbl", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.213", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94767978, 31.37021748 ], [ 114.94784934, 31.37019719 ], [ 114.9481188, 31.37016677 ], [ 114.9483483, 31.37009643 ], [ 114.94857798, 31.37009603 ], [ 114.94926648, 31.36996494 ], [ 114.94974564, 31.36991418 ], [ 114.95029392, 31.36987287 ], [ 114.95085228, 31.36979156 ], [ 114.95140056, 31.36962024 ], [ 114.95156004, 31.3694699 ], [ 114.95180952, 31.36891955 ], [ 114.95198898, 31.36874918 ], [ 114.9522183, 31.36865864 ], [ 114.95297592, 31.36839683 ], [ 114.95323512, 31.36833621 ], [ 114.95348442, 31.36824563 ], [ 114.95398302, 31.36803449 ], [ 114.95434194, 31.36784369 ], [ 114.95451132, 31.3677333 ], [ 114.95513952, 31.36741187 ], [ 114.95549844, 31.36716108 ], [ 114.95640582, 31.36662905 ], [ 114.95664504, 31.36645854 ], [ 114.9583401, 31.36549473 ], [ 114.95860938, 31.36535415 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528311", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.460", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93211014, 31.38914826 ], [ 114.93211014, 31.38909827 ], [ 114.93213012, 31.38858837 ], [ 114.93209034, 31.38830852 ], [ 114.93207036, 31.38801863 ], [ 114.93211032, 31.3877786 ], [ 114.93221004, 31.38753852 ], [ 114.93239976, 31.38734822 ], [ 114.93267912, 31.38691788 ], [ 114.93286884, 31.38672762 ], [ 114.93309834, 31.38661724 ], [ 114.93339768, 31.38658673 ], [ 114.93516402, 31.3865438 ], [ 114.93573282, 31.38654285 ], [ 114.93600228, 31.38649245 ], [ 114.93622188, 31.38633212 ], [ 114.93656118, 31.38597167 ], [ 114.93671094, 31.38583149 ], [ 114.93701046, 31.38536111 ], [ 114.93712026, 31.38510101 ], [ 114.9371901, 31.38454107 ], [ 114.93744966, 31.38408081 ], [ 114.93767934, 31.38356057 ], [ 114.93813834, 31.38326991 ], [ 114.93837792, 31.38312956 ], [ 114.93859752, 31.38288926 ], [ 114.93876726, 31.38263906 ], [ 114.93943596, 31.38144831 ], [ 114.93946602, 31.38123834 ], [ 114.93938628, 31.38098855 ], [ 114.9393762, 31.38075864 ], [ 114.93908694, 31.37967945 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528312", "Name": "小王线", "pyname": "xwx", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93908694, 31.37967945 ], [ 114.9388974, 31.37899995 ], [ 114.93874782, 31.37854032 ], [ 114.93874782, 31.37842035 ], [ 114.93878778, 31.37828036 ], [ 114.93889758, 31.37811021 ], [ 114.93902736, 31.37794007 ], [ 114.93963612, 31.37721926 ], [ 114.93981576, 31.37703903 ], [ 114.94038474, 31.37656824 ], [ 114.9414327, 31.37536688 ], [ 114.94179216, 31.37489645 ], [ 114.94259046, 31.37368532 ], [ 114.94278, 31.37347503 ], [ 114.94347858, 31.37286398 ], [ 114.94433664, 31.37205267 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528313", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "4.306", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8144211, 31.33727235 ], [ 114.81451128, 31.33727253 ], [ 114.8148018, 31.337393 ], [ 114.8149422, 31.33746324 ], [ 114.81505236, 31.33753344 ], [ 114.8151726, 31.33761363 ], [ 114.81533298, 31.3377539 ], [ 114.81559344, 31.3380243 ], [ 114.81580386, 31.33827459 ], [ 114.81601428, 31.33856489 ], [ 114.81626484, 31.33884528 ], [ 114.81654546, 31.33913571 ], [ 114.81678594, 31.3393361 ], [ 114.81729696, 31.33967693 ], [ 114.81768774, 31.33992758 ], [ 114.81790824, 31.34008791 ], [ 114.81812856, 31.34028825 ], [ 114.8183991, 31.34065865 ], [ 114.81851934, 31.3408688 ], [ 114.81860952, 31.3410789 ], [ 114.8186898, 31.341299 ], [ 114.81874992, 31.34147904 ], [ 114.8188401, 31.34173914 ], [ 114.81889014, 31.34189921 ], [ 114.81893028, 31.34201922 ], [ 114.8190003, 31.34222928 ], [ 114.81910056, 31.34245941 ], [ 114.81917076, 31.34260949 ], [ 114.81925086, 31.3427196 ], [ 114.81940116, 31.34289983 ], [ 114.81970176, 31.34312033 ], [ 114.82033302, 31.34353136 ], [ 114.82051338, 31.34368166 ], [ 114.8207139, 31.34393195 ], [ 114.82082406, 31.34406209 ], [ 114.82092432, 31.34419227 ], [ 114.8213853, 31.34476292 ], [ 114.82182612, 31.34532357 ], [ 114.8223672, 31.34599439 ], [ 114.82256754, 31.34624468 ], [ 114.8226579, 31.34635479 ], [ 114.82297848, 31.34671529 ], [ 114.82322904, 31.34698565 ], [ 114.8235597, 31.34733615 ], [ 114.82393032, 31.34766677 ], [ 114.82399062, 31.34773683 ], [ 114.82429122, 31.34805728 ], [ 114.8244615, 31.34821757 ], [ 114.824682, 31.34844788 ], [ 114.82501266, 31.34878839 ], [ 114.8253633, 31.34915892 ], [ 114.8256639, 31.34947941 ], [ 114.8259645, 31.34979986 ], [ 114.82623504, 31.35006027 ], [ 114.82665606, 31.35042095 ], [ 114.82684632, 31.35054123 ], [ 114.82712694, 31.35072173 ], [ 114.8275377, 31.35094241 ], [ 114.82774812, 31.35106274 ], [ 114.8280588, 31.35124323 ], [ 114.82832934, 31.35137369 ], [ 114.82852968, 31.35145401 ], [ 114.82871004, 31.3515243 ], [ 114.82900056, 31.35159482 ], [ 114.8293413, 31.3516454 ], [ 114.82981236, 31.35164625 ], [ 114.83035344, 31.35161723 ], [ 114.83080434, 31.35157808 ], [ 114.831135, 31.35154869 ], [ 114.8314455, 31.35152925 ], [ 114.83162604, 31.35150959 ], [ 114.83214696, 31.35148052 ], [ 114.83223714, 31.3514807 ], [ 114.83268804, 31.3514915 ], [ 114.83328924, 31.35151256 ], [ 114.83343954, 31.35152282 ], [ 114.83390052, 31.35154365 ], [ 114.8342112, 31.35155423 ], [ 114.83484246, 31.35158532 ], [ 114.83550378, 31.3516265 ], [ 114.83581446, 31.35163707 ], [ 114.83606484, 31.35164751 ], [ 114.83642556, 31.35165818 ], [ 114.8366961, 31.35167865 ], [ 114.83696664, 31.35171911 ], [ 114.83725734, 31.35179961 ], [ 114.83749782, 31.35188003 ], [ 114.83780832, 31.35202052 ], [ 114.83825922, 31.35225128 ], [ 114.8388705, 31.35257226 ], [ 114.83908092, 31.3526826 ], [ 114.83941158, 31.35285315 ], [ 114.83964198, 31.35298352 ], [ 114.8398623, 31.35310385 ], [ 114.84007272, 31.35319416 ], [ 114.8404734, 31.3533648 ], [ 114.84080406, 31.35348531 ], [ 114.84119484, 31.35355596 ], [ 114.8416155, 31.35360668 ], [ 114.84222678, 31.3536677 ], [ 114.84254736, 31.3537082 ], [ 114.8431986, 31.35378929 ], [ 114.84378954, 31.3538603 ], [ 114.84416034, 31.35391088 ], [ 114.84433062, 31.35395115 ], [ 114.84455112, 31.35400151 ], [ 114.84490176, 31.35412206 ], [ 114.84509202, 31.35420239 ], [ 114.84542268, 31.35433289 ], [ 114.8458635, 31.3545236 ], [ 114.8460939, 31.35458399 ], [ 114.8464044, 31.35467448 ], [ 114.84657468, 31.35470477 ], [ 114.84688536, 31.35475526 ], [ 114.84714582, 31.3548057 ], [ 114.84732618, 31.354826 ], [ 114.84775692, 31.35490668 ], [ 114.84826794, 31.35499754 ], [ 114.84866862, 31.35504821 ], [ 114.84872874, 31.35506828 ], [ 114.84881892, 31.35507845 ], [ 114.84911952, 31.35512894 ], [ 114.84922968, 31.35512912 ], [ 114.8493699, 31.35514937 ], [ 114.8494401, 31.35514946 ], [ 114.8495202, 31.35516962 ], [ 114.84958032, 31.35516971 ], [ 114.84963036, 31.35515981 ], [ 114.8497506, 31.35515999 ], [ 114.84987084, 31.35514019 ], [ 114.84993096, 31.35514032 ], [ 114.849981, 31.35513038 ], [ 114.85002114, 31.35513047 ], [ 114.85009134, 31.35511058 ], [ 114.8501214, 31.35511062 ], [ 114.85016136, 31.35510072 ], [ 114.8502015, 31.35510077 ], [ 114.85023156, 31.35508083 ], [ 114.85032174, 31.35507098 ], [ 114.85045188, 31.35503124 ], [ 114.8505021, 31.3550213 ], [ 114.85056222, 31.35500141 ], [ 114.85061226, 31.35498152 ], [ 114.85070244, 31.35495168 ], [ 114.85083276, 31.35490191 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528314", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.265", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81177546, 31.33654772 ], [ 114.81179562, 31.33654776 ], [ 114.81191586, 31.336538 ], [ 114.81204618, 31.33654821 ], [ 114.81217632, 31.33655847 ], [ 114.81230664, 31.33657868 ], [ 114.81244686, 31.33661895 ], [ 114.81257718, 31.33665918 ], [ 114.81271758, 31.33669941 ], [ 114.81283782, 31.3367396 ], [ 114.81295806, 31.33678982 ], [ 114.8130783, 31.33683005 ], [ 114.81319854, 31.33687023 ], [ 114.81332886, 31.33691046 ], [ 114.8134491, 31.33696068 ], [ 114.81356934, 31.33700087 ], [ 114.81369948, 31.3370411 ], [ 114.8138298, 31.33709132 ], [ 114.81396012, 31.33713155 ], [ 114.81408036, 31.33717178 ], [ 114.81419052, 31.33721196 ], [ 114.81429078, 31.33724211 ], [ 114.81436098, 31.33726223 ], [ 114.8144211, 31.33727235 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528317", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.540", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80638464, 31.33803776 ], [ 114.80643468, 31.33800783 ], [ 114.80651478, 31.33795793 ], [ 114.80660496, 31.33790807 ], [ 114.80670504, 31.33784822 ], [ 114.8068152, 31.33780839 ], [ 114.80693544, 31.33776852 ], [ 114.80706558, 31.33772874 ], [ 114.8071959, 31.337699 ], [ 114.80733612, 31.33767929 ], [ 114.80746644, 31.33763951 ], [ 114.80760684, 31.33760981 ], [ 114.80774706, 31.33758006 ], [ 114.80788728, 31.33755032 ], [ 114.80803776, 31.33752062 ], [ 114.80817798, 31.33749087 ], [ 114.80832828, 31.33745114 ], [ 114.80847858, 31.33742144 ], [ 114.80861898, 31.33739169 ], [ 114.80876928, 31.33736199 ], [ 114.8089095, 31.33732226 ], [ 114.8090598, 31.33729256 ], [ 114.8092002, 31.33726281 ], [ 114.8093505, 31.33722308 ], [ 114.80949072, 31.33719338 ], [ 114.80963112, 31.33716363 ], [ 114.80978142, 31.3371239 ], [ 114.80992164, 31.33708416 ], [ 114.81007194, 31.33703448 ], [ 114.81021234, 31.33699475 ], [ 114.81035256, 31.33695501 ], [ 114.81049278, 31.33690529 ], [ 114.81063318, 31.33686555 ], [ 114.8107635, 31.33681578 ], [ 114.81089364, 31.33677605 ], [ 114.81103404, 31.33673631 ], [ 114.81116418, 31.33669658 ], [ 114.8112945, 31.3366568 ], [ 114.81142482, 31.33661706 ], [ 114.81154506, 31.33658727 ], [ 114.81167538, 31.33655753 ], [ 114.81177546, 31.33654772 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528318", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87803328, 31.28589914 ], [ 114.878574, 31.28571995 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528319", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.016", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83341362, 31.30150032 ], [ 114.83333352, 31.30163015 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528320", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.296", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83333352, 31.30163015 ], [ 114.83254188, 31.30257816 ], [ 114.83196066, 31.30340675 ], [ 114.83175006, 31.30382619 ], [ 114.8317101, 31.30389612 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528321", "Name": "红军一路", "pyname": "hjyl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83742096, 31.29740838 ], [ 114.83733078, 31.29738822 ], [ 114.83712036, 31.29739785 ], [ 114.83699004, 31.29743763 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528322", "Name": "红军一路", "pyname": "hjyl", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.187", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83699004, 31.29743763 ], [ 114.83689986, 31.29746747 ], [ 114.83668944, 31.29755706 ], [ 114.83611848, 31.297856 ], [ 114.8359581, 31.29798569 ], [ 114.83568756, 31.29831513 ], [ 114.83554734, 31.2985148 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528323", "Name": "长岭大道", "pyname": "cldd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.434", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82660908, 31.29275088 ], [ 114.82675938, 31.29293106 ], [ 114.82871346, 31.29455403 ], [ 114.82945506, 31.29519515 ], [ 114.82969554, 31.2953855 ], [ 114.8298057, 31.29551568 ], [ 114.82981578, 31.29553566 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528324", "Name": "长岭大道", "pyname": "cldd", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.406", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82981578, 31.29553566 ], [ 114.82984584, 31.2955857 ], [ 114.82986582, 31.29566571 ], [ 114.82986582, 31.29574572 ], [ 114.82984584, 31.29581565 ], [ 114.8298057, 31.29589557 ], [ 114.82931484, 31.2963746 ], [ 114.82912458, 31.29651423 ], [ 114.82897428, 31.29669392 ], [ 114.82884396, 31.29690362 ], [ 114.8287338, 31.29711336 ], [ 114.8284935, 31.29770273 ], [ 114.8284935, 31.29787265 ], [ 114.82858368, 31.29820263 ], [ 114.82884414, 31.29876288 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528325", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.426", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82680402, 31.25219864 ], [ 114.82683408, 31.25232864 ], [ 114.82704432, 31.25321856 ], [ 114.82708428, 31.25351853 ], [ 114.82699392, 31.2552176 ], [ 114.8268735, 31.25654681 ], [ 114.82682328, 31.25768621 ], [ 114.8268834, 31.25797619 ], [ 114.8270436, 31.25824632 ], [ 114.82723386, 31.25849652 ], [ 114.82736418, 31.25878659 ], [ 114.82750422, 31.25942654 ], [ 114.82761438, 31.26006644 ], [ 114.8276844, 31.2606563 ], [ 114.82773444, 31.26094623 ], [ 114.82786458, 31.26121632 ], [ 114.8285457, 31.26210701 ], [ 114.82865586, 31.26231711 ], [ 114.8287059, 31.26254706 ], [ 114.82873596, 31.26277701 ], [ 114.82868574, 31.2635066 ], [ 114.82862562, 31.26376638 ], [ 114.82820478, 31.26453539 ], [ 114.8281848, 31.26455532 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528326", "Name": "X207", "pyname": "x207", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8281848, 31.26455532 ], [ 114.8280444, 31.26475503 ], [ 114.82799436, 31.2647949 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528415", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.065", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8058837, 31.3386669 ], [ 114.80590386, 31.33862694 ], [ 114.80596398, 31.33854702 ], [ 114.80601402, 31.33845716 ], [ 114.80607414, 31.33837724 ], [ 114.80613426, 31.33829736 ], [ 114.8061942, 31.33823742 ], [ 114.80624442, 31.33817753 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528416", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.020", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80624442, 31.33817753 ], [ 114.80630454, 31.33811763 ], [ 114.80636448, 31.33805774 ], [ 114.80638464, 31.33803776 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528417", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.394", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80295942, 31.34091245 ], [ 114.80300946, 31.3409025 ], [ 114.8031396, 31.34086268 ], [ 114.80327982, 31.34082285 ], [ 114.80342004, 31.34079306 ], [ 114.80355018, 31.34076323 ], [ 114.8036904, 31.34073339 ], [ 114.80382054, 31.34070356 ], [ 114.80396076, 31.34065379 ], [ 114.80409108, 31.34060393 ], [ 114.80422122, 31.34055411 ], [ 114.80435136, 31.34049431 ], [ 114.8044716, 31.34042447 ], [ 114.80459166, 31.34036466 ], [ 114.80469192, 31.34029482 ], [ 114.80477202, 31.34022494 ], [ 114.80485212, 31.34014506 ], [ 114.80493222, 31.34006519 ], [ 114.80499234, 31.33998531 ], [ 114.80506254, 31.33988541 ], [ 114.80511258, 31.33978551 ], [ 114.8051826, 31.33968566 ], [ 114.8052528, 31.33958576 ], [ 114.80532282, 31.3394859 ], [ 114.80538294, 31.339386 ], [ 114.80546304, 31.33928615 ], [ 114.80552316, 31.33917626 ], [ 114.80560326, 31.3390764 ], [ 114.80567346, 31.3389765 ], [ 114.80573358, 31.33888664 ], [ 114.8058036, 31.33879673 ], [ 114.80585382, 31.33870686 ], [ 114.8058837, 31.3386669 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528418", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80253876, 31.34101185 ], [ 114.80261886, 31.34099196 ], [ 114.80275908, 31.34095218 ], [ 114.80287932, 31.34093234 ], [ 114.80295942, 31.34091245 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528419", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.198", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8008059, 31.34407856 ], [ 114.80084604, 31.34398865 ], [ 114.80086602, 31.34392871 ], [ 114.8008761, 31.34384874 ], [ 114.80089608, 31.34377881 ], [ 114.80091606, 31.34369885 ], [ 114.80093622, 31.34362892 ], [ 114.80094612, 31.34355894 ], [ 114.80096628, 31.34348901 ], [ 114.80098626, 31.34337908 ], [ 114.80100624, 31.34328912 ], [ 114.80101632, 31.34323913 ], [ 114.8010264, 31.34318918 ], [ 114.8010363, 31.34313923 ], [ 114.80105646, 31.34306925 ], [ 114.80106636, 31.34300931 ], [ 114.80108652, 31.34292935 ], [ 114.8011065, 31.34283939 ], [ 114.80112648, 31.34272946 ], [ 114.80114664, 31.34263955 ], [ 114.8011767, 31.3425396 ], [ 114.80120676, 31.3424397 ], [ 114.80122674, 31.34233976 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528420", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.210", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80122674, 31.34233976 ], [ 114.8012568, 31.34222982 ], [ 114.80127678, 31.34211989 ], [ 114.80130684, 31.34199996 ], [ 114.80134698, 31.34188008 ], [ 114.80138712, 31.34177015 ], [ 114.80143716, 31.34167025 ], [ 114.80149728, 31.34157039 ], [ 114.8015673, 31.34147049 ], [ 114.80165748, 31.34139066 ], [ 114.80175756, 31.34131079 ], [ 114.80186772, 31.34124095 ], [ 114.80197788, 31.34119113 ], [ 114.8021082, 31.34113128 ], [ 114.80222826, 31.34109146 ], [ 114.80235858, 31.34105163 ], [ 114.80248872, 31.3410218 ], [ 114.80253876, 31.34101185 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528421", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.470", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79909302, 31.34724525 ], [ 114.79912308, 31.34723531 ], [ 114.79925322, 31.34718549 ], [ 114.79939344, 31.34715566 ], [ 114.79952358, 31.34712582 ], [ 114.7996638, 31.34709603 ], [ 114.79979394, 31.34707619 ], [ 114.79993416, 31.34704635 ], [ 114.80007438, 31.34701656 ], [ 114.80020452, 31.34697674 ], [ 114.80033484, 31.34692692 ], [ 114.800445, 31.34686707 ], [ 114.80056506, 31.34679723 ], [ 114.80066532, 31.34670741 ], [ 114.8007555, 31.34662754 ], [ 114.8008356, 31.34652768 ], [ 114.80090562, 31.34641779 ], [ 114.80096574, 31.34629791 ], [ 114.80101578, 31.34617803 ], [ 114.80104584, 31.34605811 ], [ 114.801066, 31.3459182 ], [ 114.801066, 31.34578824 ], [ 114.80103594, 31.34565824 ], [ 114.80099598, 31.34553827 ], [ 114.80095584, 31.34541825 ], [ 114.8009058, 31.34529824 ], [ 114.80086584, 31.34517822 ], [ 114.8008257, 31.3450682 ], [ 114.80078574, 31.34495822 ], [ 114.80075568, 31.3448382 ], [ 114.80074578, 31.34472827 ], [ 114.80074578, 31.3446083 ], [ 114.80075568, 31.34449836 ], [ 114.80076576, 31.34439842 ], [ 114.80077584, 31.34430846 ], [ 114.80079582, 31.34414853 ], [ 114.8008059, 31.34407856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528422", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.957", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78952818, 31.35676982 ], [ 114.78959838, 31.35661997 ], [ 114.78962844, 31.35653006 ], [ 114.7896684, 31.35645014 ], [ 114.78970854, 31.35636018 ], [ 114.78974868, 31.35627027 ], [ 114.78977874, 31.35617037 ], [ 114.78982878, 31.35608046 ], [ 114.78986874, 31.35598056 ], [ 114.78990888, 31.35589061 ], [ 114.78995892, 31.35579071 ], [ 114.79001904, 31.35569085 ], [ 114.79007916, 31.35560094 ], [ 114.79014936, 31.35551108 ], [ 114.79021938, 31.3554312 ], [ 114.79029948, 31.35536132 ], [ 114.79038966, 31.35530142 ], [ 114.79047984, 31.35525156 ], [ 114.79055994, 31.35521169 ], [ 114.79064004, 31.35517182 ], [ 114.79072014, 31.35515189 ], [ 114.79081032, 31.35512205 ], [ 114.79089042, 31.35510212 ], [ 114.79098042, 31.35508227 ], [ 114.7910706, 31.35505239 ], [ 114.79116078, 31.35504249 ], [ 114.79126086, 31.35502265 ], [ 114.79136112, 31.35500276 ], [ 114.79147128, 31.35498291 ], [ 114.79158144, 31.35496307 ], [ 114.7917015, 31.35493319 ], [ 114.79181166, 31.35491334 ], [ 114.7919319, 31.35488351 ], [ 114.79205196, 31.35484368 ], [ 114.7921722, 31.35479382 ], [ 114.79229244, 31.35474401 ], [ 114.7924026, 31.35467417 ], [ 114.79251276, 31.35461432 ], [ 114.79261284, 31.35453449 ], [ 114.79271292, 31.35446465 ], [ 114.7928031, 31.35437478 ], [ 114.7928832, 31.35428492 ], [ 114.79296348, 31.35419505 ], [ 114.79304358, 31.35410519 ], [ 114.79312368, 31.35400533 ], [ 114.79320378, 31.35391547 ], [ 114.79328388, 31.35381557 ], [ 114.79336398, 31.35371571 ], [ 114.79344408, 31.35361586 ], [ 114.79352436, 31.353516 ], [ 114.79361436, 31.35342614 ], [ 114.79369464, 31.35332628 ], [ 114.79378464, 31.35323642 ], [ 114.79387482, 31.35314655 ], [ 114.7939749, 31.35305673 ], [ 114.79406508, 31.35296687 ], [ 114.79415526, 31.352877 ], [ 114.79424544, 31.35279717 ], [ 114.79433562, 31.35270731 ], [ 114.79442562, 31.35262743 ], [ 114.7945158, 31.3525476 ], [ 114.79460598, 31.35246773 ], [ 114.79469616, 31.35239789 ], [ 114.79478616, 31.352328 ], [ 114.79486644, 31.35224813 ], [ 114.79495644, 31.35217829 ], [ 114.79502664, 31.3521084 ], [ 114.79510674, 31.35202853 ], [ 114.79516686, 31.35194861 ], [ 114.79523688, 31.35186873 ], [ 114.79528692, 31.35177882 ], [ 114.79532706, 31.35167892 ], [ 114.79535712, 31.35157898 ], [ 114.7953771, 31.35148907 ], [ 114.79539726, 31.35138912 ], [ 114.79540734, 31.35129917 ], [ 114.79541724, 31.35119922 ], [ 114.7954374, 31.35110927 ], [ 114.79545738, 31.35100932 ], [ 114.79546746, 31.35092936 ], [ 114.79548744, 31.35084944 ], [ 114.79549752, 31.35078945 ], [ 114.79550742, 31.35074949 ], [ 114.79550742, 31.35070949 ], [ 114.79550742, 31.35067952 ], [ 114.79550742, 31.35064955 ], [ 114.7955175, 31.35061958 ], [ 114.79552758, 31.35058956 ], [ 114.79553748, 31.35052962 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528423", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.508", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79553748, 31.35052962 ], [ 114.79554756, 31.35049965 ], [ 114.79555764, 31.35045965 ], [ 114.79557762, 31.3504097 ], [ 114.7955976, 31.35035975 ], [ 114.79562766, 31.35029981 ], [ 114.79565772, 31.35022988 ], [ 114.79569786, 31.35015995 ], [ 114.79573782, 31.35009002 ], [ 114.79578804, 31.35002013 ], [ 114.79583808, 31.34994021 ], [ 114.7959081, 31.34986034 ], [ 114.79596822, 31.34977043 ], [ 114.79603842, 31.34969055 ], [ 114.79610844, 31.34960069 ], [ 114.79617864, 31.34951078 ], [ 114.79624866, 31.34942091 ], [ 114.79632876, 31.34932106 ], [ 114.79640904, 31.34923119 ], [ 114.79648914, 31.34913134 ], [ 114.79657932, 31.34903148 ], [ 114.79665942, 31.34894162 ], [ 114.79674942, 31.34884176 ], [ 114.7968396, 31.34874191 ], [ 114.79693986, 31.34865204 ], [ 114.79702986, 31.34857221 ], [ 114.79714002, 31.34849238 ], [ 114.79724028, 31.34841251 ], [ 114.79735044, 31.34833268 ], [ 114.7974606, 31.34825285 ], [ 114.79757076, 31.34817302 ], [ 114.79768092, 31.34809319 ], [ 114.79779108, 31.34801336 ], [ 114.79791132, 31.34793353 ], [ 114.79802148, 31.3478537 ], [ 114.79813164, 31.34777387 ], [ 114.79823172, 31.34769404 ], [ 114.79834188, 31.3476242 ], [ 114.79845204, 31.34755436 ], [ 114.7985523, 31.34749451 ], [ 114.79866246, 31.34743466 ], [ 114.79876254, 31.3473848 ], [ 114.79888278, 31.34733494 ], [ 114.79900284, 31.34727513 ], [ 114.79909302, 31.34724525 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528464", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.070", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04440098, 31.250453 ], [ 115.04439108, 31.2503031 ], [ 115.04438118, 31.25017319 ], [ 115.04427138, 31.24983357 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528465", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04427138, 31.24983357 ], [ 115.04426148, 31.24981359 ], [ 115.04417166, 31.24957388 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528466", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.814", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01537166, 31.26919014 ], [ 115.01537166, 31.26905024 ], [ 115.01539164, 31.26884027 ], [ 115.01551134, 31.26821022 ], [ 115.01559108, 31.26798009 ], [ 115.01571078, 31.26756996 ], [ 115.01579052, 31.26737984 ], [ 115.01596998, 31.26696948 ], [ 115.01618922, 31.26656907 ], [ 115.01632872, 31.26637877 ], [ 115.01650818, 31.26617838 ], [ 115.01663778, 31.26597809 ], [ 115.01678736, 31.26581775 ], [ 115.01707644, 31.26536717 ], [ 115.01737542, 31.2649965 ], [ 115.01751492, 31.26490614 ], [ 115.01769438, 31.26468573 ], [ 115.01786376, 31.26451536 ], [ 115.0184718, 31.26406388 ], [ 115.01907984, 31.26353243 ], [ 115.0192593, 31.26336201 ], [ 115.01945856, 31.26321149 ], [ 115.01963802, 31.26310106 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528467", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01528184, 31.26962021 ], [ 115.01534178, 31.26945011 ], [ 115.01537166, 31.26929013 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528468", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.011", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01537166, 31.26929013 ], [ 115.01537166, 31.26919014 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528469", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.713", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0102089, 31.27676153 ], [ 115.01049798, 31.27615097 ], [ 115.01062758, 31.27594068 ], [ 115.01084682, 31.27549023 ], [ 115.0115445, 31.27386893 ], [ 115.01172378, 31.27339863 ], [ 115.01184348, 31.27291848 ], [ 115.0120827, 31.2717983 ], [ 115.01214246, 31.27158819 ], [ 115.0122222, 31.27139807 ], [ 115.01254116, 31.27093736 ], [ 115.01268066, 31.27082702 ], [ 115.01274042, 31.27078688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528470", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.367", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0087338, 31.28005436 ], [ 115.0088535, 31.27976415 ], [ 115.00888338, 31.27956413 ], [ 115.00918236, 31.27886357 ], [ 115.0098003, 31.27756235 ], [ 115.01010918, 31.27697172 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528471", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.025", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01010918, 31.27697172 ], [ 115.01016912, 31.27685162 ], [ 115.0102089, 31.27676153 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528472", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23019716, 31.33040747 ], [ 115.23054708, 31.33016757 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528473", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.081", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23054708, 31.33016757 ], [ 115.23076704, 31.33001759 ], [ 115.23091698, 31.32995765 ], [ 115.2312471, 31.32975771 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528474", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.480", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0600266, 31.18807994 ], [ 115.06100418, 31.18824783 ], [ 115.06176216, 31.18837622 ], [ 115.06211136, 31.18840556 ], [ 115.06501674, 31.188632 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528475", "Name": "X104", "pyname": "x104", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.427", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06501674, 31.188632 ], [ 115.06771242, 31.18883864 ], [ 115.06908024, 31.18897692 ], [ 115.0693398, 31.18904658 ], [ 115.0694496, 31.1890964 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528480", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.020", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80638464, 31.33803776 ], [ 114.80635458, 31.33810769 ], [ 114.80629446, 31.3381976 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528481", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "30", "length": "0.066", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80629446, 31.3381976 ], [ 114.8062644, 31.33825754 ], [ 114.80622426, 31.33832747 ], [ 114.8061843, 31.33838736 ], [ 114.80614416, 31.3384473 ], [ 114.80609412, 31.3385072 ], [ 114.806034, 31.33857713 ], [ 114.8058837, 31.3386669 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528620", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.269", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16467716, 31.0981802 ], [ 115.16559894, 31.09736228 ], [ 115.16612994, 31.09691349 ], [ 115.16666112, 31.09645476 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528621", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.085", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16666112, 31.09645476 ], [ 115.1669718, 31.09618548 ], [ 115.16725242, 31.09588619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528622", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.362", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1591859, 31.10403717 ], [ 115.15972716, 31.10308866 ], [ 115.1598573, 31.10291897 ], [ 115.16001768, 31.10273937 ], [ 115.16053878, 31.10227056 ], [ 115.16085936, 31.10195129 ], [ 115.16147064, 31.10148266 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528623", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16147064, 31.10148266 ], [ 115.16160096, 31.10138294 ], [ 115.16164092, 31.10134302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528624", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1588853, 31.105166 ], [ 115.1588853, 31.10496611 ], [ 115.15890546, 31.10464634 ], [ 115.15891536, 31.10455638 ], [ 115.15893552, 31.10447646 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528625", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "1.985", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16211036, 31.12192296 ], [ 115.16214042, 31.12054371 ], [ 115.16213052, 31.1197541 ], [ 115.1620704, 31.11953414 ], [ 115.16197014, 31.11930405 ], [ 115.16174982, 31.11888389 ], [ 115.1616195, 31.11855381 ], [ 115.16139918, 31.11786378 ], [ 115.1609283, 31.11684345 ], [ 115.16085828, 31.11660347 ], [ 115.16078808, 31.11611355 ], [ 115.16072796, 31.11587361 ], [ 115.16065794, 31.11563358 ], [ 115.16035734, 31.11488343 ], [ 115.16026716, 31.1146034 ], [ 115.16012694, 31.11403347 ], [ 115.15994676, 31.11351341 ], [ 115.15990662, 31.11326348 ], [ 115.1599167, 31.1130036 ], [ 115.16002704, 31.11230417 ], [ 115.16032764, 31.11155514 ], [ 115.16044788, 31.11112557 ], [ 115.16068836, 31.11079617 ], [ 115.16082858, 31.11066648 ], [ 115.16091876, 31.11047676 ], [ 115.16096898, 31.11030693 ], [ 115.16098896, 31.11008711 ], [ 115.16096898, 31.10988717 ], [ 115.16089878, 31.10969714 ], [ 115.16077872, 31.10952699 ], [ 115.16061834, 31.1093568 ], [ 115.160418, 31.10919651 ], [ 115.16020758, 31.10906624 ], [ 115.15999716, 31.10897592 ], [ 115.15982688, 31.10883566 ], [ 115.15969656, 31.10863554 ], [ 115.15949622, 31.10826542 ], [ 115.1592759, 31.10793516 ], [ 115.15910562, 31.10755509 ], [ 115.15880502, 31.10649512 ], [ 115.15876506, 31.1062752 ], [ 115.15875498, 31.10607527 ], [ 115.15885524, 31.10570564 ], [ 115.15887522, 31.10556578 ], [ 115.1588853, 31.105166 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528626", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.300", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16103792, 31.12428974 ], [ 115.16123844, 31.1241402 ], [ 115.1617194, 31.1237213 ], [ 115.16185962, 31.12357163 ], [ 115.16200992, 31.123332 ], [ 115.16205006, 31.12321217 ], [ 115.16207004, 31.12308225 ], [ 115.16210028, 31.12241265 ], [ 115.16211018, 31.12197291 ], [ 115.16211036, 31.12192296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528627", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15644846, 31.13031816 ], [ 115.15645854, 31.12987842 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528628", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.127", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15645854, 31.12987842 ], [ 115.1564787, 31.12921881 ], [ 115.15646862, 31.12873907 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528629", "Name": "X209", "pyname": "x209", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.670", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15646862, 31.12873907 ], [ 115.15649886, 31.12851924 ], [ 115.1566191, 31.1283396 ], [ 115.15702986, 31.12780064 ], [ 115.15776138, 31.12677248 ], [ 115.15792176, 31.12660287 ], [ 115.1584929, 31.12614414 ], [ 115.1590941, 31.12576542 ], [ 115.15953492, 31.1254664 ], [ 115.160076, 31.12504763 ], [ 115.16030658, 31.12484814 ], [ 115.16050692, 31.12470855 ], [ 115.16103792, 31.12428974 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528727", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08606486, 30.91619547 ], [ 115.0860348, 30.91619547 ], [ 115.08599484, 30.9162155 ], [ 115.08587496, 30.9163554 ], [ 115.08582492, 30.91641539 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528728", "Name": null, "pyname": null, "kind_num": "1", "kind": "0401", "width": "55", "length": "2.669", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08582492, 30.91641539 ], [ 115.08573492, 30.91652532 ], [ 115.08563484, 30.91664525 ], [ 115.08545502, 30.91680518 ], [ 115.08515496, 30.9170151 ], [ 115.0849251, 30.91718502 ], [ 115.08489504, 30.917205 ], [ 115.08484518, 30.91722503 ], [ 115.08480504, 30.91724501 ], [ 115.08477516, 30.917255 ], [ 115.08469524, 30.91727502 ], [ 115.08460524, 30.91727507 ], [ 115.08450534, 30.91726508 ], [ 115.0844553, 30.91725509 ], [ 115.08441534, 30.91724514 ], [ 115.08437538, 30.91722516 ], [ 115.0843554, 30.91721517 ], [ 115.08433542, 30.91720518 ], [ 115.08430536, 30.91717521 ], [ 115.08428538, 30.91712526 ], [ 115.08427548, 30.91710528 ], [ 115.0842654, 30.9170853 ], [ 115.08423552, 30.91691543 ], [ 115.08418548, 30.91681553 ], [ 115.08413562, 30.91676558 ], [ 115.0840557, 30.9166457 ], [ 115.0839657, 30.91649585 ], [ 115.08394572, 30.91646588 ], [ 115.08393582, 30.91640594 ], [ 115.08393582, 30.91637592 ], [ 115.08393582, 30.91631598 ], [ 115.0839459, 30.91627602 ], [ 115.08400584, 30.9161561 ], [ 115.08405588, 30.91603617 ], [ 115.08409584, 30.91592624 ], [ 115.0841259, 30.91590626 ], [ 115.08414588, 30.91589627 ], [ 115.08420582, 30.91589622 ], [ 115.08423588, 30.91589622 ], [ 115.08427584, 30.9159162 ], [ 115.08429582, 30.91592619 ], [ 115.0843158, 30.91593618 ], [ 115.08434568, 30.91596615 ], [ 115.08436566, 30.91599612 ], [ 115.08439572, 30.91604607 ], [ 115.08440562, 30.91607604 ], [ 115.08439572, 30.916166 ], [ 115.08438564, 30.91620596 ], [ 115.08435558, 30.91624592 ], [ 115.08427566, 30.91635585 ], [ 115.0842456, 30.91638587 ], [ 115.08422562, 30.9164558 ], [ 115.08422562, 30.91648577 ], [ 115.0842357, 30.91652573 ], [ 115.0842456, 30.9165557 ], [ 115.08427566, 30.91658567 ], [ 115.08430554, 30.91661564 ], [ 115.0843356, 30.91664561 ], [ 115.08435558, 30.91666559 ], [ 115.08441552, 30.91667558 ], [ 115.08445548, 30.91668557 ], [ 115.08449544, 30.91668552 ], [ 115.0845255, 30.91668552 ], [ 115.08454548, 30.91667553 ], [ 115.08457536, 30.91666554 ], [ 115.08463548, 30.91662554 ], [ 115.08476544, 30.91650561 ], [ 115.08493536, 30.91637565 ], [ 115.08503526, 30.91631567 ], [ 115.08513534, 30.91621572 ], [ 115.08523524, 30.91608581 ], [ 115.08533532, 30.91593587 ], [ 115.08540534, 30.91585595 ], [ 115.08556518, 30.91576595 ], [ 115.08559524, 30.91573598 ], [ 115.0856253, 30.91570601 ], [ 115.0856352, 30.91568598 ], [ 115.08564528, 30.91565601 ], [ 115.08564528, 30.91562604 ], [ 115.08564528, 30.91558608 ], [ 115.08561522, 30.91551615 ], [ 115.08558534, 30.91548618 ], [ 115.08555528, 30.91545621 ], [ 115.08548544, 30.91539627 ], [ 115.08532542, 30.91528638 ], [ 115.08525558, 30.9152165 ], [ 115.08519564, 30.91513653 ], [ 115.08517566, 30.91509657 ], [ 115.08516558, 30.9150666 ], [ 115.08516558, 30.91503663 ], [ 115.08516576, 30.91499667 ], [ 115.08518574, 30.91490672 ], [ 115.08529572, 30.91469688 ], [ 115.08529572, 30.91466691 ], [ 115.08529572, 30.91464689 ], [ 115.08517584, 30.91434719 ], [ 115.08507612, 30.91401747 ], [ 115.08506604, 30.91399749 ], [ 115.08505614, 30.91397751 ], [ 115.08502608, 30.91395753 ], [ 115.0850061, 30.91394754 ], [ 115.08495606, 30.91394754 ], [ 115.08492618, 30.91394754 ], [ 115.0849062, 30.91395758 ], [ 115.08487614, 30.91397756 ], [ 115.08485616, 30.91399754 ], [ 115.08485616, 30.91402751 ], [ 115.08483618, 30.91409748 ], [ 115.08483618, 30.91416741 ], [ 115.08485616, 30.91426731 ], [ 115.08487596, 30.9143273 ], [ 115.08491592, 30.91440722 ], [ 115.08496596, 30.91446716 ], [ 115.08501582, 30.91453709 ], [ 115.0850358, 30.91457705 ], [ 115.0850358, 30.91459703 ], [ 115.08504588, 30.91461701 ], [ 115.0850358, 30.91465697 ], [ 115.0850358, 30.91468694 ], [ 115.08498576, 30.91475691 ], [ 115.08492582, 30.9148169 ], [ 115.0848459, 30.91489686 ], [ 115.08479586, 30.91494681 ], [ 115.0847658, 30.91496679 ], [ 115.08471594, 30.91497683 ], [ 115.08467598, 30.91497683 ], [ 115.08462594, 30.91497683 ], [ 115.08452604, 30.91495689 ], [ 115.08442614, 30.91491693 ], [ 115.08403626, 30.91474719 ], [ 115.08378642, 30.91467731 ], [ 115.08364656, 30.91463739 ], [ 115.08354666, 30.91460742 ], [ 115.08349662, 30.9145775 ], [ 115.08347664, 30.91455752 ], [ 115.0834167, 30.91448759 ], [ 115.08337674, 30.91441766 ], [ 115.08336684, 30.9143277 ], [ 115.08335676, 30.91417785 ], [ 115.08332688, 30.91407791 ], [ 115.083297, 30.91400798 ], [ 115.08322698, 30.91392806 ], [ 115.08316704, 30.91386812 ], [ 115.08305706, 30.91377825 ], [ 115.08297714, 30.91371831 ], [ 115.0829073, 30.91364838 ], [ 115.08284736, 30.91357845 ], [ 115.08278742, 30.91346856 ], [ 115.08274746, 30.91341861 ], [ 115.08268752, 30.91335867 ], [ 115.08260742, 30.91331871 ], [ 115.08249762, 30.91325882 ], [ 115.0823376, 30.9131789 ], [ 115.08219774, 30.91312899 ], [ 115.08208776, 30.91308903 ], [ 115.08198786, 30.9130691 ], [ 115.08158808, 30.9129593 ], [ 115.08149808, 30.91293932 ], [ 115.08124824, 30.91283946 ], [ 115.08101856, 30.91271963 ], [ 115.08094854, 30.91269969 ], [ 115.0808886, 30.91267971 ], [ 115.08084864, 30.91266972 ], [ 115.08081858, 30.91266972 ], [ 115.08078852, 30.91266977 ], [ 115.08073866, 30.91267976 ], [ 115.08057882, 30.91270986 ], [ 115.08047892, 30.91273997 ], [ 115.080399, 30.91279005 ], [ 115.08032916, 30.91284009 ], [ 115.0802793, 30.91290012 ], [ 115.0801695, 30.9131402 ], [ 115.08011964, 30.91324019 ], [ 115.0799499, 30.91342032 ], [ 115.07976018, 30.91358048 ], [ 115.07962032, 30.91365063 ], [ 115.07957046, 30.91366067 ], [ 115.0795305, 30.9136707 ], [ 115.07948064, 30.9136608 ], [ 115.07938074, 30.9136109 ], [ 115.07933088, 30.91359096 ], [ 115.07923098, 30.91353111 ], [ 115.07893146, 30.91342154 ], [ 115.07884146, 30.91337163 ], [ 115.0787916, 30.91333172 ], [ 115.0786818, 30.91321188 ], [ 115.07855202, 30.91307211 ], [ 115.07840208, 30.91279239 ], [ 115.07828238, 30.91260263 ], [ 115.07825232, 30.91254269 ], [ 115.07823234, 30.91246272 ], [ 115.07823234, 30.91234275 ], [ 115.07821236, 30.91224285 ], [ 115.0781724, 30.91218291 ], [ 115.07812254, 30.912143 ], [ 115.07809248, 30.91213301 ], [ 115.07805252, 30.91212306 ], [ 115.07802264, 30.91211312 ], [ 115.07798268, 30.91211316 ], [ 115.07793282, 30.9121232 ], [ 115.07790276, 30.91213323 ], [ 115.0778529, 30.9121533 ], [ 115.07783292, 30.91216329 ], [ 115.0777332, 30.91225338 ], [ 115.07761332, 30.91237349 ], [ 115.07749344, 30.9124836 ], [ 115.07739372, 30.91257365 ], [ 115.07735376, 30.9126537 ], [ 115.07732388, 30.9127037 ], [ 115.07727384, 30.91284369 ], [ 115.07721408, 30.91309367 ], [ 115.077204, 30.91324361 ], [ 115.0771941, 30.91330359 ], [ 115.07718402, 30.91332362 ], [ 115.07716404, 30.91334364 ], [ 115.07713416, 30.91335368 ], [ 115.0770843, 30.91335372 ], [ 115.07706432, 30.91334373 ], [ 115.07704434, 30.9133238 ], [ 115.07702436, 30.91330382 ], [ 115.07701428, 30.91328384 ], [ 115.07700438, 30.91326386 ], [ 115.07700438, 30.91323384 ], [ 115.07701428, 30.9131339 ], [ 115.0771041, 30.9128639 ], [ 115.07718402, 30.91264389 ], [ 115.07724396, 30.91252388 ], [ 115.07730372, 30.91243383 ], [ 115.07740362, 30.91232376 ], [ 115.07748354, 30.91224371 ], [ 115.07751342, 30.91219371 ], [ 115.07754348, 30.91213368 ], [ 115.0776333, 30.91188371 ], [ 115.07770314, 30.91169372 ], [ 115.07772312, 30.9116637 ], [ 115.0777431, 30.91163369 ], [ 115.07776308, 30.9116237 ], [ 115.07778306, 30.91160367 ], [ 115.07780304, 30.91159364 ], [ 115.07783292, 30.91159359 ], [ 115.07786298, 30.91158356 ], [ 115.07792274, 30.91158351 ], [ 115.07798268, 30.91159341 ], [ 115.07820228, 30.91161308 ], [ 115.07825232, 30.91161303 ], [ 115.0782822, 30.91161299 ], [ 115.07833206, 30.91159296 ], [ 115.07836212, 30.91158293 ], [ 115.0783821, 30.91155291 ], [ 115.07840208, 30.91149293 ], [ 115.07840208, 30.91146291 ], [ 115.078392, 30.91144293 ], [ 115.07835204, 30.91138304 ], [ 115.0782822, 30.91133313 ], [ 115.07813244, 30.91123341 ], [ 115.07803272, 30.9111836 ], [ 115.0779429, 30.91115372 ], [ 115.07790294, 30.91114377 ], [ 115.07786298, 30.91114382 ], [ 115.0778331, 30.91115385 ], [ 115.07781312, 30.91116389 ], [ 115.07778306, 30.91117392 ], [ 115.07772312, 30.91121397 ], [ 115.0776234, 30.91127409 ], [ 115.07758344, 30.91130411 ], [ 115.07753358, 30.91136414 ], [ 115.07748354, 30.91140419 ], [ 115.07744358, 30.91145423 ], [ 115.07743368, 30.91147421 ], [ 115.07738382, 30.91155426 ], [ 115.07736384, 30.91164422 ], [ 115.07735376, 30.91184411 ], [ 115.07733378, 30.91192407 ], [ 115.07727384, 30.91204409 ], [ 115.07725386, 30.9120741 ], [ 115.07717412, 30.91215416 ], [ 115.07705424, 30.91225428 ], [ 115.07703426, 30.91226432 ], [ 115.0769943, 30.91228434 ], [ 115.07693454, 30.91228443 ], [ 115.07690448, 30.91227449 ], [ 115.0768746, 30.91226454 ], [ 115.07685462, 30.91225455 ], [ 115.07683464, 30.91222458 ], [ 115.07682474, 30.9122046 ], [ 115.07682474, 30.91216464 ], [ 115.07682474, 30.91209467 ], [ 115.07684472, 30.91200471 ], [ 115.0768746, 30.91191471 ], [ 115.07691456, 30.91181472 ], [ 115.0769844, 30.91168472 ], [ 115.07704434, 30.91158468 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528838", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.126", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85853244, 31.30075571 ], [ 114.85811178, 31.30083513 ], [ 114.8572206, 31.30090398 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528839", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8572206, 31.30090398 ], [ 114.85668978, 31.3009533 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528840", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.373", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86199852, 31.29625283 ], [ 114.86196846, 31.29628275 ], [ 114.86183814, 31.29637253 ], [ 114.86156778, 31.29646212 ], [ 114.86144772, 31.29647198 ], [ 114.8613075, 31.29648179 ], [ 114.86085678, 31.29640128 ], [ 114.8605965, 31.29638099 ], [ 114.8603661, 31.29641069 ], [ 114.86014578, 31.29652035 ], [ 114.86002572, 31.29665009 ], [ 114.8599755, 31.29674999 ], [ 114.85995552, 31.29689988 ], [ 114.85991538, 31.29713969 ], [ 114.8599152, 31.29751944 ], [ 114.85992528, 31.29763937 ], [ 114.86005524, 31.29807929 ], [ 114.86006532, 31.29812924 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.528841", "Name": "X103", "pyname": "x103", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.342", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86006532, 31.29812924 ], [ 114.8600952, 31.29828917 ], [ 114.8600952, 31.29850904 ], [ 114.86003508, 31.29870884 ], [ 114.8597946, 31.2991583 ], [ 114.85968426, 31.29953792 ], [ 114.85958418, 31.29979761 ], [ 114.859494, 31.29994742 ], [ 114.85920348, 31.30023686 ], [ 114.85892304, 31.30051635 ], [ 114.85875276, 31.30064609 ], [ 114.85853244, 31.30075571 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_county_road_pl.531793", "Name": "X304", "pyname": "x304", "kind_num": "1", "kind": "0401", "width": "55", "length": "0.018", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78946806, 31.35691971 ], [ 114.78948822, 31.35685973 ], [ 114.78951828, 31.35680978 ], [ 114.78952818, 31.35676982 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/国道.geojson b/public/mapbox/geojson/国道.geojson new file mode 100644 index 0000000..daddd95 --- /dev/null +++ b/public/mapbox/geojson/国道.geojson @@ -0,0 +1,555 @@ +{ +"type": "FeatureCollection", +"name": "国道", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.205676", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.353", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11939852, 31.50357147 ], [ 115.11925848, 31.50350141 ], [ 115.11887832, 31.50331124 ], [ 115.11757782, 31.50265073 ], [ 115.11682758, 31.50228042 ], [ 115.11666756, 31.50218039 ], [ 115.1165574, 31.50211032 ], [ 115.11644742, 31.50202028 ], [ 115.1162874, 31.50185022 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210761", "Name": "余家集桥", "pyname": "yjjq", "kind": "0208", "width": "55", "length": "0.130", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09346448, 31.45959806 ], [ 115.09342452, 31.45914815 ], [ 115.09341462, 31.45885821 ], [ 115.09340454, 31.45879823 ], [ 115.09336458, 31.4585883 ], [ 115.09335468, 31.45855829 ], [ 115.0933248, 31.45845834 ], [ 115.09331472, 31.45843836 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210762", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.082", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09836282, 31.48277499 ], [ 115.09830288, 31.48268499 ], [ 115.09824276, 31.48261497 ], [ 115.0982028, 31.48256498 ], [ 115.0981128, 31.48249491 ], [ 115.09798284, 31.48240487 ], [ 115.09786278, 31.48233485 ], [ 115.0978428, 31.48232486 ], [ 115.09774272, 31.4822849 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210763", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.127", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09774272, 31.4822849 ], [ 115.09753284, 31.4821949 ], [ 115.09694298, 31.48202498 ], [ 115.09668306, 31.48190501 ], [ 115.09651314, 31.48184502 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210764", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.250", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10037378, 31.4859159 ], [ 115.1003538, 31.48589592 ], [ 115.10011386, 31.48564586 ], [ 115.09992378, 31.4854358 ], [ 115.09965378, 31.48515576 ], [ 115.09925364, 31.48471566 ], [ 115.09915356, 31.48457562 ], [ 115.09899354, 31.48432551 ], [ 115.09889346, 31.48407545 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210765", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.174", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09331472, 31.45843836 ], [ 115.09329474, 31.45838837 ], [ 115.0932249, 31.45828842 ], [ 115.09314498, 31.45818852 ], [ 115.09305498, 31.45810856 ], [ 115.09286526, 31.45799871 ], [ 115.09274538, 31.45793882 ], [ 115.09235568, 31.45772912 ], [ 115.09189614, 31.45748945 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210766", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.130", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0935444, 31.46076779 ], [ 115.09353432, 31.46062784 ], [ 115.09346448, 31.45959806 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.210767", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.326", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09257906, 31.43323566 ], [ 115.092639, 31.43307564 ], [ 115.09266888, 31.43297561 ], [ 115.0928487, 31.4325855 ], [ 115.09332804, 31.43162516 ], [ 115.09379748, 31.43071494 ], [ 115.09424784, 31.42977548 ], [ 115.09461828, 31.42905593 ], [ 115.09470828, 31.42887606 ], [ 115.09478838, 31.42868616 ], [ 115.09483842, 31.42849622 ], [ 115.09491852, 31.42805643 ], [ 115.0950888, 31.42698683 ], [ 115.09528914, 31.42575729 ], [ 115.09538922, 31.42510754 ], [ 115.09550946, 31.42442781 ], [ 115.0956396, 31.42369814 ], [ 115.0957197, 31.42308834 ], [ 115.09590996, 31.42198877 ], [ 115.09594002, 31.42173888 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.225433", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.027", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15802963354615, 31.606530082993888 ], [ 115.1580429, 31.60642482 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228741", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.206", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09594002, 31.42173888 ], [ 115.09597026, 31.4210691 ], [ 115.09599024, 31.42022936 ], [ 115.09600032, 31.41988943 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228742", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.151", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09600032, 31.41988943 ], [ 115.0960104, 31.41956952 ], [ 115.0960203, 31.41922955 ], [ 115.09604028, 31.41865953 ], [ 115.09604028, 31.41852953 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228743", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.341", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.093008, 31.4379041 ], [ 115.09306794, 31.43747412 ], [ 115.09307784, 31.43735411 ], [ 115.0931178, 31.43700414 ], [ 115.09318782, 31.43657417 ], [ 115.09319772, 31.43641419 ], [ 115.09319772, 31.43624423 ], [ 115.09318782, 31.43610428 ], [ 115.09315794, 31.43587437 ], [ 115.09311798, 31.43567448 ], [ 115.09302816, 31.43528465 ], [ 115.09291836, 31.43486489 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228744", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.185", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09291836, 31.43486489 ], [ 115.09278858, 31.43438514 ], [ 115.09258896, 31.43369556 ], [ 115.09255908, 31.43355561 ], [ 115.09255908, 31.43347565 ], [ 115.09256898, 31.43334564 ], [ 115.09257906, 31.43323566 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228745", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.112", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09376652, 31.44021269 ], [ 115.0937766, 31.44016265 ], [ 115.0937766, 31.44010266 ], [ 115.09373664, 31.43995277 ], [ 115.09364682, 31.43971292 ], [ 115.09350696, 31.43941317 ], [ 115.09341714, 31.43926328 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228746", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.161", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09341714, 31.43926328 ], [ 115.09310772, 31.43874375 ], [ 115.09303788, 31.43861388 ], [ 115.09300782, 31.43855394 ], [ 115.09298784, 31.43847398 ], [ 115.09297794, 31.438364 ], [ 115.09297794, 31.43812406 ], [ 115.09298802, 31.43805408 ], [ 115.093008, 31.4379041 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228747", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.030", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0936866, 31.4404727 ], [ 115.09371666, 31.44040268 ], [ 115.09375662, 31.44027267 ], [ 115.09376652, 31.44021269 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228748", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.670", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09408314, 31.47279548 ], [ 115.09418304, 31.47270543 ], [ 115.09427286, 31.47261539 ], [ 115.0943229, 31.47256535 ], [ 115.09437276, 31.47253533 ], [ 115.0945029, 31.47244533 ], [ 115.09454286, 31.47240537 ], [ 115.0946028, 31.47234539 ], [ 115.09469298, 31.47221547 ], [ 115.09474302, 31.47211553 ], [ 115.09503318, 31.47144579 ], [ 115.09530336, 31.47077601 ], [ 115.0953534, 31.47061608 ], [ 115.09541334, 31.4703162 ], [ 115.0954335, 31.47012621 ], [ 115.09545348, 31.46999625 ], [ 115.0954434, 31.46987628 ], [ 115.0954335, 31.46968634 ], [ 115.09537356, 31.46936639 ], [ 115.09521354, 31.46877644 ], [ 115.09504362, 31.46810657 ], [ 115.0947837, 31.46725665 ], [ 115.09475364, 31.46714667 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228749", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.041", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09475364, 31.46714667 ], [ 115.09466364, 31.46678672 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228750", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.160", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09466364, 31.46678672 ], [ 115.0946136, 31.46660672 ], [ 115.0944138, 31.46591682 ], [ 115.09425378, 31.46538686 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228751", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.125", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0917453, 31.47492672 ], [ 115.0919451, 31.47478664 ], [ 115.09265448, 31.47411623 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228752", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.200", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09265448, 31.47411623 ], [ 115.0930341, 31.47374606 ], [ 115.09408314, 31.47279548 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228753", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.020", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09160544, 31.47505682 ], [ 115.0917453, 31.47492672 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228754", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.770", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09404336, 31.48010492 ], [ 115.0931448, 31.47940616 ], [ 115.0927155, 31.47909665 ], [ 115.0924059, 31.47886692 ], [ 115.09187634, 31.4785274 ], [ 115.0914069, 31.47823782 ], [ 115.09106742, 31.47799811 ], [ 115.09065774, 31.47763842 ], [ 115.09044804, 31.47742859 ], [ 115.09036794, 31.47729863 ], [ 115.09034796, 31.47726866 ], [ 115.09029792, 31.47710864 ], [ 115.0902378, 31.47673851 ], [ 115.09020774, 31.47650847 ], [ 115.09020774, 31.47647846 ], [ 115.0902576, 31.47636834 ], [ 115.09033734, 31.47625818 ], [ 115.0906167, 31.47595772 ], [ 115.09087626, 31.47568727 ], [ 115.09148556, 31.47516689 ], [ 115.09160544, 31.47505682 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228755", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.171", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09651314, 31.48184502 ], [ 115.09638318, 31.48180506 ], [ 115.09622316, 31.48171506 ], [ 115.09585326, 31.48144506 ], [ 115.09512318, 31.48087496 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228756", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.133", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09512318, 31.48087496 ], [ 115.09490322, 31.48070495 ], [ 115.09404336, 31.48010492 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228757", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.097", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10102394, 31.48658604 ], [ 115.10057394, 31.48610594 ], [ 115.10037378, 31.4859159 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228758", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.142", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09889346, 31.48407545 ], [ 115.09875324, 31.48362527 ], [ 115.0985529, 31.48307505 ], [ 115.0984629, 31.482905 ], [ 115.09843284, 31.48286499 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228759", "Name": "福田大道", "pyname": "ftdd", "kind": "0201", "width": "55", "length": "0.012", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09843284, 31.48286499 ], [ 115.09836282, 31.48277499 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228760", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.102", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1162874, 31.50185022 ], [ 115.11615744, 31.50172022 ], [ 115.11594738, 31.50149013 ], [ 115.11559728, 31.50115002 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228761", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "2.140", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11559728, 31.50115002 ], [ 115.1154972, 31.50104999 ], [ 115.11498708, 31.50054986 ], [ 115.11458694, 31.50014972 ], [ 115.11442692, 31.49999969 ], [ 115.11431694, 31.49986964 ], [ 115.11362664, 31.49919941 ], [ 115.11297648, 31.49855924 ], [ 115.1126064, 31.4981991 ], [ 115.1123364, 31.49792901 ], [ 115.11213624, 31.49770896 ], [ 115.11192636, 31.4974589 ], [ 115.11160614, 31.49702883 ], [ 115.11094608, 31.49605868 ], [ 115.11064602, 31.49556863 ], [ 115.11044604, 31.4952786 ], [ 115.11015588, 31.49487855 ], [ 115.1100459, 31.49472852 ], [ 115.10979588, 31.49444844 ], [ 115.10945568, 31.49402837 ], [ 115.1089857, 31.49359821 ], [ 115.10839548, 31.49315798 ], [ 115.10813538, 31.49295791 ], [ 115.10761518, 31.49255772 ], [ 115.10677494, 31.49192741 ], [ 115.10550468, 31.49095698 ], [ 115.1045946, 31.49026682 ], [ 115.10402454, 31.48980678 ], [ 115.10374446, 31.48955672 ], [ 115.10322444, 31.48901663 ], [ 115.10292438, 31.48871657 ], [ 115.1025444, 31.4883765 ], [ 115.10232426, 31.48815645 ], [ 115.10217432, 31.48799643 ], [ 115.10195418, 31.48769633 ], [ 115.10154414, 31.48718621 ], [ 115.10116398, 31.48673607 ], [ 115.10102394, 31.48658604 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228762", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.288", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12611288, 31.50897584 ], [ 115.12605276, 31.50891576 ], [ 115.12569222, 31.50861525 ], [ 115.1250012, 31.5081243 ], [ 115.12426014, 31.50741335 ], [ 115.12395972, 31.50715307 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228763", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.588", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12395972, 31.50715307 ], [ 115.12324962, 31.5065628 ], [ 115.12243926, 31.50590256 ], [ 115.12175922, 31.50533232 ], [ 115.12136898, 31.50501219 ], [ 115.12075878, 31.50448196 ], [ 115.1202987, 31.50412182 ], [ 115.12008864, 31.50397175 ], [ 115.11963846, 31.50370157 ], [ 115.11939852, 31.50357147 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228764", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.926", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15080582, 31.54428657 ], [ 115.15053546, 31.54391622 ], [ 115.15016502, 31.54337573 ], [ 115.14875292, 31.54141377 ], [ 115.14811194, 31.54056291 ], [ 115.14777138, 31.54018244 ], [ 115.14754098, 31.53997206 ], [ 115.14719034, 31.53966156 ], [ 115.14700008, 31.53951126 ], [ 115.14671964, 31.53929085 ], [ 115.14649932, 31.53912053 ], [ 115.14621888, 31.53893009 ], [ 115.14576816, 31.53860942 ], [ 115.14530736, 31.53827871 ], [ 115.14470634, 31.53787781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228765", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1580429, 31.60642482 ], [ 115.1580528, 31.60627484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228766", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.145", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15807368, 31.60211535 ], [ 115.15807386, 31.60196537 ], [ 115.15805388, 31.60141542 ], [ 115.15809402, 31.60081557 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228767", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15809402, 31.60081557 ], [ 115.1581041, 31.60059561 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228768", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.136", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1581041, 31.60059561 ], [ 115.15811418, 31.60046565 ], [ 115.15825458, 31.60008594 ], [ 115.15836474, 31.59987615 ], [ 115.1585352, 31.59956651 ], [ 115.1586054, 31.59945666 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228769", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.413", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1586054, 31.59945666 ], [ 115.15864536, 31.59939672 ], [ 115.15877568, 31.59920696 ], [ 115.1590464, 31.59876749 ], [ 115.1594172, 31.5981482 ], [ 115.15946724, 31.5980483 ], [ 115.15953744, 31.59787847 ], [ 115.15959756, 31.59767858 ], [ 115.15961772, 31.59749862 ], [ 115.15959774, 31.59732861 ], [ 115.15957758, 31.59721863 ], [ 115.15940748, 31.59667841 ], [ 115.15918716, 31.59614813 ], [ 115.15912704, 31.59599801 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228770", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.437", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15912704, 31.59599801 ], [ 115.15907718, 31.59572796 ], [ 115.15904712, 31.59555795 ], [ 115.15904712, 31.59551795 ], [ 115.1590671, 31.59534803 ], [ 115.15921758, 31.59491832 ], [ 115.15937796, 31.59454865 ], [ 115.1594181, 31.59440874 ], [ 115.15946814, 31.59421884 ], [ 115.1594883, 31.59407894 ], [ 115.1594982, 31.59388895 ], [ 115.1594784, 31.593569 ], [ 115.15942836, 31.59272903 ], [ 115.15936842, 31.59215901 ], [ 115.15936842, 31.592129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228771", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.273", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15936842, 31.592129 ], [ 115.15932846, 31.59166901 ], [ 115.15930866, 31.59119903 ], [ 115.15933872, 31.59104909 ], [ 115.15944888, 31.59070934 ], [ 115.15960926, 31.59029966 ], [ 115.15986, 31.58975016 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228772", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.203", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16030136, 31.58698131 ], [ 115.16032152, 31.58678138 ], [ 115.16039172, 31.58619161 ], [ 115.16039172, 31.58597165 ], [ 115.16034168, 31.58579156 ], [ 115.16029164, 31.58566151 ], [ 115.16015142, 31.58543129 ], [ 115.1600112, 31.58523108 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228773", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.983", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1596206, 31.58471052 ], [ 115.15947048, 31.5844803 ], [ 115.1593803, 31.58426016 ], [ 115.15931028, 31.58401005 ], [ 115.15926006, 31.58373996 ], [ 115.15924008, 31.58347991 ], [ 115.15923, 31.58333987 ], [ 115.15916988, 31.5822897 ], [ 115.15911966, 31.58192957 ], [ 115.1590896, 31.58178953 ], [ 115.15906962, 31.58168949 ], [ 115.15905954, 31.58165948 ], [ 115.1590095, 31.58149937 ], [ 115.1589393, 31.58131923 ], [ 115.15867884, 31.58076875 ], [ 115.1583282, 31.58002809 ], [ 115.15805766, 31.57949759 ], [ 115.15779702, 31.5789971 ], [ 115.15738626, 31.57811636 ], [ 115.1572158, 31.57772603 ], [ 115.15678506, 31.57686522 ], [ 115.1565345, 31.57634475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228774", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.248", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1565345, 31.57634475 ], [ 115.1563041, 31.57586433 ], [ 115.15619376, 31.57558412 ], [ 115.15604346, 31.57531385 ], [ 115.15580298, 31.57488342 ], [ 115.1557029, 31.57466324 ], [ 115.15566276, 31.57453314 ], [ 115.15565268, 31.5744431 ], [ 115.15565268, 31.57433312 ], [ 115.15566276, 31.57426314 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228775", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.033", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15986, 31.58975016 ], [ 115.1598699, 31.58973018 ], [ 115.15997016, 31.5894704 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228776", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.279", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15997016, 31.5894704 ], [ 115.16007042, 31.5892206 ], [ 115.16014062, 31.58864082 ], [ 115.16024106, 31.58762112 ], [ 115.16030136, 31.58698131 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228777", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.518", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14470634, 31.53787781 ], [ 115.1445861, 31.53778763 ], [ 115.14386502, 31.53725654 ], [ 115.14307356, 31.53669534 ], [ 115.1424126, 31.53620435 ], [ 115.14174138, 31.53575331 ], [ 115.14096018, 31.53517214 ], [ 115.14051936, 31.53487149 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228778", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "3.237", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14051936, 31.53487149 ], [ 115.1400987, 31.53458084 ], [ 115.13965806, 31.53426017 ], [ 115.13909718, 31.53387938 ], [ 115.13885688, 31.53363908 ], [ 115.13873664, 31.53349895 ], [ 115.13857644, 31.5332987 ], [ 115.13807568, 31.53260808 ], [ 115.13787534, 31.5323078 ], [ 115.13754504, 31.53186738 ], [ 115.13705418, 31.53115674 ], [ 115.1363232, 31.53014577 ], [ 115.13597274, 31.52968533 ], [ 115.13560212, 31.52919483 ], [ 115.13535174, 31.5286745 ], [ 115.13508138, 31.52811411 ], [ 115.13470086, 31.52744361 ], [ 115.1342802, 31.52679309 ], [ 115.13362932, 31.52568222 ], [ 115.13312856, 31.52479158 ], [ 115.13277828, 31.52420123 ], [ 115.13192742, 31.52274035 ], [ 115.13168712, 31.52234012 ], [ 115.13138688, 31.52185983 ], [ 115.13109654, 31.52133959 ], [ 115.1307963, 31.52083932 ], [ 115.13043594, 31.52020896 ], [ 115.12984536, 31.51921842 ], [ 115.12957518, 31.51878818 ], [ 115.1293851, 31.518468 ], [ 115.12917486, 31.51809779 ], [ 115.12908468, 31.51793772 ], [ 115.12904472, 31.5178277 ], [ 115.12900476, 31.51771767 ], [ 115.12896462, 31.51756764 ], [ 115.12890468, 31.51727766 ], [ 115.12882476, 31.51668771 ], [ 115.12865502, 31.51504791 ], [ 115.12852506, 31.51407803 ], [ 115.1283951, 31.51333805 ], [ 115.12832508, 31.51303803 ], [ 115.12819512, 31.51262795 ], [ 115.12797498, 31.51208777 ], [ 115.12785492, 31.5118377 ], [ 115.12742454, 31.51089734 ], [ 115.1269641, 31.50994694 ], [ 115.12687392, 31.50979682 ], [ 115.1268039, 31.50969674 ], [ 115.1266536, 31.50950652 ], [ 115.12646334, 31.50930627 ], [ 115.12637316, 31.50921618 ], [ 115.12611288, 31.50897584 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228779", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.064", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15566276, 31.57426314 ], [ 115.15566276, 31.5742131 ], [ 115.15569282, 31.57402316 ], [ 115.15577292, 31.57380329 ], [ 115.15581306, 31.57370334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228780", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.011", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1600112, 31.58523108 ], [ 115.15994118, 31.58515098 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228781", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.045", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09189614, 31.45748945 ], [ 115.09169634, 31.4573796 ], [ 115.09165638, 31.45735967 ], [ 115.09150662, 31.45725977 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228782", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.937", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09150662, 31.45725977 ], [ 115.09128684, 31.45709993 ], [ 115.09119684, 31.45702001 ], [ 115.0910271, 31.45687016 ], [ 115.0909173, 31.45674024 ], [ 115.09077744, 31.4565404 ], [ 115.09069752, 31.45638047 ], [ 115.09060752, 31.45613058 ], [ 115.0905177, 31.4557907 ], [ 115.09045776, 31.45550076 ], [ 115.09043778, 31.45532085 ], [ 115.09039782, 31.45506093 ], [ 115.09037784, 31.45473104 ], [ 115.09043796, 31.45395119 ], [ 115.09088814, 31.44909222 ], [ 115.09094826, 31.44862229 ], [ 115.09099812, 31.44833235 ], [ 115.09103808, 31.44814236 ], [ 115.09112808, 31.4478324 ], [ 115.09145784, 31.44692241 ], [ 115.09166772, 31.44630245 ], [ 115.09202754, 31.44523248 ], [ 115.09229736, 31.44443247 ], [ 115.09274718, 31.44318251 ], [ 115.09303698, 31.44232265 ], [ 115.09333704, 31.44146283 ], [ 115.093467, 31.44101283 ], [ 115.09351686, 31.44085281 ], [ 115.09364664, 31.44059271 ], [ 115.0936866, 31.4404727 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228783", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.504", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09425378, 31.46538686 ], [ 115.09416378, 31.4650769 ], [ 115.09403382, 31.46462699 ], [ 115.09399386, 31.46446701 ], [ 115.0938639, 31.46375709 ], [ 115.093764, 31.46315729 ], [ 115.09369416, 31.4625474 ], [ 115.09363422, 31.46188757 ], [ 115.0935543, 31.46089779 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228784", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.014", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0935543, 31.46089779 ], [ 115.0935444, 31.46076779 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228785", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.092", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15581306, 31.57370334 ], [ 115.1558631, 31.57358342 ], [ 115.1560233, 31.57325366 ], [ 115.15619358, 31.57294397 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228786", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "3.363", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15619358, 31.57294397 ], [ 115.15627386, 31.57279407 ], [ 115.15675464, 31.57196486 ], [ 115.15707522, 31.57143534 ], [ 115.15730562, 31.57104573 ], [ 115.15737564, 31.57091586 ], [ 115.15746582, 31.57074599 ], [ 115.15761612, 31.57038621 ], [ 115.1577063, 31.57016634 ], [ 115.15774626, 31.56999642 ], [ 115.15782654, 31.56974658 ], [ 115.15788666, 31.56943671 ], [ 115.15796694, 31.5688469 ], [ 115.15809726, 31.56754721 ], [ 115.15819752, 31.56681744 ], [ 115.1582076, 31.56648746 ], [ 115.1582076, 31.56618749 ], [ 115.15817754, 31.56600744 ], [ 115.1580573, 31.56566729 ], [ 115.15799718, 31.56551717 ], [ 115.15796712, 31.56548711 ], [ 115.15793706, 31.56541709 ], [ 115.15769676, 31.56505664 ], [ 115.15727592, 31.56444594 ], [ 115.15686516, 31.56388524 ], [ 115.15610376, 31.56283391 ], [ 115.1555526, 31.56206297 ], [ 115.1554023, 31.56180273 ], [ 115.1553222, 31.56164258 ], [ 115.15525218, 31.56148247 ], [ 115.15487148, 31.56058184 ], [ 115.15450086, 31.55964125 ], [ 115.15423032, 31.55900081 ], [ 115.15384962, 31.55809023 ], [ 115.15363938, 31.5576599 ], [ 115.15345902, 31.55714964 ], [ 115.15306842, 31.55620901 ], [ 115.15287816, 31.55569875 ], [ 115.15249746, 31.55477819 ], [ 115.15226724, 31.5542178 ], [ 115.15205682, 31.5537075 ], [ 115.15186656, 31.55316723 ], [ 115.15176648, 31.55265711 ], [ 115.1517564, 31.55254709 ], [ 115.1517564, 31.5522171 ], [ 115.15178664, 31.55145728 ], [ 115.15178664, 31.55079731 ], [ 115.15179672, 31.55063738 ], [ 115.1518068, 31.55028741 ], [ 115.15181688, 31.55018747 ], [ 115.15184694, 31.54918761 ], [ 115.1518671, 31.54880768 ], [ 115.1518572, 31.54838769 ], [ 115.15182714, 31.54796771 ], [ 115.15179708, 31.54769766 ], [ 115.15167702, 31.54713755 ], [ 115.15160682, 31.54662747 ], [ 115.15158684, 31.54632746 ], [ 115.15154688, 31.54604742 ], [ 115.15149684, 31.54583741 ], [ 115.15142664, 31.54561731 ], [ 115.15134672, 31.54532724 ], [ 115.15127652, 31.54514715 ], [ 115.15118652, 31.54491707 ], [ 115.15108626, 31.54471695 ], [ 115.1509662, 31.54451679 ], [ 115.150896, 31.54440672 ], [ 115.15080582, 31.54428657 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228787", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.023", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15994118, 31.58515098 ], [ 115.15981104, 31.58498079 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228788", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15981104, 31.58498079 ], [ 115.15973076, 31.58487068 ], [ 115.1596206, 31.58471052 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228789", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1580528, 31.60627484 ], [ 115.15806288, 31.60613484 ], [ 115.15806288, 31.60601483 ], [ 115.1580429, 31.60578479 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.228790", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.408", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1580429, 31.60578479 ], [ 115.15803282, 31.60561478 ], [ 115.158033, 31.6053648 ], [ 115.15805316, 31.60477494 ], [ 115.15804326, 31.604225 ], [ 115.15805352, 31.60309518 ], [ 115.15807368, 31.60211535 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.232994", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01623782, 31.17596135 ], [ 115.0161381, 31.17578171 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.232995", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0161381, 31.17578171 ], [ 115.01606826, 31.17566196 ], [ 115.01603838, 31.17561206 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233053", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.913", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04417166, 31.24957388 ], [ 115.04416176, 31.24953392 ], [ 115.04405196, 31.24930424 ], [ 115.04382264, 31.2489149 ], [ 115.0433739, 31.24816614 ], [ 115.04308464, 31.24775691 ], [ 115.04272554, 31.24718789 ], [ 115.04232666, 31.24656896 ], [ 115.04196756, 31.24600992 ], [ 115.04189772, 31.24588014 ], [ 115.04158848, 31.245381 ], [ 115.04109978, 31.24459233 ], [ 115.0408206, 31.24415309 ], [ 115.04044152, 31.24353416 ], [ 115.0402221, 31.24323473 ], [ 115.04017224, 31.24315485 ], [ 115.04007252, 31.24298511 ], [ 115.03965366, 31.24233626 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233054", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.220", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03965366, 31.24233626 ], [ 115.03896552, 31.24118817 ], [ 115.03860642, 31.2405692 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233055", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.250", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03860642, 31.2405692 ], [ 115.03815768, 31.23976046 ], [ 115.03762902, 31.23872199 ], [ 115.0375194, 31.23852233 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233066", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.794", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03538658, 31.23361013 ], [ 115.03512756, 31.23298112 ], [ 115.03470888, 31.23192272 ], [ 115.03444986, 31.23132368 ], [ 115.03402128, 31.23029529 ], [ 115.03378224, 31.2297462 ], [ 115.03365264, 31.22941671 ], [ 115.03332378, 31.22864793 ], [ 115.03298484, 31.22788919 ], [ 115.03283544, 31.22750975 ], [ 115.03257642, 31.22689073 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233067", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.534", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83927262, 31.08806343 ], [ 114.83892198, 31.08789288 ], [ 114.83833086, 31.08764196 ], [ 114.83798022, 31.08748145 ], [ 114.83744904, 31.08723062 ], [ 114.83592624, 31.08650832 ], [ 114.83451342, 31.0858362 ], [ 114.83434314, 31.08575597 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233068", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.83434314, 31.08575597 ], [ 114.8340726, 31.08562556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233069", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.359", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85640556, 31.09672917 ], [ 114.85611504, 31.09650876 ], [ 114.85534356, 31.09596768 ], [ 114.85473246, 31.09556682 ], [ 114.85430154, 31.0952862 ], [ 114.85377054, 31.09496544 ], [ 114.85340982, 31.09476488 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233070", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85340982, 31.09476488 ], [ 114.85316934, 31.09463456 ], [ 114.85216746, 31.09410306 ], [ 114.85151622, 31.09381205 ], [ 114.85135602, 31.0937418 ], [ 114.85113552, 31.09362147 ], [ 114.85078488, 31.09343094 ], [ 114.85050426, 31.09327056 ], [ 114.85023372, 31.09315014 ], [ 114.84955242, 31.09284909 ], [ 114.84886104, 31.09253801 ], [ 114.84794934, 31.09210664 ], [ 114.84711774, 31.09172535 ], [ 114.84629622, 31.09134411 ], [ 114.84538434, 31.09091274 ], [ 114.84462294, 31.09055157 ], [ 114.84408186, 31.09029075 ], [ 114.84377136, 31.09016025 ], [ 114.84316008, 31.08986933 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233071", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.487", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8698755, 31.10877122 ], [ 114.8668425, 31.10625945 ], [ 114.8662215, 31.10569893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233072", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.145", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84060516, 31.08869546 ], [ 114.83998398, 31.08840449 ], [ 114.83927262, 31.08806343 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233359", "Name": null, "pyname": null, "kind": "0200", "width": "55", "length": "0.038", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01935668, 31.18124988 ], [ 115.01936658, 31.18128984 ], [ 115.01939646, 31.18131972 ], [ 115.01943624, 31.18136963 ], [ 115.0194762, 31.18139946 ], [ 115.01955594, 31.18141922 ], [ 115.01965548, 31.18143893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233360", "Name": null, "pyname": null, "kind": "0200", "width": "55", "length": "0.055", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01965548, 31.18143893 ], [ 115.01968536, 31.18143884 ], [ 115.0197552, 31.18141863 ], [ 115.01979498, 31.18139856 ], [ 115.01984484, 31.18136841 ], [ 115.01986482, 31.18133835 ], [ 115.0198947, 31.18130829 ], [ 115.01992458, 31.18124822 ], [ 115.01993448, 31.18115826 ], [ 115.01992458, 31.18110831 ], [ 115.01992458, 31.1810783 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233361", "Name": null, "pyname": null, "kind": "0200", "width": "55", "length": "0.052", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01992458, 31.1810783 ], [ 115.0199145, 31.18105836 ], [ 115.0198947, 31.1810184 ], [ 115.01987472, 31.18099851 ], [ 115.01984484, 31.18096859 ], [ 115.01981496, 31.18093871 ], [ 115.0197552, 31.18091886 ], [ 115.01971524, 31.18090901 ], [ 115.01965548, 31.1808992 ], [ 115.01959572, 31.18089933 ], [ 115.01953596, 31.1809095 ], [ 115.0194861, 31.18092966 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233362", "Name": null, "pyname": null, "kind": "0200", "width": "55", "length": "0.040", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0194861, 31.18092966 ], [ 115.01943624, 31.1809698 ], [ 115.01939646, 31.18099991 ], [ 115.01938656, 31.18102992 ], [ 115.01936658, 31.18107992 ], [ 115.01935668, 31.18112996 ], [ 115.0193466, 31.18116996 ], [ 115.01935668, 31.18124988 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233363", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.063", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.005258, 31.17338492 ], [ 115.00493922, 31.17337587 ], [ 115.00460046, 31.17335688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233364", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00522812, 31.17319511 ], [ 115.00500888, 31.17319578 ], [ 115.00466022, 31.17317684 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233365", "Name": "西环路", "pyname": "xhl", "kind": "0204", "width": "55", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.005258, 31.17338492 ], [ 115.00522812, 31.17319511 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233366", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.183", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00714098, 31.17326936 ], [ 115.00684218, 31.17325028 ], [ 115.00641378, 31.17324155 ], [ 115.00522812, 31.17319511 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233367", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.116", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04417166, 31.24957388 ], [ 115.04442096, 31.25000318 ], [ 115.04459052, 31.25022273 ], [ 115.04481012, 31.25046218 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233368", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.236", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04481012, 31.25046218 ], [ 115.04510928, 31.25077146 ], [ 115.0465356, 31.25197805 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233396", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.130", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00006734, 31.17247106 ], [ 114.99977826, 31.17241197 ], [ 114.9992901, 31.1723235 ], [ 114.99875208, 31.17219521 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233397", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.132", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.000137, 31.17230091 ], [ 115.00003746, 31.17228125 ], [ 114.99880194, 31.17199518 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233398", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00214958, 31.1729045 ], [ 115.00194042, 31.17285513 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233399", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00194042, 31.17285513 ], [ 115.00167132, 31.172796 ], [ 115.00152192, 31.17276644 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233400", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00221942, 31.17271437 ], [ 115.00200018, 31.17266505 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233401", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.022", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00152192, 31.17276644 ], [ 115.00157178, 31.1725764 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233402", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00460046, 31.17335688 ], [ 115.00423182, 31.173318 ], [ 115.00404246, 31.17327863 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233403", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.186", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00404246, 31.17327863 ], [ 115.00375356, 31.1732195 ], [ 115.00352442, 31.17318021 ], [ 115.00214958, 31.1729045 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233404", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00466022, 31.17317684 ], [ 115.00409232, 31.17308859 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233405", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.184", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00409232, 31.17308859 ], [ 115.00381332, 31.17304944 ], [ 115.00274736, 31.17282273 ], [ 115.00221942, 31.17271437 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233406", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.022", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00404246, 31.17327863 ], [ 115.00409232, 31.17308859 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233407", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.021", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00714098, 31.17326936 ], [ 115.0071111, 31.17345935 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233408", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00801776, 31.17348662 ], [ 115.00787826, 31.17347703 ], [ 115.00746984, 31.17346826 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233409", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00746984, 31.17346826 ], [ 115.0071111, 31.17345935 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233410", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00800786, 31.17327678 ], [ 115.00779852, 31.1732874 ], [ 115.00745994, 31.1732784 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233411", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00745994, 31.1732784 ], [ 115.00714098, 31.17326936 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233412", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00846614, 31.17348527 ], [ 115.00801776, 31.17348662 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233413", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.044", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00846614, 31.17329541 ], [ 115.00819704, 31.17328619 ], [ 115.00800786, 31.17327678 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233414", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0107975, 31.17334842 ], [ 115.0105185, 31.17333924 ], [ 115.01004024, 31.1733207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233415", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01075754, 31.17355839 ], [ 115.01072766, 31.17354849 ], [ 115.01005014, 31.17353054 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233416", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01005014, 31.17353054 ], [ 115.009821, 31.17352122 ], [ 115.0096815, 31.17352163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233417", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01004024, 31.1733207 ], [ 115.00991082, 31.17332106 ], [ 115.00970148, 31.17332169 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233418", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.128", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01213256, 31.17337448 ], [ 115.0115148, 31.17336629 ], [ 115.0107975, 31.17334842 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233419", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.133", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01214246, 31.17360434 ], [ 115.01167428, 31.1735957 ], [ 115.01075754, 31.17355839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233420", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.024", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0107975, 31.17334842 ], [ 115.01075754, 31.17355839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.233421", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01518158, 31.17432515 ], [ 115.01509176, 31.17416549 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234483", "Name": "浮桥河大桥", "pyname": "fqhdq", "kind": "0208", "width": "55", "length": "0.287", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90856956, 31.14278204 ], [ 114.9078204, 31.14249287 ], [ 114.90700086, 31.14219321 ], [ 114.90613092, 31.1418734 ], [ 114.90581088, 31.14175343 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234484", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90300126, 31.140644 ], [ 114.90291126, 31.14055404 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234485", "Name": "车站路", "pyname": "czl", "kind": "0204", "width": "130", "length": "0.019", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9553224, 31.16496348 ], [ 114.9553224, 31.16479347 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234486", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.010", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98972544, 31.16881454 ], [ 114.98982516, 31.16884424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234526", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.146", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96338874, 31.16448432 ], [ 114.96307968, 31.16450507 ], [ 114.96206268, 31.16456748 ], [ 114.96186324, 31.16457792 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234527", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.092", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9643458, 31.16423205 ], [ 114.96377754, 31.16426342 ], [ 114.96338856, 31.16428434 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234528", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.094", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96436578, 31.164422 ], [ 114.96379752, 31.16445336 ], [ 114.96338874, 31.16448432 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234529", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.380", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89807196, 31.13576627 ], [ 114.89788188, 31.1355464 ], [ 114.89723208, 31.13489669 ], [ 114.89708196, 31.13475674 ], [ 114.89666184, 31.13434674 ], [ 114.8962617, 31.1339268 ], [ 114.8959917, 31.13368682 ], [ 114.89549148, 31.1331569 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234530", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.047", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95581092, 31.16476233 ], [ 114.9553224, 31.16479347 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234531", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95553156, 31.16421306 ], [ 114.95551176, 31.16441309 ], [ 114.95553174, 31.16449305 ], [ 114.95557152, 31.16457293 ], [ 114.95565144, 31.16464272 ], [ 114.95581092, 31.16476233 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234532", "Name": null, "pyname": null, "kind": "0202|0204", "width": "55", "length": "0.023", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96176334, 31.1643882 ], [ 114.96186324, 31.16457792 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234533", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.094", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96338856, 31.16428434 ], [ 114.96304962, 31.16429514 ], [ 114.96241152, 31.16433668 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234534", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.065", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96241152, 31.16433668 ], [ 114.96214224, 31.16424731 ], [ 114.96208248, 31.16421747 ], [ 114.96203262, 31.16415758 ], [ 114.9619527, 31.16396781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234535", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.068", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96176334, 31.1643882 ], [ 114.9611751, 31.16441961 ], [ 114.96105558, 31.16442987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234536", "Name": "西陵一路", "pyname": "xlyl", "kind": "0212", "width": "30", "length": "0.096", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96185298, 31.16394806 ], [ 114.96167352, 31.16411847 ], [ 114.96153402, 31.16425878 ], [ 114.96144438, 31.16430896 ], [ 114.96134466, 31.16434919 ], [ 114.96105558, 31.16442987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234537", "Name": "西陵二路", "pyname": "xlel", "kind": "0204", "width": "55", "length": "0.022", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97091652, 31.16382647 ], [ 114.97088664, 31.16402649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234538", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.035", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97128534, 31.16380559 ], [ 114.97091652, 31.16382647 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234539", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.058", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97102596, 31.16334627 ], [ 114.9710859, 31.16354612 ], [ 114.97112586, 31.163616 ], [ 114.97118562, 31.16368584 ], [ 114.97128534, 31.16380559 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234540", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.038", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97091652, 31.16382647 ], [ 114.97051764, 31.16385743 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234541", "Name": "西陵二路", "pyname": "xlel", "kind": "0212", "width": "30", "length": "0.075", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97051764, 31.16385743 ], [ 114.97066722, 31.1637371 ], [ 114.97074696, 31.16367689 ], [ 114.9708267, 31.16357672 ], [ 114.97102596, 31.16334627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234542", "Name": "金通大道", "pyname": "jtdd", "kind": "0204", "width": "130", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98196258, 31.16660769 ], [ 114.98201244, 31.16639768 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234543", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.049", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98201244, 31.16639768 ], [ 114.98249088, 31.16654627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234557", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.199", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98249088, 31.16654627 ], [ 114.98291928, 31.16666502 ], [ 114.98446404, 31.16711048 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234558", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98216202, 31.16593751 ], [ 114.98223168, 31.16614721 ], [ 114.98226174, 31.16621709 ], [ 114.98231142, 31.16632689 ], [ 114.98238126, 31.16643665 ], [ 114.98249088, 31.16654627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234559", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.047", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98196258, 31.16660769 ], [ 114.98214204, 31.16665719 ], [ 114.98243094, 31.16673635 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234560", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.195", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98243094, 31.16673635 ], [ 114.98333796, 31.16699366 ], [ 114.98436432, 31.16729066 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234561", "Name": "金通大道", "pyname": "jtdd", "kind": "0212", "width": "30", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98243094, 31.16673635 ], [ 114.98228154, 31.16675673 ], [ 114.98222178, 31.1667669 ], [ 114.98215194, 31.16678706 ], [ 114.9820722, 31.16682729 ], [ 114.98190282, 31.16694771 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234562", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.067", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98130486, 31.16639966 ], [ 114.98196258, 31.16660769 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234563", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.085", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98190282, 31.16694771 ], [ 114.9818031, 31.16679804 ], [ 114.98175324, 31.1667282 ], [ 114.9816438, 31.16661858 ], [ 114.98157396, 31.16656881 ], [ 114.98130486, 31.16639966 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234564", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.069", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98132484, 31.16620967 ], [ 114.98201244, 31.16639768 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234565", "Name": "金通大道", "pyname": "jtdd", "kind": "0212", "width": "30", "length": "0.090", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98132484, 31.16620967 ], [ 114.98156406, 31.16621903 ], [ 114.98167368, 31.16620872 ], [ 114.9817932, 31.16618838 ], [ 114.98187294, 31.16615819 ], [ 114.98195268, 31.16610797 ], [ 114.98216202, 31.16593751 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234566", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.235", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9553224, 31.16496348 ], [ 114.95486376, 31.16497455 ], [ 114.95451474, 31.1649854 ], [ 114.95420568, 31.16496614 ], [ 114.95398626, 31.16494665 ], [ 114.95338812, 31.16486808 ], [ 114.95324844, 31.16483843 ], [ 114.95294928, 31.16476913 ], [ 114.95288952, 31.16475927 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234567", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.225", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9553224, 31.16479347 ], [ 114.954804, 31.1648247 ], [ 114.95453472, 31.16482538 ], [ 114.95410596, 31.16480639 ], [ 114.95365722, 31.16475747 ], [ 114.95324844, 31.16467845 ], [ 114.95298906, 31.16461905 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234568", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.066", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95288952, 31.16475927 ], [ 114.95252052, 31.1646402 ], [ 114.95224134, 31.16455088 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234598", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.230", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89357106, 31.13126703 ], [ 114.89201064, 31.12968717 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234599", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.135", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89549148, 31.1331569 ], [ 114.8953815, 31.13303688 ], [ 114.89536152, 31.1330169 ], [ 114.8945913, 31.13225694 ], [ 114.89457132, 31.13223696 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234600", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.144", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89457132, 31.13223696 ], [ 114.89370102, 31.13139699 ], [ 114.89357106, 31.13126703 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234601", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.352", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91192566, 31.14409851 ], [ 114.91009776, 31.14340043 ], [ 114.90856956, 31.14278204 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234602", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.033", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87142692, 31.11004206 ], [ 114.87116682, 31.1098419 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234603", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.171", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87116682, 31.1098419 ], [ 114.87101652, 31.10972184 ], [ 114.8698755, 31.10877122 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234604", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.320", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9002217, 31.13798526 ], [ 114.89991174, 31.13767539 ], [ 114.89943168, 31.13717562 ], [ 114.8991318, 31.13685576 ], [ 114.89887188, 31.1365859 ], [ 114.89857182, 31.13628602 ], [ 114.89807196, 31.13576627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234605", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.194", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89201064, 31.12968717 ], [ 114.89133042, 31.12899723 ], [ 114.89067018, 31.12836728 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.234606", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90046164, 31.13822511 ], [ 114.9002217, 31.13798526 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235532", "Name": "闵五路", "pyname": "mwl", "kind": "0204", "width": "55", "length": "0.017", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99395994, 31.17012093 ], [ 114.99398982, 31.1699709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235533", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.061", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99398982, 31.1699709 ], [ 114.99452784, 31.17025913 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235534", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.017", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99452784, 31.17025913 ], [ 114.99467724, 31.17033864 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235535", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.085", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99408954, 31.1696208 ], [ 114.99413922, 31.16982056 ], [ 114.9941691, 31.16990039 ], [ 114.99419898, 31.16996028 ], [ 114.99424884, 31.17002009 ], [ 114.9943185, 31.17009983 ], [ 114.99452784, 31.17025913 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235536", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.055", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99348168, 31.16974257 ], [ 114.99398982, 31.1699709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235537", "Name": "闵五路", "pyname": "mwl", "kind": "0212", "width": "30", "length": "0.067", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99408954, 31.1696208 ], [ 114.9940098, 31.16972097 ], [ 114.99396984, 31.16975108 ], [ 114.99390018, 31.16978127 ], [ 114.99383034, 31.16980148 ], [ 114.99377058, 31.16980166 ], [ 114.99370092, 31.16979189 ], [ 114.99348168, 31.16974257 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235538", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.059", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99342192, 31.16986272 ], [ 114.99395994, 31.17012093 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235539", "Name": "金桥大道", "pyname": "jqdd", "kind": "0212", "width": "30", "length": "0.104", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99342192, 31.16986272 ], [ 114.9935913, 31.17004209 ], [ 114.99372072, 31.17025161 ], [ 114.9937605, 31.17035142 ], [ 114.99380046, 31.17050123 ], [ 114.99385014, 31.17070098 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235540", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.058", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99395994, 31.17012093 ], [ 114.99447798, 31.17039921 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235541", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.023", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99447798, 31.17039921 ], [ 114.99467724, 31.17050852 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.235542", "Name": "闵五路", "pyname": "mwl", "kind": "0212", "width": "30", "length": "0.073", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99385014, 31.17070098 ], [ 114.99394986, 31.17057071 ], [ 114.9940395, 31.17050051 ], [ 114.9941691, 31.17044012 ], [ 114.9943185, 31.17039971 ], [ 114.99447798, 31.17039921 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236071", "Name": "严家畈桥", "pyname": "yjfq", "kind": "0208", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08300054, 31.391771 ], [ 115.08297048, 31.39161102 ], [ 115.08270066, 31.39043139 ], [ 115.08268068, 31.39034144 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236072", "Name": "麒龙大道", "pyname": "qldd", "kind": "0201", "width": "55", "length": "0.189", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07283324, 31.38319215 ], [ 115.0726734, 31.38255243 ], [ 115.0726635, 31.38253241 ], [ 115.0725735, 31.38218258 ], [ 115.0725636, 31.38211265 ], [ 115.07249394, 31.38161306 ], [ 115.07248404, 31.38152315 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236100", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.058", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05638772, 31.35159711 ], [ 115.05631806, 31.35139731 ], [ 115.05620826, 31.35109761 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236602", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.703", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04897442, 31.2795693 ], [ 115.04913426, 31.27905923 ], [ 115.0494336, 31.27844894 ], [ 115.05040182, 31.27663805 ], [ 115.05072132, 31.27566785 ], [ 115.05099096, 31.27353827 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236603", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.034", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05061476, 31.25518812 ], [ 115.05035556, 31.25497878 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236604", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.007", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05280806, 31.2580116 ], [ 115.05279798, 31.25795166 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236605", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.381", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05279798, 31.25795166 ], [ 115.05262878, 31.25723252 ], [ 115.05201066, 31.25638436 ], [ 115.05162186, 31.25598543 ], [ 115.05061476, 31.25518812 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236606", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.550", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04176812, 31.3305251 ], [ 115.04146914, 31.32845663 ], [ 115.04136942, 31.32771719 ], [ 115.0411104, 31.32672818 ], [ 115.04091096, 31.32622886 ], [ 115.04075148, 31.32593937 ], [ 115.040592, 31.32571982 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236607", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.312", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04404116, 31.33527804 ], [ 115.0440012, 31.33521815 ], [ 115.04366226, 31.33469903 ], [ 115.04327328, 31.33410008 ], [ 115.04278476, 31.33333152 ], [ 115.0427151, 31.33320174 ], [ 115.0426053, 31.33303209 ], [ 115.04248578, 31.33281245 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236608", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.265", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04248578, 31.33281245 ], [ 115.0422066, 31.33232334 ], [ 115.04199726, 31.33180404 ], [ 115.04186766, 31.33124456 ], [ 115.04176812, 31.3305251 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236609", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.445", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.040592, 31.32571982 ], [ 115.0403328, 31.32535059 ], [ 115.03998378, 31.32486162 ], [ 115.03932624, 31.32395384 ], [ 115.03908702, 31.32363465 ], [ 115.03894752, 31.32342513 ], [ 115.03857888, 31.32293639 ], [ 115.03830996, 31.32256725 ], [ 115.0381305, 31.32231786 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236610", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.166", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0381305, 31.32231786 ], [ 115.03795122, 31.32197852 ], [ 115.0378317, 31.32169898 ], [ 115.03743336, 31.32071055 ], [ 115.03699506, 31.31957228 ], [ 115.0367859, 31.31895312 ], [ 115.03669626, 31.31861355 ], [ 115.0366365, 31.31838383 ], [ 115.03653696, 31.31802428 ], [ 115.0364871, 31.31778452 ], [ 115.03636758, 31.31717513 ], [ 115.03625814, 31.31657568 ], [ 115.03623834, 31.31640585 ], [ 115.03620846, 31.31633597 ], [ 115.0361685, 31.31616614 ], [ 115.0361487, 31.31605625 ], [ 115.03612872, 31.31592638 ], [ 115.03609884, 31.31559662 ], [ 115.03608894, 31.3154267 ], [ 115.03606914, 31.31516687 ], [ 115.03604916, 31.31492706 ], [ 115.03606932, 31.31457719 ], [ 115.03623888, 31.31392703 ], [ 115.03631862, 31.31367692 ], [ 115.03640844, 31.31335683 ], [ 115.0364781, 31.31312675 ], [ 115.03650816, 31.31307671 ], [ 115.03680714, 31.31252613 ], [ 115.03695672, 31.3122159 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236838", "Name": "白塔河桥", "pyname": "bthq", "kind": "0208", "width": "55", "length": "0.379", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05035556, 31.25497878 ], [ 115.04936826, 31.25419137 ], [ 115.04741328, 31.25268594 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.236839", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.115", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04741328, 31.25268594 ], [ 115.04708424, 31.25244672 ], [ 115.0465356, 31.25197805 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237523", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.464", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78140964, 31.05565637 ], [ 114.7807197, 31.0549167 ], [ 114.78025962, 31.05442692 ], [ 114.77977974, 31.05388719 ], [ 114.7791996, 31.05327749 ], [ 114.77887974, 31.05293765 ], [ 114.77860974, 31.05263777 ], [ 114.7783797, 31.05238788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237586", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.179", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77356902, 31.0471997 ], [ 114.77285838, 31.04644955 ], [ 114.77236806, 31.04595941 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237587", "Name": "刘杰士大桥", "pyname": "ljsdq", "kind": "0208", "width": "55", "length": "0.347", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77581974, 31.04964918 ], [ 114.77579958, 31.04961917 ], [ 114.77528964, 31.04909942 ], [ 114.77480958, 31.04861963 ], [ 114.7743396, 31.0480898 ], [ 114.7739292, 31.04758976 ], [ 114.7736691, 31.04729969 ], [ 114.77356902, 31.0471997 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237599", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.273", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79111308, 31.06584446 ], [ 114.79082256, 31.06559421 ], [ 114.7905423, 31.06526405 ], [ 114.79037202, 31.06504391 ], [ 114.78931038, 31.06393313 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237600", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.221", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78931038, 31.06393313 ], [ 114.78900006, 31.06360287 ], [ 114.78864978, 31.06319297 ], [ 114.78814992, 31.06268321 ], [ 114.78783978, 31.06239332 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237601", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.288", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79299588, 31.06787589 ], [ 114.7922046, 31.06701527 ], [ 114.7912533, 31.06598459 ], [ 114.79111308, 31.06584446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237602", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.279", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79542984, 31.07060775 ], [ 114.79397742, 31.06897664 ], [ 114.79364694, 31.06860638 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237603", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.102", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79364694, 31.06860638 ], [ 114.79308588, 31.06797593 ], [ 114.79299588, 31.06787589 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237626", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74843796, 31.01529627 ], [ 114.74836758, 31.01489618 ], [ 114.74831736, 31.01448614 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237627", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74831736, 31.01448614 ], [ 114.74825724, 31.0139762 ], [ 114.74820684, 31.01341626 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237628", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.413", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74796618, 31.01027724 ], [ 114.7480263, 31.00993745 ], [ 114.74818632, 31.00914792 ], [ 114.7482864, 31.00859829 ], [ 114.74840646, 31.00795866 ], [ 114.74856648, 31.0072991 ], [ 114.74876664, 31.00661951 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237629", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78209976, 31.05638604 ], [ 114.78157974, 31.05583628 ], [ 114.78140964, 31.05565637 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237631", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.075", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80362344, 31.07361812 ], [ 114.80286204, 31.07343686 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.237632", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.244", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75115164, 31.03196148 ], [ 114.7511016, 31.03182149 ], [ 114.75080118, 31.03099164 ], [ 114.75064116, 31.03047176 ], [ 114.75047088, 31.02984194 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.238234", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.585", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75318798, 30.99735549 ], [ 114.75305784, 30.99783519 ], [ 114.75296784, 30.99810506 ], [ 114.75276786, 30.99863471 ], [ 114.7526478, 30.99890453 ], [ 114.75251766, 30.99916436 ], [ 114.75237762, 30.99945416 ], [ 114.7522077, 30.999744 ], [ 114.75210762, 30.99994385 ], [ 114.75207756, 31.00000383 ], [ 114.75205758, 31.00004379 ], [ 114.7518675, 31.00042355 ], [ 114.75174744, 31.0006634 ], [ 114.75154746, 31.00102313 ], [ 114.7509873, 31.00212243 ], [ 114.75091728, 31.00224236 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.238240", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.753254281957581, 30.99703918912968 ], [ 114.75323802, 30.99718562 ], [ 114.75320796, 30.99727557 ], [ 114.75318798, 30.99735549 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248731", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90291126, 31.14055404 ], [ 114.9027714, 31.14044411 ], [ 114.90249132, 31.14015422 ], [ 114.9024114, 31.14007425 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248732", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.277", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9024114, 31.14007425 ], [ 114.90234138, 31.14000428 ], [ 114.90182136, 31.13951454 ], [ 114.90140142, 31.13912471 ], [ 114.9008616, 31.13861495 ], [ 114.90058152, 31.13834508 ], [ 114.90046164, 31.13822511 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248733", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.223", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90581088, 31.14175343 ], [ 114.90470118, 31.1414436 ], [ 114.90363126, 31.14103383 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248734", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90363126, 31.14103383 ], [ 114.90344118, 31.14095387 ], [ 114.90300126, 31.140644 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248735", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.438", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92172432, 31.14742842 ], [ 114.9178986, 31.14614237 ], [ 114.91743924, 31.14600282 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248736", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.251", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9241914, 31.14820593 ], [ 114.9237819, 31.14805635 ], [ 114.9223536, 31.14763781 ], [ 114.92172432, 31.14742842 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248737", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.015", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95224134, 31.16455088 ], [ 114.95209176, 31.16450124 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248738", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.086", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95298906, 31.16461905 ], [ 114.95269008, 31.1645498 ], [ 114.95248056, 31.16449031 ], [ 114.95233098, 31.16444067 ], [ 114.95214162, 31.16437115 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248739", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.021", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9643458, 31.16423205 ], [ 114.96436578, 31.164422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248740", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.092", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96533292, 31.16435972 ], [ 114.96436578, 31.164422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248741", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.020", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9681447, 31.16400305 ], [ 114.9681546, 31.164183 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248750", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.331", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03101186, 31.22311667 ], [ 115.03099206, 31.22306676 ], [ 115.03060344, 31.2221682 ], [ 115.0302546, 31.22135951 ], [ 115.0301151, 31.22097008 ], [ 115.02988596, 31.2204609 ], [ 115.02979632, 31.22033121 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248751", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.042", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03115136, 31.22347613 ], [ 115.03101186, 31.22311667 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248763", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.234", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74876664, 31.00661951 ], [ 114.74885664, 31.00632966 ], [ 114.7490667, 31.00577004 ], [ 114.74926668, 31.00536032 ], [ 114.74943678, 31.00508051 ], [ 114.74963694, 31.00466075 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248764", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.295", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74963694, 31.00466075 ], [ 114.74975682, 31.00442094 ], [ 114.74999694, 31.00391127 ], [ 114.7506372, 31.00274204 ], [ 114.75091728, 31.00224236 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248765", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.259", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74820684, 31.01341626 ], [ 114.74819694, 31.01330628 ], [ 114.74813664, 31.01270639 ], [ 114.74810658, 31.01247639 ], [ 114.74808642, 31.01219645 ], [ 114.7479561, 31.01133663 ], [ 114.74793612, 31.01116671 ], [ 114.74793612, 31.01109674 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248766", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74793612, 31.01109674 ], [ 114.74792604, 31.01101682 ], [ 114.74792622, 31.01082692 ], [ 114.74793612, 31.01042714 ], [ 114.74796618, 31.01027724 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248767", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.498", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74928972, 31.02220445 ], [ 114.74924958, 31.02190452 ], [ 114.74917956, 31.02128474 ], [ 114.74903934, 31.0202451 ], [ 114.74895924, 31.01954535 ], [ 114.74885916, 31.01897552 ], [ 114.74879904, 31.01854568 ], [ 114.74870886, 31.01786586 ], [ 114.74869896, 31.01775588 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248768", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.205", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74869896, 31.01775588 ], [ 114.74861868, 31.01695614 ], [ 114.74854866, 31.01635629 ], [ 114.74854866, 31.01632632 ], [ 114.74850852, 31.01591637 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248769", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.069", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74850852, 31.01591637 ], [ 114.74843796, 31.01529627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248770", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.344", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74965008, 31.02528335 ], [ 114.74960004, 31.02492348 ], [ 114.74953992, 31.02436368 ], [ 114.74945982, 31.0237439 ], [ 114.7493898, 31.02315408 ], [ 114.74932968, 31.0225343 ], [ 114.74928972, 31.02220445 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248771", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.262", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7519422, 31.03422102 ], [ 114.75179208, 31.03377111 ], [ 114.75157194, 31.03315124 ], [ 114.75115164, 31.03196148 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248772", "Name": "G106", "pyname": "g106", "kind": "0204", "width": "55", "length": "0.009", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75047088, 31.02984194 ], [ 114.750441, 31.02976193 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248773", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.504", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.750441, 31.02976193 ], [ 114.75033084, 31.02938204 ], [ 114.75027072, 31.0291421 ], [ 114.75024066, 31.02899216 ], [ 114.75001044, 31.02791247 ], [ 114.74984034, 31.02713267 ], [ 114.74978022, 31.02676281 ], [ 114.74977032, 31.0264929 ], [ 114.74975016, 31.02606306 ], [ 114.7497201, 31.02573321 ], [ 114.74969004, 31.02554327 ], [ 114.74965008, 31.02528335 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248774", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75223254, 31.03502085 ], [ 114.75220248, 31.0349309 ], [ 114.75200232, 31.034381 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248775", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.019", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75200232, 31.034381 ], [ 114.75198234, 31.034331 ], [ 114.7519422, 31.03422102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248776", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.159", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75294318, 31.03630079 ], [ 114.75287298, 31.03623077 ], [ 114.75279306, 31.03612079 ], [ 114.7525929, 31.03587072 ], [ 114.75247266, 31.03561076 ], [ 114.7523526, 31.03533081 ], [ 114.75223254, 31.03502085 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248777", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75691614, 31.03847249 ], [ 114.75670608, 31.03839239 ], [ 114.75659592, 31.0383423 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248778", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.422", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75659592, 31.0383423 ], [ 114.75640584, 31.03826225 ], [ 114.75563526, 31.03797186 ], [ 114.75540504, 31.03790171 ], [ 114.75504468, 31.03777152 ], [ 114.7547745, 31.03765142 ], [ 114.75462438, 31.03758135 ], [ 114.75436428, 31.03746125 ], [ 114.75411408, 31.03732112 ], [ 114.75362358, 31.03696094 ], [ 114.7534335, 31.03680092 ], [ 114.75319338, 31.03656084 ], [ 114.75298314, 31.03635078 ], [ 114.75294318, 31.03630079 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248779", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.486", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76417158, 31.04118608 ], [ 114.7639014, 31.04109594 ], [ 114.7636512, 31.04100581 ], [ 114.76301076, 31.04075552 ], [ 114.76226016, 31.04047512 ], [ 114.7617999, 31.04031488 ], [ 114.76110942, 31.04004456 ], [ 114.7607991, 31.03992441 ], [ 114.76032876, 31.03976417 ], [ 114.76005858, 31.03968402 ], [ 114.75947808, 31.03945376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248780", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.267", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75947808, 31.03945376 ], [ 114.75921798, 31.03935359 ], [ 114.75877752, 31.03917341 ], [ 114.75797706, 31.03887299 ], [ 114.7572765, 31.03860267 ], [ 114.75691614, 31.03847249 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248781", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.144", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76555272, 31.04171676 ], [ 114.76522242, 31.04159661 ], [ 114.76458198, 31.04133629 ], [ 114.76417158, 31.04118608 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248782", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.272", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77236806, 31.04595941 ], [ 114.77214774, 31.04572937 ], [ 114.77181762, 31.04540928 ], [ 114.77151738, 31.04513919 ], [ 114.77122704, 31.04488913 ], [ 114.77064654, 31.04438895 ], [ 114.77038644, 31.04419887 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248783", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.123", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76815462, 31.042818 ], [ 114.76769436, 31.04258778 ], [ 114.76728396, 31.04239761 ], [ 114.76702386, 31.0422875 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248784", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76702386, 31.0422875 ], [ 114.76671354, 31.04215731 ], [ 114.76645344, 31.04205719 ], [ 114.76579284, 31.04179686 ], [ 114.76555272, 31.04171676 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248785", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.178", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77038644, 31.04419887 ], [ 114.7700862, 31.04397878 ], [ 114.76984608, 31.04381867 ], [ 114.76964592, 31.04367863 ], [ 114.76926558, 31.04344845 ], [ 114.76889532, 31.0432383 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248786", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.085", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76889532, 31.0432383 ], [ 114.76852506, 31.04301816 ], [ 114.76815462, 31.042818 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248787", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.186", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7783797, 31.05238788 ], [ 114.77812968, 31.05211802 ], [ 114.77762964, 31.05157829 ], [ 114.77718972, 31.05110849 ], [ 114.77715966, 31.05107852 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248788", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77715966, 31.05107852 ], [ 114.77673972, 31.05061871 ], [ 114.77641968, 31.05025889 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248789", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.089", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77641968, 31.05025889 ], [ 114.7763196, 31.05014895 ], [ 114.77606958, 31.04988908 ], [ 114.77581974, 31.04964918 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248790", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.207", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78783978, 31.06239332 ], [ 114.7874499, 31.06196352 ], [ 114.78688974, 31.06138379 ], [ 114.7864698, 31.06094396 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248791", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "130", "length": "0.388", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7864698, 31.06094396 ], [ 114.78631986, 31.06078407 ], [ 114.7853997, 31.0598145 ], [ 114.78486978, 31.05928472 ], [ 114.78455964, 31.05900482 ], [ 114.78429972, 31.05876492 ], [ 114.78414978, 31.05860499 ], [ 114.78384972, 31.05827514 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248792", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.129", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78384972, 31.05827514 ], [ 114.78338964, 31.05776538 ], [ 114.78317976, 31.05753552 ], [ 114.78302964, 31.05735561 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248793", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.008", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78214962, 31.05644603 ], [ 114.78209976, 31.05638604 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248794", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.094", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.78302964, 31.05735561 ], [ 114.78279978, 31.05707576 ], [ 114.78263976, 31.05692582 ], [ 114.7824198, 31.05669591 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248795", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7824198, 31.05669591 ], [ 114.78214962, 31.05644603 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248796", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.195", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79855482, 31.07246103 ], [ 114.7976433, 31.07226987 ], [ 114.79738284, 31.0721796 ], [ 114.79715262, 31.07207934 ], [ 114.79703238, 31.07202921 ], [ 114.7969422, 31.07197908 ], [ 114.79680198, 31.07189894 ], [ 114.79673196, 31.07185889 ], [ 114.79667184, 31.07181884 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248797", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.179", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.79667184, 31.07181884 ], [ 114.79649148, 31.07167866 ], [ 114.79635126, 31.07155851 ], [ 114.79623102, 31.07143841 ], [ 114.7957803, 31.07097806 ], [ 114.79542984, 31.07060775 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248798", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.197", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80055804, 31.07290352 ], [ 114.80032764, 31.07284322 ], [ 114.79905558, 31.07258163 ], [ 114.79862484, 31.07247111 ], [ 114.79855482, 31.07246103 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248799", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.346", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81110802, 31.07548044 ], [ 114.81098778, 31.07544026 ], [ 114.81009606, 31.07521881 ], [ 114.80889384, 31.07490683 ], [ 114.80761116, 31.07459471 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248800", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.394", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80761116, 31.07459471 ], [ 114.80745096, 31.07455443 ], [ 114.80625864, 31.07427246 ], [ 114.80596812, 31.07420199 ], [ 114.8056173, 31.07409143 ], [ 114.80510628, 31.07395058 ], [ 114.80362344, 31.07361812 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248801", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.056", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.81166926, 31.07563137 ], [ 114.81110802, 31.07548044 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248802", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.888", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8206167, 31.07932533 ], [ 114.8203161, 31.07918489 ], [ 114.81999534, 31.0790444 ], [ 114.81898338, 31.0785728 ], [ 114.81843222, 31.07830194 ], [ 114.81798132, 31.07809125 ], [ 114.81712974, 31.07767995 ], [ 114.81633828, 31.07732873 ], [ 114.8153463, 31.07687724 ], [ 114.81465492, 31.07659617 ], [ 114.81400368, 31.07633513 ], [ 114.81313194, 31.07604375 ], [ 114.8122503, 31.07579234 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248803", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.058", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8122503, 31.07579234 ], [ 114.81183954, 31.07567165 ], [ 114.81166926, 31.07563137 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248804", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.176", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8340726, 31.08562556 ], [ 114.83380206, 31.08550514 ], [ 114.83282016, 31.08505365 ], [ 114.83204868, 31.08468254 ], [ 114.83116704, 31.08430116 ], [ 114.83039556, 31.08393 ], [ 114.8298444, 31.08366918 ], [ 114.82922322, 31.08336827 ], [ 114.82914312, 31.08332813 ], [ 114.8290128, 31.08327795 ], [ 114.82769034, 31.08264597 ], [ 114.82661826, 31.08214436 ], [ 114.82549596, 31.08161268 ], [ 114.82453422, 31.08115121 ], [ 114.82371252, 31.08078999 ], [ 114.82320168, 31.0805492 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248805", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.281", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.82320168, 31.0805492 ], [ 114.82181892, 31.07988716 ], [ 114.82117776, 31.07959619 ], [ 114.82096734, 31.07948585 ], [ 114.82075692, 31.07939553 ], [ 114.8206167, 31.07932533 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248806", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.105", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84316008, 31.08986933 ], [ 114.84236862, 31.08949812 ], [ 114.84218826, 31.08941784 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248807", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.170", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.84218826, 31.08941784 ], [ 114.84148698, 31.08911679 ], [ 114.84127656, 31.08901644 ], [ 114.84060516, 31.08869546 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248808", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.063", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85996236, 31.09987382 ], [ 114.85990224, 31.09982373 ], [ 114.85951146, 31.09945325 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248809", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.423", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85951146, 31.09945325 ], [ 114.85929114, 31.09924296 ], [ 114.85867986, 31.09867218 ], [ 114.85800864, 31.09804133 ], [ 114.85717704, 31.09733024 ], [ 114.85640556, 31.09672917 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248810", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.631", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87901392, 31.11666588 ], [ 114.87872376, 31.11636578 ], [ 114.87768282, 31.11532529 ], [ 114.87645162, 31.11412473 ], [ 114.8755707, 31.11330429 ], [ 114.87500028, 31.112784 ], [ 114.87492018, 31.11271398 ], [ 114.87474, 31.11257385 ], [ 114.8745798, 31.1124438 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248811", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.401", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8745798, 31.1124438 ], [ 114.87425958, 31.11220359 ], [ 114.87394926, 31.11198341 ], [ 114.87342888, 31.11160311 ], [ 114.87255804, 31.11093266 ], [ 114.87180726, 31.11034226 ], [ 114.87142692, 31.11004206 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248812", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.437", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8662215, 31.10569893 ], [ 114.8660514, 31.10554881 ], [ 114.86524014, 31.10478818 ], [ 114.86490966, 31.10449793 ], [ 114.86430882, 31.10389745 ], [ 114.86354778, 31.10318685 ], [ 114.86312712, 31.10278653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248813", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.442", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86312712, 31.10278653 ], [ 114.86304702, 31.10270648 ], [ 114.86248614, 31.10219604 ], [ 114.86192544, 31.10170559 ], [ 114.86114424, 31.10099499 ], [ 114.86051334, 31.10037449 ], [ 114.85996236, 31.09987382 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248814", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.395", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91743924, 31.14600282 ], [ 114.91589106, 31.1455044 ], [ 114.9137136, 31.14474665 ], [ 114.91358364, 31.14470678 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248815", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.172", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91358364, 31.14470678 ], [ 114.91317414, 31.14457718 ], [ 114.91204554, 31.14413838 ], [ 114.91192566, 31.14409851 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248816", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.518", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8825673, 31.12019753 ], [ 114.88250736, 31.1201375 ], [ 114.88118598, 31.11880689 ], [ 114.8805054, 31.11813657 ], [ 114.87931434, 31.11695604 ], [ 114.87901392, 31.11666588 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248817", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.004", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88283766, 31.12046766 ], [ 114.8828076, 31.12043765 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248818", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8828076, 31.12043765 ], [ 114.8825673, 31.12019753 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248819", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.536", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88767948, 31.12531763 ], [ 114.88655916, 31.12419771 ], [ 114.88621896, 31.12386773 ], [ 114.88578894, 31.12340778 ], [ 114.88491864, 31.12248789 ], [ 114.88456854, 31.12214792 ], [ 114.88402836, 31.12164797 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248820", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.174", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88402836, 31.12164797 ], [ 114.88342824, 31.12109793 ], [ 114.88301784, 31.12062777 ], [ 114.88283766, 31.12046766 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248821", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.036", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89067018, 31.12836728 ], [ 114.89042016, 31.12812729 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248822", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.407", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89042016, 31.12812729 ], [ 114.88998996, 31.12770735 ], [ 114.88905972, 31.12677743 ], [ 114.88866966, 31.12638746 ], [ 114.88767948, 31.12531763 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248861", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.012", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99264486, 31.1694453 ], [ 114.99276438, 31.16947491 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248862", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.075", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99276438, 31.16947491 ], [ 114.99348168, 31.16974257 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248863", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.026", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99050268, 31.16884217 ], [ 114.9907617, 31.16891133 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248864", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.023", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9907617, 31.16891133 ], [ 114.99099084, 31.16898059 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248865", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.056", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98982516, 31.16884424 ], [ 114.99038316, 31.16899242 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248866", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.029", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99038316, 31.16899242 ], [ 114.99067206, 31.16907153 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248867", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.028", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99067206, 31.16907153 ], [ 114.99095106, 31.16915064 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248868", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.013", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9924753, 31.16953575 ], [ 114.9926049, 31.16957535 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248869", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.020", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99095106, 31.16915064 ], [ 114.99115032, 31.16920001 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248870", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.043", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9920469, 31.16942712 ], [ 114.99239574, 31.16951604 ], [ 114.9924753, 31.16953575 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248871", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.150", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92563968, 31.14872442 ], [ 114.9241914, 31.14820593 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248872", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.243", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92563968, 31.14872442 ], [ 114.9257196, 31.14879435 ], [ 114.9259293, 31.14887409 ], [ 114.92680842, 31.14920318 ], [ 114.92706798, 31.1493029 ], [ 114.9273477, 31.1494226 ], [ 114.9277473, 31.14961218 ], [ 114.92791704, 31.14969197 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248873", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.247", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92563968, 31.14872442 ], [ 114.92573958, 31.14872438 ], [ 114.92594928, 31.14879413 ], [ 114.9268284, 31.14912321 ], [ 114.92708796, 31.14922293 ], [ 114.92738766, 31.14934263 ], [ 114.92778726, 31.14953217 ], [ 114.92799696, 31.14963194 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248874", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.065", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93009432, 31.15097937 ], [ 114.93026424, 31.15107918 ], [ 114.93036396, 31.15114907 ], [ 114.93064368, 31.15131872 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248875", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.045", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93013428, 31.15091939 ], [ 114.93029412, 31.1510192 ], [ 114.93040392, 31.15108908 ], [ 114.9305139, 31.15115892 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248876", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.286", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93064368, 31.15131872 ], [ 114.93101322, 31.15155834 ], [ 114.93138294, 31.15178793 ], [ 114.93199224, 31.15216733 ], [ 114.93216216, 31.15227713 ], [ 114.93284148, 31.15270643 ], [ 114.93306126, 31.1528462 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248877", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.102", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93306126, 31.1528462 ], [ 114.93392994, 31.15337504 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248878", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.102", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93310104, 31.15278617 ], [ 114.9339699, 31.15331501 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248879", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.550", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9410718, 31.1577984 ], [ 114.94430298, 31.15983042 ], [ 114.94569924, 31.16074698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248880", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.010", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92791704, 31.14969197 ], [ 114.92799696, 31.14963194 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248881", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.065", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92799696, 31.14963194 ], [ 114.92834652, 31.14983156 ], [ 114.9285663, 31.14996129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248882", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.170", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92791704, 31.14969197 ], [ 114.92830656, 31.14989154 ], [ 114.92863614, 31.15009116 ], [ 114.9288858, 31.15024083 ], [ 114.9293952, 31.15055025 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248883", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.082", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9293952, 31.15055025 ], [ 114.92996454, 31.15089954 ], [ 114.93009432, 31.15097937 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248884", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.139", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9285663, 31.14996129 ], [ 114.9286761, 31.15003113 ], [ 114.92892576, 31.15018085 ], [ 114.92975484, 31.15068984 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248885", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.020", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92975484, 31.15068984 ], [ 114.92992458, 31.15078965 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248886", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.025", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92992458, 31.15078965 ], [ 114.9300045, 31.15083956 ], [ 114.93013428, 31.15091939 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248887", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93009432, 31.15097937 ], [ 114.93013428, 31.15091939 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248888", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93310104, 31.15278617 ], [ 114.93306126, 31.1528462 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248889", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.270", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9305139, 31.15115892 ], [ 114.93105318, 31.15149831 ], [ 114.9314229, 31.15172795 ], [ 114.9320322, 31.1521073 ], [ 114.93220212, 31.15221714 ], [ 114.93280152, 31.15259649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248890", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.035", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93280152, 31.15259649 ], [ 114.93288144, 31.1526464 ], [ 114.93310104, 31.15278617 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248891", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.062", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9339699, 31.15331501 ], [ 114.93422928, 31.1534744 ], [ 114.93449856, 31.15364382 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248892", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.074", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93392994, 31.15337504 ], [ 114.93418932, 31.15353447 ], [ 114.9345585, 31.15376361 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248893", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.078", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93449856, 31.15364382 ], [ 114.93506718, 31.15399253 ], [ 114.935157, 31.15405233 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248894", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.066", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9345585, 31.15376361 ], [ 114.93502722, 31.1540526 ], [ 114.93511704, 31.15411236 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248895", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.935157, 31.15405233 ], [ 114.93511704, 31.15411236 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248896", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.053", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93511704, 31.15411236 ], [ 114.93523674, 31.15418211 ], [ 114.93557586, 31.15438137 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248897", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.054", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.935157, 31.15405233 ], [ 114.9352767, 31.15412208 ], [ 114.9356259, 31.15433129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248898", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.007", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93557586, 31.15438137 ], [ 114.9356259, 31.15433129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248899", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.184", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9356259, 31.15433129 ], [ 114.93573552, 31.15440104 ], [ 114.93627426, 31.15473984 ], [ 114.93664326, 31.15496903 ], [ 114.9367032, 31.1550089 ], [ 114.9368328, 31.15508859 ], [ 114.937182, 31.15530783 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248900", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.185", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93557586, 31.15438137 ], [ 114.93569574, 31.15446111 ], [ 114.9362343, 31.15479987 ], [ 114.93660348, 31.15502906 ], [ 114.93668322, 31.15507887 ], [ 114.93680292, 31.15515861 ], [ 114.93714204, 31.15536786 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248901", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93714204, 31.15536786 ], [ 114.937182, 31.15530783 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248902", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.078", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94045332, 31.15732995 ], [ 114.94073268, 31.15749929 ], [ 114.94111158, 31.15773833 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248903", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.080", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94039356, 31.15737009 ], [ 114.94069272, 31.15755936 ], [ 114.9410718, 31.1577984 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248904", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.352", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93714204, 31.15536786 ], [ 114.93727182, 31.15544756 ], [ 114.9376509, 31.15567674 ], [ 114.93801, 31.15590593 ], [ 114.93868824, 31.15632429 ], [ 114.93900738, 31.15652351 ], [ 114.93951588, 31.15683225 ], [ 114.93976536, 31.15699164 ], [ 114.94013436, 31.15721075 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248905", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.030", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94013436, 31.15721075 ], [ 114.94016424, 31.15723068 ], [ 114.9403536, 31.1573502 ], [ 114.94039356, 31.15737009 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248906", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.353", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.937182, 31.15530783 ], [ 114.93731178, 31.15538753 ], [ 114.93769086, 31.15561667 ], [ 114.93804996, 31.1558459 ], [ 114.93872802, 31.15626422 ], [ 114.93904716, 31.15646343 ], [ 114.93955584, 31.15677218 ], [ 114.93980514, 31.15693157 ], [ 114.94018404, 31.15716062 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248907", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94018404, 31.15716062 ], [ 114.94020402, 31.15717056 ], [ 114.94039356, 31.15729013 ], [ 114.94045332, 31.15732995 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248908", "Name": null, "pyname": null, "kind": "0204", "width": "30", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94569924, 31.16074698 ], [ 114.94574892, 31.16068686 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248909", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.527", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94111158, 31.15773833 ], [ 114.94434276, 31.15977035 ], [ 114.94554948, 31.16055735 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248910", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.024", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94554948, 31.16055735 ], [ 114.94574892, 31.16068686 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248911", "Name": null, "pyname": null, "kind": "0212", "width": "30", "length": "0.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94554948, 31.16055735 ], [ 114.94568916, 31.16056703 ], [ 114.94574892, 31.16056689 ], [ 114.94584864, 31.16054664 ], [ 114.9458985, 31.16052653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248912", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94574892, 31.16068686 ], [ 114.9460182, 31.1608562 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248913", "Name": "G106", "pyname": "g106", "kind": "0212", "width": "30", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94592838, 31.16049647 ], [ 114.94596834, 31.16065635 ], [ 114.9460182, 31.1608562 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248914", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.016", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95209176, 31.16450124 ], [ 114.95194218, 31.16443158 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248915", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.015", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95194218, 31.16443158 ], [ 114.9518025, 31.16437196 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248916", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.017", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95214162, 31.16437115 ], [ 114.95197206, 31.16432156 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248917", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.014", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95197206, 31.16432156 ], [ 114.95183238, 31.16427188 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248918", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.647", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94569924, 31.16074698 ], [ 114.9471054, 31.1616135 ], [ 114.9496983, 31.1632371 ], [ 114.95020698, 31.16355584 ], [ 114.95050614, 31.16373512 ], [ 114.95098476, 31.16399396 ], [ 114.95122416, 31.16411334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248919", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.062", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95122416, 31.16411334 ], [ 114.95133378, 31.16417306 ], [ 114.95153322, 31.16425257 ], [ 114.9518025, 31.16437196 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248920", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.613", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9460182, 31.1608562 ], [ 114.94714518, 31.16155343 ], [ 114.94973826, 31.16317703 ], [ 114.95024676, 31.16349576 ], [ 114.95054592, 31.16367504 ], [ 114.95102472, 31.16391386 ], [ 114.95125404, 31.16403329 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248921", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.061", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95125404, 31.16403329 ], [ 114.95137374, 31.164093 ], [ 114.9515631, 31.16416253 ], [ 114.95183238, 31.16427188 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248922", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.374", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96186324, 31.16457792 ], [ 114.96171366, 31.16458827 ], [ 114.96121506, 31.16461946 ], [ 114.96023802, 31.16467179 ], [ 114.9592608, 31.16471414 ], [ 114.95831364, 31.16476638 ], [ 114.95794464, 31.16479725 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248923", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.251", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95794464, 31.16479725 ], [ 114.9573564, 31.16483865 ], [ 114.9558309, 31.16492226 ], [ 114.9553224, 31.16496348 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248924", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.297", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96105558, 31.16442987 ], [ 114.96019806, 31.1644719 ], [ 114.95921094, 31.16451425 ], [ 114.95827368, 31.16456649 ], [ 114.95794464, 31.16458728 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248925", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.204", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95794464, 31.16458728 ], [ 114.95731644, 31.16463876 ], [ 114.95581092, 31.16476233 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248926", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.103", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96542274, 31.16415951 ], [ 114.9643458, 31.16423205 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248927", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.052", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96241152, 31.16433668 ], [ 114.96203262, 31.16436755 ], [ 114.96195288, 31.16436777 ], [ 114.96187314, 31.16437794 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248928", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202|0204", "width": "55", "length": "0.011", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96187314, 31.16437794 ], [ 114.96176334, 31.1643882 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248929", "Name": null, "pyname": null, "kind": "0202|0204", "width": "55", "length": "0.022", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96186324, 31.16457792 ], [ 114.96187314, 31.16437794 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248930", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.099", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9681447, 31.16400305 ], [ 114.96778578, 31.16401389 ], [ 114.96710772, 31.16405552 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248931", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.161", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96710772, 31.16405552 ], [ 114.96542274, 31.16415951 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248932", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.098", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9681546, 31.164183 ], [ 114.9671277, 31.16424542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248933", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.172", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9671277, 31.16424542 ], [ 114.96533292, 31.16435972 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248934", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.119", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97051764, 31.16385743 ], [ 114.96927132, 31.16393037 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248935", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.108", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96927132, 31.16393037 ], [ 114.96886254, 31.16396133 ], [ 114.9681447, 31.16400305 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248936", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.153", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97088664, 31.16402649 ], [ 114.97007898, 31.16406843 ], [ 114.96936114, 31.16411015 ], [ 114.9692814, 31.16411033 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248937", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.108", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9692814, 31.16411033 ], [ 114.9686532, 31.16415182 ], [ 114.9681546, 31.164183 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248938", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.014", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97143492, 31.16379524 ], [ 114.97128534, 31.16380559 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248939", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97177404, 31.16377445 ], [ 114.97166424, 31.16378471 ], [ 114.97143492, 31.16379524 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248940", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.054", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9714549, 31.16398518 ], [ 114.97088664, 31.16402649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248941", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.031", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97178394, 31.16396439 ], [ 114.9714549, 31.16398518 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248942", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.123", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97306032, 31.16407131 ], [ 114.97288086, 31.16402177 ], [ 114.97264146, 31.16398235 ], [ 114.97254174, 31.16396259 ], [ 114.97217292, 31.16394347 ], [ 114.97178394, 31.16396439 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248943", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.173", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97607172, 31.16491403 ], [ 114.97528404, 31.16468592 ], [ 114.97435668, 31.16441817 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248944", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.130", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97435668, 31.16441817 ], [ 114.97349898, 31.16417027 ], [ 114.97306032, 31.16407131 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248945", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.130", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97312998, 31.16385117 ], [ 114.97277106, 31.16379204 ], [ 114.97225248, 31.1637533 ], [ 114.97177404, 31.16377445 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248946", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.173", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97615146, 31.16472386 ], [ 114.97443624, 31.16421801 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248947", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.131", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97443624, 31.16421801 ], [ 114.97354884, 31.16396016 ], [ 114.97331952, 31.16390072 ], [ 114.97323978, 31.16388092 ], [ 114.97312998, 31.16385117 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248948", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.110", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97607172, 31.16491403 ], [ 114.97716864, 31.16522138 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248949", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.082", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97716864, 31.16522138 ], [ 114.97780692, 31.16539985 ], [ 114.97798638, 31.16544935 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248950", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.109", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97615146, 31.16472386 ], [ 114.97723848, 31.16502122 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248951", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.084", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97723848, 31.16502122 ], [ 114.97775688, 31.16516999 ], [ 114.97807602, 31.16525922 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248952", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.092", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97807602, 31.16525922 ], [ 114.97899294, 31.16552652 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248953", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.235", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97899294, 31.16552652 ], [ 114.98132484, 31.16620967 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248954", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.095", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.97798638, 31.16544935 ], [ 114.9789231, 31.16572659 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248955", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.240", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9789231, 31.16572659 ], [ 114.98076666, 31.16626119 ], [ 114.98130486, 31.16639966 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248956", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.199", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98436432, 31.16729066 ], [ 114.98486256, 31.1674392 ], [ 114.98633766, 31.16785487 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248957", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.194", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98446404, 31.16711048 ], [ 114.98504202, 31.16727878 ], [ 114.98638734, 31.16766483 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248958", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.064", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98633766, 31.16785487 ], [ 114.98691564, 31.16801318 ], [ 114.9869754, 31.16803302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248959", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.064", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98638734, 31.16766483 ], [ 114.98702526, 31.16785298 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248960", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.132", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98702526, 31.16785298 ], [ 114.98790222, 31.16808041 ], [ 114.9883407, 31.16820911 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248961", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.213", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9869754, 31.16803302 ], [ 114.98827086, 31.16840918 ], [ 114.98908788, 31.16863656 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248962", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.018", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98908788, 31.16863656 ], [ 114.98926716, 31.16868602 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248963", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.046", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98926716, 31.16868602 ], [ 114.98972544, 31.16881454 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248964", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.081", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9883407, 31.16820911 ], [ 114.98867946, 31.16831801 ], [ 114.98913774, 31.16844653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248965", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.019", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98913774, 31.16844653 ], [ 114.9893271, 31.16849594 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248966", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.046", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9893271, 31.16849594 ], [ 114.98978538, 31.16862446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248967", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.043", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.98978538, 31.16862446 ], [ 114.99021378, 31.16875307 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248968", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.029", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99021378, 31.16875307 ], [ 114.99050268, 31.16884217 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248969", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.043", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99164838, 31.16916846 ], [ 114.99207678, 31.16928713 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248970", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.046", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99115032, 31.16920001 ], [ 114.9916086, 31.16931854 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248971", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.044", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9916086, 31.16931854 ], [ 114.9920469, 31.16942712 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248972", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.021", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99099084, 31.16898059 ], [ 114.99120018, 31.16903994 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248973", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.045", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99120018, 31.16903994 ], [ 114.9913197, 31.16907954 ], [ 114.99164838, 31.16916846 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248974", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.044", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99207678, 31.16928713 ], [ 114.99251526, 31.1694057 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248975", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.013", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99251526, 31.1694057 ], [ 114.99264486, 31.1694453 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248976", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.025", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9926049, 31.16957535 ], [ 114.99284394, 31.16966459 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248977", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.059", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99284394, 31.16966459 ], [ 114.99342192, 31.16986272 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248978", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.097", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0194861, 31.18092966 ], [ 115.01911746, 31.18035101 ], [ 115.01899794, 31.18016142 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248979", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01899794, 31.18016142 ], [ 115.018938, 31.18007165 ], [ 115.01852958, 31.17944309 ], [ 115.01840988, 31.17926354 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248980", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99492636, 31.17044781 ], [ 114.99539454, 31.17064626 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248981", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.007", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99467724, 31.17033864 ], [ 114.994737, 31.17036843 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248982", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.994737, 31.17036843 ], [ 114.99492636, 31.17044781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248983", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.004", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99467724, 31.17050852 ], [ 114.99471702, 31.17052841 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248984", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.019", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9953148, 31.17078644 ], [ 114.99549426, 31.17086586 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248985", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99549426, 31.17086586 ], [ 114.99595254, 31.17107435 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248986", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.176", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99595254, 31.17107435 ], [ 114.9975963, 31.17178895 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248987", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.070", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99539454, 31.17064626 ], [ 114.99605208, 31.17092414 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248988", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.178", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99605208, 31.17092414 ], [ 114.9977259, 31.17162866 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248989", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.019", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99595254, 31.17107435 ], [ 114.99605208, 31.17092414 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248990", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99880194, 31.17199518 ], [ 114.9981345, 31.17177734 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248991", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9981345, 31.17177734 ], [ 114.99810444, 31.17176744 ], [ 114.9977259, 31.17162866 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248992", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99806466, 31.17195743 ], [ 114.9975963, 31.17178895 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248993", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.012", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99875208, 31.17219521 ], [ 114.99863256, 31.17215561 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248994", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.059", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99863256, 31.17215561 ], [ 114.99806466, 31.17195743 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248995", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.037", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00152192, 31.17276644 ], [ 115.00114338, 31.17269763 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248996", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.066", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00114338, 31.17269763 ], [ 115.00076466, 31.17261884 ], [ 115.00047576, 31.17255975 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248997", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00047576, 31.17255975 ], [ 115.00006734, 31.17247106 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248998", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00049574, 31.17236981 ], [ 115.000137, 31.17230091 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.248999", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00157178, 31.1725764 ], [ 115.00118316, 31.17249765 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249000", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.067", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00118316, 31.17249765 ], [ 115.00075476, 31.17241899 ], [ 115.00049574, 31.17236981 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249001", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.023", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00200018, 31.17266505 ], [ 115.00177104, 31.17261578 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249002", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00177104, 31.17261578 ], [ 115.00157178, 31.1725764 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249003", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.110", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0071111, 31.17345935 ], [ 115.0068321, 31.17344018 ], [ 115.0059555, 31.17341282 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249004", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.067", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0059555, 31.17341282 ], [ 115.00593552, 31.17341286 ], [ 115.005258, 31.17338492 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249005", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00879482, 31.17330441 ], [ 115.00846614, 31.17329541 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249006", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00970148, 31.17332169 ], [ 115.00928316, 31.17331296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249007", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00928316, 31.17331296 ], [ 115.00879482, 31.17330441 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249008", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0096815, 31.17352163 ], [ 115.00926318, 31.1735129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249009", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0129296, 31.17343212 ], [ 115.01281008, 31.17341246 ], [ 115.01261082, 31.17340305 ], [ 115.01232192, 31.17338388 ], [ 115.01213256, 31.17337448 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249010", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.115", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0140357, 31.17395867 ], [ 115.01399574, 31.17393878 ], [ 115.01368686, 31.17382974 ], [ 115.01337798, 31.17373065 ], [ 115.01308908, 31.17366153 ], [ 115.01289972, 31.17364209 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249011", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01289972, 31.17364209 ], [ 115.01247132, 31.17361338 ], [ 115.01214246, 31.17360434 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249012", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01509176, 31.17416549 ], [ 115.014753, 31.17402653 ], [ 115.01397594, 31.17369893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249013", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.105", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01397594, 31.17369893 ], [ 115.01387622, 31.17365924 ], [ 115.01351748, 31.17354035 ], [ 115.0132086, 31.17346128 ], [ 115.0129296, 31.17343212 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249014", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.048", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01518158, 31.17432515 ], [ 115.01497224, 31.17430575 ], [ 115.0148727, 31.17427605 ], [ 115.01470332, 31.17421661 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249015", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.070", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01470332, 31.17421661 ], [ 115.01438436, 31.17409758 ], [ 115.0141752, 31.17400821 ], [ 115.0140357, 31.17395867 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249016", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01527122, 31.17445484 ], [ 115.01518158, 31.17432515 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249017", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01603838, 31.17561206 ], [ 115.01580924, 31.17524292 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249018", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.102", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01580924, 31.17524292 ], [ 115.01562996, 31.17495357 ], [ 115.01527122, 31.17445484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249019", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.061", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01715438, 31.17739802 ], [ 115.01690526, 31.17698892 ], [ 115.01685558, 31.17691913 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249020", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.122", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01685558, 31.17691913 ], [ 115.01634726, 31.17616092 ], [ 115.01623782, 31.17596135 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249021", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.160", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01840988, 31.17926354 ], [ 115.01811108, 31.17882461 ], [ 115.01785188, 31.17839553 ], [ 115.01760294, 31.17800646 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249022", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.080", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01760294, 31.17800646 ], [ 115.01749332, 31.17784685 ], [ 115.01715438, 31.17739802 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249023", "Name": "将军路", "pyname": "jjl", "kind": "0201", "width": "130", "length": "0.246", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01978508, 31.18364757 ], [ 115.0197453, 31.1831379 ], [ 115.01972532, 31.18266819 ], [ 115.01971542, 31.18221842 ], [ 115.01968536, 31.18171874 ], [ 115.01965548, 31.18143893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249024", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.100", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01978508, 31.18364757 ], [ 115.01971542, 31.1838777 ], [ 115.01976528, 31.18425737 ], [ 115.01980506, 31.18453713 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249025", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.098", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01978508, 31.18364757 ], [ 115.01983494, 31.18385736 ], [ 115.0198848, 31.18423703 ], [ 115.01992476, 31.18451679 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249026", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.167", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01980506, 31.18453713 ], [ 115.01984502, 31.18473693 ], [ 115.01992476, 31.18517649 ], [ 115.0200243, 31.185626 ], [ 115.020144, 31.18600548 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249027", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.020144, 31.18600548 ], [ 115.02019386, 31.18616528 ], [ 115.02026352, 31.18638497 ], [ 115.02047286, 31.18688415 ], [ 115.02058248, 31.1871537 ], [ 115.02068202, 31.18738329 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249028", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.170", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02023364, 31.18589528 ], [ 115.02031338, 31.18612496 ], [ 115.02038304, 31.18634465 ], [ 115.02059238, 31.18684379 ], [ 115.020702, 31.18711338 ], [ 115.02080154, 31.18734297 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249029", "Name": "将军路", "pyname": "jjl", "kind": "0202|0204", "width": "55", "length": "0.011", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02217674, 31.19002776 ], [ 115.0222266, 31.19011758 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249030", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.524", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0272081, 31.20048828 ], [ 115.02739728, 31.20094755 ], [ 115.0276563, 31.20157647 ], [ 115.02788544, 31.20213551 ], [ 115.02806472, 31.20256476 ], [ 115.02828396, 31.20304388 ], [ 115.02849312, 31.20359301 ], [ 115.02861246, 31.20396246 ], [ 115.02875196, 31.20438182 ], [ 115.02893124, 31.20495102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249031", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02879174, 31.2049314 ], [ 115.02882162, 31.20503126 ], [ 115.0288614, 31.2051911 ], [ 115.02898092, 31.20539063 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249032", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02893124, 31.20495102 ], [ 115.02894114, 31.20499094 ], [ 115.0289811, 31.20517076 ], [ 115.02898092, 31.20539063 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249033", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02080154, 31.18734297 ], [ 115.02088128, 31.18755263 ], [ 115.02091116, 31.18761252 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249034", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02068202, 31.18738329 ], [ 115.02078174, 31.18761293 ], [ 115.02079164, 31.18763286 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249035", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02079164, 31.18763286 ], [ 115.02091116, 31.18761252 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249036", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.126", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02079164, 31.18763286 ], [ 115.02095112, 31.18791227 ], [ 115.0211205, 31.18822164 ], [ 115.02135972, 31.18865076 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249037", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02135972, 31.18865076 ], [ 115.02145926, 31.1888304 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249038", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02145926, 31.1888304 ], [ 115.02148914, 31.18888031 ], [ 115.02161874, 31.18909982 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249039", "Name": "将军路", "pyname": "jjl", "kind": "0212", "width": "30", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02182808, 31.19011875 ], [ 115.02190764, 31.19003856 ], [ 115.0219575, 31.18997844 ], [ 115.02201726, 31.18987832 ], [ 115.02203724, 31.18979826 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249040", "Name": "北环路", "pyname": "bhl", "kind": "0212", "width": "30", "length": "0.065", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02214686, 31.189748 ], [ 115.02229626, 31.1898375 ], [ 115.02240588, 31.18988718 ], [ 115.02257526, 31.18993664 ], [ 115.02276462, 31.1899761 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249041", "Name": "将军路", "pyname": "jjl", "kind": "0212", "width": "30", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02276462, 31.1899761 ], [ 115.02263502, 31.19010642 ], [ 115.02257526, 31.19018652 ], [ 115.02253548, 31.1902866 ], [ 115.0225155, 31.19039663 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249042", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02232614, 31.19004734 ], [ 115.0225155, 31.19039663 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249043", "Name": "X103", "pyname": "x103", "kind": "0212", "width": "30", "length": "0.056", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02239598, 31.19040698 ], [ 115.02227646, 31.19035734 ], [ 115.02214686, 31.19029776 ], [ 115.02199746, 31.19024822 ], [ 115.02186786, 31.19019858 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249044", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.036", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0222266, 31.19011758 ], [ 115.02239598, 31.19040698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249045", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.087", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02161874, 31.18909982 ], [ 115.02172836, 31.18926942 ], [ 115.02191772, 31.18958874 ], [ 115.02203724, 31.18979826 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249046", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.029", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02203724, 31.18979826 ], [ 115.02217674, 31.19002776 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249047", "Name": null, "pyname": null, "kind": "0202|0204", "width": "55", "length": "0.012", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02232614, 31.19004734 ], [ 115.0222266, 31.19011758 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249048", "Name": null, "pyname": null, "kind": "0202|0204", "width": "55", "length": "0.014", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02232614, 31.19004734 ], [ 115.02217674, 31.19002776 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249049", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0270785, 31.20051866 ], [ 115.0272081, 31.20048828 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249050", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.130", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02346212, 31.19229302 ], [ 115.02372114, 31.19285201 ], [ 115.02395028, 31.19338107 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249051", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.123", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02360162, 31.1923026 ], [ 115.02382086, 31.19281173 ], [ 115.02405, 31.19334084 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249052", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.066", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02405, 31.19334084 ], [ 115.02410976, 31.19346059 ], [ 115.02429912, 31.19388984 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249053", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.065", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02395028, 31.19338107 ], [ 115.02401004, 31.19350086 ], [ 115.0241994, 31.19392013 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249054", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02429912, 31.19388984 ], [ 115.02445842, 31.19423922 ], [ 115.0246278, 31.19460854 ], [ 115.02464778, 31.1946485 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249055", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.089", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0241994, 31.19392013 ], [ 115.0243587, 31.1942795 ], [ 115.02452808, 31.19466879 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249056", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.053", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02464778, 31.1946485 ], [ 115.02474732, 31.19484807 ], [ 115.02485694, 31.19508765 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249057", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.032", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02485694, 31.19508765 ], [ 115.02494658, 31.19529731 ], [ 115.02497646, 31.1953572 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249058", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.053", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02452808, 31.19466879 ], [ 115.02464778, 31.19490837 ], [ 115.02473742, 31.19510799 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249059", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.033", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02473742, 31.19510799 ], [ 115.02484686, 31.19533758 ], [ 115.02486684, 31.19538749 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249060", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02497646, 31.1953572 ], [ 115.02510606, 31.19564669 ], [ 115.02525546, 31.19597609 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249061", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.536", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02525546, 31.19597609 ], [ 115.02528534, 31.19603598 ], [ 115.02546462, 31.19642528 ], [ 115.02570366, 31.19700429 ], [ 115.02600264, 31.1977431 ], [ 115.02625176, 31.19827212 ], [ 115.02646092, 31.19875128 ], [ 115.0267896, 31.19953995 ], [ 115.02704862, 31.20013895 ], [ 115.0272081, 31.20048828 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249062", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.075", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02486684, 31.19538749 ], [ 115.02500634, 31.19570694 ], [ 115.02515574, 31.19601636 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249063", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.534", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02515574, 31.19601636 ], [ 115.02518562, 31.19607626 ], [ 115.0253451, 31.1964656 ], [ 115.02558414, 31.19704461 ], [ 115.02590292, 31.19778338 ], [ 115.02615204, 31.1983124 ], [ 115.02634122, 31.1987916 ], [ 115.02667008, 31.19958027 ], [ 115.02694908, 31.20017918 ], [ 115.0270785, 31.20051866 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249064", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.547", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02979632, 31.22033121 ], [ 115.02952722, 31.21964226 ], [ 115.02938772, 31.2192428 ], [ 115.0291485, 31.21873371 ], [ 115.02888948, 31.21809467 ], [ 115.02864036, 31.21746566 ], [ 115.02849096, 31.21704626 ], [ 115.02833148, 31.21655688 ], [ 115.02828162, 31.21632711 ], [ 115.02820188, 31.2159875 ], [ 115.02813222, 31.21563785 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249065", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.110", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02813222, 31.21563785 ], [ 115.02809244, 31.21546802 ], [ 115.02807246, 31.21540812 ], [ 115.02804258, 31.21524828 ], [ 115.0280127, 31.21503845 ], [ 115.02799272, 31.2148386 ], [ 115.02797292, 31.21465874 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249066", "Name": "建设路", "pyname": "jsl", "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01980506, 31.18453713 ], [ 115.01992476, 31.18451679 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249067", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.029", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01992476, 31.18451679 ], [ 115.01996454, 31.18471659 ], [ 115.01997444, 31.18477653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249068", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.127", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01997444, 31.18477653 ], [ 115.02004428, 31.18515615 ], [ 115.020144, 31.18558568 ], [ 115.02023364, 31.18589528 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249069", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02156888, 31.18878009 ], [ 115.02158886, 31.18882001 ], [ 115.02172836, 31.18904951 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249070", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02145926, 31.1888304 ], [ 115.02156888, 31.18878009 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249071", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02161874, 31.18909982 ], [ 115.02172836, 31.18904951 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249072", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.118", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02091116, 31.18761252 ], [ 115.02105066, 31.18785201 ], [ 115.02122004, 31.18816139 ], [ 115.02144936, 31.18857053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249073", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.026", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02144936, 31.18857053 ], [ 115.02156888, 31.18878009 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249074", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.087", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02172836, 31.18904951 ], [ 115.0218279, 31.18920917 ], [ 115.02201726, 31.18952844 ], [ 115.02214686, 31.189748 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249075", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.037", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02214686, 31.189748 ], [ 115.02232614, 31.19004734 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249076", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.046", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02239598, 31.19040698 ], [ 115.02246564, 31.1905467 ], [ 115.02260514, 31.1907762 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249077", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0225155, 31.19039663 ], [ 115.02256536, 31.19048645 ], [ 115.02271476, 31.19073588 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249078", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.112", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02260514, 31.1907762 ], [ 115.02261522, 31.19079614 ], [ 115.02282438, 31.19116536 ], [ 115.02298386, 31.19143478 ], [ 115.02312336, 31.19167427 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249079", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02312336, 31.19167427 ], [ 115.02317322, 31.19176409 ], [ 115.02328284, 31.19195367 ], [ 115.02346212, 31.19229302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249080", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02346212, 31.19229302 ], [ 115.02357174, 31.19224271 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249081", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.007", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02357174, 31.19224271 ], [ 115.02360162, 31.1923026 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249082", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.108", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02271476, 31.19073588 ], [ 115.0229241, 31.19110511 ], [ 115.0230834, 31.19137452 ], [ 115.023213, 31.19160407 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249083", "Name": "将军路", "pyname": "jjl", "kind": "0202", "width": "55", "length": "0.079", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.023213, 31.19160407 ], [ 115.02327276, 31.19170383 ], [ 115.02338238, 31.19189342 ], [ 115.02357174, 31.19224271 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249084", "Name": null, "pyname": null, "kind": "0204", "width": "55", "length": "0.012", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.023213, 31.19160407 ], [ 115.02312336, 31.19167427 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249085", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.150", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0270785, 31.20051866 ], [ 115.02727776, 31.20098787 ], [ 115.02753678, 31.20161679 ], [ 115.02760644, 31.20178653 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249086", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.065", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03561572, 31.23415926 ], [ 115.0355061, 31.23390969 ], [ 115.03538658, 31.23361013 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249087", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.464", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0375194, 31.23852233 ], [ 115.03743948, 31.23838256 ], [ 115.0372701, 31.23796311 ], [ 115.0371306, 31.23768362 ], [ 115.03677186, 31.23692492 ], [ 115.0366023, 31.2364256 ], [ 115.03635318, 31.23582656 ], [ 115.03599444, 31.23502785 ], [ 115.03583496, 31.23461849 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249088", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.055", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03583496, 31.23461849 ], [ 115.03561572, 31.23415926 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249089", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.016", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05283794, 31.25815146 ], [ 115.05280806, 31.2580116 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249090", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.613", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05099096, 31.27353827 ], [ 115.05168954, 31.26805911 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249091", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.108", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05168954, 31.26805911 ], [ 115.05282768, 31.25913084 ], [ 115.05288762, 31.25836121 ], [ 115.05283794, 31.25815146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249092", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.199", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04750562, 31.29764508 ], [ 115.04753568, 31.29732513 ], [ 115.04756556, 31.29712515 ], [ 115.04761542, 31.2967652 ], [ 115.0476255, 31.2967152 ], [ 115.04768544, 31.29586542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249093", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.308", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04768544, 31.29586542 ], [ 115.04768544, 31.29519569 ], [ 115.04766564, 31.29492578 ], [ 115.04766564, 31.29486584 ], [ 115.0475958, 31.29450606 ], [ 115.04738628, 31.29382665 ], [ 115.04721672, 31.29329714 ], [ 115.04717676, 31.29314724 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249094", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.273", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04717676, 31.29314724 ], [ 115.04714688, 31.29302736 ], [ 115.04707704, 31.29280754 ], [ 115.0468974, 31.29237801 ], [ 115.04685762, 31.29222812 ], [ 115.04683764, 31.29204821 ], [ 115.04683764, 31.29188828 ], [ 115.04684754, 31.2918183 ], [ 115.04685762, 31.2917783 ], [ 115.04690748, 31.29157827 ], [ 115.0469874, 31.29135822 ], [ 115.04700738, 31.29127821 ], [ 115.04723688, 31.29078803 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249095", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.199", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04953296, 31.28344695 ], [ 115.04956284, 31.28323698 ], [ 115.04958282, 31.283087 ], [ 115.04956302, 31.28271719 ], [ 115.04943324, 31.28166779 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249096", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.239", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04943324, 31.28166779 ], [ 115.04941344, 31.28152784 ], [ 115.04904426, 31.28036891 ], [ 115.04903436, 31.28004905 ], [ 115.04897442, 31.2795693 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249097", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.503", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04792556, 31.28942741 ], [ 115.04805534, 31.28911731 ], [ 115.04818512, 31.28870723 ], [ 115.0483149, 31.28825718 ], [ 115.04839482, 31.28800716 ], [ 115.0485246, 31.28747711 ], [ 115.04868426, 31.28684711 ], [ 115.0488441, 31.28618709 ], [ 115.04901384, 31.28556704 ], [ 115.04915352, 31.285067 ], [ 115.0491636, 31.28502699 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249098", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.179", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0491636, 31.28502699 ], [ 115.04932326, 31.28443695 ], [ 115.0493832, 31.2842169 ], [ 115.04946312, 31.28386689 ], [ 115.04948292, 31.28370696 ], [ 115.04952288, 31.28346698 ], [ 115.04953296, 31.28344695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249099", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.036", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04723688, 31.29078803 ], [ 115.04738664, 31.29048788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249100", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.129", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04738664, 31.29048788 ], [ 115.04756628, 31.29013773 ], [ 115.04769606, 31.2899076 ], [ 115.04789568, 31.28948744 ], [ 115.04792556, 31.28942741 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249101", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.141", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03695672, 31.3122159 ], [ 115.03704654, 31.31202573 ], [ 115.0372161, 31.31167545 ], [ 115.03731564, 31.31152524 ], [ 115.03742544, 31.31138502 ], [ 115.03756494, 31.3112547 ], [ 115.03769454, 31.31113442 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249102", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.034", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03769454, 31.31113442 ], [ 115.03772442, 31.31111435 ], [ 115.03785402, 31.31102403 ], [ 115.03797372, 31.31094375 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249103", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.770", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03797372, 31.31094375 ], [ 115.03914984, 31.31014091 ], [ 115.03949868, 31.30992009 ], [ 115.0398675, 31.30965923 ], [ 115.04007684, 31.30949871 ], [ 115.04040588, 31.309178 ], [ 115.04066508, 31.3089174 ], [ 115.04106378, 31.30847654 ], [ 115.04122326, 31.30832615 ], [ 115.04162196, 31.3079153 ], [ 115.0418214, 31.30770483 ], [ 115.04211048, 31.30742417 ], [ 115.04236968, 31.30715363 ], [ 115.042599, 31.30693308 ], [ 115.04289798, 31.30663244 ], [ 115.04305746, 31.30647206 ], [ 115.04327688, 31.30622159 ], [ 115.04346624, 31.30594119 ], [ 115.04357586, 31.305771 ], [ 115.04360592, 31.30570094 ], [ 115.04386512, 31.30518051 ], [ 115.04408454, 31.30463016 ], [ 115.0442739, 31.30413984 ], [ 115.0444035, 31.3037996 ], [ 115.04456298, 31.30344927 ], [ 115.04474244, 31.30304895 ], [ 115.04501154, 31.30253843 ], [ 115.04524086, 31.30210796 ], [ 115.0453206, 31.30195784 ], [ 115.0455798, 31.30152732 ], [ 115.04587896, 31.30100672 ], [ 115.04616804, 31.30051622 ], [ 115.0464177, 31.30007594 ], [ 115.0465275, 31.29989585 ], [ 115.04696652, 31.29913539 ], [ 115.04715624, 31.29884519 ], [ 115.04727594, 31.29860507 ], [ 115.04734596, 31.29844505 ], [ 115.04737584, 31.298355 ], [ 115.0474257, 31.29818499 ], [ 115.04748564, 31.29783503 ], [ 115.04750562, 31.29764508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249104", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.798", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04833884, 31.34141649 ], [ 115.04807964, 31.34108718 ], [ 115.04773062, 31.34064812 ], [ 115.0471224, 31.33988969 ], [ 115.04669364, 31.33930086 ], [ 115.04626488, 31.33865201 ], [ 115.04605536, 31.33834259 ], [ 115.04577618, 31.3379433 ], [ 115.04551698, 31.337604 ], [ 115.04544714, 31.33742423 ], [ 115.04541726, 31.3373543 ], [ 115.04530746, 31.3371846 ], [ 115.04508822, 31.33684521 ], [ 115.04470932, 31.33623623 ], [ 115.04404116, 31.33527804 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249105", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.746", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05620826, 31.35109761 ], [ 115.0560189, 31.35058817 ], [ 115.0556499, 31.34956928 ], [ 115.0555401, 31.34923961 ], [ 115.05543048, 31.3489899 ], [ 115.05532068, 31.34878016 ], [ 115.0551711, 31.34853054 ], [ 115.05426336, 31.34750261 ], [ 115.0531461, 31.34657502 ], [ 115.05258756, 31.34611625 ], [ 115.05200904, 31.3456275 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249106", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.587", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05200904, 31.3456275 ], [ 115.05178944, 31.34542797 ], [ 115.05121092, 31.34494922 ], [ 115.05103146, 31.3447896 ], [ 115.0508718, 31.34463998 ], [ 115.05059244, 31.34435058 ], [ 115.05034314, 31.34404116 ], [ 115.05022344, 31.3438815 ], [ 115.04979468, 31.34330262 ], [ 115.04934594, 31.34272383 ], [ 115.04877768, 31.34198534 ], [ 115.04844846, 31.34154623 ], [ 115.04833884, 31.34141649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249107", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.048", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06038084, 31.36117928 ], [ 115.06034106, 31.36106939 ], [ 115.06021128, 31.36076973 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249108", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.241", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.061139, 31.36323726 ], [ 115.06111902, 31.36313736 ], [ 115.06106916, 31.36286759 ], [ 115.06091958, 31.36238802 ], [ 115.06044078, 31.36131914 ], [ 115.06038084, 31.36117928 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249109", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.456", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06185612, 31.36719393 ], [ 115.06159656, 31.36696434 ], [ 115.06151664, 31.36688447 ], [ 115.06146678, 31.36679456 ], [ 115.0614369, 31.36671468 ], [ 115.06141692, 31.36666473 ], [ 115.06138704, 31.36657482 ], [ 115.06137714, 31.36648491 ], [ 115.06133736, 31.36617518 ], [ 115.0613379, 31.36496603 ], [ 115.06124844, 31.36396676 ], [ 115.06118886, 31.36349709 ], [ 115.061139, 31.36323726 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249110", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.335", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0713189, 31.3756286 ], [ 115.07113962, 31.3746894 ], [ 115.07113962, 31.3746494 ], [ 115.07108976, 31.37446958 ], [ 115.07101992, 31.37428976 ], [ 115.0709301, 31.37413995 ], [ 115.07085018, 31.37403011 ], [ 115.07061078, 31.37376051 ], [ 115.0703712, 31.37357088 ], [ 115.06997178, 31.3733115 ], [ 115.06927302, 31.37289255 ], [ 115.06768578, 31.37194481 ], [ 115.06686714, 31.37144594 ], [ 115.0665975, 31.37127633 ], [ 115.06625802, 31.37102685 ], [ 115.0658289, 31.37067752 ], [ 115.06541958, 31.37032818 ], [ 115.06410198, 31.3691603 ], [ 115.06270446, 31.36792257 ], [ 115.06236516, 31.36763309 ], [ 115.06185612, 31.36719393 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249111", "Name": "麒龙大道", "pyname": "qldd", "kind": "0201", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07144832, 31.37638793 ], [ 115.07139846, 31.37610816 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249112", "Name": "麒龙大道", "pyname": "qldd", "kind": "0201", "width": "55", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07139846, 31.37610816 ], [ 115.0713288, 31.37568854 ], [ 115.0713189, 31.3756286 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249113", "Name": "麒龙大道", "pyname": "qldd", "kind": "0201", "width": "55", "length": "0.237", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07248404, 31.38152315 ], [ 115.07234472, 31.38077385 ], [ 115.072245, 31.38026432 ], [ 115.07212548, 31.37970483 ], [ 115.0720758, 31.37942507 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249114", "Name": "麒龙大道", "pyname": "qldd", "kind": "0201", "width": "55", "length": "0.343", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0720758, 31.37942507 ], [ 115.07206572, 31.37936513 ], [ 115.07184666, 31.37833611 ], [ 115.07167746, 31.37744691 ], [ 115.07145822, 31.37642789 ], [ 115.07144832, 31.37638793 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249115", "Name": "南正街", "pyname": "nzj", "kind": "0201", "width": "55", "length": "0.475", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07833584, 31.38647603 ], [ 115.07815602, 31.38644624 ], [ 115.07643828, 31.38606792 ], [ 115.07559948, 31.38589881 ], [ 115.07484042, 31.38574964 ], [ 115.07450094, 31.38562004 ], [ 115.07436108, 31.3855502 ], [ 115.07421132, 31.38539036 ], [ 115.07389182, 31.38493077 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249116", "Name": "南正街", "pyname": "nzj", "kind": "0201", "width": "55", "length": "0.218", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07389182, 31.38493077 ], [ 115.07351238, 31.38437124 ], [ 115.07334246, 31.38411146 ], [ 115.07314284, 31.38379173 ], [ 115.07283324, 31.38319215 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249117", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.110", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07946444, 31.3867049 ], [ 115.07928462, 31.38667511 ], [ 115.0786755, 31.38655568 ], [ 115.07833584, 31.38647603 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249118", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.157", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08076278, 31.38750356 ], [ 115.08069294, 31.38742364 ], [ 115.08049314, 31.38718388 ], [ 115.08041322, 31.38710396 ], [ 115.08029334, 31.38701409 ], [ 115.08015366, 31.38693422 ], [ 115.07997384, 31.38685439 ], [ 115.07966424, 31.38675471 ], [ 115.0795143, 31.38671489 ], [ 115.07946444, 31.3867049 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249119", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.128", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08160194, 31.38840266 ], [ 115.0814421, 31.38821285 ], [ 115.08126228, 31.38801305 ], [ 115.08089274, 31.38764342 ], [ 115.08076278, 31.38750356 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249120", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.041", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0818615, 31.38869237 ], [ 115.08163182, 31.38844262 ], [ 115.08160194, 31.38840266 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249121", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08268068, 31.39034144 ], [ 115.08258078, 31.38986156 ], [ 115.08255072, 31.38974163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249122", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.046", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08255072, 31.38974163 ], [ 115.08250086, 31.38953166 ], [ 115.0824609, 31.38943172 ], [ 115.08241086, 31.3893518 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249123", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08241086, 31.3893518 ], [ 115.0823709, 31.38925185 ], [ 115.08221124, 31.38905201 ], [ 115.08200136, 31.38884222 ], [ 115.0818615, 31.38869237 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249124", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.322", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08409926, 31.39450965 ], [ 115.08370974, 31.3936101 ], [ 115.08336018, 31.39279052 ], [ 115.08320034, 31.3924307 ], [ 115.08309036, 31.39214085 ], [ 115.08300054, 31.391771 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249167", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.992", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02797292, 31.21465874 ], [ 115.02797292, 31.21461873 ], [ 115.02792306, 31.21369929 ], [ 115.02791316, 31.21340945 ], [ 115.0279632, 31.21273967 ], [ 115.02799308, 31.21234979 ], [ 115.0280829, 31.21179984 ], [ 115.02817272, 31.21128986 ], [ 115.02829242, 31.21067984 ], [ 115.02842202, 31.21007976 ], [ 115.02849186, 31.20964979 ], [ 115.02852174, 31.20948977 ], [ 115.02866142, 31.20895967 ], [ 115.02874116, 31.20860961 ], [ 115.02885096, 31.20806957 ], [ 115.02894078, 31.2075396 ], [ 115.02900054, 31.20699969 ], [ 115.02900072, 31.20683981 ], [ 115.0290207, 31.20649992 ], [ 115.0290207, 31.20607013 ], [ 115.0290108, 31.2058503 ], [ 115.0290108, 31.2058103 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249168", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.047", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0290108, 31.2058103 ], [ 115.0290009, 31.20560046 ], [ 115.028991, 31.20548054 ], [ 115.02898092, 31.20539063 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249169", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.180", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03257642, 31.22689073 ], [ 115.03243692, 31.22653127 ], [ 115.03212786, 31.2258524 ], [ 115.03201842, 31.22556282 ], [ 115.03193868, 31.22537315 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249170", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.224", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03193868, 31.22537315 ], [ 115.03171944, 31.224834 ], [ 115.03139058, 31.22407521 ], [ 115.03115136, 31.22347613 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249171", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.062", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0904736, 31.40225424 ], [ 115.09015356, 31.40190432 ], [ 115.08968376, 31.40143439 ], [ 115.08899382, 31.40072456 ], [ 115.08784488, 31.3995555 ], [ 115.08704586, 31.39871634 ], [ 115.0865964, 31.39824686 ], [ 115.08601716, 31.39766748 ], [ 115.08550776, 31.397108 ], [ 115.0853679, 31.39693817 ], [ 115.08521814, 31.39673832 ], [ 115.08506838, 31.39652849 ], [ 115.08491844, 31.39631865 ], [ 115.08482862, 31.39616876 ], [ 115.08477858, 31.39608884 ], [ 115.08466878, 31.39587896 ], [ 115.0845588, 31.3956491 ], [ 115.0844589, 31.39539921 ], [ 115.08432912, 31.39505937 ], [ 115.08409926, 31.39450965 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249172", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.313", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09195266, 31.40572311 ], [ 115.09196256, 31.40568315 ], [ 115.09210278, 31.40511341 ], [ 115.09219296, 31.40478356 ], [ 115.0922529, 31.40453367 ], [ 115.09226298, 31.40440371 ], [ 115.09226298, 31.40433374 ], [ 115.09225308, 31.40426376 ], [ 115.092243, 31.40421377 ], [ 115.09219314, 31.40411382 ], [ 115.09211304, 31.40397387 ], [ 115.0919631, 31.40379392 ], [ 115.09180326, 31.40361392 ], [ 115.0915833, 31.40338397 ], [ 115.09138332, 31.40317404 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249173", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "1.449", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09604028, 31.41852953 ], [ 115.0960401, 31.41845951 ], [ 115.0960302, 31.41835952 ], [ 115.09600014, 31.41822947 ], [ 115.09592004, 31.41806945 ], [ 115.09582986, 31.41792936 ], [ 115.09551972, 31.41751914 ], [ 115.09510968, 31.41707913 ], [ 115.09485966, 31.41677921 ], [ 115.09477974, 31.41666923 ], [ 115.0947198, 31.41659925 ], [ 115.0943499, 31.41612936 ], [ 115.09396992, 31.41563949 ], [ 115.0938, 31.41539955 ], [ 115.09353018, 31.41495968 ], [ 115.09328016, 31.41452979 ], [ 115.09301034, 31.41397998 ], [ 115.09280046, 31.41349011 ], [ 115.09245072, 31.4127104 ], [ 115.09221078, 31.41219056 ], [ 115.09195104, 31.41155075 ], [ 115.09185114, 31.41126086 ], [ 115.09183116, 31.41115088 ], [ 115.09182108, 31.41097097 ], [ 115.09179138, 31.41035118 ], [ 115.09175142, 31.40978144 ], [ 115.0917516, 31.40918168 ], [ 115.09177176, 31.40858192 ], [ 115.09179192, 31.4079422 ], [ 115.09182216, 31.40732246 ], [ 115.09181226, 31.40671266 ], [ 115.09183242, 31.40640279 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249174", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09183242, 31.40640279 ], [ 115.09187256, 31.40611295 ], [ 115.09195266, 31.40572311 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249175", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.089", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09138332, 31.40317404 ], [ 115.09118334, 31.40297406 ], [ 115.09077348, 31.40256416 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249176", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.045", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09077348, 31.40256416 ], [ 115.09059348, 31.4023842 ], [ 115.0904736, 31.40225424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249177", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.404", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06021128, 31.36076973 ], [ 115.06003164, 31.36035015 ], [ 115.05958272, 31.35933126 ], [ 115.05922362, 31.35850214 ], [ 115.05875472, 31.35743325 ], [ 115.05872484, 31.35736332 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249178", "Name": "G106", "pyname": "g106", "kind": "0201", "width": "55", "length": "0.679", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05872484, 31.35736332 ], [ 115.0584156, 31.35665408 ], [ 115.05799656, 31.3556751 ], [ 115.05775698, 31.35507557 ], [ 115.05751704, 31.35453579 ], [ 115.05724722, 31.35392604 ], [ 115.0570872, 31.35348617 ], [ 115.0567974, 31.35267644 ], [ 115.05665736, 31.35232656 ], [ 115.05638772, 31.35159711 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249179", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.045", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00926318, 31.1735129 ], [ 115.00879482, 31.1735043 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249180", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00879482, 31.1735043 ], [ 115.00856568, 31.17349499 ], [ 115.00846614, 31.17348527 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249328", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80286204, 31.07343686 ], [ 114.80254128, 31.07336634 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249329", "Name": "英联大道", "pyname": "yldd", "kind": "0201", "width": "55", "length": "0.195", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.80254128, 31.07336634 ], [ 114.80220072, 31.07328579 ], [ 114.8012892, 31.07307443 ], [ 114.80055804, 31.07290352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249330", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99471702, 31.17052841 ], [ 114.99491628, 31.17061773 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249331", "Name": "金桥大道", "pyname": "jqdd", "kind": "0202", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99491628, 31.17061773 ], [ 114.9953148, 31.17078644 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249375", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.350", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02760644, 31.20178653 ], [ 115.02776592, 31.20217587 ], [ 115.027965, 31.20260504 ], [ 115.02816426, 31.2030842 ], [ 115.02837342, 31.20363333 ], [ 115.02849294, 31.20400278 ], [ 115.02863244, 31.20442214 ], [ 115.02874188, 31.20477165 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_state_road_pl.249376", "Name": "G106", "pyname": "g106", "kind": "0202", "width": "55", "length": "0.018", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02874188, 31.20477165 ], [ 115.02879174, 31.2049314 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/水系.geojson b/public/mapbox/geojson/水系.geojson new file mode 100644 index 0000000..98feae5 --- /dev/null +++ b/public/mapbox/geojson/水系.geojson @@ -0,0 +1,85 @@ +{ +"type": "FeatureCollection", +"name": "水系", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.1549", "Name": null, "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.42765752, 31.31389202 ], [ 115.42782744, 31.31417187 ], [ 115.42994748, 31.31571132 ], [ 115.43073714, 31.31685072 ], [ 115.43090706, 31.31724047 ], [ 115.43164704, 31.31750048 ], [ 115.4327076, 31.31745084 ], [ 115.43298786, 31.31696129 ], [ 115.43251842, 31.31581203 ], [ 115.43284944, 31.31420333 ], [ 115.43428188, 31.31072636 ], [ 115.43596452, 31.30726941 ], [ 115.43607486, 31.30662996 ], [ 115.43358402, 31.30655927 ], [ 115.43244372, 31.30620921 ], [ 115.43017338, 31.30526925 ], [ 115.42993326, 31.30526916 ], [ 115.4292723, 31.30664792 ], [ 115.42872132, 31.30803675 ], [ 115.42954104, 31.3090362 ], [ 115.42962096, 31.30932605 ], [ 115.42963068, 31.30964577 ], [ 115.42959018, 31.31042522 ], [ 115.42902894, 31.31232359 ], [ 115.42795794, 31.31346245 ], [ 115.42765752, 31.31389202 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.93688", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.24458834, 31.33934708 ], [ 115.24387824, 31.33922697 ], [ 115.24270806, 31.33923669 ], [ 115.24120776, 31.33924637 ], [ 115.2403776, 31.33954602 ], [ 115.23971736, 31.33997568 ], [ 115.23921696, 31.34083514 ], [ 115.24039704, 31.34197485 ], [ 115.24156704, 31.34254487 ], [ 115.242237, 31.34311475 ], [ 115.24241682, 31.34411433 ], [ 115.2417564, 31.34527362 ], [ 115.24040622, 31.34557319 ], [ 115.2396459, 31.34589287 ], [ 115.23918582, 31.34634251 ], [ 115.2390555, 31.34706215 ], [ 115.23855528, 31.34774174 ], [ 115.23806514, 31.34837133 ], [ 115.23779496, 31.34915087 ], [ 115.2374346, 31.34977052 ], [ 115.23716442, 31.35067002 ], [ 115.2367542, 31.35156948 ], [ 115.23649392, 31.35231909 ], [ 115.2362637, 31.35314862 ], [ 115.23633354, 31.35403823 ], [ 115.23635316, 31.35532761 ], [ 115.23620304, 31.35675713 ], [ 115.2353628, 31.35747668 ], [ 115.2337023, 31.35778605 ], [ 115.23137184, 31.35779532 ], [ 115.22904138, 31.35780482 ], [ 115.2277011, 31.35810438 ], [ 115.2263907, 31.35852387 ], [ 115.22554056, 31.35898346 ], [ 115.22472012, 31.35999281 ], [ 115.22473002, 31.36099239 ], [ 115.22489994, 31.36170231 ], [ 115.22625048, 31.36256262 ], [ 115.22792088, 31.36341299 ], [ 115.22815092, 31.36375301 ], [ 115.22783088, 31.36415283 ], [ 115.22725074, 31.36447256 ], [ 115.22585034, 31.36501197 ], [ 115.22435994, 31.36537143 ], [ 115.22293956, 31.3655909 ], [ 115.22259954, 31.36573076 ], [ 115.22193912, 31.36603032 ], [ 115.22194902, 31.36631018 ], [ 115.2222795, 31.36674042 ], [ 115.22361978, 31.36687088 ], [ 115.22612052, 31.36671176 ], [ 115.22761092, 31.36627233 ], [ 115.2289413, 31.36599284 ], [ 115.23010158, 31.36540334 ], [ 115.2306018, 31.36483364 ], [ 115.23059172, 31.36425372 ], [ 115.23013164, 31.36334378 ], [ 115.22941128, 31.36254368 ], [ 115.22905128, 31.36212365 ], [ 115.22840094, 31.36197344 ], [ 115.2277308, 31.36168328 ], [ 115.22740068, 31.3614032 ], [ 115.22723058, 31.36098326 ], [ 115.22789082, 31.36025363 ], [ 115.2293913, 31.36025412 ], [ 115.23122172, 31.36023473 ], [ 115.23339234, 31.36021547 ], [ 115.23522294, 31.36020611 ], [ 115.235883, 31.3597764 ], [ 115.23655332, 31.35963668 ], [ 115.23722346, 31.35991685 ], [ 115.23790368, 31.36048695 ], [ 115.23838374, 31.36072707 ], [ 115.23890394, 31.36047728 ], [ 115.23922398, 31.35961755 ], [ 115.24038426, 31.35845817 ], [ 115.24170456, 31.35759881 ], [ 115.24304502, 31.35757928 ], [ 115.24458546, 31.35757977 ], [ 115.24458618, 31.34848275 ], [ 115.24445622, 31.34826279 ], [ 115.2444564, 31.3476831 ], [ 115.24458654, 31.34760314 ], [ 115.24458834, 31.33934708 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.94212", "Name": "大河铺水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.928253669649138, 31.474340687565444 ], [ 114.92972893, 31.47295111 ], [ 114.929729007686035, 31.472951061482576 ], [ 114.929729022, 31.472951048 ], [ 114.931300101, 31.471969860000101 ], [ 114.932341042, 31.471969233 ], [ 114.933261116, 31.472687625 ], [ 114.933483174886973, 31.473222270968691 ], [ 114.93366768, 31.47282396 ], [ 114.93434646, 31.4717931 ], [ 114.9348456, 31.47150245 ], [ 114.9351849, 31.47165198 ], [ 114.93535482, 31.47222173 ], [ 114.9356943, 31.47294128 ], [ 114.9360237, 31.47308082 ], [ 114.93669258, 31.47292994 ], [ 114.93736128, 31.47192909 ], [ 114.93768078, 31.47077867 ], [ 114.93833958, 31.46991782 ], [ 114.93884862, 31.46991714 ], [ 114.93934776, 31.47020649 ], [ 114.9400269, 31.47249555 ], [ 114.94020564, 31.47549431 ], [ 114.94021518, 31.47635385 ], [ 114.94038438, 31.47692315 ], [ 114.94039392, 31.47779268 ], [ 114.9410619, 31.4783609 ], [ 114.94148076, 31.47816006 ], [ 114.94136178, 31.47688098 ], [ 114.94117314, 31.47529226 ], [ 114.9411735, 31.47451268 ], [ 114.94132416, 31.47276326 ], [ 114.94109502, 31.47102414 ], [ 114.94109484, 31.47021414 ], [ 114.94139436, 31.4689338 ], [ 114.94179342, 31.4670033 ], [ 114.942582, 31.46530226 ], [ 114.94274166, 31.46447205 ], [ 114.94232226, 31.46403263 ], [ 114.94137384, 31.46356391 ], [ 114.93964692, 31.46446616 ], [ 114.9388083, 31.46475726 ], [ 114.9381495, 31.46590814 ], [ 114.93783018, 31.46704853 ], [ 114.93732114, 31.46762921 ], [ 114.93615312, 31.46820075 ], [ 114.93515484, 31.46820206 ], [ 114.93398682, 31.46835362 ], [ 114.93332784, 31.46849451 ], [ 114.9324894, 31.46950557 ], [ 114.93200034, 31.47036624 ], [ 114.93166086, 31.47050669 ], [ 114.93083232, 31.47065775 ], [ 114.93047286, 31.47073826 ], [ 114.93028314, 31.4708985 ], [ 114.93033318, 31.47107841 ], [ 114.93066258, 31.471268 ], [ 114.93080244, 31.47145781 ], [ 114.9307524, 31.47165788 ], [ 114.93067266, 31.47194795 ], [ 114.9303033, 31.47257844 ], [ 114.92972424, 31.47288921 ], [ 114.92800722, 31.47353145 ], [ 114.9278175, 31.47361173 ], [ 114.92771778, 31.47371186 ], [ 114.9276978, 31.47384186 ], [ 114.92774766, 31.4739518 ], [ 114.92784756, 31.47411168 ], [ 114.928253669649138, 31.474340687565444 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.94213", "Name": "落衣山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.91028262, 31.41889853 ], [ 114.90615594, 31.41890078 ], [ 114.9058458, 31.41987048 ], [ 114.9058458, 31.42087025 ], [ 114.90618582, 31.42130027 ], [ 114.90652602, 31.42130036 ], [ 114.90718572, 31.42101024 ], [ 114.90819462, 31.42114943 ], [ 114.90885396, 31.42128884 ], [ 114.90986268, 31.42157796 ], [ 114.91019244, 31.42085792 ], [ 114.91018272, 31.41985829 ], [ 114.91028262, 31.41889853 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.94802", "Name": "黑水潭水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84671274, 31.44324681 ], [ 114.84738414, 31.44252825 ], [ 114.84787536, 31.44152952 ], [ 114.84771552, 31.44080966 ], [ 114.8470344, 31.44037878 ], [ 114.8460426, 31.44053714 ], [ 114.84471006, 31.44125471 ], [ 114.84371808, 31.44196278 ], [ 114.84237546, 31.44255039 ], [ 114.84137376, 31.44254882 ], [ 114.84037206, 31.44254724 ], [ 114.8400414, 31.44255674 ], [ 114.83971092, 31.44269615 ], [ 114.83971056, 31.44326585 ], [ 114.8403816, 31.44369668 ], [ 114.84121284, 31.44426768 ], [ 114.84222426, 31.44497891 ], [ 114.8430555, 31.44526007 ], [ 114.84372636, 31.4458308 ], [ 114.84373626, 31.44641054 ], [ 114.84406656, 31.44698078 ], [ 114.84440694, 31.44755102 ], [ 114.84506808, 31.4472722 ], [ 114.8457294, 31.44697335 ], [ 114.8463909, 31.44597494 ], [ 114.84639144, 31.44496545 ], [ 114.8463918, 31.44382601 ], [ 114.84671274, 31.44324681 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.95552", "Name": "大旗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.14087774, 31.47931161 ], [ 115.1411481, 31.47899211 ], [ 115.1414388, 31.47811277 ], [ 115.14176946, 31.47696351 ], [ 115.14176964, 31.47596375 ], [ 115.1412489, 31.47539306 ], [ 115.1412489, 31.47468323 ], [ 115.1412489, 31.47410331 ], [ 115.14207042, 31.47294479 ], [ 115.14257136, 31.47280565 ], [ 115.14373326, 31.47207759 ], [ 115.14539628, 31.47136034 ], [ 115.14656826, 31.47106226 ], [ 115.14807072, 31.47120459 ], [ 115.14852162, 31.47111531 ], [ 115.14874194, 31.4709057 ], [ 115.14906252, 31.47033636 ], [ 115.1493732, 31.4700669 ], [ 115.1496936, 31.46994743 ], [ 115.14997422, 31.47002784 ], [ 115.1502345, 31.47018818 ], [ 115.15073526, 31.47060888 ], [ 115.1512461, 31.47132951 ], [ 115.15191696, 31.47261026 ], [ 115.1524278, 31.47333089 ], [ 115.15343922, 31.47447222 ], [ 115.1547813, 31.47546407 ], [ 115.155783, 31.47603548 ], [ 115.15645404, 31.47660639 ], [ 115.15780602, 31.47774822 ], [ 115.15881762, 31.47844964 ], [ 115.1601597, 31.47946155 ], [ 115.16150232, 31.48030391 ], [ 115.1620533, 31.48053489 ], [ 115.1625042, 31.48059573 ], [ 115.1628147, 31.48049633 ], [ 115.16304528, 31.48035678 ], [ 115.16316552, 31.48003706 ], [ 115.1633259, 31.47914754 ], [ 115.16332608, 31.47842768 ], [ 115.16314572, 31.47799743 ], [ 115.16230422, 31.47743597 ], [ 115.1608014, 31.47672326 ], [ 115.15912848, 31.47573074 ], [ 115.1572356, 31.47468804 ], [ 115.155603, 31.47374574 ], [ 115.15460148, 31.47307434 ], [ 115.15362984, 31.47219302 ], [ 115.15291884, 31.47122214 ], [ 115.15169718, 31.46934065 ], [ 115.15088592, 31.46803965 ], [ 115.1502147, 31.46717871 ], [ 115.14953358, 31.46631777 ], [ 115.14895272, 31.46530703 ], [ 115.14876246, 31.46508675 ], [ 115.14852198, 31.46488641 ], [ 115.14785094, 31.46475537 ], [ 115.14717972, 31.46475429 ], [ 115.14679902, 31.46499365 ], [ 115.14651858, 31.46533317 ], [ 115.14569706, 31.46662166 ], [ 115.14503574, 31.4682003 ], [ 115.14455496, 31.46921937 ], [ 115.14355308, 31.46993766 ], [ 115.1422209, 31.47037547 ], [ 115.14105882, 31.47080355 ], [ 115.13971656, 31.47139134 ], [ 115.13822382, 31.47253875 ], [ 115.13690154, 31.4729766 ], [ 115.13589984, 31.47312497 ], [ 115.1356194, 31.47322451 ], [ 115.13545902, 31.47340424 ], [ 115.1352387, 31.47398379 ], [ 115.13507832, 31.47499337 ], [ 115.1352486, 31.47570351 ], [ 115.13558916, 31.47642392 ], [ 115.13575926, 31.4771441 ], [ 115.13592954, 31.47856412 ], [ 115.13614986, 31.47899436 ], [ 115.1365104, 31.47929483 ], [ 115.1372016, 31.47935589 ], [ 115.14032676, 31.47944072 ], [ 115.14087774, 31.47931161 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.95828", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.26970302, 31.33538541 ], [ 115.25900868, 31.3353896 ], [ 115.258869, 31.33727924 ], [ 115.2580491, 31.33871888 ], [ 115.25721912, 31.33929866 ], [ 115.255719, 31.33929852 ], [ 115.254549, 31.33902843 ], [ 115.2530388, 31.33802849 ], [ 115.2516987, 31.33688855 ], [ 115.25102856, 31.33660851 ], [ 115.24999842, 31.33639845 ], [ 115.24933854, 31.33625841 ], [ 115.24815846, 31.33682816 ], [ 115.2472185, 31.33736798 ], [ 115.2468585, 31.33783787 ], [ 115.2465786, 31.33820777 ], [ 115.24640868, 31.33853766 ], [ 115.2462987, 31.33885761 ], [ 115.24599846, 31.33944734 ], [ 115.24514832, 31.33944716 ], [ 115.24458834, 31.33934708 ], [ 115.24458654, 31.34760314 ], [ 115.24511664, 31.34725344 ], [ 115.2457767, 31.34710364 ], [ 115.24611672, 31.34739357 ], [ 115.24645674, 31.34810331 ], [ 115.24665654, 31.3486731 ], [ 115.24680648, 31.34906294 ], [ 115.24701654, 31.34945282 ], [ 115.24712634, 31.35005258 ], [ 115.24715622, 31.35062228 ], [ 115.24748616, 31.35125205 ], [ 115.2481563, 31.35196211 ], [ 115.24910652, 31.35216236 ], [ 115.2498267, 31.35195266 ], [ 115.2499968, 31.35189272 ], [ 115.25098716, 31.35151314 ], [ 115.2516573, 31.35151337 ], [ 115.2520974, 31.35208343 ], [ 115.2523476, 31.35323327 ], [ 115.25238756, 31.35535286 ], [ 115.25203746, 31.35653253 ], [ 115.25176746, 31.35743226 ], [ 115.25105736, 31.35825185 ], [ 115.25039712, 31.35941141 ], [ 115.2502371, 31.36041113 ], [ 115.25008716, 31.36198077 ], [ 115.24999716, 31.3623207 ], [ 115.24976712, 31.36313048 ], [ 115.2499968, 31.36342019 ], [ 115.25010678, 31.36356005 ], [ 115.25043636, 31.36369977 ], [ 115.2507762, 31.36355969 ], [ 115.2511065, 31.36285008 ], [ 115.2517662, 31.36254998 ], [ 115.2524259, 31.36239977 ], [ 115.2530955, 31.36225955 ], [ 115.25393448, 31.36282866 ], [ 115.25560254, 31.3642467 ], [ 115.25663052, 31.36639455 ], [ 115.2571392, 31.36767327 ], [ 115.25732784, 31.36982153 ], [ 115.25767668, 31.37111033 ], [ 115.2581859, 31.37182952 ], [ 115.25867568, 31.37182929 ], [ 115.2590058, 31.3711097 ], [ 115.25916636, 31.36996049 ], [ 115.25898762, 31.3683818 ], [ 115.25896836, 31.36709282 ], [ 115.25895882, 31.36637336 ], [ 115.25961942, 31.36479426 ], [ 115.25983974, 31.36417466 ], [ 115.25992002, 31.36354511 ], [ 115.25960052, 31.36293572 ], [ 115.25826222, 31.36193717 ], [ 115.25708376, 31.36079867 ], [ 115.2565443, 31.36039925 ], [ 115.25623506, 31.35965999 ], [ 115.25639526, 31.35909033 ], [ 115.25672538, 31.35837074 ], [ 115.25655618, 31.35751146 ], [ 115.256547, 31.35622248 ], [ 115.25620788, 31.35507354 ], [ 115.25619834, 31.35450398 ], [ 115.25618862, 31.35392442 ], [ 115.25685822, 31.35392411 ], [ 115.25752764, 31.35420356 ], [ 115.25853654, 31.35477263 ], [ 115.25903622, 31.35476237 ], [ 115.25952618, 31.35419258 ], [ 115.25951664, 31.35362301 ], [ 115.25851782, 31.35276419 ], [ 115.25750892, 31.35219512 ], [ 115.25616864, 31.35149492 ], [ 115.25531832, 31.35063479 ], [ 115.25480802, 31.3496348 ], [ 115.254468, 31.3486349 ], [ 115.25412816, 31.34777522 ], [ 115.2534582, 31.34720534 ], [ 115.251948, 31.34677518 ], [ 115.25110794, 31.3457855 ], [ 115.25043798, 31.34536551 ], [ 115.25024826, 31.34406609 ], [ 115.25007834, 31.34320646 ], [ 115.25041854, 31.34277675 ], [ 115.25074866, 31.34277684 ], [ 115.25140872, 31.34305683 ], [ 115.25207886, 31.34291706 ], [ 115.25307912, 31.34218761 ], [ 115.25542938, 31.34183801 ], [ 115.25713938, 31.34142828 ], [ 115.2585693, 31.34115846 ], [ 115.26006942, 31.34071872 ], [ 115.26139944, 31.34013894 ], [ 115.26238926, 31.33897929 ], [ 115.26304914, 31.33796954 ], [ 115.2637092, 31.33738971 ], [ 115.26437862, 31.3372494 ], [ 115.26504786, 31.33724882 ], [ 115.2657072, 31.33738814 ], [ 115.26605658, 31.33810755 ], [ 115.26574662, 31.34025689 ], [ 115.26574644, 31.34139642 ], [ 115.26609582, 31.34211579 ], [ 115.26726438, 31.3431143 ], [ 115.26792372, 31.34310372 ], [ 115.2687627, 31.34253321 ], [ 115.2697518, 31.34180264 ], [ 115.2712404, 31.34051186 ], [ 115.27223922, 31.34050097 ], [ 115.27290828, 31.34107013 ], [ 115.27326774, 31.34220935 ], [ 115.27326756, 31.34335887 ], [ 115.27296768, 31.34435873 ], [ 115.27294752, 31.34508845 ], [ 115.27278768, 31.34580831 ], [ 115.27313724, 31.3460879 ], [ 115.27345674, 31.34607764 ], [ 115.27412616, 31.34578716 ], [ 115.27479522, 31.34592648 ], [ 115.27513488, 31.34592621 ], [ 115.27512498, 31.34521647 ], [ 115.27443612, 31.34349779 ], [ 115.27442622, 31.34291801 ], [ 115.27475616, 31.34176821 ], [ 115.2754155, 31.340768 ], [ 115.27574526, 31.34018795 ], [ 115.27574526, 31.33976814 ], [ 115.27522614, 31.33889897 ], [ 115.274637, 31.33790991 ], [ 115.27395786, 31.33724081 ], [ 115.2735084, 31.33692135 ], [ 115.27292898, 31.33719176 ], [ 115.27237962, 31.33762209 ], [ 115.27073118, 31.33922288 ], [ 115.26873318, 31.34037416 ], [ 115.26807402, 31.34038473 ], [ 115.26787422, 31.33994513 ], [ 115.26841386, 31.339085 ], [ 115.26905322, 31.33779498 ], [ 115.269543, 31.33664505 ], [ 115.26970302, 31.33538541 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.95829", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.24458618, 31.34848275 ], [ 115.24458546, 31.35757977 ], [ 115.24503564, 31.35757995 ], [ 115.24637592, 31.35728043 ], [ 115.24720626, 31.35684083 ], [ 115.24786632, 31.35641112 ], [ 115.24802634, 31.35612123 ], [ 115.24785624, 31.35555131 ], [ 115.24685598, 31.35498107 ], [ 115.24617576, 31.35413102 ], [ 115.24550562, 31.35327093 ], [ 115.24532562, 31.35212118 ], [ 115.24519602, 31.35020207 ], [ 115.24479624, 31.34882264 ], [ 115.24458618, 31.34848275 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96469", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.11944622, 31.02604785 ], [ 115.11944748, 31.02208097 ], [ 115.11915714, 31.02286019 ], [ 115.11899658, 31.02443888 ], [ 115.11944622, 31.02604785 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96761", "Name": "虎形地水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.99466932, 31.24505282 ], [ 114.9946695, 31.2428637 ], [ 114.99446034, 31.24301432 ], [ 114.99346404, 31.24330722 ], [ 114.99246756, 31.24386999 ], [ 114.9914709, 31.24503221 ], [ 114.99096258, 31.24550345 ], [ 114.99087276, 31.24582353 ], [ 114.9909525, 31.2460232 ], [ 114.99115176, 31.24617251 ], [ 114.99129126, 31.24629207 ], [ 114.99149052, 31.24632146 ], [ 114.9916599, 31.246281 ], [ 114.99187914, 31.24615046 ], [ 114.99200874, 31.24593018 ], [ 114.9923376, 31.2456294 ], [ 114.99279606, 31.24522832 ], [ 114.993135, 31.2451074 ], [ 114.99394212, 31.24511501 ], [ 114.99437052, 31.2451137 ], [ 114.99466932, 31.24505282 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96762", "Name": "虎形地水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.99466968, 31.24108445 ], [ 114.99466986, 31.23885537 ], [ 114.99443082, 31.23885614 ], [ 114.99208956, 31.23757377 ], [ 114.99042582, 31.23656928 ], [ 114.98958882, 31.2364319 ], [ 114.98909058, 31.23686322 ], [ 114.98893128, 31.23729356 ], [ 114.98876172, 31.23758394 ], [ 114.98910048, 31.23830259 ], [ 114.99010668, 31.23886928 ], [ 114.99127236, 31.23943551 ], [ 114.99193998, 31.23972333 ], [ 114.99294618, 31.24029006 ], [ 114.99466968, 31.24108445 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96763", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.8698629, 31.2305976 ], [ 114.86986326, 31.23374666 ], [ 114.8703237, 31.234127 ], [ 114.87110454, 31.23466758 ], [ 114.87182508, 31.23470826 ], [ 114.87211542, 31.23426866 ], [ 114.87210534, 31.23375881 ], [ 114.87155472, 31.23328842 ], [ 114.87114432, 31.23212837 ], [ 114.87014334, 31.23097776 ], [ 114.8698629, 31.2305976 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96764", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.87302838, 31.19443736 ], [ 114.87376908, 31.19519768 ], [ 114.87427938, 31.19586777 ], [ 114.87493998, 31.19678789 ], [ 114.87549042, 31.19744804 ], [ 114.87581064, 31.19809793 ], [ 114.87588048, 31.19860773 ], [ 114.87556008, 31.19936697 ], [ 114.87493926, 31.20015587 ], [ 114.87431844, 31.20071495 ], [ 114.87397788, 31.20188391 ], [ 114.87398778, 31.20259352 ], [ 114.8741478, 31.20331325 ], [ 114.8746581, 31.20403334 ], [ 114.8749983, 31.20460331 ], [ 114.8753286, 31.20517328 ], [ 114.87599892, 31.20660297 ], [ 114.87566826, 31.20717218 ], [ 114.87566826, 31.20761187 ], [ 114.87633894, 31.20774246 ], [ 114.87666924, 31.20775281 ], [ 114.87699972, 31.20760328 ], [ 114.87766068, 31.20659474 ], [ 114.87800124, 31.20602544 ], [ 114.87765096, 31.20488577 ], [ 114.87681036, 31.20387552 ], [ 114.87614994, 31.20301539 ], [ 114.87614004, 31.20245573 ], [ 114.87667068, 31.20178662 ], [ 114.87729132, 31.20147743 ], [ 114.87767184, 31.20095808 ], [ 114.87786246, 31.19939919 ], [ 114.87792276, 31.19845982 ], [ 114.87782286, 31.19750028 ], [ 114.87780288, 31.19694057 ], [ 114.87782304, 31.19647086 ], [ 114.8781033, 31.19614133 ], [ 114.87855384, 31.19594189 ], [ 114.87895434, 31.1960822 ], [ 114.87943458, 31.19671233 ], [ 114.88028526, 31.1979924 ], [ 114.88094586, 31.19871263 ], [ 114.88229694, 31.20014309 ], [ 114.88279716, 31.20085319 ], [ 114.88313736, 31.20156311 ], [ 114.88353786, 31.20189327 ], [ 114.88413834, 31.2019938 ], [ 114.88512942, 31.2018449 ], [ 114.88613058, 31.20156603 ], [ 114.88696146, 31.2014169 ], [ 114.88847292, 31.20197805 ], [ 114.88963392, 31.20298862 ], [ 114.89047452, 31.20412878 ], [ 114.89148522, 31.20555893 ], [ 114.8921559, 31.20612926 ], [ 114.89415606, 31.20639953 ], [ 114.89564574, 31.20639953 ], [ 114.8963058, 31.2056798 ], [ 114.8963058, 31.20525 ], [ 114.89596578, 31.20425037 ], [ 114.89529582, 31.20354068 ], [ 114.89479596, 31.20296094 ], [ 114.8932962, 31.20297093 ], [ 114.89163606, 31.20269076 ], [ 114.89046498, 31.20225984 ], [ 114.8887935, 31.20082907 ], [ 114.88662162, 31.19911794 ], [ 114.88476996, 31.19768699 ], [ 114.88293828, 31.19626602 ], [ 114.88126698, 31.19498514 ], [ 114.88126698, 31.1946953 ], [ 114.88192776, 31.19440613 ], [ 114.8831289, 31.19444726 ], [ 114.8838597, 31.19434803 ], [ 114.88422024, 31.19407857 ], [ 114.88445046, 31.19375898 ], [ 114.88455072, 31.19329935 ], [ 114.88454082, 31.19294952 ], [ 114.88438062, 31.19275949 ], [ 114.8839902, 31.19264919 ], [ 114.8835798, 31.19268875 ], [ 114.88241862, 31.19268762 ], [ 114.88091706, 31.19211648 ], [ 114.87891546, 31.19055543 ], [ 114.87790458, 31.1894051 ], [ 114.87778452, 31.18915517 ], [ 114.87500136, 31.19026176 ], [ 114.87295908, 31.19106929 ], [ 114.87308922, 31.1911394 ], [ 114.87292884, 31.19171886 ], [ 114.87259854, 31.1919984 ], [ 114.87192786, 31.19214767 ], [ 114.87126708, 31.19214699 ], [ 114.87089682, 31.19183681 ], [ 114.87066642, 31.19261612 ], [ 114.87302838, 31.19443736 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96765", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.87295908, 31.19106929 ], [ 114.87500136, 31.19026176 ], [ 114.87778452, 31.18915517 ], [ 114.87706416, 31.18768529 ], [ 114.87706416, 31.18692573 ], [ 114.87738474, 31.18596665 ], [ 114.8785263, 31.18405887 ], [ 114.87906702, 31.18343976 ], [ 114.87933738, 31.18328015 ], [ 114.87969774, 31.18323051 ], [ 114.88025826, 31.18328105 ], [ 114.88052862, 31.18352117 ], [ 114.88064868, 31.18398102 ], [ 114.8806584, 31.18478054 ], [ 114.88097862, 31.18535051 ], [ 114.8816493, 31.18575092 ], [ 114.88262022, 31.18603172 ], [ 114.88385142, 31.18601295 ], [ 114.88509288, 31.18559441 ], [ 114.88609404, 31.18537553 ], [ 114.88731534, 31.1850369 ], [ 114.88753566, 31.18482725 ], [ 114.88761576, 31.18456746 ], [ 114.88754574, 31.18420764 ], [ 114.88726548, 31.18400748 ], [ 114.88665492, 31.18390695 ], [ 114.88572396, 31.18397598 ], [ 114.88484286, 31.18434489 ], [ 114.88423212, 31.18467411 ], [ 114.88349142, 31.18479332 ], [ 114.8827707, 31.18440285 ], [ 114.88230036, 31.18372277 ], [ 114.88216032, 31.18285314 ], [ 114.88177008, 31.18235306 ], [ 114.88131972, 31.18193285 ], [ 114.880509, 31.18136243 ], [ 114.879528, 31.18095158 ], [ 114.87885714, 31.18095086 ], [ 114.87753558, 31.18151916 ], [ 114.87587364, 31.18252689 ], [ 114.87499254, 31.18284581 ], [ 114.87388122, 31.18325445 ], [ 114.87137832, 31.18412133 ], [ 114.8698665, 31.1846495 ], [ 114.86986632, 31.18885749 ], [ 114.87001644, 31.1889276 ], [ 114.87011652, 31.18905765 ], [ 114.87024666, 31.18929768 ], [ 114.87017646, 31.18986729 ], [ 114.8700861, 31.19086661 ], [ 114.87019608, 31.19190611 ], [ 114.87066642, 31.19261612 ], [ 114.87089682, 31.19183681 ], [ 114.8707566, 31.19172674 ], [ 114.87075678, 31.19114709 ], [ 114.87142764, 31.19071802 ], [ 114.87208824, 31.19057874 ], [ 114.87258882, 31.19085905 ], [ 114.87295908, 31.19106929 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96766", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86986704, 31.17263517 ], [ 114.86986704, 31.17342479 ], [ 114.87049776, 31.17409515 ], [ 114.87116862, 31.17452567 ], [ 114.87150882, 31.17552557 ], [ 114.8718393, 31.17638552 ], [ 114.87150882, 31.1771048 ], [ 114.87118842, 31.17810398 ], [ 114.87036744, 31.17882276 ], [ 114.86986686, 31.17904214 ], [ 114.8698665, 31.18256046 ], [ 114.87004686, 31.18241075 ], [ 114.87136842, 31.18154256 ], [ 114.87270006, 31.18010468 ], [ 114.87352104, 31.17910599 ], [ 114.8748426, 31.17751817 ], [ 114.8749929, 31.1769486 ], [ 114.87533328, 31.17565958 ], [ 114.87565386, 31.17422061 ], [ 114.87632454, 31.17365159 ], [ 114.8774859, 31.17365285 ], [ 114.87865734, 31.17364407 ], [ 114.8796585, 31.17306542 ], [ 114.87968856, 31.17281558 ], [ 114.8798187, 31.17191616 ], [ 114.87990888, 31.1713565 ], [ 114.87962862, 31.17077649 ], [ 114.87863736, 31.17077541 ], [ 114.877476, 31.17120399 ], [ 114.87597426, 31.17164216 ], [ 114.87499308, 31.17188102 ], [ 114.87415212, 31.17208001 ], [ 114.87265038, 31.17236828 ], [ 114.87148902, 31.17237701 ], [ 114.87048786, 31.17223602 ], [ 114.86986704, 31.17263517 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.96924", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.770796819119525, 30.977477299183043 ], [ 114.77048606, 30.97708326 ], [ 114.76925299, 30.97501536 ], [ 114.76865453, 30.97351072 ], [ 114.76706544, 30.96882515 ], [ 114.766406, 30.96708465 ], [ 114.76569347, 30.96594077 ], [ 114.765467966792315, 30.965732077444258 ], [ 114.76431522, 30.9655089 ], [ 114.7629744, 30.96522842 ], [ 114.76148364, 30.96421835 ], [ 114.760993325961806, 30.963364743862353 ], [ 114.76082297, 30.96365783 ], [ 114.7606658, 30.9644103 ], [ 114.759882586338037, 30.965423774922126 ], [ 114.7600026, 30.96541679 ], [ 114.76046286, 30.96554693 ], [ 114.76144332, 30.96588717 ], [ 114.762654, 30.96650741 ], [ 114.76481508, 30.96708809 ], [ 114.76598562, 30.96794813 ], [ 114.76664586, 30.96907772 ], [ 114.7671459, 30.97023719 ], [ 114.76781586, 30.97266575 ], [ 114.76814508, 30.97596335 ], [ 114.76831464, 30.97811178 ], [ 114.76898496, 30.98112048 ], [ 114.76965528, 30.98326973 ], [ 114.77019582, 30.98437947 ], [ 114.77187738, 30.98374124 ], [ 114.77130696, 30.98226168 ], [ 114.77080638, 30.97983254 ], [ 114.770796819119525, 30.977477299183043 ] ] ], [ [ [ 114.75845166287273, 30.967499450472786 ], [ 114.75772268, 30.96865625 ], [ 114.75765359, 30.96920789 ], [ 114.75781709071012, 30.969626296751532 ], [ 114.7590009, 30.97052262 ], [ 114.759252760978484, 30.970809583790754 ], [ 114.76035398, 30.97150395 ], [ 114.76123047, 30.97253286 ], [ 114.76169069, 30.97365748 ], [ 114.76187378, 30.97411133 ], [ 114.76204688, 30.97446323 ], [ 114.762063965555868, 30.974563538689946 ], [ 114.76233198, 30.97410165 ], [ 114.76241226, 30.97320242 ], [ 114.76232244, 30.97238301 ], [ 114.7616622, 30.97152329 ], [ 114.76066194, 30.97066343 ], [ 114.75950148, 30.96952367 ], [ 114.75867114, 30.968514 ], [ 114.75840114, 30.96820404 ], [ 114.75833112, 30.9679542 ], [ 114.75840114, 30.96762444 ], [ 114.75845166287273, 30.967499450472786 ] ] ], [ [ [ 114.761586759117264, 30.975516569037783 ], [ 114.76117915, 30.97590585 ], [ 114.76081383, 30.97678712 ], [ 114.76037139, 30.97845288 ], [ 114.7600501, 30.97953207 ], [ 114.75965077, 30.98038635 ], [ 114.75921642, 30.98147148 ], [ 114.75921634, 30.98236395 ], [ 114.75912923, 30.98307749 ], [ 114.75931225, 30.98408899 ], [ 114.75965042, 30.98452892 ], [ 114.759723375868163, 30.984616907958639 ], [ 114.7600305, 30.9847541 ], [ 114.7611807, 30.98470446 ], [ 114.76200096, 30.98470469 ], [ 114.76236114, 30.98473479 ], [ 114.76274112, 30.98483483 ], [ 114.76312128, 30.98507477 ], [ 114.763285879516729, 30.985231856427312 ], [ 114.76367915, 30.9853879 ], [ 114.763804266530983, 30.985483950098931 ], [ 114.76484172, 30.98482547 ], [ 114.7646718, 30.98456559 ], [ 114.76445166, 30.98434568 ], [ 114.76407168, 30.98412572 ], [ 114.76367154, 30.98398572 ], [ 114.76267128, 30.9838455 ], [ 114.76101096, 30.98342529 ], [ 114.76052082, 30.98325528 ], [ 114.76028088, 30.98293542 ], [ 114.76001088, 30.9823358 ], [ 114.76001106, 30.98169626 ], [ 114.76101114, 30.97739903 ], [ 114.761586759117264, 30.975516569037783 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97020", "Name": "吴河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.28804628, 31.24922013 ], [ 115.28871534, 31.24906943 ], [ 115.28904492, 31.24906907 ], [ 115.2900036, 31.24916798 ], [ 115.2920709, 31.24915574 ], [ 115.29350892, 31.24940414 ], [ 115.29454752, 31.24947299 ], [ 115.29521676, 31.24946228 ], [ 115.29587574, 31.24946151 ], [ 115.29638478, 31.24932071 ], [ 115.29654444, 31.24888065 ], [ 115.29619524, 31.24846139 ], [ 115.29503658, 31.24774278 ], [ 115.29351846, 31.24660464 ], [ 115.29250956, 31.24604588 ], [ 115.29150066, 31.24475721 ], [ 115.29032202, 31.24331879 ], [ 115.28930304, 31.24190016 ], [ 115.2883044, 31.24119137 ], [ 115.28745534, 31.24090238 ], [ 115.2869661, 31.24090292 ], [ 115.28629704, 31.24135355 ], [ 115.28630712, 31.24177344 ], [ 115.2863172, 31.24249331 ], [ 115.28698644, 31.2433524 ], [ 115.28749602, 31.24420169 ], [ 115.28817534, 31.24535072 ], [ 115.28818542, 31.24621053 ], [ 115.28769636, 31.24707089 ], [ 115.2875367, 31.24808087 ], [ 115.28753688, 31.24865079 ], [ 115.28804628, 31.24922013 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97117", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86986632, 31.18885749 ], [ 114.8698665, 31.1846495 ], [ 114.86972628, 31.18469931 ], [ 114.86888532, 31.1847084 ], [ 114.86872512, 31.18442837 ], [ 114.86872512, 31.18384863 ], [ 114.86938608, 31.18297977 ], [ 114.8698665, 31.18256046 ], [ 114.86986686, 31.17904214 ], [ 114.86910582, 31.17937118 ], [ 114.86855502, 31.18184942 ], [ 114.86871522, 31.18197951 ], [ 114.8688855, 31.18226954 ], [ 114.86854512, 31.18269897 ], [ 114.86788434, 31.18270829 ], [ 114.86782422, 31.18265825 ], [ 114.86627208, 31.18916349 ], [ 114.8665824, 31.18915382 ], [ 114.86741346, 31.18901477 ], [ 114.86825442, 31.18886577 ], [ 114.8692455, 31.18871691 ], [ 114.86986632, 31.18885749 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97118", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86986704, 31.17342479 ], [ 114.86986704, 31.17263517 ], [ 114.86982708, 31.1726651 ], [ 114.86982708, 31.17338478 ], [ 114.86986704, 31.17342479 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97119", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84354222, 31.18695804 ], [ 114.84388314, 31.18462988 ], [ 114.84342216, 31.18449915 ], [ 114.8429214, 31.18391856 ], [ 114.8429214, 31.18335885 ], [ 114.84325206, 31.1832095 ], [ 114.84424404, 31.18292145 ], [ 114.84491526, 31.18292262 ], [ 114.84516582, 31.18302302 ], [ 114.8494446, 31.17958245 ], [ 114.8492241, 31.17932217 ], [ 114.84705996, 31.17847878 ], [ 114.84505602, 31.17847523 ], [ 114.84405414, 31.17819357 ], [ 114.84372366, 31.1776133 ], [ 114.84372366, 31.17733344 ], [ 114.84404424, 31.17675434 ], [ 114.84404442, 31.17618464 ], [ 114.8433831, 31.17561377 ], [ 114.84305244, 31.17590303 ], [ 114.84238122, 31.17618167 ], [ 114.84170982, 31.17619049 ], [ 114.84138924, 31.17605999 ], [ 114.84031716, 31.17559829 ], [ 114.8394852, 31.17799557 ], [ 114.83989614, 31.17834612 ], [ 114.8403969, 31.17892671 ], [ 114.84056718, 31.17934679 ], [ 114.84023652, 31.1799159 ], [ 114.8395752, 31.17992472 ], [ 114.83897418, 31.17951387 ], [ 114.83661924, 31.18160858 ], [ 114.83691984, 31.18250862 ], [ 114.83659908, 31.18351752 ], [ 114.83593758, 31.18480565 ], [ 114.83561682, 31.1859545 ], [ 114.83527626, 31.18667369 ], [ 114.8352561, 31.18681359 ], [ 114.8353263, 31.18694369 ], [ 114.8355468, 31.18696407 ], [ 114.83576712, 31.18686444 ], [ 114.83640828, 31.18653558 ], [ 114.8378913, 31.18606848 ], [ 114.83843238, 31.18536981 ], [ 114.83876322, 31.1843709 ], [ 114.8389236, 31.18365158 ], [ 114.83942454, 31.18308278 ], [ 114.8397552, 31.18278353 ], [ 114.84008586, 31.18292402 ], [ 114.84042642, 31.18350434 ], [ 114.84160866, 31.184366 ], [ 114.8421096, 31.18519643 ], [ 114.84228978, 31.18628619 ], [ 114.8431014, 31.18679735 ], [ 114.84354222, 31.18695804 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97225", "Name": "碧绿河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.24459626, 31.29352772 ], [ 115.24459752, 31.28765081 ], [ 115.243758, 31.28863082 ], [ 115.24243896, 31.28964111 ], [ 115.24143906, 31.28965124 ], [ 115.24076874, 31.28965074 ], [ 115.24008816, 31.28922036 ], [ 115.23974796, 31.28765067 ], [ 115.23872736, 31.28493083 ], [ 115.23770658, 31.28351054 ], [ 115.23635568, 31.28207 ], [ 115.23568518, 31.28164965 ], [ 115.23452436, 31.28194868 ], [ 115.23403404, 31.28251811 ], [ 115.23437424, 31.28352804 ], [ 115.23571524, 31.28480861 ], [ 115.23673584, 31.28651879 ], [ 115.23757644, 31.28766903 ], [ 115.23816684, 31.28831924 ], [ 115.238277, 31.28892912 ], [ 115.2381969, 31.28944887 ], [ 115.23767652, 31.28959845 ], [ 115.23661578, 31.28952767 ], [ 115.2355851, 31.28910705 ], [ 115.23375378, 31.28840591 ], [ 115.23174228, 31.28769464 ], [ 115.23040146, 31.28669397 ], [ 115.22872026, 31.28528322 ], [ 115.22738934, 31.2847124 ], [ 115.22655882, 31.28515164 ], [ 115.22706912, 31.28615168 ], [ 115.22807982, 31.28700213 ], [ 115.22942064, 31.28785286 ], [ 115.23058146, 31.2882836 ], [ 115.23142206, 31.28870408 ], [ 115.23209256, 31.28927436 ], [ 115.23243276, 31.28970447 ], [ 115.23244284, 31.29041426 ], [ 115.23194244, 31.29056384 ], [ 115.23110184, 31.2905732 ], [ 115.23061152, 31.29057284 ], [ 115.23044142, 31.2908526 ], [ 115.23145194, 31.29243278 ], [ 115.23247254, 31.29386297 ], [ 115.23247236, 31.29443258 ], [ 115.23232152, 31.29600137 ], [ 115.23199068, 31.29701031 ], [ 115.2318303, 31.29743984 ], [ 115.23132954, 31.2974393 ], [ 115.23015828, 31.29744794 ], [ 115.22849652, 31.29688643 ], [ 115.22664486, 31.29546533 ], [ 115.22546388, 31.29460457 ], [ 115.2244629, 31.29404382 ], [ 115.22380212, 31.29404306 ], [ 115.22313108, 31.294472 ], [ 115.22246976, 31.29578037 ], [ 115.22182842, 31.29706877 ], [ 115.22116746, 31.29750774 ], [ 115.21932516, 31.29751566 ], [ 115.2179937, 31.29751422 ], [ 115.217253, 31.29866325 ], [ 115.21741356, 31.30140294 ], [ 115.21790406, 31.30192337 ], [ 115.21870506, 31.30238408 ], [ 115.21970622, 31.30267505 ], [ 115.22072736, 31.30275609 ], [ 115.22176848, 31.30299711 ], [ 115.22241918, 31.30359768 ], [ 115.2235305, 31.30401875 ], [ 115.2246717, 31.30391993 ], [ 115.22555262, 31.30364088 ], [ 115.22601306, 31.30295148 ], [ 115.22620314, 31.30233179 ], [ 115.22669346, 31.30105248 ], [ 115.22702376, 31.30090286 ], [ 115.22752434, 31.30090335 ], [ 115.2283653, 31.3011842 ], [ 115.22953656, 31.30175529 ], [ 115.23154896, 31.30288713 ], [ 115.23289032, 31.30302848 ], [ 115.2340515, 31.30258973 ], [ 115.2355329, 31.30130147 ], [ 115.2361944, 31.29985314 ], [ 115.23666564, 31.2969852 ], [ 115.23681576, 31.29540584 ], [ 115.23747636, 31.29425672 ], [ 115.23813678, 31.29367743 ], [ 115.2391374, 31.29367815 ], [ 115.2409788, 31.29438929 ], [ 115.24230792, 31.29465857 ], [ 115.2433071, 31.29478785 ], [ 115.24430628, 31.29435747 ], [ 115.24459626, 31.29352772 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97380", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86987658, 31.09290984 ], [ 114.8698764, 31.09696772 ], [ 114.87021678, 31.097138 ], [ 114.87200742, 31.09782839 ], [ 114.87399732, 31.0984682 ], [ 114.8749974, 31.09870818 ], [ 114.87690738, 31.09898831 ], [ 114.88106754, 31.09954865 ], [ 114.88338774, 31.09953911 ], [ 114.8855589, 31.09953038 ], [ 114.8877198, 31.09923162 ], [ 114.88904028, 31.09866237 ], [ 114.89086026, 31.09722332 ], [ 114.89285052, 31.0957844 ], [ 114.8941809, 31.09505531 ], [ 114.89623164, 31.0939767 ], [ 114.89849244, 31.09297806 ], [ 114.8993325, 31.09287834 ], [ 114.90148314, 31.09259925 ], [ 114.90332454, 31.09317039 ], [ 114.90464556, 31.09373123 ], [ 114.905997, 31.09487207 ], [ 114.90715836, 31.09602285 ], [ 114.90836958, 31.09715361 ], [ 114.90975972, 31.09807328 ], [ 114.91051968, 31.09839309 ], [ 114.91210944, 31.09872294 ], [ 114.91482906, 31.09890276 ], [ 114.91743798, 31.09884201 ], [ 114.91936506, 31.09821017 ], [ 114.92065332, 31.09736916 ], [ 114.92130258, 31.0961192 ], [ 114.92130258, 31.09539965 ], [ 114.92129286, 31.09454024 ], [ 114.92129304, 31.09311113 ], [ 114.92133318, 31.09206177 ], [ 114.92145306, 31.09177179 ], [ 114.92195238, 31.09129151 ], [ 114.92511768, 31.09050828 ], [ 114.92749404, 31.09014567 ], [ 114.92862228, 31.0902143 ], [ 114.93022986, 31.09033229 ], [ 114.93621072, 31.09157469 ], [ 114.94080036, 31.09207613 ], [ 114.94661454, 31.09264308 ], [ 114.95288808, 31.09418883 ], [ 114.95365614, 31.09443705 ], [ 114.95866266, 31.09610529 ], [ 114.96396672, 31.09822133 ], [ 114.96590028, 31.09909554 ], [ 114.96741516, 31.10254979 ], [ 114.96876066, 31.10876325 ], [ 114.96912948, 31.11097122 ], [ 114.96997656, 31.11283805 ], [ 114.96999474, 31.1174244 ], [ 114.9700329, 31.12129116 ], [ 114.97037148, 31.12243952 ], [ 114.97138794, 31.12558511 ], [ 114.97189608, 31.12817238 ], [ 114.97257396, 31.12930013 ], [ 114.97425876, 31.13202461 ], [ 114.97492674, 31.13288253 ], [ 114.97559472, 31.13331071 ], [ 114.976881, 31.13384742 ], [ 114.97859604, 31.13429319 ], [ 114.97972284, 31.13438054 ], [ 114.98060052, 31.13428865 ], [ 114.98175666, 31.13400569 ], [ 114.98358042, 31.13284113 ], [ 114.98490576, 31.13169782 ], [ 114.98573286, 31.1306859 ], [ 114.98655006, 31.12939422 ], [ 114.98685912, 31.12872368 ], [ 114.9870186, 31.12807356 ], [ 114.9875766, 31.12675263 ], [ 114.98884218, 31.12531965 ], [ 114.98928066, 31.12506851 ], [ 114.9921801, 31.12436025 ], [ 114.99383412, 31.12363571 ], [ 114.99468102, 31.12334334 ], [ 114.9946812, 31.12182419 ], [ 114.99316668, 31.12248834 ], [ 114.99184152, 31.12349175 ], [ 114.99049638, 31.12391552 ], [ 114.9885036, 31.12469096 ], [ 114.9881148, 31.12503192 ], [ 114.98735754, 31.12597359 ], [ 114.98709834, 31.12651409 ], [ 114.98640084, 31.12769552 ], [ 114.98352066, 31.13077221 ], [ 114.98290272, 31.13127369 ], [ 114.9815574, 31.13203712 ], [ 114.98008248, 31.13229114 ], [ 114.97908528, 31.13229339 ], [ 114.97815774, 31.13211551 ], [ 114.97725036, 31.13172783 ], [ 114.97625334, 31.13101058 ], [ 114.97524624, 31.12986362 ], [ 114.97422942, 31.12801709 ], [ 114.97356162, 31.12657952 ], [ 114.97304394, 31.12429244 ], [ 114.97253616, 31.12229516 ], [ 114.9721875, 31.12113681 ], [ 114.97183974, 31.11828989 ], [ 114.9718203, 31.11512189 ], [ 114.9718104, 31.1135526 ], [ 114.97146156, 31.11225413 ], [ 114.97130208, 31.11139499 ], [ 114.97079376, 31.1102469 ], [ 114.97023558, 31.1066001 ], [ 114.96938832, 31.10137479 ], [ 114.96845142, 31.09818879 ], [ 114.9675147, 31.09697195 ], [ 114.96699648, 31.09654359 ], [ 114.96635856, 31.09626549 ], [ 114.9630399, 31.09497534 ], [ 114.95897298, 31.09375661 ], [ 114.95421558, 31.0924575 ], [ 114.95155248, 31.0917236 ], [ 114.94845054, 31.09123044 ], [ 114.94455066, 31.09080884 ], [ 114.94150848, 31.09051544 ], [ 114.93692982, 31.08987482 ], [ 114.93257634, 31.08933018 ], [ 114.93073926, 31.08906252 ], [ 114.92844282, 31.08887537 ], [ 114.9261462, 31.08908795 ], [ 114.92126352, 31.09016309 ], [ 114.92006526, 31.09057425 ], [ 114.91944606, 31.09153433 ], [ 114.91929612, 31.0926938 ], [ 114.9191262, 31.09426299 ], [ 114.91906608, 31.09514247 ], [ 114.91897608, 31.09598204 ], [ 114.91849674, 31.09665218 ], [ 114.91771788, 31.09689297 ], [ 114.91490898, 31.09698369 ], [ 114.91230924, 31.09697375 ], [ 114.91080948, 31.09665393 ], [ 114.90932934, 31.09589411 ], [ 114.90614604, 31.09330206 ], [ 114.90514506, 31.09244139 ], [ 114.90397398, 31.09173066 ], [ 114.90197346, 31.09145013 ], [ 114.90115338, 31.09155989 ], [ 114.89966298, 31.09182935 ], [ 114.8971923, 31.09269807 ], [ 114.89435172, 31.09353674 ], [ 114.89268114, 31.09437563 ], [ 114.89085054, 31.09520453 ], [ 114.88952988, 31.09636323 ], [ 114.88819932, 31.09723218 ], [ 114.88770918, 31.0975218 ], [ 114.88687902, 31.09751163 ], [ 114.88570884, 31.0975214 ], [ 114.88354884, 31.09724123 ], [ 114.8818788, 31.09697114 ], [ 114.88121892, 31.09668125 ], [ 114.87988908, 31.0961115 ], [ 114.87819942, 31.09518203 ], [ 114.87499938, 31.09443206 ], [ 114.87450942, 31.09428212 ], [ 114.8721192, 31.09350195 ], [ 114.87047742, 31.09308039 ], [ 114.86987658, 31.09290984 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97381", "Name": null, "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.16937714, 31.09003371 ], [ 115.16982804, 31.09045428 ], [ 115.17005844, 31.0906346 ], [ 115.17025896, 31.09071492 ], [ 115.17044922, 31.09074525 ], [ 115.17082002, 31.09080591 ], [ 115.17093018, 31.09078616 ], [ 115.17103044, 31.09066641 ], [ 115.17125094, 31.09022708 ], [ 115.17149142, 31.08995771 ], [ 115.17213276, 31.08951914 ], [ 115.17250356, 31.08927996 ], [ 115.17361578, 31.08874239 ], [ 115.17462792, 31.08821459 ], [ 115.17491844, 31.08804521 ], [ 115.17610086, 31.08718791 ], [ 115.1765217, 31.08688889 ], [ 115.17732342, 31.08646062 ], [ 115.17796476, 31.086122 ], [ 115.17814512, 31.08600239 ], [ 115.17820524, 31.08586257 ], [ 115.17819516, 31.08574265 ], [ 115.17782454, 31.08543215 ], [ 115.1733456, 31.08542391 ], [ 115.17187266, 31.08607074 ], [ 115.1707203, 31.08664827 ], [ 115.16988852, 31.08751619 ], [ 115.16934726, 31.08839468 ], [ 115.16918688, 31.08866418 ], [ 115.16918688, 31.08877412 ], [ 115.169247, 31.08884418 ], [ 115.16937732, 31.08892437 ], [ 115.16950746, 31.0889646 ], [ 115.16958774, 31.08899475 ], [ 115.1696277, 31.08906477 ], [ 115.16965776, 31.08918474 ], [ 115.16964786, 31.08928469 ], [ 115.16951754, 31.08961422 ], [ 115.16938722, 31.08984386 ], [ 115.16935716, 31.08993372 ], [ 115.16937714, 31.09003371 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97418", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.773548599000918, 30.98898262973302 ], [ 114.77352538, 30.98891627 ], [ 114.773628289594924, 30.988360947609955 ], [ 114.77363868, 30.98827989 ], [ 114.77363868, 30.98671088 ], [ 114.77297826, 30.98556104 ], [ 114.77197746, 30.98399117 ], [ 114.77187738, 30.98374124 ], [ 114.77019582, 30.98437947 ], [ 114.77064618, 30.9852693 ], [ 114.77164698, 30.98713896 ], [ 114.7716468, 30.98957747 ], [ 114.77147652, 30.99186594 ], [ 114.77115612, 30.99301497 ], [ 114.77049534, 30.99416373 ], [ 114.76949454, 30.99459263 ], [ 114.76783296, 30.99501099 ], [ 114.76580166, 30.99574944 ], [ 114.76570158, 30.99577937 ], [ 114.76415088, 30.99665831 ], [ 114.76365066, 30.99694797 ], [ 114.76262034, 30.99783726 ], [ 114.76071972, 30.99943589 ], [ 114.7602096, 30.99976551 ], [ 114.75979938, 30.99982527 ], [ 114.75948906, 30.9997751 ], [ 114.75908874, 30.9992751 ], [ 114.75895878, 30.99867543 ], [ 114.75886878, 30.99731621 ], [ 114.75852912, 30.99386822 ], [ 114.75752904, 30.99201917 ], [ 114.75653886, 30.99014991 ], [ 114.75619902, 30.98915037 ], [ 114.756188832752599, 30.988968525612574 ], [ 114.75544878, 30.9893921 ], [ 114.7551526, 30.98990369 ], [ 114.75523958, 30.99065528 ], [ 114.75590876, 30.9919338 ], [ 114.75660297, 30.99331128 ], [ 114.75658718690228, 30.993352446555669 ], [ 114.7577589, 30.99525732 ], [ 114.7581288, 30.99617681 ], [ 114.7581288, 30.99679646 ], [ 114.75785862, 30.9973361 ], [ 114.7573485, 30.99800565 ], [ 114.75626832, 30.99914483 ], [ 114.75545814, 31.00006418 ], [ 114.754878, 31.00114346 ], [ 114.75440784, 31.00224276 ], [ 114.75706842, 31.0022433 ], [ 114.7570884, 31.00220334 ], [ 114.75874908, 31.00105449 ], [ 114.76074006, 31.00009577 ], [ 114.76086012, 31.00000586 ], [ 114.7621905, 30.99902679 ], [ 114.76368126, 30.99831777 ], [ 114.76601226, 30.99688934 ], [ 114.76783314, 30.99630047 ], [ 114.76933434, 30.9960216 ], [ 114.77099574, 30.99559325 ], [ 114.77203686, 30.99457472 ], [ 114.77247732, 30.99315596 ], [ 114.7733082, 30.99085803 ], [ 114.773548599000918, 30.98898262973302 ] ] ], [ [ [ 114.763804266530983, 30.985483950098931 ], [ 114.76423555, 30.98581504 ], [ 114.76468687, 30.98639702 ], [ 114.76491298, 30.98720671 ], [ 114.76492994, 30.98787433 ], [ 114.764671676565371, 30.98841897002454 ], [ 114.7648311, 30.988283 ], [ 114.76512126, 30.98791337 ], [ 114.76533132, 30.98742377 ], [ 114.7653315, 30.98671425 ], [ 114.76533168, 30.98556509 ], [ 114.76484172, 30.98482547 ], [ 114.763804266530983, 30.985483950098931 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97447", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.1019396, 31.02272109 ], [ 115.1020296, 31.0226612 ], [ 115.10352072, 31.02165279 ], [ 115.10484138, 31.02136371 ], [ 115.10584182, 31.02120441 ], [ 115.10684226, 31.02134481 ], [ 115.10851284, 31.02162548 ], [ 115.11000342, 31.02205595 ], [ 115.11151398, 31.02218667 ], [ 115.11234432, 31.02246689 ], [ 115.1133444, 31.02346661 ], [ 115.11402426, 31.02475595 ], [ 115.11469404, 31.02632505 ], [ 115.11530406, 31.02677505 ], [ 115.11669474, 31.02685574 ], [ 115.1175951, 31.02689615 ], [ 115.1176851, 31.02659645 ], [ 115.11667548, 31.02473741 ], [ 115.11600552, 31.02373782 ], [ 115.11466542, 31.02230826 ], [ 115.11349542, 31.02073884 ], [ 115.11264546, 31.0196093 ], [ 115.11214542, 31.01873972 ], [ 115.11196578, 31.01746064 ], [ 115.11196614, 31.01673123 ], [ 115.11223632, 31.01649156 ], [ 115.10993646, 31.01338278 ], [ 115.10977626, 31.01345267 ], [ 115.10894592, 31.01345222 ], [ 115.10844588, 31.01318217 ], [ 115.10844588, 31.0130123 ], [ 115.10637498, 31.0130811 ], [ 115.10662464, 31.0141904 ], [ 115.1072946, 31.01490018 ], [ 115.10729442, 31.0154697 ], [ 115.1069643, 31.01575932 ], [ 115.106634, 31.01576913 ], [ 115.10596404, 31.01519921 ], [ 115.10517384, 31.01465921 ], [ 115.10233128, 31.0185846 ], [ 115.10283132, 31.01879471 ], [ 115.10316144, 31.01893475 ], [ 115.10301114, 31.01950422 ], [ 115.10250102, 31.01950395 ], [ 115.10219088, 31.01957375 ], [ 115.1019396, 31.02272109 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97580", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.85319094, 31.20593684 ], [ 114.854193, 31.20624837 ], [ 114.85436328, 31.20581885 ], [ 114.85435338, 31.2049593 ], [ 114.85452384, 31.20466973 ], [ 114.85484442, 31.20438042 ], [ 114.85534536, 31.20409139 ], [ 114.85667772, 31.20394365 ], [ 114.85700838, 31.20395418 ], [ 114.8574492, 31.20383498 ], [ 114.85764954, 31.20364539 ], [ 114.85765962, 31.20349545 ], [ 114.85758942, 31.20328544 ], [ 114.85700838, 31.20279471 ], [ 114.85566558, 31.20136313 ], [ 114.85499436, 31.20050241 ], [ 114.85499436, 31.19979272 ], [ 114.85515456, 31.19951313 ], [ 114.85598598, 31.19850495 ], [ 114.85631664, 31.19750595 ], [ 114.85580562, 31.19664551 ], [ 114.8553045, 31.19592488 ], [ 114.85513422, 31.19535473 ], [ 114.85512414, 31.19464485 ], [ 114.85512396, 31.19377509 ], [ 114.85561518, 31.19191691 ], [ 114.8562765, 31.19147834 ], [ 114.85693782, 31.19161941 ], [ 114.85727838, 31.19204979 ], [ 114.85761894, 31.19277002 ], [ 114.85729818, 31.19405877 ], [ 114.85762884, 31.19491899 ], [ 114.85830006, 31.19520002 ], [ 114.85863072, 31.19519061 ], [ 114.85946232, 31.1949122 ], [ 114.86012364, 31.19448357 ], [ 114.861276, 31.19303633 ], [ 114.86193678, 31.19174762 ], [ 114.86160648, 31.19117756 ], [ 114.86060496, 31.19089631 ], [ 114.8594328, 31.19004468 ], [ 114.85926252, 31.18932477 ], [ 114.85959336, 31.18845582 ], [ 114.86059542, 31.18788788 ], [ 114.86142648, 31.18788891 ], [ 114.86225736, 31.18830962 ], [ 114.86325852, 31.18859055 ], [ 114.86441988, 31.18916151 ], [ 114.86559132, 31.18916277 ], [ 114.86627208, 31.18916349 ], [ 114.86782422, 31.18265825 ], [ 114.86754396, 31.18241804 ], [ 114.86738376, 31.18212801 ], [ 114.86738376, 31.18184816 ], [ 114.86770416, 31.18155863 ], [ 114.86821464, 31.18155917 ], [ 114.86855502, 31.18184942 ], [ 114.86910582, 31.17937118 ], [ 114.86902572, 31.17941105 ], [ 114.86770416, 31.17940965 ], [ 114.8665329, 31.1789786 ], [ 114.86603232, 31.17826841 ], [ 114.86602242, 31.17740877 ], [ 114.86585214, 31.17683889 ], [ 114.86519154, 31.17669822 ], [ 114.8641902, 31.17683709 ], [ 114.86285874, 31.17684569 ], [ 114.86219796, 31.17698492 ], [ 114.86252826, 31.17741503 ], [ 114.86352942, 31.1778459 ], [ 114.86453058, 31.17869658 ], [ 114.86453058, 31.17942626 ], [ 114.86421018, 31.17985569 ], [ 114.86320902, 31.18028441 ], [ 114.86221776, 31.18028337 ], [ 114.86087622, 31.17971219 ], [ 114.85971468, 31.17914091 ], [ 114.85904328, 31.17886988 ], [ 114.85854252, 31.17842924 ], [ 114.85886328, 31.17715047 ], [ 114.85886328, 31.17571124 ], [ 114.85918404, 31.17456239 ], [ 114.85968516, 31.17413354 ], [ 114.86034594, 31.17384441 ], [ 114.861177, 31.17355542 ], [ 114.86216808, 31.17298676 ], [ 114.86333952, 31.17239829 ], [ 114.8639904, 31.17153938 ], [ 114.86466126, 31.1705406 ], [ 114.86465118, 31.16939112 ], [ 114.86432088, 31.16897096 ], [ 114.86331972, 31.16896988 ], [ 114.86298924, 31.16924942 ], [ 114.8614974, 31.17083706 ], [ 114.86000574, 31.17198492 ], [ 114.85834272, 31.17299175 ], [ 114.85752102, 31.17342006 ], [ 114.85668942, 31.17342857 ], [ 114.85601802, 31.17342735 ], [ 114.85550718, 31.17228705 ], [ 114.85550736, 31.17156746 ], [ 114.85499652, 31.16999736 ], [ 114.85433538, 31.16895674 ], [ 114.85294254, 31.16895426 ], [ 114.85316286, 31.16971427 ], [ 114.85383408, 31.17071493 ], [ 114.85384398, 31.17157448 ], [ 114.85334304, 31.17186342 ], [ 114.85234116, 31.17128198 ], [ 114.85066806, 31.1697198 ], [ 114.8495058, 31.16914803 ], [ 114.84916524, 31.16914745 ], [ 114.84884448, 31.1692968 ], [ 114.84901476, 31.17029657 ], [ 114.85001664, 31.17115791 ], [ 114.851349, 31.1725895 ], [ 114.85269144, 31.17402113 ], [ 114.85269144, 31.17487068 ], [ 114.85270134, 31.17558033 ], [ 114.85287162, 31.17588048 ], [ 114.85437444, 31.17730239 ], [ 114.8555466, 31.17844391 ], [ 114.85571688, 31.17916382 ], [ 114.8557167, 31.18001337 ], [ 114.85538604, 31.18074237 ], [ 114.85405332, 31.18130973 ], [ 114.85273068, 31.18188708 ], [ 114.85140804, 31.18218458 ], [ 114.85089702, 31.18218363 ], [ 114.85039626, 31.18103339 ], [ 114.8500557, 31.18032315 ], [ 114.8494446, 31.17958245 ], [ 114.84516582, 31.18302302 ], [ 114.84524592, 31.18306316 ], [ 114.8454162, 31.18334328 ], [ 114.8454162, 31.18363313 ], [ 114.8454162, 31.18392297 ], [ 114.84475488, 31.1843516 ], [ 114.84392328, 31.18463996 ], [ 114.84388314, 31.18462988 ], [ 114.84354222, 31.18695804 ], [ 114.84460422, 31.18735971 ], [ 114.84577638, 31.18768164 ], [ 114.84720918, 31.18825391 ], [ 114.84760986, 31.18849448 ], [ 114.84778032, 31.18887459 ], [ 114.84785034, 31.18937445 ], [ 114.8476599, 31.19005373 ], [ 114.8472891, 31.19079272 ], [ 114.84662796, 31.19266116 ], [ 114.84564642, 31.19509895 ], [ 114.84554616, 31.19531873 ], [ 114.8460372, 31.19556947 ], [ 114.84613728, 31.1953797 ], [ 114.84647802, 31.19495036 ], [ 114.84696888, 31.19495117 ], [ 114.84730944, 31.1952317 ], [ 114.84730962, 31.19566158 ], [ 114.84714942, 31.19653112 ], [ 114.84681876, 31.19710041 ], [ 114.84642798, 31.19709978 ], [ 114.8473098, 31.20281852 ], [ 114.84767052, 31.20239934 ], [ 114.84834192, 31.20211062 ], [ 114.84867258, 31.20211121 ], [ 114.84884286, 31.20253128 ], [ 114.84885276, 31.20325092 ], [ 114.84835164, 31.20425951 ], [ 114.84795096, 31.20477858 ], [ 114.85176822, 31.20557463 ], [ 114.8518584, 31.20539486 ], [ 114.85218924, 31.20496565 ], [ 114.85269018, 31.2049665 ], [ 114.85319112, 31.20539711 ], [ 114.85319094, 31.20593684 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97581", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.83661924, 31.18160858 ], [ 114.83897418, 31.17951387 ], [ 114.8387436, 31.17935354 ], [ 114.83823276, 31.17864299 ], [ 114.83823276, 31.1780633 ], [ 114.83873388, 31.17777435 ], [ 114.83922474, 31.17777521 ], [ 114.8394852, 31.17799557 ], [ 114.84031716, 31.17559829 ], [ 114.84004662, 31.17547787 ], [ 114.83871408, 31.17462597 ], [ 114.83771238, 31.17334487 ], [ 114.83718156, 31.17204459 ], [ 114.83696106, 31.17153447 ], [ 114.83659044, 31.17059433 ], [ 114.83658054, 31.1696748 ], [ 114.83679114, 31.16892555 ], [ 114.83492742, 31.16892222 ], [ 114.83477712, 31.16939171 ], [ 114.83452656, 31.17005091 ], [ 114.83436618, 31.17091019 ], [ 114.83487684, 31.17249027 ], [ 114.83504712, 31.17335013 ], [ 114.83538768, 31.17449012 ], [ 114.83572806, 31.17649968 ], [ 114.8353974, 31.17764849 ], [ 114.83440542, 31.17793658 ], [ 114.83373402, 31.17764552 ], [ 114.83273232, 31.17679421 ], [ 114.83173044, 31.17593286 ], [ 114.83138988, 31.17465293 ], [ 114.83171064, 31.17321428 ], [ 114.83171082, 31.17235473 ], [ 114.83103942, 31.17206367 ], [ 114.82971678, 31.17165156 ], [ 114.82927596, 31.17206057 ], [ 114.82907544, 31.17233003 ], [ 114.82938594, 31.17350997 ], [ 114.82972668, 31.17464996 ], [ 114.82922556, 31.1753687 ], [ 114.82840386, 31.17537725 ], [ 114.8265702, 31.17509415 ], [ 114.82523766, 31.17466202 ], [ 114.82140006, 31.1739656 ], [ 114.81989724, 31.17368318 ], [ 114.81857478, 31.17340112 ], [ 114.81623046, 31.17239766 ], [ 114.8125635, 31.17112214 ], [ 114.80989842, 31.17026804 ], [ 114.80673258, 31.16898338 ], [ 114.80526972, 31.16887097 ], [ 114.80409756, 31.16886899 ], [ 114.8040675, 31.16913881 ], [ 114.80473872, 31.16970968 ], [ 114.80607126, 31.17014168 ], [ 114.80740362, 31.17084359 ], [ 114.8084055, 31.1715549 ], [ 114.81040926, 31.17284766 ], [ 114.81358518, 31.17513186 ], [ 114.81541866, 31.17626442 ], [ 114.81659082, 31.17669615 ], [ 114.81775308, 31.17640824 ], [ 114.81858468, 31.17597989 ], [ 114.8200776, 31.17568253 ], [ 114.82124976, 31.17596436 ], [ 114.82207128, 31.1762556 ], [ 114.82275258, 31.17696638 ], [ 114.82340382, 31.17767715 ], [ 114.82326342, 31.17925611 ], [ 114.82276248, 31.17983499 ], [ 114.82109928, 31.18041194 ], [ 114.82148988, 31.1809023 ], [ 114.82678026, 31.17930228 ], [ 114.82924518, 31.17938661 ], [ 114.8299164, 31.17951774 ], [ 114.83057772, 31.17994871 ], [ 114.8315796, 31.18024031 ], [ 114.83226072, 31.18138092 ], [ 114.83226072, 31.18224047 ], [ 114.83125866, 31.18323816 ], [ 114.83027658, 31.18396604 ], [ 114.82778196, 31.1854014 ], [ 114.82645914, 31.18612856 ], [ 114.82595802, 31.18727709 ], [ 114.82595802, 31.18755695 ], [ 114.8261985, 31.18779729 ], [ 114.82682976, 31.18798841 ], [ 114.82745112, 31.18807958 ], [ 114.82796214, 31.18798058 ], [ 114.8282928, 31.18812111 ], [ 114.82862346, 31.18833167 ], [ 114.82905438, 31.18844241 ], [ 114.82951536, 31.1884133 ], [ 114.82972578, 31.1882738 ], [ 114.82979598, 31.18804403 ], [ 114.82979598, 31.18754426 ], [ 114.8297859, 31.18683447 ], [ 114.82995618, 31.18611492 ], [ 114.83093808, 31.18567667 ], [ 114.832611, 31.18509963 ], [ 114.83377344, 31.18452197 ], [ 114.8349357, 31.18395434 ], [ 114.83525646, 31.18294544 ], [ 114.83525664, 31.1816561 ], [ 114.83525664, 31.18079655 ], [ 114.8355774, 31.18065723 ], [ 114.83607834, 31.18093794 ], [ 114.83658918, 31.18150854 ], [ 114.83661924, 31.18160858 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97582", "Name": "邓家河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.7616883, 31.16882574 ], [ 114.7596579, 31.16882538 ], [ 114.76031724, 31.17240333 ], [ 114.76065708, 31.17397244 ], [ 114.76087668, 31.17594132 ], [ 114.76122642, 31.17730055 ], [ 114.76168632, 31.17816009 ], [ 114.76279638, 31.17923964 ], [ 114.76344636, 31.17985943 ], [ 114.76411632, 31.18046918 ], [ 114.76470654, 31.18087908 ], [ 114.76558692, 31.18138902 ], [ 114.76600704, 31.18151907 ], [ 114.76628712, 31.18138925 ], [ 114.76634724, 31.18112937 ], [ 114.76600704, 31.18026978 ], [ 114.76466694, 31.17855042 ], [ 114.76399698, 31.17712118 ], [ 114.7633173, 31.17497234 ], [ 114.76331748, 31.17411284 ], [ 114.76364778, 31.17354327 ], [ 114.76447794, 31.17297375 ], [ 114.76497816, 31.1725341 ], [ 114.76497834, 31.1721044 ], [ 114.76497834, 31.17181455 ], [ 114.7642983, 31.17153461 ], [ 114.76346814, 31.17153443 ], [ 114.7628079, 31.17153434 ], [ 114.76229796, 31.17067475 ], [ 114.7619682, 31.16953539 ], [ 114.7616883, 31.16882574 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97821", "Name": null, "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84045162, 31.03988436 ], [ 114.84052182, 31.03964465 ], [ 114.84002088, 31.03850439 ], [ 114.83950986, 31.03779389 ], [ 114.83950986, 31.03750404 ], [ 114.83951004, 31.03664459 ], [ 114.83883864, 31.03607367 ], [ 114.83800704, 31.03608218 ], [ 114.83717526, 31.03607066 ], [ 114.83617338, 31.03536924 ], [ 114.83451, 31.03437677 ], [ 114.8336784, 31.03423533 ], [ 114.83284662, 31.0346636 ], [ 114.83251596, 31.03495281 ], [ 114.83168418, 31.03581078 ], [ 114.83120304, 31.03681928 ], [ 114.83120304, 31.03738893 ], [ 114.83186436, 31.0378199 ], [ 114.8323653, 31.03781081 ], [ 114.83319708, 31.03781234 ], [ 114.83418906, 31.03752434 ], [ 114.83551188, 31.03708698 ], [ 114.83651376, 31.03707884 ], [ 114.8368545, 31.03736927 ], [ 114.83785656, 31.03808067 ], [ 114.83852778, 31.03937114 ], [ 114.83951976, 31.0397927 ], [ 114.84019098, 31.03994385 ], [ 114.84045162, 31.03988436 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97974", "Name": "双河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.195628573405671, 30.928776251050028 ], [ 115.19551354, 30.92869784 ], [ 115.192384760256004, 30.928544116360893 ], [ 115.19238762, 30.92855013 ], [ 115.19265816, 30.92886045 ], [ 115.19311914, 30.9290112 ], [ 115.19362008, 30.92915201 ], [ 115.19445168, 30.9295733 ], [ 115.19496252, 30.93057365 ], [ 115.19529318, 30.93143378 ], [ 115.1959743, 30.93287405 ], [ 115.19697546, 30.93501416 ], [ 115.1976762, 30.93614447 ], [ 115.19804664, 30.93673464 ], [ 115.19858736, 30.93777477 ], [ 115.19921826, 30.93824538 ], [ 115.19974908, 30.93824615 ], [ 115.19999946, 30.93792669 ], [ 115.20007974, 30.93721722 ], [ 115.1997795, 30.93576768 ], [ 115.19925876, 30.93485751 ], [ 115.19812728, 30.93371658 ], [ 115.19795718, 30.9330068 ], [ 115.19845812, 30.93242787 ], [ 115.1989488, 30.93227865 ], [ 115.1989488, 30.9318489 ], [ 115.19778726, 30.93099777 ], [ 115.19644536, 30.92970668 ], [ 115.195628573405671, 30.928776251050028 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.97975", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.13695716, 31.00208022 ], [ 115.14089286, 31.00208553 ], [ 115.14091284, 31.00181567 ], [ 115.1400816, 31.00008546 ], [ 115.13875968, 31.00153289 ], [ 115.13808882, 31.00182188 ], [ 115.13709738, 31.00183052 ], [ 115.13695716, 31.00208022 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98079", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86985552, 31.27458591 ], [ 114.86985516, 31.27600503 ], [ 114.87050586, 31.27626567 ], [ 114.87131676, 31.27710618 ], [ 114.87205728, 31.27840628 ], [ 114.87305844, 31.27939695 ], [ 114.87371922, 31.27982751 ], [ 114.8740596, 31.27982792 ], [ 114.87440016, 31.27953852 ], [ 114.87456072, 31.27867925 ], [ 114.874551, 31.27767984 ], [ 114.874461, 31.27707009 ], [ 114.8742009, 31.27639019 ], [ 114.87354012, 31.27595963 ], [ 114.87249882, 31.27562856 ], [ 114.87193812, 31.27514814 ], [ 114.87132738, 31.27475763 ], [ 114.87078666, 31.27461705 ], [ 114.86985552, 31.27458591 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98112", "Name": null, "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.1733456, 31.08542391 ], [ 115.17782454, 31.08543215 ], [ 115.17752394, 31.08517178 ], [ 115.17730362, 31.08505145 ], [ 115.17699294, 31.08505086 ], [ 115.17643188, 31.08522974 ], [ 115.17618132, 31.08522929 ], [ 115.17545988, 31.08517799 ], [ 115.17503904, 31.08501729 ], [ 115.17466842, 31.08493665 ], [ 115.17444792, 31.08497621 ], [ 115.17352596, 31.08534426 ], [ 115.1733456, 31.08542391 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98113", "Name": "大坳水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.1194419, 31.0729302 ], [ 115.11944208, 31.07429978 ], [ 115.11956232, 31.07430986 ], [ 115.11990252, 31.07432012 ], [ 115.12023264, 31.07417036 ], [ 115.12023264, 31.07373053 ], [ 115.11955188, 31.07302025 ], [ 115.1194419, 31.0729302 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98116", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.1019396, 31.02272109 ], [ 115.10219088, 31.01957375 ], [ 115.1018406, 31.01965349 ], [ 115.10150058, 31.01922365 ], [ 115.10150076, 31.01879399 ], [ 115.10183106, 31.01850437 ], [ 115.10216118, 31.01851454 ], [ 115.10233128, 31.0185846 ], [ 115.10517384, 31.01465921 ], [ 115.10513388, 31.01462924 ], [ 115.10478396, 31.01361984 ], [ 115.1044542, 31.01262048 ], [ 115.10444448, 31.01175113 ], [ 115.10493498, 31.01090207 ], [ 115.10526528, 31.0106025 ], [ 115.1057655, 31.01074263 ], [ 115.10626554, 31.01132246 ], [ 115.10627526, 31.01203188 ], [ 115.10627508, 31.01261144 ], [ 115.10637498, 31.0130811 ], [ 115.10844588, 31.0130123 ], [ 115.1084358, 31.01289237 ], [ 115.1087661, 31.01259281 ], [ 115.1092665, 31.01230328 ], [ 115.10992674, 31.01230364 ], [ 115.11026676, 31.01259362 ], [ 115.11043686, 31.01287347 ], [ 115.11043668, 31.01316323 ], [ 115.10993646, 31.01338278 ], [ 115.11223632, 31.01649156 ], [ 115.11278676, 31.01602221 ], [ 115.11461736, 31.01657279 ], [ 115.11611766, 31.01743287 ], [ 115.11779796, 31.0185729 ], [ 115.11862812, 31.01943263 ], [ 115.11912834, 31.01941292 ], [ 115.11944856, 31.01919327 ], [ 115.11945, 31.01489667 ], [ 115.11942012, 31.01482674 ], [ 115.11945, 31.01479677 ], [ 115.11945198, 31.00918122 ], [ 115.11905166, 31.00953074 ], [ 115.11905166, 31.00982049 ], [ 115.11938178, 31.00982067 ], [ 115.1193915, 31.01053014 ], [ 115.11906138, 31.01067981 ], [ 115.11840096, 31.01096925 ], [ 115.11791064, 31.01125874 ], [ 115.11658962, 31.01241713 ], [ 115.11525888, 31.01299596 ], [ 115.11408852, 31.01228591 ], [ 115.11407916, 31.01070713 ], [ 115.1150697, 31.01012811 ], [ 115.1140599, 31.00869873 ], [ 115.1145504, 31.00754988 ], [ 115.11405036, 31.00726985 ], [ 115.11304992, 31.00698954 ], [ 115.11106884, 31.00785777 ], [ 115.11071928, 31.00628885 ], [ 115.1100387, 31.00441923 ], [ 115.10922798, 31.00385867 ], [ 115.10701614, 31.00312706 ], [ 115.10620578, 31.00386627 ], [ 115.10621604, 31.00458614 ], [ 115.1057259, 31.00544559 ], [ 115.10356446, 31.00574385 ], [ 115.10290404, 31.00617324 ], [ 115.10258418, 31.00718277 ], [ 115.10242416, 31.00766256 ], [ 115.10225442, 31.00848228 ], [ 115.1022645, 31.00890222 ], [ 115.10342514, 31.008753 ], [ 115.10359488, 31.00947251 ], [ 115.1034345, 31.0107614 ], [ 115.10178318, 31.01205947 ], [ 115.099632, 31.01278775 ], [ 115.09697052, 31.01351576 ], [ 115.09365906, 31.01496314 ], [ 115.09182972, 31.0152632 ], [ 115.09117056, 31.01526387 ], [ 115.09033212, 31.0149752 ], [ 115.09033248, 31.01426591 ], [ 115.08949368, 31.01454666 ], [ 115.08850494, 31.01512734 ], [ 115.0882164, 31.01355927 ], [ 115.08683886, 31.01327127 ], [ 115.0865091, 31.01372123 ], [ 115.0861797, 31.01371164 ], [ 115.08584022, 31.01371209 ], [ 115.08534126, 31.01343296 ], [ 115.08545124, 31.0131531 ], [ 115.07968152, 31.01184162 ], [ 115.0798608, 31.01246082 ], [ 115.0787025, 31.01304168 ], [ 115.07637636, 31.01291474 ], [ 115.07453928, 31.01320674 ], [ 115.07322078, 31.01436725 ], [ 115.07307048, 31.01536643 ], [ 115.07407812, 31.01664393 ], [ 115.0740774, 31.01793264 ], [ 115.0732485, 31.01823338 ], [ 115.07242968, 31.01851413 ], [ 115.07193018, 31.01909418 ], [ 115.0714404, 31.02024366 ], [ 115.07144976, 31.02138257 ], [ 115.07062032, 31.0226823 ], [ 115.06847328, 31.02383385 ], [ 115.06797414, 31.0245642 ], [ 115.06830318, 31.02868134 ], [ 115.07099796, 31.02784767 ], [ 115.07248494, 31.0272557 ], [ 115.07414202, 31.02710355 ], [ 115.07514048, 31.02710229 ], [ 115.07730678, 31.02722946 ], [ 115.079463, 31.02750648 ], [ 115.08112026, 31.02749442 ], [ 115.08178914, 31.02749357 ], [ 115.08227856, 31.02706337 ], [ 115.08243876, 31.02634391 ], [ 115.08277842, 31.02591389 ], [ 115.08327774, 31.02562355 ], [ 115.08376698, 31.02576282 ], [ 115.08410592, 31.02648165 ], [ 115.08444468, 31.02762011 ], [ 115.0842843, 31.02877917 ], [ 115.08429384, 31.02962832 ], [ 115.0847937, 31.02991817 ], [ 115.0856334, 31.02991812 ], [ 115.08612318, 31.02918836 ], [ 115.08661296, 31.02804873 ], [ 115.08660288, 31.02731901 ], [ 115.0866027, 31.02674922 ], [ 115.08592338, 31.02561027 ], [ 115.08559434, 31.02503126 ], [ 115.08525504, 31.02461208 ], [ 115.08475626, 31.02404328 ], [ 115.08391782, 31.02361475 ], [ 115.08357888, 31.02275601 ], [ 115.08324948, 31.02261656 ], [ 115.08225138, 31.02218825 ], [ 115.08158268, 31.02190934 ], [ 115.08091416, 31.02120086 ], [ 115.08040548, 31.02048221 ], [ 115.08040584, 31.01977292 ], [ 115.08089526, 31.01919287 ], [ 115.08156468, 31.01847273 ], [ 115.08255306, 31.01847152 ], [ 115.08355116, 31.01874998 ], [ 115.08421968, 31.01959832 ], [ 115.0848981, 31.02017688 ], [ 115.08522768, 31.02016649 ], [ 115.08589656, 31.02016563 ], [ 115.08671538, 31.01973507 ], [ 115.08721434, 31.02000417 ], [ 115.08755382, 31.02015357 ], [ 115.08887178, 31.01986224 ], [ 115.08970086, 31.01957172 ], [ 115.08970086, 31.01928183 ], [ 115.0898607, 31.01871213 ], [ 115.0907004, 31.0188519 ], [ 115.09186014, 31.01898177 ], [ 115.0930197, 31.01870178 ], [ 115.09517898, 31.0181018 ], [ 115.09666902, 31.01752242 ], [ 115.09733916, 31.01796243 ], [ 115.0980093, 31.01838242 ], [ 115.09800912, 31.01895198 ], [ 115.09800894, 31.01953154 ], [ 115.09735878, 31.02096047 ], [ 115.09703892, 31.02182019 ], [ 115.09736886, 31.02224999 ], [ 115.09803882, 31.02295964 ], [ 115.09904862, 31.02410912 ], [ 115.0997184, 31.02439892 ], [ 115.10020836, 31.02439887 ], [ 115.10037846, 31.02409917 ], [ 115.10103906, 31.02324021 ], [ 115.1019396, 31.02272109 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98129", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84364374, 31.25222564 ], [ 114.84310266, 31.25222474 ], [ 114.84326304, 31.25241491 ], [ 114.84336312, 31.25256503 ], [ 114.84364374, 31.25222564 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98227", "Name": "尾斗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.7341850024971, 31.167408913007936 ], [ 114.734413053111894, 31.168824653999565 ], [ 114.73832376, 31.16882156 ], [ 114.73832376, 31.16872161 ], [ 114.73832376, 31.16829177 ], [ 114.7389939, 31.16771226 ], [ 114.73899408, 31.16743241 ], [ 114.73865406, 31.16700261 ], [ 114.73815384, 31.16700252 ], [ 114.73765434, 31.16729273 ], [ 114.73699482, 31.16758316 ], [ 114.73665516, 31.16758343 ], [ 114.73616574, 31.16744384 ], [ 114.73499664, 31.16730483 ], [ 114.73445718, 31.1672453 ], [ 114.7341850024971, 31.167408913007936 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98245", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.85009404, 31.08565373 ], [ 114.85187748, 31.08565683 ], [ 114.85169712, 31.08553659 ], [ 114.8502744, 31.08471453 ], [ 114.84897192, 31.08405258 ], [ 114.84759924, 31.08359043 ], [ 114.84548514, 31.0829171 ], [ 114.8435514, 31.08222405 ], [ 114.84038538, 31.08072929 ], [ 114.8381712, 31.0791663 ], [ 114.8356764, 31.077383 ], [ 114.83401338, 31.07616084 ], [ 114.83160876, 31.0743477 ], [ 114.82923438, 31.07266452 ], [ 114.82771158, 31.07178239 ], [ 114.8267097, 31.07122092 ], [ 114.82448544, 31.07007761 ], [ 114.82123932, 31.06820291 ], [ 114.8178528, 31.06646784 ], [ 114.81479694, 31.06537299 ], [ 114.81258258, 31.06462946 ], [ 114.81012774, 31.06392557 ], [ 114.80819418, 31.06319283 ], [ 114.80599008, 31.06196001 ], [ 114.80456754, 31.0611582 ], [ 114.80265378, 31.06023539 ], [ 114.8003892, 31.05897197 ], [ 114.7995576, 31.05868073 ], [ 114.79838544, 31.05782928 ], [ 114.7960017, 31.05547709 ], [ 114.7940388, 31.05356549 ], [ 114.79237668, 31.05168458 ], [ 114.79044708, 31.04900609 ], [ 114.79041738, 31.04812683 ], [ 114.79067784, 31.04731764 ], [ 114.79148946, 31.04481015 ], [ 114.7929822, 31.04022479 ], [ 114.79381326, 31.03778705 ], [ 114.79397346, 31.03635776 ], [ 114.79396338, 31.03519824 ], [ 114.7939632, 31.03463844 ], [ 114.79374288, 31.03363863 ], [ 114.79362282, 31.03305881 ], [ 114.79194126, 31.03034868 ], [ 114.78672684, 31.0250673 ], [ 114.78563604, 31.02446682 ], [ 114.78078234, 31.02221457 ], [ 114.77581866, 31.02065199 ], [ 114.77178558, 31.01908001 ], [ 114.76897344, 31.01865836 ], [ 114.76714212, 31.01866722 ], [ 114.7654809, 31.01866614 ], [ 114.76397988, 31.0181054 ], [ 114.76198818, 31.01639477 ], [ 114.75981612, 31.01467379 ], [ 114.75841428, 31.01349276 ], [ 114.7573629, 31.012632 ], [ 114.75641142, 31.0114413 ], [ 114.7558005, 31.01009117 ], [ 114.75586998, 31.00830156 ], [ 114.75577908, 31.00637183 ], [ 114.75610866, 31.0043624 ], [ 114.75675846, 31.00278303 ], [ 114.75706842, 31.0022433 ], [ 114.75440784, 31.00224276 ], [ 114.75411768, 31.00342203 ], [ 114.75390762, 31.00556093 ], [ 114.754239, 31.00840061 ], [ 114.75420912, 31.00897049 ], [ 114.7542399, 31.01083016 ], [ 114.7547007, 31.01234022 ], [ 114.75597276, 31.01387117 ], [ 114.75782514, 31.01582237 ], [ 114.75882594, 31.01668268 ], [ 114.75949662, 31.01725287 ], [ 114.76082754, 31.01840334 ], [ 114.76198854, 31.01910381 ], [ 114.76332954, 31.0198244 ], [ 114.76548126, 31.02039554 ], [ 114.7683132, 31.0205273 ], [ 114.77075508, 31.02109862 ], [ 114.77385738, 31.02195029 ], [ 114.77796048, 31.02322239 ], [ 114.7806324, 31.02421374 ], [ 114.78478554, 31.02578582 ], [ 114.78694734, 31.02720665 ], [ 114.79012002, 31.0307774 ], [ 114.79197186, 31.03449723 ], [ 114.79231206, 31.03606679 ], [ 114.79231224, 31.03707636 ], [ 114.7913613, 31.04032401 ], [ 114.78974868, 31.04462957 ], [ 114.7888071, 31.04717697 ], [ 114.78835566, 31.04984444 ], [ 114.7886352, 31.05103352 ], [ 114.78951504, 31.05234279 ], [ 114.79438908, 31.05640436 ], [ 114.79757382, 31.05998667 ], [ 114.79982796, 31.06125981 ], [ 114.8026734, 31.06305365 ], [ 114.80455692, 31.0640661 ], [ 114.80719194, 31.06501983 ], [ 114.80963652, 31.06591344 ], [ 114.81276258, 31.0673282 ], [ 114.8152473, 31.06831208 ], [ 114.82074792, 31.07052068 ], [ 114.82406424, 31.07251544 ], [ 114.82573734, 31.07322801 ], [ 114.82775118, 31.07405106 ], [ 114.82910388, 31.07483294 ], [ 114.83049654, 31.0757049 ], [ 114.83155836, 31.07664617 ], [ 114.83352198, 31.07840855 ], [ 114.8357061, 31.08013142 ], [ 114.8406957, 31.08294864 ], [ 114.84293004, 31.08382209 ], [ 114.84501408, 31.08434549 ], [ 114.84690786, 31.08463866 ], [ 114.84857106, 31.08504137 ], [ 114.84956304, 31.08533292 ], [ 114.85006398, 31.08561368 ], [ 114.85009404, 31.08565373 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98323", "Name": "积雨咀水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.10117208, 31.23293022 ], [ 115.10000154, 31.23236984 ], [ 115.09916112, 31.23236934 ], [ 115.0981704, 31.23309839 ], [ 115.09733988, 31.2338075 ], [ 115.09651926, 31.23452664 ], [ 115.09584894, 31.23453623 ], [ 115.09484832, 31.23453564 ], [ 115.0941879, 31.23468518 ], [ 115.0938576, 31.23554454 ], [ 115.09387722, 31.23769343 ], [ 115.09403724, 31.23812327 ], [ 115.09437744, 31.23812349 ], [ 115.09487784, 31.23783392 ], [ 115.0965288, 31.23667553 ], [ 115.09852032, 31.23494762 ], [ 115.09918056, 31.23465813 ], [ 115.09968096, 31.23480839 ], [ 115.09968078, 31.23523814 ], [ 115.09969068, 31.23609768 ], [ 115.09937028, 31.23724689 ], [ 115.09871958, 31.23939537 ], [ 115.0987293, 31.24054481 ], [ 115.09856892, 31.24182402 ], [ 115.09890894, 31.24269378 ], [ 115.09957926, 31.24297404 ], [ 115.10007966, 31.24297431 ], [ 115.10090028, 31.24167548 ], [ 115.10154108, 31.2390972 ], [ 115.10219196, 31.23593928 ], [ 115.10184204, 31.23436986 ], [ 115.10117208, 31.23293022 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98324", "Name": "虎形地水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.99466932, 31.24505282 ], [ 114.99546654, 31.24458059 ], [ 114.99713046, 31.24299618 ], [ 114.99745932, 31.24184562 ], [ 114.99743952, 31.24026635 ], [ 114.99793776, 31.23941517 ], [ 114.99859548, 31.2394032 ], [ 114.99894414, 31.2399819 ], [ 114.9994521, 31.24070006 ], [ 115.00000002, 31.24182789 ], [ 115.00062768, 31.24312547 ], [ 115.00147422, 31.24527197 ], [ 115.00214184, 31.24583969 ], [ 115.0024806, 31.24583865 ], [ 115.00279938, 31.24512801 ], [ 115.00279956, 31.24454823 ], [ 115.0024608, 31.24311984 ], [ 115.00211214, 31.24212134 ], [ 115.00178346, 31.24140264 ], [ 115.00178346, 31.2409728 ], [ 115.00244118, 31.24097082 ], [ 115.00277994, 31.24096979 ], [ 115.00293924, 31.24053945 ], [ 115.00309872, 31.23995922 ], [ 115.00292952, 31.23896018 ], [ 115.00292952, 31.23825044 ], [ 115.00374654, 31.23709844 ], [ 115.00475292, 31.23651569 ], [ 115.00524126, 31.2365142 ], [ 115.00640694, 31.23679055 ], [ 115.00742304, 31.23722723 ], [ 115.0077519, 31.2370763 ], [ 115.00840962, 31.23635468 ], [ 115.00905762, 31.23296438 ], [ 115.00632774, 31.23235296 ], [ 115.0047333, 31.2343668 ], [ 115.003737, 31.23479961 ], [ 115.00257114, 31.2353829 ], [ 115.0020729, 31.23624398 ], [ 115.00108632, 31.23767633 ], [ 115.00009002, 31.23825912 ], [ 115.00000038, 31.23825939 ], [ 114.99859548, 31.23826367 ], [ 114.99758928, 31.23798683 ], [ 114.9964335, 31.23827024 ], [ 114.99543702, 31.23885303 ], [ 114.99466986, 31.23885537 ], [ 114.99466968, 31.24108445 ], [ 114.9947793, 31.24114412 ], [ 114.99528744, 31.24172232 ], [ 114.99528726, 31.24243202 ], [ 114.9946695, 31.2428637 ], [ 114.99466932, 31.24505282 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98340", "Name": "永丰水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.05826998, 31.11177537 ], [ 115.06012704, 31.11015389 ], [ 115.06062636, 31.10972346 ], [ 115.06094586, 31.10900346 ], [ 115.06128534, 31.10829336 ], [ 115.06127544, 31.10757372 ], [ 115.06075632, 31.10642496 ], [ 115.05975804, 31.10585648 ], [ 115.05875958, 31.10529798 ], [ 115.0577613, 31.10500935 ], [ 115.05742182, 31.10529965 ], [ 115.05710232, 31.10630954 ], [ 115.0562736, 31.10673038 ], [ 115.05511548, 31.10731151 ], [ 115.05461634, 31.10789183 ], [ 115.0544565, 31.10846175 ], [ 115.05508524, 31.11107967 ], [ 115.05826998, 31.11177537 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98341", "Name": null, "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.05740202, 31.10171144 ], [ 115.05840048, 31.10142033 ], [ 115.05888972, 31.10098995 ], [ 115.0595586, 31.10127899 ], [ 115.06022748, 31.10140809 ], [ 115.06056696, 31.10141768 ], [ 115.06055706, 31.10054819 ], [ 115.06038732, 31.09997871 ], [ 115.0603776, 31.09882937 ], [ 115.05986838, 31.09769064 ], [ 115.05903984, 31.09741178 ], [ 115.05787164, 31.09740318 ], [ 115.05720276, 31.09770378 ], [ 115.05655368, 31.0985541 ], [ 115.0562142, 31.09956399 ], [ 115.0558947, 31.09999415 ], [ 115.05656358, 31.10114277 ], [ 115.05740202, 31.10171144 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98342", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.9946812, 31.12182419 ], [ 114.99468102, 31.12334334 ], [ 114.99616548, 31.12318899 ], [ 114.99749064, 31.12333497 ], [ 114.99849702, 31.12333196 ], [ 114.99949332, 31.12317909 ], [ 114.99982218, 31.12296822 ], [ 114.99992172, 31.12274804 ], [ 114.9999219, 31.12246823 ], [ 114.9996429, 31.12212924 ], [ 114.99848712, 31.12175291 ], [ 114.99681348, 31.12132811 ], [ 114.99631524, 31.12132959 ], [ 114.99515946, 31.1216229 ], [ 114.9946812, 31.12182419 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98469", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.13695716, 31.00208022 ], [ 115.13677698, 31.00240985 ], [ 115.1374581, 31.00497966 ], [ 115.13780892, 31.00727916 ], [ 115.137819, 31.00842864 ], [ 115.13782908, 31.00927833 ], [ 115.13749878, 31.01014751 ], [ 115.1381799, 31.01215757 ], [ 115.13853054, 31.0138673 ], [ 115.13887128, 31.01558702 ], [ 115.13888136, 31.01615676 ], [ 115.13855088, 31.01745578 ], [ 115.13790018, 31.01846445 ], [ 115.13723922, 31.0184636 ], [ 115.13656818, 31.01832275 ], [ 115.13590722, 31.01861174 ], [ 115.13525634, 31.01948046 ], [ 115.1340948, 31.02019862 ], [ 115.13260278, 31.02078636 ], [ 115.13160126, 31.02107486 ], [ 115.12845702, 31.02238008 ], [ 115.1271351, 31.02252827 ], [ 115.12613358, 31.02253691 ], [ 115.1257932, 31.02225656 ], [ 115.12545246, 31.02095664 ], [ 115.12610316, 31.01837864 ], [ 115.12659384, 31.01708984 ], [ 115.12658376, 31.0165101 ], [ 115.12624302, 31.01537012 ], [ 115.12540278, 31.01437031 ], [ 115.12500264, 31.01447997 ], [ 115.12490256, 31.0145099 ], [ 115.12291158, 31.0149585 ], [ 115.1209305, 31.01568687 ], [ 115.11975996, 31.01554634 ], [ 115.11945, 31.01489667 ], [ 115.11944856, 31.01919327 ], [ 115.11994896, 31.0188438 ], [ 115.1211096, 31.01840478 ], [ 115.12128942, 31.01897444 ], [ 115.12062846, 31.02070271 ], [ 115.11963774, 31.02157148 ], [ 115.11944748, 31.02208097 ], [ 115.11944622, 31.02604785 ], [ 115.11951606, 31.02629769 ], [ 115.12084644, 31.02685794 ], [ 115.12250892, 31.02686015 ], [ 115.1241813, 31.0275621 ], [ 115.12500246, 31.02791306 ], [ 115.1255133, 31.02813365 ], [ 115.12685538, 31.02926499 ], [ 115.12736622, 31.03041519 ], [ 115.12819746, 31.0315658 ], [ 115.12820754, 31.03241544 ], [ 115.1288784, 31.03298591 ], [ 115.12954908, 31.03283678 ], [ 115.12953936, 31.03211727 ], [ 115.12918872, 31.03040763 ], [ 115.12774656, 31.0287564 ], [ 115.12766628, 31.02682712 ], [ 115.12715544, 31.02582686 ], [ 115.12715544, 31.02524712 ], [ 115.12780632, 31.02466824 ], [ 115.12980918, 31.02467094 ], [ 115.132473, 31.02523425 ], [ 115.13347452, 31.02579536 ], [ 115.13413548, 31.02550637 ], [ 115.1339652, 31.0252163 ], [ 115.1341254, 31.02492663 ], [ 115.1329635, 31.02393546 ], [ 115.1332839, 31.02292634 ], [ 115.13560716, 31.02233972 ], [ 115.13793042, 31.0217531 ], [ 115.13876166, 31.02203408 ], [ 115.14009366, 31.02289551 ], [ 115.14094452, 31.02474542 ], [ 115.14195522, 31.02660522 ], [ 115.14229542, 31.02774476 ], [ 115.14263562, 31.02832472 ], [ 115.14412728, 31.02873611 ], [ 115.14562902, 31.02843798 ], [ 115.1462898, 31.02858864 ], [ 115.14696066, 31.02843951 ], [ 115.14861288, 31.02829173 ], [ 115.14944448, 31.02799334 ], [ 115.150266, 31.02770498 ], [ 115.14993552, 31.0272746 ], [ 115.14877326, 31.02699272 ], [ 115.14661056, 31.02729993 ], [ 115.14544938, 31.02672902 ], [ 115.1446086, 31.02573879 ], [ 115.1435979, 31.02401894 ], [ 115.1425872, 31.02216912 ], [ 115.14257694, 31.02058985 ], [ 115.14272706, 31.01943056 ], [ 115.14338802, 31.01871173 ], [ 115.14488004, 31.01799407 ], [ 115.14686274, 31.01697716 ], [ 115.1475237, 31.01668817 ], [ 115.14801438, 31.01610906 ], [ 115.1476839, 31.01581877 ], [ 115.14685266, 31.01553779 ], [ 115.14435912, 31.01583429 ], [ 115.14286692, 31.01571234 ], [ 115.14135474, 31.01457078 ], [ 115.14035304, 31.01342994 ], [ 115.13967192, 31.01170973 ], [ 115.13983212, 31.01027058 ], [ 115.14014226, 31.00770212 ], [ 115.1407728, 31.00396455 ], [ 115.14089286, 31.00208553 ], [ 115.13695716, 31.00208022 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98470", "Name": "巴水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.367049153855945, 31.059062576190318 ], [ 115.36697138, 31.05890321 ], [ 115.36512238, 31.05408717 ], [ 115.364859778643478, 31.05317737494283 ], [ 115.3644426, 31.05262418 ], [ 115.36278588, 31.05072788 ], [ 115.36177788, 31.0495901 ], [ 115.36076988, 31.04873217 ], [ 115.3594224, 31.04716518 ], [ 115.3580652, 31.04488868 ], [ 115.35772608, 31.04373996 ], [ 115.35771636, 31.0428806 ], [ 115.35769674, 31.04130168 ], [ 115.35734754, 31.03958336 ], [ 115.35700842, 31.03829474 ], [ 115.35582096, 31.03629786 ], [ 115.35430392, 31.0344413 ], [ 115.3532961, 31.03273395 ], [ 115.35243804, 31.03058664 ], [ 115.3515897, 31.02915884 ], [ 115.35091128, 31.02772082 ], [ 115.35056208, 31.02601248 ], [ 115.34986386, 31.02329538 ], [ 115.34917572, 31.02085805 ], [ 115.34849712, 31.01929007 ], [ 115.3478187, 31.01756225 ], [ 115.3474596, 31.01599382 ], [ 115.34744016, 31.01370539 ], [ 115.3472607, 31.0121267 ], [ 115.34657184, 31.00983881 ], [ 115.34555322, 31.00783104 ], [ 115.34436558, 31.00569404 ], [ 115.34351742, 31.00210722 ], [ 115.3420704, 31.00210992 ], [ 115.34221008, 31.00267931 ], [ 115.34305788, 31.00684541 ], [ 115.34372658, 31.00827362 ], [ 115.344585, 31.00985145 ], [ 115.34475474, 31.01071086 ], [ 115.3451043, 31.01256954 ], [ 115.3451142, 31.01371875 ], [ 115.34769774, 31.02272888 ], [ 115.35183864, 31.03261614 ], [ 115.35254712, 31.03362441 ], [ 115.35450318, 31.03673945 ], [ 115.35568074, 31.03873637 ], [ 115.35601986, 31.03973519 ], [ 115.35607926, 31.04167379 ], [ 115.35681762, 31.04409105 ], [ 115.35749604, 31.04606871 ], [ 115.35944202, 31.04894394 ], [ 115.36067952, 31.05068094 ], [ 115.36230636, 31.05273717 ], [ 115.36365366, 31.05430416 ], [ 115.36467156, 31.05601151 ], [ 115.36619904, 31.05872793 ], [ 115.3663587, 31.0589276 ], [ 115.36652844, 31.05909729 ], [ 115.36669818, 31.05915705 ], [ 115.36682814, 31.05915687 ], [ 115.36696782, 31.05913671 ], [ 115.367049153855945, 31.059062576190318 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98636", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84069678, 31.26460536 ], [ 114.84594576, 31.26700269 ], [ 114.84649692, 31.2654443 ], [ 114.84581598, 31.26300426 ], [ 114.84480438, 31.26186315 ], [ 114.8434722, 31.26072155 ], [ 114.84263088, 31.26000051 ], [ 114.84247068, 31.25943054 ], [ 114.84247068, 31.2590007 ], [ 114.84279126, 31.25872134 ], [ 114.8441337, 31.25828372 ], [ 114.84561636, 31.25727653 ], [ 114.84611748, 31.25612786 ], [ 114.84627786, 31.25540844 ], [ 114.84627786, 31.25512854 ], [ 114.84726966, 31.25512013 ], [ 114.84761022, 31.25555051 ], [ 114.84828126, 31.25683098 ], [ 114.84829098, 31.25812041 ], [ 114.84930258, 31.2602711 ], [ 114.8503041, 31.26213185 ], [ 114.85164618, 31.2632735 ], [ 114.85347948, 31.26341637 ], [ 114.85415052, 31.26426705 ], [ 114.85398006, 31.26513641 ], [ 114.85416024, 31.26641612 ], [ 114.85449072, 31.26728628 ], [ 114.85484136, 31.26813656 ], [ 114.8553423, 31.26870725 ], [ 114.85651482, 31.26913916 ], [ 114.85834848, 31.26971219 ], [ 114.85935054, 31.27056372 ], [ 114.86052288, 31.27142552 ], [ 114.86094372, 31.27160619 ], [ 114.86135448, 31.27156691 ], [ 114.86185542, 31.27112789 ], [ 114.86218608, 31.27083854 ], [ 114.86301732, 31.27069976 ], [ 114.86368836, 31.27069062 ], [ 114.86451924, 31.27097147 ], [ 114.86562048, 31.27195224 ], [ 114.86637126, 31.27299255 ], [ 114.86683152, 31.27400249 ], [ 114.86730204, 31.27480259 ], [ 114.86802276, 31.27535316 ], [ 114.86858346, 31.27560368 ], [ 114.8691942, 31.27584429 ], [ 114.86985516, 31.27600503 ], [ 114.86985552, 31.27458591 ], [ 114.86922462, 31.27465508 ], [ 114.86857374, 31.27460427 ], [ 114.86826342, 31.27426412 ], [ 114.86820348, 31.27376435 ], [ 114.8679837, 31.27234496 ], [ 114.86734308, 31.27111488 ], [ 114.86625192, 31.27002422 ], [ 114.86484036, 31.26911301 ], [ 114.86366874, 31.26854174 ], [ 114.86366874, 31.26825185 ], [ 114.86383884, 31.26768228 ], [ 114.86432988, 31.2671133 ], [ 114.86499084, 31.26552485 ], [ 114.8656419, 31.26294671 ], [ 114.86563164, 31.26208689 ], [ 114.86530098, 31.26137652 ], [ 114.86463966, 31.26166529 ], [ 114.86397852, 31.262234 ], [ 114.86364804, 31.26353306 ], [ 114.86364822, 31.26482271 ], [ 114.8626665, 31.26625065 ], [ 114.86132388, 31.26696813 ], [ 114.86000124, 31.26697583 ], [ 114.8588289, 31.26669386 ], [ 114.8581575, 31.26569297 ], [ 114.85798722, 31.26412328 ], [ 114.85747656, 31.26297299 ], [ 114.85680552, 31.26226221 ], [ 114.85563354, 31.26169062 ], [ 114.85380042, 31.26068811 ], [ 114.85279872, 31.25953701 ], [ 114.8519475, 31.25769647 ], [ 114.85144692, 31.25582654 ], [ 114.85142712, 31.25409728 ], [ 114.85159758, 31.25338785 ], [ 114.85266948, 31.25258991 ], [ 114.85301022, 31.25239056 ], [ 114.85374138, 31.25224179 ], [ 114.84952398, 31.25223504 ], [ 114.84909324, 31.25283408 ], [ 114.84826164, 31.25325258 ], [ 114.84725994, 31.2534009 ], [ 114.8465988, 31.25340981 ], [ 114.84592758, 31.25311889 ], [ 114.84542682, 31.25254833 ], [ 114.84514638, 31.25222802 ], [ 114.84364374, 31.25222564 ], [ 114.84336312, 31.25256503 ], [ 114.84393408, 31.25340558 ], [ 114.84410418, 31.25426544 ], [ 114.84410418, 31.25484518 ], [ 114.84344286, 31.25542388 ], [ 114.84278172, 31.25585264 ], [ 114.84212058, 31.25585156 ], [ 114.84160956, 31.2557108 ], [ 114.84124902, 31.25547032 ], [ 114.84005598, 31.26187557 ], [ 114.84014616, 31.26187571 ], [ 114.84064692, 31.26244626 ], [ 114.84098748, 31.26302654 ], [ 114.84098748, 31.26359628 ], [ 114.84069678, 31.26460536 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98637", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.82149384, 31.25218946 ], [ 114.81998076, 31.25218671 ], [ 114.81955992, 31.25249586 ], [ 114.81908886, 31.2530148 ], [ 114.81869808, 31.25366388 ], [ 114.81862788, 31.25434352 ], [ 114.81865794, 31.2547734 ], [ 114.819129, 31.25498418 ], [ 114.81962994, 31.25486511 ], [ 114.81999066, 31.25421603 ], [ 114.82042158, 31.25335712 ], [ 114.82088256, 31.25274813 ], [ 114.82149384, 31.25218946 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98638", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.840468, 31.25222055 ], [ 114.83499852, 31.25221178 ], [ 114.8351085, 31.25286167 ], [ 114.83494812, 31.25387097 ], [ 114.83461746, 31.25487996 ], [ 114.83445708, 31.25587928 ], [ 114.8344569, 31.25644902 ], [ 114.83479746, 31.25715926 ], [ 114.83579916, 31.25774057 ], [ 114.83596944, 31.25802074 ], [ 114.83629992, 31.25845107 ], [ 114.8354784, 31.2590295 ], [ 114.83346492, 31.25859647 ], [ 114.83148132, 31.25889315 ], [ 114.8308002, 31.25890206 ], [ 114.83080002, 31.25933186 ], [ 114.83148114, 31.26004263 ], [ 114.8329737, 31.26103457 ], [ 114.8351472, 31.26260736 ], [ 114.83682012, 31.2636096 ], [ 114.8371605, 31.26431984 ], [ 114.83683992, 31.26560873 ], [ 114.83616852, 31.26604748 ], [ 114.83500662, 31.26604559 ], [ 114.83384436, 31.26662348 ], [ 114.83218152, 31.2669207 ], [ 114.8305086, 31.26634826 ], [ 114.8295069, 31.26620673 ], [ 114.8286753, 31.26650526 ], [ 114.8286852, 31.26706502 ], [ 114.82934634, 31.2676358 ], [ 114.83035812, 31.26792731 ], [ 114.83134992, 31.26791889 ], [ 114.83235162, 31.26778056 ], [ 114.83418492, 31.26791345 ], [ 114.83584776, 31.26805605 ], [ 114.83684946, 31.26847748 ], [ 114.83768088, 31.26904853 ], [ 114.83820162, 31.27047872 ], [ 114.83853192, 31.27204854 ], [ 114.83921286, 31.27376889 ], [ 114.84005418, 31.27519958 ], [ 114.840054, 31.27577931 ], [ 114.840054, 31.27633907 ], [ 114.8392224, 31.27749723 ], [ 114.83840088, 31.27849547 ], [ 114.83722872, 31.27907331 ], [ 114.83673786, 31.27908254 ], [ 114.83606664, 31.27865166 ], [ 114.8343939, 31.27750947 ], [ 114.8333922, 31.277228 ], [ 114.8324004, 31.27765622 ], [ 114.83106804, 31.27780404 ], [ 114.83039682, 31.27780296 ], [ 114.8297256, 31.27752198 ], [ 114.82906464, 31.27681125 ], [ 114.8285637, 31.27667054 ], [ 114.82806276, 31.27723947 ], [ 114.827652, 31.27785854 ], [ 114.82698078, 31.27833725 ], [ 114.82598898, 31.27855554 ], [ 114.82537788, 31.27834467 ], [ 114.82471674, 31.27794377 ], [ 114.82406568, 31.27739297 ], [ 114.82306398, 31.2769715 ], [ 114.82156116, 31.27625919 ], [ 114.8205591, 31.27597754 ], [ 114.81989778, 31.27640621 ], [ 114.81990768, 31.27698599 ], [ 114.82023834, 31.27712648 ], [ 114.82124022, 31.27768799 ], [ 114.82190154, 31.2782589 ], [ 114.82291332, 31.27927023 ], [ 114.82324398, 31.27998051 ], [ 114.82325388, 31.28055026 ], [ 114.82291314, 31.28112941 ], [ 114.82259238, 31.28141876 ], [ 114.82226172, 31.28213786 ], [ 114.82275258, 31.28255852 ], [ 114.8232636, 31.28255937 ], [ 114.8242554, 31.2822711 ], [ 114.82492662, 31.28169245 ], [ 114.82578846, 31.28011452 ], [ 114.82608888, 31.27991508 ], [ 114.82808238, 31.27996827 ], [ 114.82924446, 31.27967028 ], [ 114.83057682, 31.2796724 ], [ 114.83140842, 31.27967375 ], [ 114.83224974, 31.28023485 ], [ 114.83240994, 31.28109471 ], [ 114.83224956, 31.28181413 ], [ 114.83158824, 31.28253273 ], [ 114.83058636, 31.2832508 ], [ 114.82960446, 31.28410886 ], [ 114.8292639, 31.2845481 ], [ 114.82960446, 31.28511839 ], [ 114.83026542, 31.2856992 ], [ 114.83093664, 31.28598023 ], [ 114.83226936, 31.28626247 ], [ 114.83294076, 31.28668349 ], [ 114.8332815, 31.28711396 ], [ 114.83295084, 31.28797319 ], [ 114.83177868, 31.2881211 ], [ 114.82978482, 31.28826758 ], [ 114.8284521, 31.28841522 ], [ 114.82778088, 31.28885397 ], [ 114.82720002, 31.29134229 ], [ 114.82702992, 31.29254168 ], [ 114.82693974, 31.29284142 ], [ 114.82659918, 31.29311075 ], [ 114.82626852, 31.29341009 ], [ 114.82568748, 31.293689 ], [ 114.82431462, 31.29361664 ], [ 114.8229819, 31.29373409 ], [ 114.82115796, 31.29488028 ], [ 114.8203764, 31.29512882 ], [ 114.81904386, 31.29501659 ], [ 114.81798168, 31.29502473 ], [ 114.81737058, 31.29533357 ], [ 114.8172201, 31.29598301 ], [ 114.8173002, 31.2969627 ], [ 114.8180112, 31.29977264 ], [ 114.8180211, 31.30106202 ], [ 114.81769026, 31.30263077 ], [ 114.818031, 31.30306119 ], [ 114.81835176, 31.30320173 ], [ 114.81919362, 31.30305332 ], [ 114.81985512, 31.30247475 ], [ 114.8200254, 31.30320474 ], [ 114.82019568, 31.30391475 ], [ 114.81986502, 31.3047738 ], [ 114.8200353, 31.30534386 ], [ 114.82036614, 31.30563434 ], [ 114.82037604, 31.30649402 ], [ 114.82020558, 31.30706349 ], [ 114.81971454, 31.30764237 ], [ 114.81888276, 31.30865042 ], [ 114.81869232, 31.30943976 ], [ 114.81788052, 31.31055783 ], [ 114.8173893, 31.31218629 ], [ 114.81740928, 31.31322597 ], [ 114.8180706, 31.31395691 ], [ 114.81858162, 31.31480759 ], [ 114.81858162, 31.31537738 ], [ 114.81870186, 31.31594744 ], [ 114.81901254, 31.31615795 ], [ 114.81929316, 31.31617847 ], [ 114.81968394, 31.31615921 ], [ 114.8200947, 31.31595005 ], [ 114.82041564, 31.31437118 ], [ 114.82023528, 31.3129413 ], [ 114.820065, 31.31150157 ], [ 114.82023546, 31.3109321 ], [ 114.82089696, 31.31035353 ], [ 114.82155828, 31.31007489 ], [ 114.82255044, 31.30920707 ], [ 114.82289118, 31.30863791 ], [ 114.82305156, 31.30719876 ], [ 114.82287138, 31.30548908 ], [ 114.8227011, 31.30361946 ], [ 114.82302186, 31.30190073 ], [ 114.82301196, 31.30032137 ], [ 114.82267122, 31.29918125 ], [ 114.82317234, 31.29803262 ], [ 114.82366338, 31.29774363 ], [ 114.82449516, 31.29745527 ], [ 114.82532694, 31.29744677 ], [ 114.82649946, 31.29773886 ], [ 114.8270004, 31.29773981 ], [ 114.82716078, 31.29717042 ], [ 114.82733106, 31.296591 ], [ 114.8279922, 31.29601239 ], [ 114.8291244, 31.29527453 ], [ 114.83019648, 31.29502649 ], [ 114.83077752, 31.29517746 ], [ 114.83148906, 31.29545862 ], [ 114.83180964, 31.29540917 ], [ 114.83192988, 31.29505947 ], [ 114.83164926, 31.29427922 ], [ 114.83164908, 31.29371937 ], [ 114.83196966, 31.29328004 ], [ 114.83363286, 31.29198327 ], [ 114.83513568, 31.291556 ], [ 114.83612766, 31.29126777 ], [ 114.83763066, 31.29183023 ], [ 114.8381316, 31.29212102 ], [ 114.83847234, 31.29240155 ], [ 114.83897328, 31.29211251 ], [ 114.83913348, 31.2916829 ], [ 114.83946414, 31.2915335 ], [ 114.8397948, 31.29167403 ], [ 114.840837, 31.29235565 ], [ 114.84104742, 31.29330578 ], [ 114.84064692, 31.29454476 ], [ 114.84013608, 31.29609344 ], [ 114.83998596, 31.29698295 ], [ 114.8401665, 31.29913265 ], [ 114.84001638, 31.30085192 ], [ 114.83968608, 31.30242093 ], [ 114.83957574, 31.30405007 ], [ 114.83965548, 31.30523946 ], [ 114.83999622, 31.30634975 ], [ 114.84030672, 31.30720007 ], [ 114.84078768, 31.30869056 ], [ 114.84105822, 31.30988072 ], [ 114.84172944, 31.31145126 ], [ 114.84240048, 31.31274195 ], [ 114.84307152, 31.31402261 ], [ 114.84375264, 31.31560319 ], [ 114.84410328, 31.31717324 ], [ 114.8441031, 31.31789301 ], [ 114.84391284, 31.31840255 ], [ 114.84400284, 31.31997215 ], [ 114.84443358, 31.32101255 ], [ 114.84637686, 31.32381474 ], [ 114.84671742, 31.32495495 ], [ 114.8472081, 31.32664515 ], [ 114.84746856, 31.32710541 ], [ 114.84792936, 31.32751599 ], [ 114.84863046, 31.32795699 ], [ 114.84917154, 31.32812781 ], [ 114.85140534, 31.32924111 ], [ 114.85236708, 31.32985248 ], [ 114.8534991, 31.33032417 ], [ 114.85417014, 31.33075509 ], [ 114.85500156, 31.33146623 ], [ 114.8555124, 31.33261661 ], [ 114.85578276, 31.33333674 ], [ 114.85584288, 31.33347678 ], [ 114.85635372, 31.33433732 ], [ 114.85668438, 31.33432787 ], [ 114.85718532, 31.33389888 ], [ 114.85732554, 31.33332932 ], [ 114.85750608, 31.3326099 ], [ 114.857496, 31.33160024 ], [ 114.85716552, 31.33060002 ], [ 114.85615374, 31.32959873 ], [ 114.85391994, 31.32854546 ], [ 114.8517963, 31.32747234 ], [ 114.84964242, 31.3264692 ], [ 114.84847044, 31.32567756 ], [ 114.84817992, 31.32493731 ], [ 114.84768924, 31.32386685 ], [ 114.84661734, 31.32146592 ], [ 114.84660744, 31.31945658 ], [ 114.8469381, 31.31873735 ], [ 114.84725868, 31.31816805 ], [ 114.84725886, 31.31758823 ], [ 114.84641736, 31.31659719 ], [ 114.8460867, 31.315307 ], [ 114.84575622, 31.31473662 ], [ 114.84490446, 31.31201579 ], [ 114.84422298, 31.30957512 ], [ 114.8435415, 31.30685451 ], [ 114.84336096, 31.30370501 ], [ 114.84317178, 31.30012697 ], [ 114.84313218, 31.29858788 ], [ 114.84521478, 31.29913013 ], [ 114.84549522, 31.29897056 ], [ 114.8454954, 31.298261 ], [ 114.8446647, 31.29711071 ], [ 114.84432432, 31.29596073 ], [ 114.84431424, 31.2953909 ], [ 114.84431406, 31.29482102 ], [ 114.84464472, 31.29425177 ], [ 114.8449752, 31.29339258 ], [ 114.84578682, 31.29350396 ], [ 114.84656838, 31.29355526 ], [ 114.84731934, 31.29346625 ], [ 114.84774, 31.29297705 ], [ 114.8478003, 31.29251742 ], [ 114.8476302, 31.29136772 ], [ 114.84829134, 31.29107891 ], [ 114.8486319, 31.29108935 ], [ 114.8489622, 31.29107976 ], [ 114.84929286, 31.29065042 ], [ 114.84961344, 31.29007118 ], [ 114.84994428, 31.28893227 ], [ 114.84994428, 31.28836257 ], [ 114.84961362, 31.28778216 ], [ 114.84861174, 31.28808033 ], [ 114.84795042, 31.288649 ], [ 114.8462874, 31.28980581 ], [ 114.84495486, 31.29066329 ], [ 114.8439528, 31.29066153 ], [ 114.84346194, 31.29067067 ], [ 114.84279054, 31.29037961 ], [ 114.84195894, 31.28995827 ], [ 114.8402754, 31.28838579 ], [ 114.83927316, 31.28724432 ], [ 114.83794044, 31.28610236 ], [ 114.83725914, 31.28552132 ], [ 114.83758962, 31.28480208 ], [ 114.8385915, 31.28366412 ], [ 114.83992404, 31.28294664 ], [ 114.84091584, 31.28264843 ], [ 114.84158724, 31.28278955 ], [ 114.8419179, 31.28350995 ], [ 114.84292014, 31.28494131 ], [ 114.8431005, 31.28536148 ], [ 114.84343116, 31.28536206 ], [ 114.84360144, 31.28493249 ], [ 114.84392184, 31.28364338 ], [ 114.84408204, 31.28293386 ], [ 114.8444127, 31.28235458 ], [ 114.84491364, 31.28177561 ], [ 114.84523404, 31.28063648 ], [ 114.84523386, 31.27948677 ], [ 114.84522378, 31.27848705 ], [ 114.84405126, 31.27676549 ], [ 114.8417073, 31.27333307 ], [ 114.84069588, 31.27148226 ], [ 114.8406858, 31.27104248 ], [ 114.84168768, 31.27089416 ], [ 114.84269946, 31.27118562 ], [ 114.84419202, 31.27117802 ], [ 114.8445126, 31.27059878 ], [ 114.84451278, 31.26974918 ], [ 114.84451296, 31.26902949 ], [ 114.84467316, 31.26859997 ], [ 114.84534438, 31.26816122 ], [ 114.84583542, 31.26730239 ], [ 114.84594576, 31.26700269 ], [ 114.84069678, 31.26460536 ], [ 114.84065664, 31.26474522 ], [ 114.83999532, 31.26560378 ], [ 114.83933418, 31.26574265 ], [ 114.83866296, 31.26589151 ], [ 114.83833248, 31.26575106 ], [ 114.8381622, 31.26489116 ], [ 114.83832276, 31.26389189 ], [ 114.83865342, 31.26289284 ], [ 114.83898408, 31.2621737 ], [ 114.83948502, 31.26188462 ], [ 114.84005598, 31.26187557 ], [ 114.84124902, 31.25547032 ], [ 114.84094842, 31.25527992 ], [ 114.8401071, 31.25442897 ], [ 114.8400972, 31.25342939 ], [ 114.84042804, 31.25228045 ], [ 114.840468, 31.25222055 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98734", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.83492742, 31.16892222 ], [ 114.83679114, 31.16892555 ], [ 114.83721198, 31.16835662 ], [ 114.83770302, 31.16787773 ], [ 114.83815392, 31.16720889 ], [ 114.83833428, 31.16666948 ], [ 114.83833446, 31.16616975 ], [ 114.83832456, 31.16474046 ], [ 114.83788374, 31.16423997 ], [ 114.83727246, 31.16423889 ], [ 114.83658108, 31.16471738 ], [ 114.83650098, 31.16517701 ], [ 114.83651088, 31.16646635 ], [ 114.83645058, 31.16666615 ], [ 114.83619012, 31.16725538 ], [ 114.8356791, 31.16791409 ], [ 114.83502768, 31.16861258 ], [ 114.83492742, 31.16892222 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.98864", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.11945198, 31.00918122 ], [ 115.11945, 31.01479677 ], [ 115.11992052, 31.01425745 ], [ 115.12207188, 31.01280975 ], [ 115.12388322, 31.01166162 ], [ 115.12470384, 31.01050301 ], [ 115.12500426, 31.01007348 ], [ 115.12520442, 31.00978382 ], [ 115.1251947, 31.0089245 ], [ 115.12500462, 31.00872456 ], [ 115.12452456, 31.00821471 ], [ 115.123194, 31.00850375 ], [ 115.12154286, 31.0093722 ], [ 115.12055214, 31.01010107 ], [ 115.12021212, 31.01010089 ], [ 115.119882, 31.01010071 ], [ 115.12005228, 31.00910162 ], [ 115.11971226, 31.00896153 ], [ 115.11945198, 31.00918122 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99448", "Name": "邓家河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.7596579, 31.16882538 ], [ 114.7616883, 31.16882574 ], [ 114.76162836, 31.16867585 ], [ 114.76195848, 31.16795634 ], [ 114.7624587, 31.16723684 ], [ 114.76245888, 31.16667717 ], [ 114.76194894, 31.16609744 ], [ 114.76078884, 31.16509785 ], [ 114.75977886, 31.16409827 ], [ 114.75977904, 31.16295896 ], [ 114.75943938, 31.16151977 ], [ 114.75959958, 31.16023061 ], [ 114.75992988, 31.15995089 ], [ 114.76092996, 31.16037083 ], [ 114.76175994, 31.16080071 ], [ 114.7625901, 31.1610807 ], [ 114.7629303, 31.16079104 ], [ 114.76292058, 31.15993167 ], [ 114.7622607, 31.15936197 ], [ 114.7609206, 31.15879205 ], [ 114.75909036, 31.15765242 ], [ 114.75809028, 31.15722249 ], [ 114.7570902, 31.1566527 ], [ 114.75659016, 31.15637276 ], [ 114.7562604, 31.15551335 ], [ 114.75642078, 31.15479393 ], [ 114.75658098, 31.15407452 ], [ 114.75658116, 31.15379475 ], [ 114.7572414, 31.15378494 ], [ 114.7585716, 31.15407506 ], [ 114.76072206, 31.15438538 ], [ 114.76192248, 31.15439568 ], [ 114.7627926, 31.15445585 ], [ 114.76321272, 31.15442601 ], [ 114.76350288, 31.1542362 ], [ 114.76357308, 31.15394645 ], [ 114.76358316, 31.15359671 ], [ 114.7632732, 31.15334682 ], [ 114.76242306, 31.1530968 ], [ 114.7595724, 31.1524965 ], [ 114.75773208, 31.15193648 ], [ 114.75587178, 31.15134644 ], [ 114.75521154, 31.15180589 ], [ 114.75375066, 31.15279476 ], [ 114.75375048, 31.15365413 ], [ 114.75359982, 31.15537277 ], [ 114.75459936, 31.15695182 ], [ 114.75626922, 31.15923057 ], [ 114.75726894, 31.1608098 ], [ 114.75761868, 31.1623889 ], [ 114.75761832, 31.16438766 ], [ 114.75729792, 31.16582676 ], [ 114.7570578, 31.16667618 ], [ 114.75696762, 31.16697602 ], [ 114.75696762, 31.16753568 ], [ 114.7579677, 31.1679756 ], [ 114.75896796, 31.16796579 ], [ 114.75963792, 31.16868548 ], [ 114.7596579, 31.16882538 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99562", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.25993856, 31.33333008 ], [ 115.26391872, 31.33333049 ], [ 115.26315858, 31.3322306 ], [ 115.26231834, 31.33138068 ], [ 115.26197832, 31.33052078 ], [ 115.2616482, 31.33053077 ], [ 115.26141834, 31.33059071 ], [ 115.26113826, 31.33080068 ], [ 115.2607284, 31.33132052 ], [ 115.2601083, 31.33179036 ], [ 115.25999832, 31.33225026 ], [ 115.26000858, 31.33312011 ], [ 115.25993856, 31.33333008 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99563", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.26854454, 31.33333737 ], [ 115.26922386, 31.33333674 ], [ 115.26900408, 31.33291712 ], [ 115.2686745, 31.33320728 ], [ 115.26854454, 31.33333737 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99564", "Name": "三河口水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.26970302, 31.33538541 ], [ 115.269723, 31.33525545 ], [ 115.26951348, 31.33391625 ], [ 115.26922386, 31.33333674 ], [ 115.26854454, 31.33333737 ], [ 115.26734574, 31.33450791 ], [ 115.2666963, 31.33523817 ], [ 115.26585732, 31.335089 ], [ 115.26433884, 31.3339604 ], [ 115.26391872, 31.33333049 ], [ 115.25993856, 31.33333008 ], [ 115.25966856, 31.33412987 ], [ 115.25901876, 31.33526963 ], [ 115.25900868, 31.3353896 ], [ 115.26970302, 31.33538541 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99687", "Name": "尾斗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.734413053111894, 31.168824653999565 ], [ 114.7345872, 31.16990576 ], [ 114.7358894, 31.17289476 ], [ 114.7371916, 31.17657348 ], [ 114.73902371, 31.18048404 ], [ 114.73971228, 31.181820236508134 ], [ 114.73971228, 31.18132508 ], [ 114.7403718, 31.18003511 ], [ 114.74053182, 31.17931551 ], [ 114.740532, 31.17846605 ], [ 114.74003214, 31.17788627 ], [ 114.7381938, 31.17588863 ], [ 114.73785414, 31.17501927 ], [ 114.73785414, 31.17459942 ], [ 114.73818372, 31.17459915 ], [ 114.7386834, 31.1747387 ], [ 114.73951266, 31.17502791 ], [ 114.74068266, 31.17559779 ], [ 114.74185266, 31.17687723 ], [ 114.74286264, 31.17817665 ], [ 114.74352252, 31.1787464 ], [ 114.74419266, 31.17887645 ], [ 114.74469288, 31.17866666 ], [ 114.74469306, 31.17746741 ], [ 114.74451324, 31.17687773 ], [ 114.74401338, 31.17572834 ], [ 114.74401338, 31.17501873 ], [ 114.74401356, 31.17458903 ], [ 114.74417376, 31.17400938 ], [ 114.74469378, 31.1737896 ], [ 114.74469432, 31.17117119 ], [ 114.74300394, 31.17144074 ], [ 114.74167374, 31.17144047 ], [ 114.74067366, 31.17115049 ], [ 114.7396635, 31.17058065 ], [ 114.73899354, 31.16958111 ], [ 114.73832376, 31.16901146 ], [ 114.73832376, 31.16882156 ], [ 114.734413053111894, 31.168824653999565 ] ] ], [ [ [ 114.740949891212907, 31.184221868558751 ], [ 114.74139381, 31.18508331 ], [ 114.741678616747706, 31.185414545214794 ], [ 114.740949891212907, 31.184221868558751 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99689", "Name": "明山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.08683886, 31.01327127 ], [ 115.0882164, 31.01355927 ], [ 115.08816654, 31.01326961 ], [ 115.08815718, 31.01227056 ], [ 115.08782778, 31.01199111 ], [ 115.08648984, 31.01099328 ], [ 115.08647958, 31.00883409 ], [ 115.0862895, 31.0068351 ], [ 115.0861698, 31.0068153 ], [ 115.08524136, 31.00655664 ], [ 115.0844229, 31.00674762 ], [ 115.08414354, 31.00828743 ], [ 115.08348474, 31.00900802 ], [ 115.08248664, 31.00914932 ], [ 115.07983128, 31.00946274 ], [ 115.07934222, 31.01003316 ], [ 115.0793424, 31.01060295 ], [ 115.07968152, 31.01184162 ], [ 115.08545124, 31.0131531 ], [ 115.08551118, 31.01300321 ], [ 115.08583086, 31.01271309 ], [ 115.08617034, 31.01257278 ], [ 115.08682914, 31.01285169 ], [ 115.08683886, 31.01327127 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.99806", "Name": "大石板水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.06873824, 30.92279981 ], [ 115.06873824, 30.92250992 ], [ 115.06839858, 30.92166063 ], [ 115.06806918, 30.92051169 ], [ 115.06805928, 30.91922244 ], [ 115.06766004, 30.91879323 ], [ 115.06400658, 30.91879818 ], [ 115.06308804, 30.91951904 ], [ 115.06143078, 30.92096043 ], [ 115.05993336, 30.92267147 ], [ 115.05911454, 30.92382189 ], [ 115.05778686, 30.92383373 ], [ 115.05678858, 30.92411489 ], [ 115.05645918, 30.92455508 ], [ 115.05678858, 30.92540414 ], [ 115.05812598, 30.92655168 ], [ 115.05846546, 30.92714087 ], [ 115.05889458, 30.92740016 ], [ 115.05913416, 30.92750973 ], [ 115.05949362, 30.92750928 ], [ 115.05980304, 30.92737892 ], [ 115.06012254, 30.92712863 ], [ 115.06045194, 30.92640858 ], [ 115.06144032, 30.92553774 ], [ 115.06226886, 30.92539671 ], [ 115.0630974, 30.92482593 ], [ 115.06334706, 30.9246057 ], [ 115.06342698, 30.92443569 ], [ 115.06342716, 30.92253683 ], [ 115.06375674, 30.92152694 ], [ 115.06524408, 30.92094527 ], [ 115.06573332, 30.92094459 ], [ 115.0664121, 30.92137344 ], [ 115.0674102, 30.92237154 ], [ 115.06840866, 30.92295011 ], [ 115.06873824, 30.92279981 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100013", "Name": "碧绿河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.24459752, 31.28765081 ], [ 115.24459626, 31.29352772 ], [ 115.24495626, 31.29248804 ], [ 115.24544604, 31.29119843 ], [ 115.24609602, 31.2894689 ], [ 115.24741524, 31.28831865 ], [ 115.24856454, 31.28659884 ], [ 115.249554, 31.28543883 ], [ 115.24999374, 31.28505876 ], [ 115.25005368, 31.28500872 ], [ 115.25038362, 31.28442885 ], [ 115.25070348, 31.28399888 ], [ 115.25170266, 31.28355846 ], [ 115.25303178, 31.28340771 ], [ 115.2537012, 31.2835572 ], [ 115.25504976, 31.2851255 ], [ 115.25639832, 31.28696384 ], [ 115.25740812, 31.28811332 ], [ 115.2580779, 31.28854302 ], [ 115.2587475, 31.28853281 ], [ 115.25974704, 31.28824251 ], [ 115.26223572, 31.28736191 ], [ 115.26455448, 31.28577152 ], [ 115.26538392, 31.28519133 ], [ 115.26504408, 31.28491152 ], [ 115.26454422, 31.28448177 ], [ 115.2637146, 31.28434205 ], [ 115.26220548, 31.28478242 ], [ 115.26138576, 31.28522261 ], [ 115.25971662, 31.28537309 ], [ 115.25871708, 31.28509346 ], [ 115.25771772, 31.28466407 ], [ 115.25669874, 31.28381514 ], [ 115.25568966, 31.28267642 ], [ 115.254351, 31.28153783 ], [ 115.2528327, 31.27967978 ], [ 115.25265306, 31.27853052 ], [ 115.25281308, 31.27753094 ], [ 115.25330286, 31.27695093 ], [ 115.25463198, 31.27638038 ], [ 115.25513166, 31.27580037 ], [ 115.25461254, 31.2740816 ], [ 115.25391396, 31.27022406 ], [ 115.25371488, 31.26663608 ], [ 115.25403492, 31.26476687 ], [ 115.2536661, 31.26118896 ], [ 115.25397624, 31.25916986 ], [ 115.2538767, 31.25710098 ], [ 115.25377698, 31.25691117 ], [ 115.2537471, 31.25663136 ], [ 115.2538272, 31.25637153 ], [ 115.25379714, 31.25619171 ], [ 115.25357754, 31.25602197 ], [ 115.25329764, 31.25603214 ], [ 115.25312772, 31.25624207 ], [ 115.25295762, 31.25674179 ], [ 115.25198778, 31.25948094 ], [ 115.25200722, 31.26162978 ], [ 115.25204628, 31.26621735 ], [ 115.25189598, 31.26822642 ], [ 115.2519156, 31.26965562 ], [ 115.25259456, 31.27166415 ], [ 115.25260428, 31.27308341 ], [ 115.25244426, 31.27395303 ], [ 115.2514647, 31.27511304 ], [ 115.25096502, 31.27568306 ], [ 115.25046534, 31.27640301 ], [ 115.24999572, 31.27661321 ], [ 115.24980582, 31.27669326 ], [ 115.2496458, 31.27697321 ], [ 115.2494856, 31.27827263 ], [ 115.24916556, 31.2797021 ], [ 115.24901544, 31.28100152 ], [ 115.24852566, 31.28172143 ], [ 115.24735656, 31.28173218 ], [ 115.24602762, 31.28188293 ], [ 115.2458676, 31.28302242 ], [ 115.2457173, 31.2846017 ], [ 115.24538736, 31.28575131 ], [ 115.24474746, 31.28747081 ], [ 115.24459752, 31.28765081 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100048", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.84952398, 31.25223504 ], [ 114.85374138, 31.25224179 ], [ 114.85409202, 31.25209244 ], [ 114.85574532, 31.2510857 ], [ 114.85690776, 31.25021814 ], [ 114.85711818, 31.24999863 ], [ 114.85756926, 31.24950971 ], [ 114.85756944, 31.2487902 ], [ 114.85689858, 31.24835942 ], [ 114.85623744, 31.24835834 ], [ 114.8550651, 31.24893609 ], [ 114.8544135, 31.24979447 ], [ 114.85401282, 31.24999368 ], [ 114.85324116, 31.25037218 ], [ 114.85258002, 31.25038113 ], [ 114.85190898, 31.25023016 ], [ 114.85124766, 31.25052887 ], [ 114.85075662, 31.25080791 ], [ 114.84991476, 31.25167596 ], [ 114.84952398, 31.25223504 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100049", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.81998076, 31.25218671 ], [ 114.82149384, 31.25218946 ], [ 114.82240572, 31.25136137 ], [ 114.82312716, 31.25072295 ], [ 114.82382862, 31.24992456 ], [ 114.82448004, 31.24866632 ], [ 114.82542198, 31.24787837 ], [ 114.82641414, 31.24701059 ], [ 114.8267448, 31.24644143 ], [ 114.82707564, 31.24529253 ], [ 114.82740648, 31.24314405 ], [ 114.82739658, 31.24214447 ], [ 114.82838874, 31.24041701 ], [ 114.82921044, 31.23941891 ], [ 114.83038278, 31.23870125 ], [ 114.83104392, 31.23855243 ], [ 114.83187552, 31.23898362 ], [ 114.83237628, 31.24012392 ], [ 114.83238618, 31.24069367 ], [ 114.83172468, 31.24241172 ], [ 114.83106336, 31.24357007 ], [ 114.83040204, 31.24413869 ], [ 114.83024166, 31.24471815 ], [ 114.83041194, 31.24528817 ], [ 114.83074242, 31.24585845 ], [ 114.83108298, 31.24671863 ], [ 114.83075232, 31.24757763 ], [ 114.83075214, 31.24800743 ], [ 114.8309325, 31.24857749 ], [ 114.83125308, 31.24858802 ], [ 114.8319144, 31.24814931 ], [ 114.83275608, 31.24728117 ], [ 114.83373798, 31.24671309 ], [ 114.83407854, 31.24670369 ], [ 114.83408826, 31.24843281 ], [ 114.8340879, 31.24958202 ], [ 114.83421786, 31.25000196 ], [ 114.83442792, 31.25072178 ], [ 114.8349384, 31.25186186 ], [ 114.83499852, 31.25221178 ], [ 114.840468, 31.25222055 ], [ 114.84109944, 31.25127209 ], [ 114.84176076, 31.25112327 ], [ 114.8424318, 31.25140416 ], [ 114.84310266, 31.25222474 ], [ 114.84364374, 31.25222564 ], [ 114.84514638, 31.25222802 ], [ 114.84492588, 31.25197778 ], [ 114.84381402, 31.25187603 ], [ 114.84301266, 31.251555 ], [ 114.84253206, 31.25112449 ], [ 114.84221184, 31.25014466 ], [ 114.84224262, 31.2486957 ], [ 114.84157212, 31.24711571 ], [ 114.84041022, 31.24654421 ], [ 114.83890776, 31.24569231 ], [ 114.83822664, 31.24468161 ], [ 114.83822682, 31.24397196 ], [ 114.83821692, 31.24268258 ], [ 114.83855766, 31.24240326 ], [ 114.83938926, 31.24225476 ], [ 114.83988012, 31.24210563 ], [ 114.84038106, 31.24181664 ], [ 114.84038124, 31.24138685 ], [ 114.83971002, 31.24081598 ], [ 114.8380371, 31.23910395 ], [ 114.83753634, 31.23795366 ], [ 114.83718588, 31.2362339 ], [ 114.8370156, 31.23495419 ], [ 114.83725626, 31.23390515 ], [ 114.83389026, 31.23230031 ], [ 114.83366976, 31.23266972 ], [ 114.83334918, 31.23266918 ], [ 114.83300862, 31.23252869 ], [ 114.83267796, 31.23195845 ], [ 114.8323374, 31.23137817 ], [ 114.83216712, 31.23066825 ], [ 114.83249778, 31.2300891 ], [ 114.8326281, 31.23008933 ], [ 114.8320773, 31.22843927 ], [ 114.83198694, 31.22851905 ], [ 114.83149608, 31.22865806 ], [ 114.83115534, 31.22851752 ], [ 114.83098506, 31.22780751 ], [ 114.83114544, 31.22708819 ], [ 114.83148618, 31.22665902 ], [ 114.83197722, 31.22665992 ], [ 114.83280882, 31.22694131 ], [ 114.83271864, 31.22728097 ], [ 114.83880066, 31.22617185 ], [ 114.83880066, 31.22578202 ], [ 114.8391414, 31.22505302 ], [ 114.83931168, 31.22490335 ], [ 114.83387226, 31.21323998 ], [ 114.83375184, 31.21332971 ], [ 114.83308044, 31.21333844 ], [ 114.83273988, 31.21304796 ], [ 114.83273988, 31.21275812 ], [ 114.83273988, 31.21232832 ], [ 114.83307054, 31.21189916 ], [ 114.83341128, 31.2116099 ], [ 114.83374212, 31.21147058 ], [ 114.83440344, 31.21146185 ], [ 114.83457372, 31.21189196 ], [ 114.83455374, 31.21199186 ], [ 114.84009468, 31.21176164 ], [ 114.840225, 31.2113021 ], [ 114.84056574, 31.21058304 ], [ 114.84105678, 31.21029401 ], [ 114.84152766, 31.21029482 ], [ 114.84211914, 31.20800702 ], [ 114.841548, 31.20771623 ], [ 114.84137772, 31.20742607 ], [ 114.84087678, 31.20685551 ], [ 114.84086688, 31.20628581 ], [ 114.84136782, 31.20570698 ], [ 114.84186894, 31.20541794 ], [ 114.84236988, 31.2054188 ], [ 114.84270054, 31.20569924 ], [ 114.84317124, 31.20663951 ], [ 114.84465426, 31.20632217 ], [ 114.8445342, 31.20542244 ], [ 114.84452412, 31.2047028 ], [ 114.8446845, 31.20398348 ], [ 114.84501516, 31.20369417 ], [ 114.8453559, 31.20369476 ], [ 114.84601722, 31.20369588 ], [ 114.84667854, 31.20368702 ], [ 114.84717948, 31.20297822 ], [ 114.8473098, 31.20281852 ], [ 114.84642798, 31.19709978 ], [ 114.84631782, 31.1970996 ], [ 114.84581688, 31.1969588 ], [ 114.8456565, 31.1965286 ], [ 114.8458167, 31.19595903 ], [ 114.8460372, 31.19556947 ], [ 114.84554616, 31.19531873 ], [ 114.8446548, 31.1973867 ], [ 114.843663, 31.19782487 ], [ 114.8429916, 31.19783373 ], [ 114.84165924, 31.19798147 ], [ 114.84165924, 31.19840127 ], [ 114.84182952, 31.19883138 ], [ 114.84234054, 31.19926199 ], [ 114.8428314, 31.19969259 ], [ 114.8428314, 31.2001124 ], [ 114.84217008, 31.2002712 ], [ 114.84083736, 31.20026891 ], [ 114.83917434, 31.19941656 ], [ 114.83667918, 31.1981225 ], [ 114.83532648, 31.19757021 ], [ 114.8350059, 31.19755959 ], [ 114.83466516, 31.1977089 ], [ 114.83500572, 31.19813933 ], [ 114.83567712, 31.19885028 ], [ 114.83634852, 31.19928138 ], [ 114.8374206, 31.19973318 ], [ 114.83771112, 31.19993361 ], [ 114.83771112, 31.20030342 ], [ 114.83737038, 31.2004827 ], [ 114.83567694, 31.20085935 ], [ 114.83551656, 31.20114893 ], [ 114.83568684, 31.20186888 ], [ 114.8366889, 31.20243048 ], [ 114.83769096, 31.20257228 ], [ 114.83852256, 31.20257381 ], [ 114.8390235, 31.20328427 ], [ 114.83935416, 31.2041444 ], [ 114.83936406, 31.20500394 ], [ 114.8390433, 31.20571301 ], [ 114.83854218, 31.20644178 ], [ 114.83771058, 31.20687018 ], [ 114.83805114, 31.20744042 ], [ 114.83905302, 31.20829169 ], [ 114.83989452, 31.20959241 ], [ 114.83989452, 31.21030206 ], [ 114.8392332, 31.21088063 ], [ 114.83755992, 31.21073789 ], [ 114.83622738, 31.21002594 ], [ 114.8338926, 31.20902208 ], [ 114.83238942, 31.20902924 ], [ 114.83189838, 31.20902834 ], [ 114.83138754, 31.20788795 ], [ 114.8310468, 31.20616814 ], [ 114.8302053, 31.20387764 ], [ 114.82991478, 31.20323742 ], [ 114.82938378, 31.20285659 ], [ 114.82865226, 31.20273522 ], [ 114.82804098, 31.20280407 ], [ 114.82741962, 31.20311273 ], [ 114.82718904, 31.20343218 ], [ 114.82719912, 31.20396192 ], [ 114.82753968, 31.20460232 ], [ 114.8280507, 31.2056028 ], [ 114.82789032, 31.20604227 ], [ 114.82688826, 31.20632028 ], [ 114.82622694, 31.20632901 ], [ 114.82517466, 31.20631704 ], [ 114.82457346, 31.20619595 ], [ 114.82411248, 31.2059952 ], [ 114.82391214, 31.20581489 ], [ 114.82353144, 31.20527439 ], [ 114.82252956, 31.20379322 ], [ 114.8220486, 31.20338255 ], [ 114.82126704, 31.20279138 ], [ 114.82011468, 31.20223955 ], [ 114.81900246, 31.20197769 ], [ 114.81858162, 31.20191694 ], [ 114.81818076, 31.20205613 ], [ 114.81795036, 31.20226565 ], [ 114.81789006, 31.20264536 ], [ 114.81796026, 31.20300531 ], [ 114.81828084, 31.20327576 ], [ 114.81882192, 31.20342669 ], [ 114.81972372, 31.20351827 ], [ 114.82054542, 31.20370965 ], [ 114.82124688, 31.20406079 ], [ 114.82212852, 31.20460214 ], [ 114.8229801, 31.20613299 ], [ 114.82367148, 31.20684395 ], [ 114.82442316, 31.20718523 ], [ 114.82688808, 31.20789951 ], [ 114.8280606, 31.20818157 ], [ 114.82939332, 31.20890369 ], [ 114.83040528, 31.20989513 ], [ 114.83123688, 31.21132599 ], [ 114.83157744, 31.21204626 ], [ 114.83174772, 31.21290617 ], [ 114.8317578, 31.21347591 ], [ 114.8310864, 31.21419429 ], [ 114.82993386, 31.21505172 ], [ 114.82976358, 31.21477155 ], [ 114.82942284, 31.21463097 ], [ 114.82875144, 31.21392006 ], [ 114.82741872, 31.21319795 ], [ 114.82658712, 31.21276658 ], [ 114.8257152, 31.2131048 ], [ 114.8257152, 31.21486394 ], [ 114.82577514, 31.21664319 ], [ 114.82644636, 31.21750404 ], [ 114.82644636, 31.21821369 ], [ 114.82611552, 31.21922259 ], [ 114.82578486, 31.2199416 ], [ 114.82595514, 31.22051166 ], [ 114.82662654, 31.22051292 ], [ 114.8276187, 31.22021489 ], [ 114.82862076, 31.21992693 ], [ 114.82977312, 31.2190695 ], [ 114.8304546, 31.21878092 ], [ 114.83094564, 31.21878182 ], [ 114.8312763, 31.2189224 ], [ 114.8319477, 31.21992315 ], [ 114.83194752, 31.22035295 ], [ 114.83094546, 31.22079084 ], [ 114.82962282, 31.22092832 ], [ 114.82896132, 31.221077 ], [ 114.82812954, 31.22165516 ], [ 114.82795926, 31.2219347 ], [ 114.82795926, 31.22222459 ], [ 114.82863048, 31.22236575 ], [ 114.82896132, 31.22236638 ], [ 114.83078508, 31.22235981 ], [ 114.83195742, 31.22235198 ], [ 114.83262882, 31.22278304 ], [ 114.83230806, 31.22336214 ], [ 114.83162676, 31.22336088 ], [ 114.83013348, 31.22393783 ], [ 114.82881084, 31.22451504 ], [ 114.82813926, 31.22552331 ], [ 114.82698672, 31.22653064 ], [ 114.8263254, 31.22709908 ], [ 114.8264856, 31.22752919 ], [ 114.827157, 31.22782029 ], [ 114.82781832, 31.22810145 ], [ 114.8284998, 31.22882235 ], [ 114.8293314, 31.22981348 ], [ 114.8293413, 31.23081297 ], [ 114.82917084, 31.2315323 ], [ 114.82817886, 31.23211014 ], [ 114.82735698, 31.23282825 ], [ 114.8278581, 31.23325904 ], [ 114.8286897, 31.23326057 ], [ 114.83085438, 31.23324464 ], [ 114.83301834, 31.23381803 ], [ 114.8335191, 31.23439857 ], [ 114.8335191, 31.23495833 ], [ 114.83318844, 31.23581733 ], [ 114.8318658, 31.23654476 ], [ 114.83053326, 31.23712224 ], [ 114.82904034, 31.23711963 ], [ 114.82820856, 31.23726804 ], [ 114.82769754, 31.23712715 ], [ 114.82669566, 31.23570591 ], [ 114.8256936, 31.23512429 ], [ 114.82424046, 31.23492165 ], [ 114.82260714, 31.23425889 ], [ 114.82118424, 31.23299678 ], [ 114.82085358, 31.23184662 ], [ 114.82101396, 31.23041747 ], [ 114.82100406, 31.22940785 ], [ 114.82033284, 31.2272676 ], [ 114.81966144, 31.22640675 ], [ 114.81899004, 31.22640545 ], [ 114.81848892, 31.22697425 ], [ 114.81832854, 31.22798346 ], [ 114.81817824, 31.22913272 ], [ 114.81750684, 31.22985123 ], [ 114.81648462, 31.23009923 ], [ 114.81653466, 31.23235841 ], [ 114.81685542, 31.23241898 ], [ 114.81735636, 31.2329997 ], [ 114.81735636, 31.23328959 ], [ 114.81719598, 31.23357917 ], [ 114.81685524, 31.23371849 ], [ 114.8167251, 31.23371822 ], [ 114.81619392, 31.23493677 ], [ 114.81817806, 31.23537026 ], [ 114.81997176, 31.23571347 ], [ 114.82050276, 31.23596435 ], [ 114.82104384, 31.2365651 ], [ 114.82145478, 31.2375155 ], [ 114.82188552, 31.23872577 ], [ 114.82202574, 31.24043532 ], [ 114.82232616, 31.24158539 ], [ 114.82273692, 31.24229585 ], [ 114.8235687, 31.24330691 ], [ 114.82390926, 31.24429713 ], [ 114.82391916, 31.24573655 ], [ 114.82358832, 31.24688544 ], [ 114.82246602, 31.24830276 ], [ 114.82202502, 31.24914161 ], [ 114.8219649, 31.25011109 ], [ 114.82155396, 31.25093999 ], [ 114.82112304, 31.25133909 ], [ 114.81998076, 31.25218671 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100203", "Name": "尾斗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.745853486029262, 31.190480202852513 ], [ 114.74614304, 31.19084622 ], [ 114.748739532907933, 31.194137565004002 ], [ 114.74892054, 31.19405814 ], [ 114.74892072, 31.19348849 ], [ 114.7485807, 31.19291879 ], [ 114.74858088, 31.19233914 ], [ 114.74924112, 31.19175959 ], [ 114.75000144, 31.19098023 ], [ 114.75007146, 31.19090027 ], [ 114.75146178, 31.19078061 ], [ 114.75247194, 31.1905809 ], [ 114.7528521, 31.19035113 ], [ 114.75298224, 31.18991139 ], [ 114.7530924, 31.18934178 ], [ 114.75302238, 31.1890919 ], [ 114.75283248, 31.188902 ], [ 114.75222228, 31.18875197 ], [ 114.75056196, 31.18919139 ], [ 114.7500018, 31.18929125 ], [ 114.74757126, 31.1897705 ], [ 114.74590068, 31.19047974 ], [ 114.745853486029262, 31.190480202852513 ] ] ], [ [ [ 114.754607869141225, 31.20145815220086 ], [ 114.75803836, 31.20513942 ], [ 114.75989727, 31.20721639 ], [ 114.7614599, 31.21180911 ], [ 114.76169469, 31.2161662 ], [ 114.76157035770143, 31.216774122017164 ], [ 114.7618413, 31.21737944 ], [ 114.76217142, 31.218669 ], [ 114.76218132, 31.22024832 ], [ 114.76136088, 31.22196732 ], [ 114.76069056, 31.22296664 ], [ 114.760498706908166, 31.222969490598011 ], [ 114.760279, 31.2246384 ], [ 114.761336088722317, 31.225724341667313 ], [ 114.7617108, 31.22540595 ], [ 114.76237104, 31.22540618 ], [ 114.76303128, 31.22554635 ], [ 114.7633713, 31.22554649 ], [ 114.76357146, 31.22537661 ], [ 114.76369152, 31.22511678 ], [ 114.76369152, 31.22396726 ], [ 114.76402182, 31.22267792 ], [ 114.76468206, 31.22124876 ], [ 114.76580256, 31.21951986 ], [ 114.76629288, 31.21771082 ], [ 114.76685304, 31.21660148 ], [ 114.7676535, 31.21610198 ], [ 114.76810368, 31.2161121 ], [ 114.7684437, 31.21629215 ], [ 114.76904382, 31.21729196 ], [ 114.76962396, 31.21825172 ], [ 114.7701141, 31.21943139 ], [ 114.77043414, 31.21976138 ], [ 114.7709043, 31.21978149 ], [ 114.77126448, 31.21961171 ], [ 114.77145456, 31.21922192 ], [ 114.7713246, 31.21887204 ], [ 114.77099448, 31.2182222 ], [ 114.76987416, 31.21631262 ], [ 114.76980414, 31.21581281 ], [ 114.77012436, 31.21542311 ], [ 114.77081466, 31.21532339 ], [ 114.77138508, 31.21500398 ], [ 114.77261736, 31.21389626 ], [ 114.7729779, 31.21367688 ], [ 114.77338848, 31.2135975 ], [ 114.77380914, 31.2135881 ], [ 114.77419974, 31.21370856 ], [ 114.7757121, 31.21468016 ], [ 114.77614266, 31.2147707 ], [ 114.77647332, 31.2144813 ], [ 114.77642328, 31.21408143 ], [ 114.77597274, 31.21362108 ], [ 114.77520162, 31.21297034 ], [ 114.7749714, 31.21191059 ], [ 114.77429046, 31.21076025 ], [ 114.77395998, 31.21047995 ], [ 114.77345922, 31.21061918 ], [ 114.77271798, 31.21114788 ], [ 114.77229714, 31.21191689 ], [ 114.77160594, 31.21275546 ], [ 114.7711149, 31.21355439 ], [ 114.77073456, 31.21406388 ], [ 114.77023452, 31.21441358 ], [ 114.76976436, 31.21450335 ], [ 114.76936422, 31.21435328 ], [ 114.76863396, 31.21335347 ], [ 114.76830384, 31.21292354 ], [ 114.76760364, 31.2127434 ], [ 114.76675332, 31.21290302 ], [ 114.76614312, 31.2133626 ], [ 114.76548288, 31.21379222 ], [ 114.76514268, 31.21379208 ], [ 114.76482264, 31.21379199 ], [ 114.76465254, 31.21307222 ], [ 114.76464264, 31.21250247 ], [ 114.76497276, 31.21135308 ], [ 114.7654629, 31.21078347 ], [ 114.76663344, 31.20978429 ], [ 114.76728378, 31.20906483 ], [ 114.76728378, 31.2084851 ], [ 114.76646352, 31.20791504 ], [ 114.76595322, 31.20805481 ], [ 114.76429272, 31.20877395 ], [ 114.76313226, 31.20936327 ], [ 114.76230192, 31.20921306 ], [ 114.76113156, 31.208643 ], [ 114.76112184, 31.20778346 ], [ 114.76112184, 31.20692391 ], [ 114.76145214, 31.2063543 ], [ 114.7624524, 31.20563498 ], [ 114.76228248, 31.20534509 ], [ 114.76212246, 31.2050552 ], [ 114.7611123, 31.20463517 ], [ 114.7597821, 31.20420506 ], [ 114.7581117, 31.2037848 ], [ 114.75745146, 31.20363473 ], [ 114.75711144, 31.20349469 ], [ 114.7567815, 31.20306485 ], [ 114.7567815, 31.20264509 ], [ 114.75711162, 31.20249524 ], [ 114.75811188, 31.20249551 ], [ 114.75977256, 31.20191627 ], [ 114.76079298, 31.20173667 ], [ 114.76115298, 31.20157683 ], [ 114.76132308, 31.20135701 ], [ 114.76136322, 31.20113714 ], [ 114.76126314, 31.20091722 ], [ 114.76112328, 31.20063732 ], [ 114.7608333, 31.20034743 ], [ 114.76043316, 31.2001974 ], [ 114.759963, 31.20026724 ], [ 114.75711198, 31.20120594 ], [ 114.7554414, 31.20149534 ], [ 114.75478116, 31.20149516 ], [ 114.754607869141225, 31.20145815220086 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100204", "Name": "尾斗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.74469432, 31.17117119 ], [ 114.74469378, 31.1737896 ], [ 114.74483382, 31.17371967 ], [ 114.7461741, 31.17371994 ], [ 114.74717436, 31.17372012 ], [ 114.74900478, 31.17372044 ], [ 114.75000486, 31.17382056 ], [ 114.75033498, 31.17386061 ], [ 114.751665, 31.17457044 ], [ 114.7530051, 31.17543017 ], [ 114.75367524, 31.17586001 ], [ 114.75400536, 31.17585011 ], [ 114.75433548, 31.17557034 ], [ 114.75433566, 31.17471084 ], [ 114.7536657, 31.1737113 ], [ 114.75266562, 31.17285167 ], [ 114.75166554, 31.17228183 ], [ 114.7500054, 31.17147201 ], [ 114.74932536, 31.17114207 ], [ 114.7483251, 31.17114189 ], [ 114.74799516, 31.1707121 ], [ 114.7469949, 31.17057201 ], [ 114.74599464, 31.17086163 ], [ 114.74483436, 31.17115125 ], [ 114.74469432, 31.17117119 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100538", "Name": "巴水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.342724230882382, 30.997406226713231 ], [ 115.34261047, 30.99718739 ], [ 115.34129071, 30.99168395 ], [ 115.33997091, 30.98686714 ], [ 115.33918099, 30.98228126 ], [ 115.338818025431408, 30.980362626762101 ], [ 115.33845096, 30.98115959 ], [ 115.33813146, 30.98287908 ], [ 115.33918824, 30.98948292 ], [ 115.340724, 30.99679565 ], [ 115.34154192, 31.00000217 ], [ 115.3420704, 31.00210992 ], [ 115.34351742, 31.00210722 ], [ 115.34347746, 31.00195737 ], [ 115.34314824, 30.99999906 ], [ 115.342724230882382, 30.997406226713231 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100687", "Name": "破堰河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.82216506, 31.13571717 ], [ 114.82165404, 31.13557637 ], [ 114.82110288, 31.13560535 ], [ 114.82069212, 31.13604441 ], [ 114.82059168, 31.13719362 ], [ 114.820281, 31.13794265 ], [ 114.81966972, 31.13854124 ], [ 114.81841728, 31.13893881 ], [ 114.81814674, 31.13922821 ], [ 114.8180364, 31.1397777 ], [ 114.81834708, 31.14023801 ], [ 114.81890814, 31.14043889 ], [ 114.8194692, 31.14039992 ], [ 114.81990012, 31.1401508 ], [ 114.82056144, 31.13972222 ], [ 114.82139304, 31.13971371 ], [ 114.82223472, 31.1402849 ], [ 114.82257528, 31.14115502 ], [ 114.82257528, 31.14157482 ], [ 114.82190388, 31.1421533 ], [ 114.82108218, 31.14288144 ], [ 114.81991992, 31.14344912 ], [ 114.8185872, 31.14402642 ], [ 114.81807618, 31.14427541 ], [ 114.81763518, 31.14474435 ], [ 114.81744474, 31.14563355 ], [ 114.81784542, 31.1476532 ], [ 114.8179554, 31.14946242 ], [ 114.8181858, 31.15034235 ], [ 114.81835608, 31.15074245 ], [ 114.81861654, 31.15098279 ], [ 114.81888708, 31.15102325 ], [ 114.81918768, 31.15087385 ], [ 114.81928794, 31.15047425 ], [ 114.81927804, 31.14975461 ], [ 114.81927822, 31.14860522 ], [ 114.81960888, 31.14745641 ], [ 114.82022016, 31.14618818 ], [ 114.82126236, 31.1454504 ], [ 114.82308612, 31.14458411 ], [ 114.82552098, 31.14335907 ], [ 114.82628256, 31.14275076 ], [ 114.82657326, 31.14185175 ], [ 114.82656318, 31.14128205 ], [ 114.82605234, 31.14014175 ], [ 114.8245596, 31.13814015 ], [ 114.8238783, 31.13727939 ], [ 114.8237982, 31.13674952 ], [ 114.82333722, 31.13628894 ], [ 114.82216506, 31.13571717 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100688", "Name": "举水", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.8698764, 31.09696772 ], [ 114.86987658, 31.09290984 ], [ 114.86728368, 31.09215744 ], [ 114.8637897, 31.09117406 ], [ 114.86057418, 31.09045973 ], [ 114.8570775, 31.08989385 ], [ 114.85623582, 31.08961251 ], [ 114.85524384, 31.08890111 ], [ 114.85407168, 31.0876097 ], [ 114.85340046, 31.08674898 ], [ 114.85273914, 31.08623805 ], [ 114.85187748, 31.08565683 ], [ 114.85009404, 31.08565373 ], [ 114.85040454, 31.08618396 ], [ 114.85124622, 31.08775464 ], [ 114.85241838, 31.08904605 ], [ 114.85375092, 31.09018784 ], [ 114.85541412, 31.09104032 ], [ 114.85775862, 31.09189401 ], [ 114.85975248, 31.09217738 ], [ 114.86141568, 31.09246016 ], [ 114.8638995, 31.09311311 ], [ 114.86661282, 31.0944555 ], [ 114.8682447, 31.09544676 ], [ 114.8698764, 31.09696772 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100689", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.85294254, 31.16895426 ], [ 114.85433538, 31.16895674 ], [ 114.85399464, 31.16842641 ], [ 114.85332342, 31.16813535 ], [ 114.85283238, 31.16856425 ], [ 114.85294254, 31.16895426 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100690", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.86331972, 31.16896988 ], [ 114.86432088, 31.16897096 ], [ 114.8639805, 31.16868075 ], [ 114.86347992, 31.16882012 ], [ 114.86331972, 31.16896988 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100691", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.80409756, 31.16886899 ], [ 114.80526972, 31.16887097 ], [ 114.8050593, 31.16885063 ], [ 114.80412762, 31.16864916 ], [ 114.80409756, 31.16886899 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100720", "Name": "尾斗山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.74469306, 31.17746741 ], [ 114.74469288, 31.17866666 ], [ 114.74486298, 31.17859673 ], [ 114.74486298, 31.17802707 ], [ 114.74469306, 31.17746741 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.100721", "Name": "芭茅河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.1010585, 31.32752724 ], [ 115.1013987, 31.32759744 ], [ 115.10172882, 31.3275276 ], [ 115.1019288, 31.32721773 ], [ 115.10220852, 31.32607788 ], [ 115.10242866, 31.32581801 ], [ 115.10296866, 31.32536832 ], [ 115.10352882, 31.32500864 ], [ 115.10403894, 31.32478895 ], [ 115.10463942, 31.3249293 ], [ 115.1050995, 31.32487958 ], [ 115.10576982, 31.32474998 ], [ 115.10615988, 31.32433017 ], [ 115.10612964, 31.32381015 ], [ 115.10567946, 31.32351 ], [ 115.1050293, 31.3233498 ], [ 115.10435916, 31.32277974 ], [ 115.10400924, 31.32149009 ], [ 115.10366904, 31.32077022 ], [ 115.10366922, 31.32020039 ], [ 115.10399934, 31.31934084 ], [ 115.1046594, 31.31933112 ], [ 115.10565966, 31.31904159 ], [ 115.10615988, 31.31875188 ], [ 115.1063199, 31.31746241 ], [ 115.10631, 31.31647277 ], [ 115.10680032, 31.31517344 ], [ 115.10762058, 31.31431403 ], [ 115.10829072, 31.31416436 ], [ 115.1089308, 31.31416463 ], [ 115.10993106, 31.31460482 ], [ 115.11140148, 31.31534516 ], [ 115.11273168, 31.31601539 ], [ 115.11335196, 31.31628557 ], [ 115.11375192, 31.31636567 ], [ 115.11414198, 31.31642579 ], [ 115.11439218, 31.31625596 ], [ 115.1144721, 31.31598609 ], [ 115.11436212, 31.31576613 ], [ 115.11395208, 31.31546607 ], [ 115.11183168, 31.31405577 ], [ 115.11096138, 31.31280585 ], [ 115.11013122, 31.31187584 ], [ 115.10843094, 31.31100549 ], [ 115.10693064, 31.31044515 ], [ 115.10559018, 31.30987487 ], [ 115.10458992, 31.30973451 ], [ 115.10368974, 31.30942428 ], [ 115.1017893, 31.31003331 ], [ 115.10139906, 31.31015315 ], [ 115.1025993, 31.31160309 ], [ 115.10343954, 31.31260304 ], [ 115.10411958, 31.31375288 ], [ 115.10428968, 31.31432276 ], [ 115.10412966, 31.31490249 ], [ 115.1031393, 31.31619165 ], [ 115.10214894, 31.31792064 ], [ 115.10116848, 31.32006948 ], [ 115.10117838, 31.32164894 ], [ 115.10085816, 31.32351815 ], [ 115.10070804, 31.32580725 ], [ 115.10071812, 31.32667701 ], [ 115.1010585, 31.32752724 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101058", "Name": "黑石咀水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.06396752, 31.00000748 ], [ 115.06757094, 30.99848324 ], [ 115.06855914, 30.99762225 ], [ 115.06955742, 30.99733106 ], [ 115.06988664, 30.99690077 ], [ 115.07055534, 30.99618014 ], [ 115.07121432, 30.99603933 ], [ 115.07154372, 30.99588894 ], [ 115.07254182, 30.99560774 ], [ 115.07321052, 30.99488711 ], [ 115.07435838, 30.99373601 ], [ 115.07468778, 30.99301583 ], [ 115.0736895, 30.99301718 ], [ 115.07286096, 30.99330815 ], [ 115.07187276, 30.99431912 ], [ 115.07120406, 30.99474981 ], [ 115.07087466, 30.99446037 ], [ 115.07020578, 30.99417138 ], [ 115.06887792, 30.99375329 ], [ 115.06787982, 30.99389459 ], [ 115.06655214, 30.99417624 ], [ 115.06589334, 30.99475688 ], [ 115.06589352, 30.99590645 ], [ 115.0658937, 30.99647624 ], [ 115.0655742, 30.99704643 ], [ 115.06407696, 30.99734834 ], [ 115.061751, 30.99749139 ], [ 115.05992436, 30.99792366 ], [ 115.05892626, 30.99908453 ], [ 115.05794814, 31.0000055 ], [ 115.05786822, 31.00009554 ], [ 115.05750894, 31.00047588 ], [ 115.05745908, 31.0011557 ], [ 115.05748914, 31.00156551 ], [ 115.05875688, 31.00146386 ], [ 115.0600545, 31.00109225 ], [ 115.06142214, 31.00077054 ], [ 115.063758, 31.0000977 ], [ 115.06396752, 31.00000748 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101079", "Name": "落衣山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.91123194, 31.41666851 ], [ 114.90765588, 31.41667134 ], [ 114.90700626, 31.4175713 ], [ 114.90616602, 31.41887076 ], [ 114.90615594, 31.41890078 ], [ 114.91028262, 31.41889853 ], [ 114.91034274, 31.4184186 ], [ 114.9106725, 31.41755865 ], [ 114.91123194, 31.41666851 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101080", "Name": "落衣山水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.90765588, 31.41667134 ], [ 114.91123194, 31.41666851 ], [ 114.91149186, 31.41625842 ], [ 114.91233102, 31.41525812 ], [ 114.9123312, 31.41468828 ], [ 114.91198164, 31.41396882 ], [ 114.911622, 31.41370917 ], [ 114.91098282, 31.4132598 ], [ 114.90980418, 31.41269096 ], [ 114.9089652, 31.41226175 ], [ 114.90830586, 31.41226224 ], [ 114.9079761, 31.41241245 ], [ 114.90780636, 31.41269253 ], [ 114.90780618, 31.41327231 ], [ 114.90831558, 31.41384174 ], [ 114.90915456, 31.4144109 ], [ 114.90915456, 31.41470079 ], [ 114.90865506, 31.41527099 ], [ 114.9078258, 31.41642128 ], [ 114.90765588, 31.41667134 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101208", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.81619392, 31.23493677 ], [ 114.8167251, 31.23371822 ], [ 114.81653466, 31.2337179 ], [ 114.81619392, 31.23343737 ], [ 114.81586326, 31.23314685 ], [ 114.81586326, 31.23257711 ], [ 114.81619392, 31.2322878 ], [ 114.81653466, 31.23235841 ], [ 114.81648462, 31.23009923 ], [ 114.81635448, 31.23013896 ], [ 114.81484122, 31.23014616 ], [ 114.81367932, 31.23000441 ], [ 114.81217704, 31.22943278 ], [ 114.80934312, 31.22744004 ], [ 114.80767074, 31.22572865 ], [ 114.80716026, 31.22428869 ], [ 114.80685984, 31.22358863 ], [ 114.80715054, 31.2227195 ], [ 114.80731074, 31.2211404 ], [ 114.80714046, 31.22057034 ], [ 114.80597874, 31.21956918 ], [ 114.80430618, 31.21870734 ], [ 114.80330466, 31.21799625 ], [ 114.80263362, 31.21699572 ], [ 114.80229306, 31.21685537 ], [ 114.80196258, 31.21729479 ], [ 114.8014719, 31.21786395 ], [ 114.80164236, 31.21872386 ], [ 114.8024736, 31.21958466 ], [ 114.80314446, 31.22029521 ], [ 114.80398578, 31.22129588 ], [ 114.80365494, 31.22215497 ], [ 114.80299398, 31.22243388 ], [ 114.80149152, 31.22259174 ], [ 114.8003397, 31.22259012 ], [ 114.7994982, 31.22302874 ], [ 114.79900734, 31.22359776 ], [ 114.79916754, 31.22416769 ], [ 114.7996683, 31.22445821 ], [ 114.80033934, 31.22459906 ], [ 114.8010003, 31.22458997 ], [ 114.80217228, 31.22473154 ], [ 114.8036445, 31.22471358 ], [ 114.80497668, 31.2249353 ], [ 114.80533686, 31.22658495 ], [ 114.80534676, 31.22758445 ], [ 114.80500602, 31.22859344 ], [ 114.80493582, 31.22941289 ], [ 114.80522616, 31.22977311 ], [ 114.80584716, 31.2298839 ], [ 114.80718924, 31.22973585 ], [ 114.8076801, 31.22973653 ], [ 114.80819076, 31.23030686 ], [ 114.80869134, 31.23088718 ], [ 114.80885136, 31.23159696 ], [ 114.80853042, 31.23302562 ], [ 114.80803956, 31.2337445 ], [ 114.80736816, 31.23461304 ], [ 114.80712768, 31.2355521 ], [ 114.8070672, 31.23663134 ], [ 114.80674644, 31.23747041 ], [ 114.80589486, 31.2386585 ], [ 114.80514336, 31.23997664 ], [ 114.8042115, 31.24119461 ], [ 114.80348016, 31.24233293 ], [ 114.80259834, 31.24356098 ], [ 114.8022576, 31.24426005 ], [ 114.80234778, 31.2446799 ], [ 114.80276826, 31.24479042 ], [ 114.80313888, 31.24464098 ], [ 114.80373, 31.24397223 ], [ 114.8043312, 31.24316354 ], [ 114.80585382, 31.24194633 ], [ 114.80724648, 31.24048914 ], [ 114.80858892, 31.238852 ], [ 114.80901984, 31.23801311 ], [ 114.80916042, 31.23691398 ], [ 114.80928066, 31.2366443 ], [ 114.80949108, 31.23625482 ], [ 114.80987178, 31.23576567 ], [ 114.81120414, 31.2344483 ], [ 114.81236604, 31.23402012 ], [ 114.81353856, 31.23373235 ], [ 114.81453054, 31.234154 ], [ 114.81603354, 31.23486648 ], [ 114.81619392, 31.23493677 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101209", "Name": "浮桥河水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.83389026, 31.23230031 ], [ 114.83725626, 31.23390515 ], [ 114.83734644, 31.23351549 ], [ 114.83733672, 31.23237609 ], [ 114.83799822, 31.23122778 ], [ 114.8389902, 31.23022001 ], [ 114.83933076, 31.2302106 ], [ 114.8398317, 31.2306512 ], [ 114.84033246, 31.23150161 ], [ 114.84067302, 31.23222179 ], [ 114.84134406, 31.23365216 ], [ 114.8420151, 31.23450284 ], [ 114.84234558, 31.23508316 ], [ 114.8430069, 31.2352142 ], [ 114.84317718, 31.23478467 ], [ 114.84316746, 31.23364527 ], [ 114.84266688, 31.23192533 ], [ 114.8423265, 31.2299258 ], [ 114.84181584, 31.22848571 ], [ 114.84180594, 31.22763615 ], [ 114.84229716, 31.22647758 ], [ 114.84380016, 31.22519081 ], [ 114.8451228, 31.22432348 ], [ 114.84645534, 31.22374604 ], [ 114.84711684, 31.22274767 ], [ 114.84777816, 31.22230905 ], [ 114.84810882, 31.22230959 ], [ 114.8484393, 31.22245008 ], [ 114.84906048, 31.22288091 ], [ 114.84984186, 31.22293217 ], [ 114.85044306, 31.2227933 ], [ 114.85076382, 31.22209418 ], [ 114.85043334, 31.22116412 ], [ 114.85076418, 31.21972542 ], [ 114.8512653, 31.21871684 ], [ 114.85192662, 31.21871792 ], [ 114.85292832, 31.21943927 ], [ 114.85358946, 31.22015 ], [ 114.85393992, 31.22128998 ], [ 114.85460106, 31.22157096 ], [ 114.85526238, 31.2212822 ], [ 114.8559237, 31.22114342 ], [ 114.85627416, 31.22185361 ], [ 114.8567751, 31.22242416 ], [ 114.85743624, 31.22271513 ], [ 114.85794708, 31.22299584 ], [ 114.8586084, 31.22299697 ], [ 114.85994094, 31.22299922 ], [ 114.86060208, 31.22357004 ], [ 114.86094246, 31.22428023 ], [ 114.86045142, 31.22556872 ], [ 114.86013066, 31.22643771 ], [ 114.86013048, 31.22699742 ], [ 114.860952, 31.22728866 ], [ 114.86129256, 31.22742915 ], [ 114.86179368, 31.22714016 ], [ 114.86229462, 31.22657127 ], [ 114.86262528, 31.22628201 ], [ 114.86295576, 31.22627247 ], [ 114.86328624, 31.22685257 ], [ 114.863967, 31.22785292 ], [ 114.86463768, 31.22856333 ], [ 114.86546856, 31.22914392 ], [ 114.86596896, 31.22928437 ], [ 114.86662974, 31.22970485 ], [ 114.86714022, 31.23012519 ], [ 114.8676408, 31.23085545 ], [ 114.86798118, 31.23199539 ], [ 114.86915244, 31.23313619 ], [ 114.86986326, 31.23374666 ], [ 114.8698629, 31.2305976 ], [ 114.8688018, 31.22912709 ], [ 114.86813112, 31.22798679 ], [ 114.86645928, 31.22727543 ], [ 114.86544822, 31.22627481 ], [ 114.86511792, 31.22569467 ], [ 114.86511792, 31.22498489 ], [ 114.86493756, 31.22427492 ], [ 114.86443698, 31.22354471 ], [ 114.86377638, 31.22312418 ], [ 114.86210472, 31.22226288 ], [ 114.86043198, 31.22170074 ], [ 114.85926, 31.22112906 ], [ 114.85875924, 31.22026866 ], [ 114.85841868, 31.21912868 ], [ 114.85858932, 31.21811951 ], [ 114.85857924, 31.2176997 ], [ 114.8580684, 31.21697921 ], [ 114.85740762, 31.21511909 ], [ 114.8565663, 31.2135485 ], [ 114.8565564, 31.2129788 ], [ 114.8565564, 31.21268895 ], [ 114.85705752, 31.21197017 ], [ 114.85755846, 31.21182108 ], [ 114.85905084, 31.21203317 ], [ 114.86033208, 31.2126642 ], [ 114.86115288, 31.21289492 ], [ 114.86164338, 31.21291535 ], [ 114.86194362, 31.21285563 ], [ 114.8620338, 31.21270578 ], [ 114.86206386, 31.21253586 ], [ 114.86197368, 31.21236585 ], [ 114.8617935, 31.21218572 ], [ 114.86091258, 31.21147512 ], [ 114.86013174, 31.21080458 ], [ 114.85889046, 31.21013363 ], [ 114.85769904, 31.20966248 ], [ 114.8571882, 31.20956168 ], [ 114.85686762, 31.20939122 ], [ 114.8568876, 31.20917135 ], [ 114.8570379, 31.20896174 ], [ 114.8580396, 31.20853334 ], [ 114.8587002, 31.20823404 ], [ 114.8587002, 31.2079541 ], [ 114.85835982, 31.20766389 ], [ 114.85735884, 31.20767294 ], [ 114.85669752, 31.20767181 ], [ 114.85536498, 31.2082493 ], [ 114.854373, 31.20881729 ], [ 114.85304028, 31.20940476 ], [ 114.85253934, 31.2095538 ], [ 114.85253934, 31.20925397 ], [ 114.85253934, 31.20897411 ], [ 114.85336122, 31.20782612 ], [ 114.85403262, 31.20667785 ], [ 114.854193, 31.20624837 ], [ 114.85319094, 31.20593684 ], [ 114.85319094, 31.20610671 ], [ 114.85252962, 31.20667533 ], [ 114.85219896, 31.20697458 ], [ 114.8518683, 31.20696405 ], [ 114.85169802, 31.20668393 ], [ 114.85152774, 31.20611391 ], [ 114.85176822, 31.20557463 ], [ 114.84795096, 31.20477858 ], [ 114.84735966, 31.20554718 ], [ 114.84653796, 31.20698502 ], [ 114.84604692, 31.20770381 ], [ 114.8455359, 31.20785289 ], [ 114.84487458, 31.20756192 ], [ 114.8447043, 31.20713186 ], [ 114.8447043, 31.20670206 ], [ 114.84465426, 31.20632217 ], [ 114.84317124, 31.20663951 ], [ 114.8432013, 31.20670953 ], [ 114.8432112, 31.20771902 ], [ 114.84288054, 31.20799829 ], [ 114.84288054, 31.20828818 ], [ 114.8423796, 31.20813738 ], [ 114.84211914, 31.20800702 ], [ 114.84152766, 31.21029482 ], [ 114.84155772, 31.21029486 ], [ 114.84188838, 31.2102954 ], [ 114.84205866, 31.21072547 ], [ 114.84205866, 31.21130516 ], [ 114.84172782, 31.21229408 ], [ 114.84123678, 31.21287296 ], [ 114.84057546, 31.21316168 ], [ 114.8402448, 31.21316114 ], [ 114.83990424, 31.2128807 ], [ 114.83990424, 31.21245095 ], [ 114.84009468, 31.21176164 ], [ 114.83455374, 31.21199186 ], [ 114.83441334, 31.21290117 ], [ 114.83387226, 31.21323998 ], [ 114.83931168, 31.22490335 ], [ 114.83946216, 31.2247737 ], [ 114.83980272, 31.22476425 ], [ 114.84046386, 31.22519517 ], [ 114.84047376, 31.22562497 ], [ 114.84047376, 31.22620466 ], [ 114.83997264, 31.22649365 ], [ 114.83948178, 31.22692259 ], [ 114.83914104, 31.2267821 ], [ 114.83881056, 31.22649167 ], [ 114.83880066, 31.22617185 ], [ 114.83271864, 31.22728097 ], [ 114.83264844, 31.22752073 ], [ 114.83249814, 31.22809016 ], [ 114.8320773, 31.22843927 ], [ 114.8326281, 31.23008933 ], [ 114.8329989, 31.23008996 ], [ 114.83332938, 31.23052029 ], [ 114.8338404, 31.23138069 ], [ 114.8340105, 31.23209061 ], [ 114.83389026, 31.23230031 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101365", "Name": "大石板水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.06400658, 30.91879818 ], [ 115.06766004, 30.91879323 ], [ 115.06739058, 30.91850375 ], [ 115.0660629, 30.91822574 ], [ 115.0647354, 30.91822754 ], [ 115.06400658, 30.91879818 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101366", "Name": "鲇鱼坝水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 114.73271676, 31.02009183 ], [ 114.7313385, 31.02000341 ], [ 114.730839, 31.01997398 ], [ 114.73041942, 31.02032417 ], [ 114.72942042, 31.0209048 ], [ 114.726933, 31.02219648 ], [ 114.72560442, 31.02291738 ], [ 114.72311718, 31.02378939 ], [ 114.72179868, 31.0240706 ], [ 114.72112944, 31.02408131 ], [ 114.72047028, 31.02407204 ], [ 114.71980104, 31.0239329 ], [ 114.71947146, 31.02407316 ], [ 114.71963112, 31.02436274 ], [ 114.71980086, 31.02464232 ], [ 114.72079914, 31.02594021 ], [ 114.72080904, 31.02650973 ], [ 114.72047928, 31.02679985 ], [ 114.71948046, 31.02709073 ], [ 114.71882112, 31.02766097 ], [ 114.71882094, 31.02795072 ], [ 114.71915052, 31.02809027 ], [ 114.72047874, 31.02822869 ], [ 114.72081822, 31.02865799 ], [ 114.72081804, 31.02951731 ], [ 114.7204881, 31.03037699 ], [ 114.71999796, 31.03224602 ], [ 114.719508, 31.0338153 ], [ 114.7198374, 31.03439445 ], [ 114.71997726, 31.03462413 ], [ 114.7208364, 31.03410362 ], [ 114.72149574, 31.03338348 ], [ 114.72166602, 31.03238408 ], [ 114.72214626, 31.02994553 ], [ 114.72280614, 31.02779651 ], [ 114.72279642, 31.02707709 ], [ 114.72296652, 31.02621759 ], [ 114.72346602, 31.02578739 ], [ 114.72412536, 31.02520716 ], [ 114.72528438, 31.02434658 ], [ 114.72711246, 31.02334538 ], [ 114.73025886, 31.02248264 ], [ 114.73108812, 31.02190218 ], [ 114.73225704, 31.0209017 ], [ 114.73271676, 31.02009183 ] ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_river_pg.101752", "Name": "大坳水库", "fclass": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 115.08190668, 31.06320377 ], [ 115.08272532, 31.0631828 ], [ 115.08455232, 31.06346049 ], [ 115.08622956, 31.06415808 ], [ 115.0878969, 31.06573533 ], [ 115.08924654, 31.06729449 ], [ 115.09008624, 31.06872369 ], [ 115.0907562, 31.06916348 ], [ 115.0917561, 31.06915353 ], [ 115.09391574, 31.06914359 ], [ 115.09557552, 31.06927355 ], [ 115.09791516, 31.06970339 ], [ 115.09923492, 31.06969344 ], [ 115.10057466, 31.07025315 ], [ 115.10274438, 31.070673 ], [ 115.1037441, 31.07152256 ], [ 115.10425404, 31.07224215 ], [ 115.10525376, 31.07281185 ], [ 115.1055837, 31.07309171 ], [ 115.10641368, 31.07309175 ], [ 115.1075736, 31.072802 ], [ 115.1082441, 31.07265251 ], [ 115.10890452, 31.07279291 ], [ 115.10957502, 31.07292336 ], [ 115.11257742, 31.07420505 ], [ 115.11373824, 31.07463575 ], [ 115.11457884, 31.0746263 ], [ 115.11589968, 31.07419736 ], [ 115.1169003, 31.07389815 ], [ 115.1174007, 31.07389851 ], [ 115.11823122, 31.074179 ], [ 115.11944208, 31.07429978 ], [ 115.1194419, 31.0729302 ], [ 115.11855108, 31.07216979 ], [ 115.1170398, 31.07160891 ], [ 115.11654948, 31.0716086 ], [ 115.11588906, 31.07161809 ], [ 115.11521856, 31.07161764 ], [ 115.11422784, 31.07132703 ], [ 115.11288684, 31.07076629 ], [ 115.11155574, 31.07034549 ], [ 115.11071514, 31.07020496 ], [ 115.10971452, 31.07049417 ], [ 115.10839368, 31.07079315 ], [ 115.1077338, 31.07079311 ], [ 115.10706384, 31.07079306 ], [ 115.10656398, 31.07022336 ], [ 115.1057142, 31.06894406 ], [ 115.10554428, 31.06793462 ], [ 115.1048745, 31.06751486 ], [ 115.10454456, 31.06751486 ], [ 115.1038746, 31.06751481 ], [ 115.10288478, 31.06780461 ], [ 115.10189478, 31.06838426 ], [ 115.10122482, 31.06838426 ], [ 115.09989498, 31.06810436 ], [ 115.0992351, 31.06811435 ], [ 115.09789536, 31.06783445 ], [ 115.09756542, 31.06783445 ], [ 115.0963956, 31.06741464 ], [ 115.09589574, 31.06727469 ], [ 115.09423596, 31.0668449 ], [ 115.0935561, 31.06642509 ], [ 115.0925562, 31.0659953 ], [ 115.09238628, 31.0652757 ], [ 115.09288632, 31.06455615 ], [ 115.09470612, 31.06412645 ], [ 115.09587594, 31.06425641 ], [ 115.09670592, 31.06396661 ], [ 115.09703586, 31.06367676 ], [ 115.09702596, 31.06339691 ], [ 115.096356, 31.063257 ], [ 115.09602606, 31.06297715 ], [ 115.09502634, 31.06282716 ], [ 115.09336656, 31.06226745 ], [ 115.0926867, 31.06169775 ], [ 115.09202682, 31.06126796 ], [ 115.09169688, 31.06126796 ], [ 115.09135686, 31.0615578 ], [ 115.0906968, 31.0625672 ], [ 115.09037676, 31.0634267 ], [ 115.08971688, 31.06357659 ], [ 115.08937686, 31.06357659 ], [ 115.088877, 31.06342665 ], [ 115.08770736, 31.06286703 ], [ 115.08653934, 31.06158917 ], [ 115.08537132, 31.06059111 ], [ 115.08453288, 31.06001246 ], [ 115.083864, 31.05988335 ], [ 115.08303528, 31.05974453 ], [ 115.0823664, 31.06017509 ], [ 115.08171732, 31.0611753 ], [ 115.08138774, 31.06189526 ], [ 115.08106824, 31.06203557 ], [ 115.08139764, 31.06248489 ], [ 115.08190668, 31.06320377 ] ] ] ] } } +] +} diff --git a/public/mapbox/geojson/省道.geojson b/public/mapbox/geojson/省道.geojson new file mode 100644 index 0000000..ed5b858 --- /dev/null +++ b/public/mapbox/geojson/省道.geojson @@ -0,0 +1,444 @@ +{ +"type": "FeatureCollection", +"name": "省道", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20856", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.320", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4387169, 31.25386022 ], [ 115.43851656, 31.25353001 ], [ 115.43835618, 31.2533298 ], [ 115.438266, 31.25323967 ], [ 115.4381958, 31.25316956 ], [ 115.4379654, 31.25299923 ], [ 115.43768478, 31.25280884 ], [ 115.4375145, 31.25269859 ], [ 115.43626188, 31.25193678 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20857", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.444", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4455506, 31.2640079 ], [ 115.44554052, 31.26396789 ], [ 115.44552054, 31.26347807 ], [ 115.44553062, 31.26314817 ], [ 115.44551046, 31.26297821 ], [ 115.44545034, 31.26276819 ], [ 115.44526998, 31.262468 ], [ 115.44512976, 31.26227787 ], [ 115.4450997, 31.26223782 ], [ 115.44506964, 31.26219777 ], [ 115.44465888, 31.26177725 ], [ 115.44452856, 31.26161709 ], [ 115.44444846, 31.26149699 ], [ 115.44433812, 31.26127689 ], [ 115.44430806, 31.26118689 ], [ 115.4442681, 31.26098687 ], [ 115.44413778, 31.26022695 ], [ 115.44407766, 31.259817 ], [ 115.4440476, 31.25971701 ], [ 115.44400764, 31.25958701 ], [ 115.44392736, 31.25944692 ], [ 115.44379722, 31.25923677 ], [ 115.4435868, 31.25898653 ], [ 115.4432961, 31.25865614 ], [ 115.4431458, 31.25851592 ], [ 115.44308568, 31.25847587 ], [ 115.44295536, 31.25838564 ], [ 115.44278508, 31.25832539 ], [ 115.4426247, 31.25828516 ], [ 115.44212376, 31.25822432 ], [ 115.44175296, 31.25818368 ], [ 115.44148242, 31.25817324 ], [ 115.44100146, 31.25813243 ], [ 115.44069078, 31.25806191 ], [ 115.4405205, 31.25801165 ], [ 115.44028992, 31.25790131 ], [ 115.44015978, 31.25781113 ], [ 115.4400696, 31.25775101 ], [ 115.44001938, 31.25770092 ], [ 115.43989914, 31.25756075 ], [ 115.43979906, 31.25741067 ], [ 115.43959854, 31.25704046 ], [ 115.43949846, 31.25681037 ], [ 115.43945832, 31.25661039 ], [ 115.43944824, 31.25640047 ], [ 115.43945832, 31.25560077 ], [ 115.43944842, 31.25544084 ], [ 115.4393982, 31.25513088 ], [ 115.43934816, 31.25499084 ], [ 115.43926806, 31.25483078 ], [ 115.43906754, 31.25443059 ], [ 115.4388672, 31.25410038 ], [ 115.4387169, 31.25386022 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20858", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.392", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44723378, 31.2702683 ], [ 115.44717366, 31.27007831 ], [ 115.4469231, 31.26925818 ], [ 115.44677298, 31.26867813 ], [ 115.44672276, 31.26853814 ], [ 115.44643224, 31.26802784 ], [ 115.4460114, 31.2672974 ], [ 115.44596136, 31.26693744 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20859", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.328", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44596136, 31.26693744 ], [ 115.4455506, 31.2640079 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20860", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.065", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44950826, 31.27586 ], [ 115.44944814, 31.27572995 ], [ 115.44928776, 31.27543979 ], [ 115.44923772, 31.27531977 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20861", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.594", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44923772, 31.27531977 ], [ 115.44907734, 31.27493961 ], [ 115.4488068, 31.27444938 ], [ 115.4486565, 31.27411922 ], [ 115.4482056, 31.27318884 ], [ 115.44809544, 31.27293873 ], [ 115.4479752, 31.27261865 ], [ 115.44781482, 31.27204863 ], [ 115.44760458, 31.27140851 ], [ 115.44732396, 31.27054838 ], [ 115.44723378, 31.2702683 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20862", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44988896, 31.27727012 ], [ 115.44984882, 31.27689018 ], [ 115.44980886, 31.27659026 ], [ 115.44974874, 31.27641021 ], [ 115.44950826, 31.27586 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20863", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.234", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.45144272, 31.28281119 ], [ 115.45137252, 31.28278118 ], [ 115.45126254, 31.28273109 ], [ 115.45117236, 31.28268105 ], [ 115.4508219, 31.28240079 ], [ 115.4507418, 31.28232069 ], [ 115.45068168, 31.2822306 ], [ 115.4506617, 31.28220059 ], [ 115.45061148, 31.28207045 ], [ 115.45056108, 31.2819003 ], [ 115.4505006, 31.28144999 ], [ 115.45051032, 31.28102987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20864", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.423", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.45051032, 31.28102987 ], [ 115.45051032, 31.28100989 ], [ 115.45048008, 31.28037989 ], [ 115.45035984, 31.27977995 ], [ 115.45018956, 31.27913987 ], [ 115.44998922, 31.2784398 ], [ 115.4499291, 31.27780998 ], [ 115.44990894, 31.27750007 ], [ 115.44988896, 31.27727012 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20865", "Name": "S210", "pyname": "s210", "kind": "0301", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.45273494, 31.28308299 ], [ 115.4518029, 31.2828813 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.20866", "Name": "S210", "pyname": "s210", "kind": "0301", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4518029, 31.2828813 ], [ 115.45144272, 31.28281119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.28548", "Name": "S210", "pyname": "s210", "kind": "0301", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.452902577887997, 31.283103402821975 ], [ 115.45287534, 31.28310333 ], [ 115.45273494, 31.28308299 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.444603", "Name": "S216", "pyname": "s216", "kind": "0301", "width": "55", "length": "0.021", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21245132, 31.51473422 ], [ 115.21267164, 31.5147645 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.489976", "Name": "S216", "pyname": "s216", "kind": "0301", "width": "55", "length": "0.552", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21267164, 31.5147645 ], [ 115.212931494299397, 31.514771273730052 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514141", "Name": null, "pyname": null, "kind": "0304", "width": "55", "length": "0.016", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01914788, 31.17318467 ], [ 115.01915778, 31.17332457 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514142", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.048", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01811108, 31.17355709 ], [ 115.01824068, 31.17351677 ], [ 115.01859942, 31.17345588 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514143", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01859942, 31.17345588 ], [ 115.01877888, 31.17342546 ], [ 115.01906796, 31.17335477 ], [ 115.01915778, 31.17332457 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514144", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0180812, 31.17342726 ], [ 115.01819082, 31.17339698 ], [ 115.01858952, 31.173336 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514145", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.056", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01858952, 31.173336 ], [ 115.0187292, 31.17330567 ], [ 115.0189983, 31.17324501 ], [ 115.01914788, 31.17318467 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514146", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.147", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.024581, 31.17196152 ], [ 115.02533862, 31.17176973 ], [ 115.0256277, 31.17163905 ], [ 115.02599652, 31.17145824 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514147", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.214", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02183942, 31.17266811 ], [ 115.02244764, 31.17251664 ], [ 115.02317538, 31.17229493 ], [ 115.02398286, 31.17210296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514148", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.059", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02398286, 31.17210296 ], [ 115.024581, 31.17196152 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514149", "Name": null, "pyname": null, "kind": "0304", "width": "30", "length": "0.014", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0239429, 31.17198317 ], [ 115.02398286, 31.17210296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514150", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0239429, 31.17198317 ], [ 115.02452124, 31.17184178 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514151", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.143", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02452124, 31.17184178 ], [ 115.02525888, 31.17165998 ], [ 115.02552798, 31.17154937 ], [ 115.02589698, 31.17135857 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514152", "Name": null, "pyname": null, "kind": "0304", "width": "30", "length": "0.014", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.024581, 31.17196152 ], [ 115.02452124, 31.17184178 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514153", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.064", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02127206, 31.16875194 ], [ 115.02147132, 31.16930121 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514154", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.364", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02147132, 31.16930121 ], [ 115.02151128, 31.16941106 ], [ 115.0216407, 31.16968056 ], [ 115.02172998, 31.17188889 ], [ 115.02177966, 31.17241841 ], [ 115.02180954, 31.17254828 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514155", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.136", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02932634, 31.17016053 ], [ 115.02956574, 31.17011994 ], [ 115.03071216, 31.16988716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514156", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03071216, 31.16988716 ], [ 115.03117062, 31.16978604 ], [ 115.03139994, 31.16973551 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514157", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.061", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0308018, 31.16999687 ], [ 115.03123038, 31.16989584 ], [ 115.03141992, 31.16986538 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514158", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.080", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03444032, 31.16972772 ], [ 115.0344702, 31.16973762 ], [ 115.0349787, 31.16980625 ], [ 115.03507824, 31.169826 ], [ 115.03523772, 31.16990556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514159", "Name": null, "pyname": null, "kind": "0304", "width": "30", "length": "0.015", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03444032, 31.16972772 ], [ 115.0344603, 31.16985755 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514224", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0308", "width": "55", "length": "0.293", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03653372, 31.16977232 ], [ 115.03667322, 31.16976197 ], [ 115.03723158, 31.16968056 ], [ 115.03829826, 31.16957792 ], [ 115.03957428, 31.16942474 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514450", "Name": "S309", "pyname": "s309", "kind": "0308", "width": "55", "length": "0.336", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0854822, 31.16490431 ], [ 115.08562206, 31.16488424 ], [ 115.08893856, 31.16447186 ], [ 115.08896862, 31.16446182 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514451", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.142", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10802612, 31.15779395 ], [ 115.10818614, 31.15772411 ], [ 115.10836632, 31.15765431 ], [ 115.10858664, 31.15759451 ], [ 115.10888688, 31.15752485 ], [ 115.10935722, 31.1574353 ], [ 115.1094573, 31.1574254 ], [ 115.10965764, 31.1574056 ], [ 115.10999784, 31.15739597 ], [ 115.11038826, 31.15740632 ], [ 115.11122904, 31.15745717 ], [ 115.11205002, 31.15748799 ], [ 115.11237024, 31.1574983 ], [ 115.1127306, 31.15749866 ], [ 115.11315108, 31.15747908 ], [ 115.11324108, 31.15747917 ], [ 115.11349128, 31.15744943 ], [ 115.11374166, 31.1573997 ], [ 115.1140419, 31.15733999 ], [ 115.11468252, 31.15717065 ], [ 115.11583344, 31.15687185 ], [ 115.11615384, 31.15681218 ], [ 115.11640404, 31.15676241 ], [ 115.11658422, 31.1567526 ], [ 115.11672426, 31.15675274 ], [ 115.11681444, 31.15677281 ], [ 115.11699462, 31.15681299 ], [ 115.11710478, 31.1568431 ], [ 115.11745506, 31.15699344 ], [ 115.1175852, 31.15705356 ], [ 115.11770544, 31.15713366 ], [ 115.11802584, 31.15734395 ], [ 115.11861642, 31.15772447 ], [ 115.1187066, 31.1577845 ], [ 115.11891666, 31.15785456 ], [ 115.11901674, 31.15788462 ], [ 115.11907668, 31.15788467 ], [ 115.11915678, 31.15789475 ], [ 115.1193069, 31.15788485 ], [ 115.11944694, 31.15785497 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514452", "Name": "S206", "pyname": "s206", "kind": "0308", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00826958, 31.13522631 ], [ 115.00846884, 31.13509581 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514453", "Name": "S206", "pyname": "s206", "kind": "0308", "width": "55", "length": "0.360", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00846884, 31.13509581 ], [ 115.00856838, 31.13502552 ], [ 115.00883748, 31.1348448 ], [ 115.00925616, 31.13451383 ], [ 115.00949538, 31.13432325 ], [ 115.0098741, 31.13404241 ], [ 115.01046216, 31.13360105 ], [ 115.01074134, 31.13337038 ], [ 115.01101044, 31.13320973 ], [ 115.01122968, 31.13303922 ], [ 115.01130942, 31.13295908 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514504", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.057", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0211025, 31.16826257 ], [ 115.02127206, 31.16875194 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514505", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.103", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02017532, 31.16562597 ], [ 115.0201854, 31.16567592 ], [ 115.02026514, 31.16591564 ], [ 115.02043452, 31.16632505 ], [ 115.02049428, 31.16651481 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514506", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00766172, 31.13567793 ], [ 115.00771158, 31.13563779 ], [ 115.00800048, 31.13540703 ], [ 115.00826958, 31.13522631 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514507", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.160", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06275684, 31.16865915 ], [ 115.06329612, 31.16834879 ], [ 115.06347594, 31.16823867 ], [ 115.06370562, 31.16814849 ], [ 115.06385538, 31.16808837 ], [ 115.0640451, 31.16802821 ], [ 115.06422492, 31.16798802 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514508", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.823", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09325478, 31.16185034 ], [ 115.09338492, 31.16173046 ], [ 115.09376508, 31.16134089 ], [ 115.0940952, 31.16095128 ], [ 115.09422534, 31.16075148 ], [ 115.09441542, 31.16038181 ], [ 115.09446546, 31.16026188 ], [ 115.09471584, 31.15949247 ], [ 115.09486596, 31.15902285 ], [ 115.0950762, 31.15837337 ], [ 115.09512624, 31.15822347 ], [ 115.09523622, 31.15800365 ], [ 115.09530624, 31.15787378 ], [ 115.09536636, 31.15780385 ], [ 115.09545636, 31.15771394 ], [ 115.09555644, 31.15763406 ], [ 115.0957566, 31.15750419 ], [ 115.09594668, 31.15742436 ], [ 115.09608672, 31.15737446 ], [ 115.09615674, 31.15735448 ], [ 115.09624674, 31.15734453 ], [ 115.09638678, 31.1573246 ], [ 115.09664688, 31.15732473 ], [ 115.0970571, 31.15732487 ], [ 115.09786746, 31.15728527 ], [ 115.09874766, 31.15722569 ], [ 115.09927794, 31.15720593 ], [ 115.09959798, 31.15720607 ], [ 115.09977816, 31.15721615 ], [ 115.09988814, 31.15723617 ], [ 115.10003808, 31.15726623 ], [ 115.1002782, 31.15735628 ], [ 115.1005986, 31.15749659 ], [ 115.10098902, 31.15771695 ], [ 115.10128944, 31.15786721 ], [ 115.10167986, 31.15808757 ], [ 115.1023707, 31.15843821 ], [ 115.10255088, 31.1585184 ], [ 115.10290134, 31.15869872 ], [ 115.10305146, 31.15876883 ], [ 115.10353206, 31.1590193 ], [ 115.10393256, 31.15917968 ], [ 115.1040627, 31.1592398 ], [ 115.10412282, 31.15925982 ], [ 115.10420274, 31.15927994 ], [ 115.10424288, 31.15928997 ], [ 115.104393, 31.1593001 ], [ 115.10451306, 31.15930023 ], [ 115.10460324, 31.15930032 ], [ 115.10469324, 31.15929042 ], [ 115.10476344, 31.15927049 ], [ 115.10491356, 31.15923062 ], [ 115.10503362, 31.15919075 ], [ 115.10535384, 31.1590611 ], [ 115.10558406, 31.15895135 ], [ 115.10614458, 31.15870196 ], [ 115.10708526, 31.15824296 ], [ 115.10734554, 31.15811322 ], [ 115.10794602, 31.15783386 ], [ 115.10802612, 31.15779395 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514509", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.412", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06422492, 31.16798802 ], [ 115.06428486, 31.16797799 ], [ 115.06451454, 31.16793776 ], [ 115.06462434, 31.16792763 ], [ 115.06547322, 31.16785676 ], [ 115.06658148, 31.1677956 ], [ 115.06719078, 31.16775492 ], [ 115.06751028, 31.16772464 ], [ 115.06777992, 31.16769435 ], [ 115.06817934, 31.16762397 ], [ 115.068429, 31.16757371 ], [ 115.06850892, 31.16755364 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514510", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9975522, 31.0855239 ], [ 114.99761196, 31.08572366 ], [ 114.99765192, 31.08590343 ], [ 114.9976818, 31.08602327 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514967", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "55", "length": "0.125", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03523772, 31.16990556 ], [ 115.03548702, 31.16988491 ], [ 115.03653372, 31.16977232 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514988", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74470098, 31.08216749 ], [ 114.74413146, 31.08255768 ], [ 114.74407134, 31.08260768 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514996", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.264", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01914788, 31.17318467 ], [ 115.01969616, 31.17304337 ], [ 115.02078282, 31.17275078 ], [ 115.02145062, 31.17261915 ], [ 115.02180954, 31.17254828 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514997", "Name": null, "pyname": null, "kind": "0304", "width": "55", "length": "0.014", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02180954, 31.17254828 ], [ 115.02181944, 31.17260817 ], [ 115.02183942, 31.17266811 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514998", "Name": null, "pyname": null, "kind": "0304", "width": "55", "length": "0.015", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02599652, 31.17145824 ], [ 115.02596664, 31.17142832 ], [ 115.02589698, 31.17135857 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.514999", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.075", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0344603, 31.16985755 ], [ 115.03502838, 31.16993607 ], [ 115.03523772, 31.16990556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517765", "Name": "S309", "pyname": "s309", "kind": "0308", "width": "55", "length": "0.109", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16875146, 31.13681688 ], [ 115.16769954, 31.13702483 ], [ 115.16763942, 31.13703473 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517766", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.072", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15842162, 31.13524895 ], [ 115.1582211, 31.13524859 ], [ 115.15772016, 31.13524764 ], [ 115.15766004, 31.13524755 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517767", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.678", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15564512, 31.14158027 ], [ 115.15524426, 31.14207923 ], [ 115.15485348, 31.14245831 ], [ 115.15447278, 31.14290736 ], [ 115.15427226, 31.14315684 ], [ 115.1540919, 31.14335642 ], [ 115.15389138, 31.14358592 ], [ 115.15378122, 31.14369567 ], [ 115.15356072, 31.14388512 ], [ 115.15294944, 31.14437373 ], [ 115.15226814, 31.1449122 ], [ 115.15167684, 31.14533088 ], [ 115.15078512, 31.14599886 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517768", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "2.360", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17966432, 31.12202475 ], [ 115.17955416, 31.12203456 ], [ 115.17942384, 31.12206431 ], [ 115.17935382, 31.12210418 ], [ 115.17927354, 31.12216398 ], [ 115.17921342, 31.12221384 ], [ 115.1791533, 31.12228373 ], [ 115.17909318, 31.12238354 ], [ 115.17902316, 31.12255332 ], [ 115.17896304, 31.12273314 ], [ 115.17883272, 31.12309274 ], [ 115.17867234, 31.12355219 ], [ 115.17865236, 31.12360214 ], [ 115.17846192, 31.12395161 ], [ 115.1782515, 31.12435103 ], [ 115.17805116, 31.12483041 ], [ 115.17786072, 31.1253498 ], [ 115.17769044, 31.12562934 ], [ 115.17729966, 31.12620836 ], [ 115.17716934, 31.12639803 ], [ 115.1768988, 31.12683728 ], [ 115.17671844, 31.12712681 ], [ 115.17653808, 31.12747632 ], [ 115.17629742, 31.12800561 ], [ 115.17603696, 31.12864479 ], [ 115.17590664, 31.12903436 ], [ 115.17559596, 31.12978338 ], [ 115.17546564, 31.13042279 ], [ 115.1753652, 31.13144199 ], [ 115.175295, 31.13180168 ], [ 115.17516468, 31.13240112 ], [ 115.17487398, 31.13400969 ], [ 115.17447294, 31.13506841 ], [ 115.17433272, 31.13557785 ], [ 115.17431256, 31.13620749 ], [ 115.17431256, 31.13683718 ], [ 115.17424236, 31.1371169 ], [ 115.17412212, 31.13732655 ], [ 115.17393168, 31.13747613 ], [ 115.17375132, 31.13757572 ], [ 115.17337044, 31.13762499 ], [ 115.17205806, 31.1373527 ], [ 115.17087564, 31.13679083 ], [ 115.17032466, 31.13666987 ], [ 115.17004404, 31.13661938 ], [ 115.1696133, 31.13668854 ], [ 115.16888178, 31.13679717 ], [ 115.16875146, 31.13681688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517857", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.069", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.73967466, 31.08552917 ], [ 114.739122995305891, 31.08591381323469 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517876", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.160", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15078512, 31.14599886 ], [ 115.1506647, 31.14611861 ], [ 115.1505747, 31.14621842 ], [ 115.15051458, 31.14628826 ], [ 115.1503542, 31.14652793 ], [ 115.14993372, 31.14723713 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517877", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.379", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12176876, 31.15521797 ], [ 115.1216487, 31.15545782 ], [ 115.12148868, 31.1559876 ], [ 115.12130868, 31.1562374 ], [ 115.12124856, 31.15635728 ], [ 115.12116864, 31.15649718 ], [ 115.12109862, 31.15659713 ], [ 115.1209485, 31.15675697 ], [ 115.12079838, 31.15689678 ], [ 115.12053828, 31.15713645 ], [ 115.12031796, 31.15729616 ], [ 115.11983736, 31.15764549 ], [ 115.11973728, 31.15771533 ], [ 115.11960714, 31.15778517 ], [ 115.11949716, 31.15783503 ], [ 115.11944694, 31.15785497 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517878", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.372", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22503296, 31.14679838 ], [ 115.22503296, 31.14671841 ], [ 115.22502306, 31.14666842 ], [ 115.2250029, 31.14664844 ], [ 115.22496294, 31.14662841 ], [ 115.22462256, 31.14652811 ], [ 115.22423214, 31.14639783 ], [ 115.2238419, 31.14625752 ], [ 115.2237618, 31.14622746 ], [ 115.22357154, 31.14614736 ], [ 115.22318112, 31.14602703 ], [ 115.22280078, 31.14588677 ], [ 115.22238048, 31.14569646 ], [ 115.22222028, 31.1455764 ], [ 115.22169972, 31.14522608 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517879", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.151", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22169972, 31.14522608 ], [ 115.22160972, 31.14520601 ], [ 115.22152962, 31.14520592 ], [ 115.22141946, 31.14522581 ], [ 115.22128932, 31.14526568 ], [ 115.22100906, 31.14534537 ], [ 115.2204084, 31.14554468 ], [ 115.2202482, 31.14557451 ], [ 115.22018826, 31.14558446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517880", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.339", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22018826, 31.14558446 ], [ 115.22001798, 31.14557429 ], [ 115.21990782, 31.14555422 ], [ 115.21969776, 31.14549405 ], [ 115.21949742, 31.14543389 ], [ 115.2193473, 31.14538376 ], [ 115.21923732, 31.14533367 ], [ 115.21911708, 31.1452736 ], [ 115.21907712, 31.14524358 ], [ 115.21894698, 31.14516353 ], [ 115.21871676, 31.14499338 ], [ 115.2185265, 31.14483332 ], [ 115.2183564, 31.14473319 ], [ 115.2181863, 31.1446431 ], [ 115.2181062, 31.14461304 ], [ 115.21792602, 31.14455288 ], [ 115.21765566, 31.14451265 ], [ 115.21730538, 31.14445235 ], [ 115.21714518, 31.1444222 ], [ 115.21699506, 31.1443821 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517976", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24460454, 31.18461494 ], [ 115.24416444, 31.18448484 ], [ 115.24389444, 31.18435484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.517977", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.366", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21937466, 31.17207875 ], [ 115.21938474, 31.1715491 ], [ 115.21940472, 31.17134925 ], [ 115.219485, 31.17077973 ], [ 115.2195552, 31.17012026 ], [ 115.21958526, 31.16980049 ], [ 115.21964556, 31.16897109 ], [ 115.21964556, 31.16879118 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518177", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.201", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24389444, 31.18435484 ], [ 115.24381434, 31.18429481 ], [ 115.24343436, 31.18404479 ], [ 115.24317426, 31.18387478 ], [ 115.2429741, 31.18377474 ], [ 115.24262418, 31.18358471 ], [ 115.24230396, 31.18339467 ], [ 115.242174, 31.18330467 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518178", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.101", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21988514, 31.17285896 ], [ 115.21947474, 31.17240869 ], [ 115.21938456, 31.17214872 ], [ 115.21937466, 31.17207875 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518367", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.206", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43626188, 31.25193678 ], [ 115.43560056, 31.25153579 ], [ 115.43471928, 31.2509849 ], [ 115.43448888, 31.2508647 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518368", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.156", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40178252, 31.23526959 ], [ 115.40166264, 31.23486981 ], [ 115.40131272, 31.23392027 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518369", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.112", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43448888, 31.2508647 ], [ 115.43418864, 31.2507045 ], [ 115.43377806, 31.25048418 ], [ 115.43323734, 31.25024375 ], [ 115.4325465, 31.25002316 ], [ 115.43189562, 31.24991246 ], [ 115.43106438, 31.24984158 ], [ 115.43085414, 31.24983132 ], [ 115.43079402, 31.24982129 ], [ 115.43059368, 31.24981107 ], [ 115.43009292, 31.24979051 ], [ 115.42958226, 31.24977993 ], [ 115.42883112, 31.24975905 ], [ 115.4282202, 31.24971837 ], [ 115.42777974, 31.24966793 ], [ 115.42739922, 31.24957757 ], [ 115.42708872, 31.24949724 ], [ 115.42644792, 31.24926671 ], [ 115.42499604, 31.24880537 ], [ 115.42433526, 31.24861488 ], [ 115.42375476, 31.24843457 ], [ 115.42333446, 31.24830434 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518370", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.130", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.42333446, 31.24830434 ], [ 115.42289418, 31.24817411 ], [ 115.42264398, 31.24811394 ], [ 115.42234374, 31.2480338 ], [ 115.4223036, 31.24802376 ], [ 115.42215348, 31.24801364 ], [ 115.42202334, 31.24800351 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518371", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41455838, 31.24958904 ], [ 115.41413844, 31.24970906 ], [ 115.4138184, 31.24980909 ], [ 115.41351852, 31.2498891 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518372", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "2.385", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.398144, 31.22202605 ], [ 115.398054, 31.22191611 ], [ 115.3978542, 31.22167631 ], [ 115.39779408, 31.22161632 ], [ 115.39723428, 31.22106674 ], [ 115.39706436, 31.22090685 ], [ 115.3969344, 31.22082693 ], [ 115.39675458, 31.22071704 ], [ 115.39622466, 31.22045735 ], [ 115.39589472, 31.22032748 ], [ 115.39486512, 31.21990799 ], [ 115.3895472, 31.21716101 ], [ 115.388838, 31.21661201 ], [ 115.3881189, 31.21597305 ], [ 115.38757962, 31.21549385 ], [ 115.38737982, 31.21534413 ], [ 115.38696042, 31.21506468 ], [ 115.3867707, 31.21495493 ], [ 115.38624132, 31.2146856 ], [ 115.38591174, 31.21451604 ], [ 115.38553212, 31.2143765 ], [ 115.38505278, 31.21416707 ], [ 115.38423378, 31.21380806 ], [ 115.38359442, 31.21350885 ], [ 115.38314514, 31.21327944 ], [ 115.38263574, 31.21297011 ], [ 115.38253584, 31.21290023 ], [ 115.38204642, 31.21255089 ], [ 115.38159696, 31.21220151 ], [ 115.38037854, 31.21135322 ], [ 115.38004896, 31.21109366 ], [ 115.37975934, 31.2108341 ], [ 115.37951958, 31.21059447 ], [ 115.3792899, 31.21031484 ], [ 115.37919, 31.21019501 ], [ 115.37885052, 31.20980553 ], [ 115.37841114, 31.20925626 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518373", "Name": "S203", "pyname": "s203", "kind": "0304", "width": "55", "length": "0.007", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37841114, 31.20925626 ], [ 115.37836128, 31.20920636 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518374", "Name": null, "pyname": null, "kind": "0308", "width": "30", "length": "0.185", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37841114, 31.20925626 ], [ 115.37823132, 31.20938636 ], [ 115.37812134, 31.20947645 ], [ 115.37804142, 31.20956645 ], [ 115.3779516, 31.20968651 ], [ 115.37789166, 31.2097865 ], [ 115.37784162, 31.20988649 ], [ 115.37780166, 31.21001645 ], [ 115.37777178, 31.2101564 ], [ 115.37775162, 31.2102464 ], [ 115.3777617, 31.21035633 ], [ 115.3777716, 31.21050623 ], [ 115.37780148, 31.21066611 ], [ 115.37783154, 31.21072605 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518540", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.096", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40211246, 31.23608918 ], [ 115.40183256, 31.23538952 ], [ 115.40178252, 31.23526959 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.518541", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3984239, 31.22232584 ], [ 115.398144, 31.22202605 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520670", "Name": "巴水大桥", "pyname": "bsdq", "kind": "0308", "width": "55", "length": "0.139", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34641668, 31.17140906 ], [ 115.3462968, 31.17130929 ], [ 115.34564826, 31.17081074 ], [ 115.3454787, 31.17065112 ], [ 115.34539878, 31.17052134 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520671", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.196", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34539878, 31.17052134 ], [ 115.34526918, 31.17033162 ], [ 115.34507946, 31.17001212 ], [ 115.3447902, 31.16949291 ], [ 115.34465052, 31.16922327 ], [ 115.34462064, 31.16918336 ], [ 115.3444509, 31.16896376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520672", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.135", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3430739, 31.16868642 ], [ 115.3439919, 31.16883465 ], [ 115.34414166, 31.16887439 ], [ 115.3444509, 31.16896376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520673", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.139", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3171782, 31.18410621 ], [ 115.31735784, 31.18399596 ], [ 115.31737782, 31.18397594 ], [ 115.31745756, 31.18390583 ], [ 115.31765718, 31.18373555 ], [ 115.31779686, 31.18361535 ], [ 115.31810628, 31.18333491 ], [ 115.3181862, 31.18325481 ], [ 115.31821608, 31.1832248 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520674", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.340", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31821608, 31.1832248 ], [ 115.31826594, 31.1831847 ], [ 115.31833578, 31.18313462 ], [ 115.3184157, 31.1830745 ], [ 115.3185354, 31.1830043 ], [ 115.31858526, 31.18298423 ], [ 115.31881494, 31.1828639 ], [ 115.31895462, 31.18280364 ], [ 115.31934378, 31.18263305 ], [ 115.3198827, 31.18238217 ], [ 115.32014208, 31.18224177 ], [ 115.32033162, 31.18213148 ], [ 115.3205811, 31.18194113 ], [ 115.32067092, 31.18185104 ], [ 115.32072096, 31.18180095 ], [ 115.32083076, 31.18163085 ], [ 115.32098034, 31.18139069 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520738", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.194", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29636912, 31.19927382 ], [ 115.29632934, 31.19937386 ], [ 115.29630936, 31.19947385 ], [ 115.29630936, 31.19957379 ], [ 115.29636912, 31.19992353 ], [ 115.2963792, 31.20003347 ], [ 115.2963792, 31.20007343 ], [ 115.29635922, 31.20015344 ], [ 115.29631926, 31.20027345 ], [ 115.29621936, 31.20043356 ], [ 115.29596988, 31.20079379 ], [ 115.29590004, 31.20091385 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520739", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.058", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32098034, 31.18139069 ], [ 115.32109014, 31.18122059 ], [ 115.32122982, 31.18091045 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520740", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.115", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31439396, 31.18592039 ], [ 115.3144539, 31.18591026 ], [ 115.31466342, 31.18581995 ], [ 115.31516238, 31.18555917 ], [ 115.31542176, 31.18538876 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520741", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.200", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31542176, 31.18538876 ], [ 115.31552166, 31.18529862 ], [ 115.3155915, 31.18522856 ], [ 115.3157013, 31.1851184 ], [ 115.31573118, 31.18507835 ], [ 115.31590092, 31.1848182 ], [ 115.31595078, 31.18475813 ], [ 115.31608056, 31.18461795 ], [ 115.31619036, 31.18453781 ], [ 115.31631006, 31.18446761 ], [ 115.31647962, 31.18437734 ], [ 115.31655954, 31.18435722 ], [ 115.3169487, 31.18423658 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520742", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.026", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3169487, 31.18423658 ], [ 115.3170585, 31.18417641 ], [ 115.3171782, 31.18410621 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.520743", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.078", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29636912, 31.19927382 ], [ 115.29644904, 31.19915376 ], [ 115.29688824, 31.19873319 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.522715", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.237", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11945774, 30.88393916 ], [ 115.11951786, 30.88389924 ], [ 115.12008846, 30.88356003 ], [ 115.1203887, 30.88333044 ], [ 115.120826521809576, 30.882954976083322 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523162", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.353", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3311669, 30.98284259 ], [ 115.33123674, 30.98298236 ], [ 115.33149612, 30.98334164 ], [ 115.33214448, 30.9842298 ], [ 115.33225428, 30.98438951 ], [ 115.33240386, 30.98462904 ], [ 115.33251366, 30.98482871 ], [ 115.33279302, 30.9852779 ], [ 115.33298256, 30.9856073 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523163", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.063", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3317357, 30.98256165 ], [ 115.3313964, 30.9827322 ], [ 115.3311669, 30.98284259 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523166", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.700", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34075334, 31.00211249 ], [ 115.34048406, 31.00120353 ], [ 115.34029452, 31.00072419 ], [ 115.34020488, 31.00042454 ], [ 115.34011506, 31.00012488 ], [ 115.3400751, 30.99998502 ], [ 115.33998546, 30.99968541 ], [ 115.33986576, 30.99929585 ], [ 115.3398159, 30.99910608 ], [ 115.33971618, 30.99878645 ], [ 115.33964634, 30.99852675 ], [ 115.33962636, 30.99836687 ], [ 115.33959648, 30.99817706 ], [ 115.3395765, 30.99795719 ], [ 115.3395765, 30.99791723 ], [ 115.33955652, 30.99775734 ], [ 115.33955652, 30.99753747 ], [ 115.3394568, 30.99677814 ], [ 115.33938714, 30.99610868 ], [ 115.33937724, 30.99595878 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523167", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.114", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33937724, 30.99595878 ], [ 115.33934718, 30.99568901 ], [ 115.3393074, 30.9952593 ], [ 115.33927752, 30.99493958 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523170", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.484", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33927752, 30.99493958 ], [ 115.33926744, 30.99485961 ], [ 115.33921776, 30.99434004 ], [ 115.3391679, 30.99399035 ], [ 115.33912794, 30.99344072 ], [ 115.33907808, 30.99289113 ], [ 115.33900842, 30.99242156 ], [ 115.33894848, 30.99201192 ], [ 115.33889862, 30.99157227 ], [ 115.33884876, 30.99130254 ], [ 115.33881888, 30.99106274 ], [ 115.338789, 30.99087288 ], [ 115.33869918, 30.99061323 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523190", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.908", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.316378790865159, 30.958666784383745 ], [ 115.31641122, 30.95878374 ], [ 115.3164411, 30.95893359 ], [ 115.31654082, 30.95936316 ], [ 115.3165707, 30.95966291 ], [ 115.3165806, 30.95993273 ], [ 115.3165806, 30.96005265 ], [ 115.31656062, 30.96047246 ], [ 115.31656062, 30.96065237 ], [ 115.3165707, 30.96074228 ], [ 115.3165707, 30.96077225 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523284", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.103", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08597468, 30.91690494 ], [ 115.08615468, 30.9166551 ], [ 115.08628464, 30.91645521 ], [ 115.08639462, 30.91629528 ], [ 115.08651468, 30.91610543 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523310", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.726", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08651468, 30.91610543 ], [ 115.08675462, 30.91572563 ], [ 115.08728472, 30.91492611 ], [ 115.0875846, 30.91446639 ], [ 115.08783462, 30.91409663 ], [ 115.0879446, 30.9139367 ], [ 115.08825456, 30.9135569 ], [ 115.08847452, 30.91329707 ], [ 115.0885746, 30.91319712 ], [ 115.08898446, 30.91283726 ], [ 115.0892145, 30.91264736 ], [ 115.0894044, 30.91247744 ], [ 115.08952446, 30.91238748 ], [ 115.08963444, 30.91228754 ], [ 115.09083414, 30.9113379 ], [ 115.091244, 30.91108802 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523311", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.547", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09911144, 30.90393054 ], [ 115.10001108, 30.90339059 ], [ 115.10019108, 30.90328065 ], [ 115.10034102, 30.90316073 ], [ 115.10049114, 30.90300084 ], [ 115.10060112, 30.90288092 ], [ 115.10079102, 30.90260111 ], [ 115.1009811, 30.90228134 ], [ 115.10136126, 30.90147188 ], [ 115.10163126, 30.90073244 ], [ 115.10188128, 30.90022281 ], [ 115.10206146, 30.89988302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523312", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.268", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10206146, 30.89988302 ], [ 115.10226144, 30.89950331 ], [ 115.10234136, 30.89934342 ], [ 115.10251146, 30.89914353 ], [ 115.10263134, 30.89905358 ], [ 115.10288136, 30.89891367 ], [ 115.10296128, 30.89887367 ], [ 115.10305128, 30.89883371 ], [ 115.10332128, 30.8987937 ], [ 115.10383104, 30.89877363 ], [ 115.104231, 30.89877359 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523313", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.241", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1172261, 30.88493703 ], [ 115.11771642, 30.88476747 ], [ 115.11811674, 30.88460786 ], [ 115.11945774, 30.88393916 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523314", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.804", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09336368, 30.90894908 ], [ 115.09373358, 30.90847932 ], [ 115.09442334, 30.90756965 ], [ 115.09503318, 30.90675996 ], [ 115.09516314, 30.90659004 ], [ 115.09526304, 30.90645009 ], [ 115.09556292, 30.90605022 ], [ 115.09581294, 30.90578031 ], [ 115.09615278, 30.90550041 ], [ 115.09668252, 30.90513047 ], [ 115.09705242, 30.90486051 ], [ 115.09729236, 30.90469055 ], [ 115.09739226, 30.90462057 ], [ 115.09748226, 30.90457058 ], [ 115.09760214, 30.90451059 ], [ 115.09777206, 30.90446055 ], [ 115.09803198, 30.90440052 ], [ 115.0982919, 30.9043305 ], [ 115.09845174, 30.90427052 ], [ 115.09879158, 30.9041105 ], [ 115.09911144, 30.90393054 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523341", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.211", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34090868, 31.16829065 ], [ 115.34101848, 31.16832044 ], [ 115.34107824, 31.16833029 ], [ 115.34175684, 31.16845899 ], [ 115.3420263, 31.16850849 ], [ 115.3430739, 31.16868642 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523342", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.082", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3401903, 31.16869182 ], [ 115.340769, 31.16838087 ], [ 115.34090868, 31.16829065 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523343", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.380", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31290698, 31.08544637 ], [ 115.3127673, 31.08623621 ], [ 115.31273742, 31.08648614 ], [ 115.31270736, 31.086806 ], [ 115.31263752, 31.08728583 ], [ 115.31258748, 31.08762576 ], [ 115.31247768, 31.08843549 ], [ 115.3124577, 31.08857544 ], [ 115.31238786, 31.08943508 ], [ 115.31229804, 31.08998493 ], [ 115.31226798, 31.09027487 ], [ 115.31218824, 31.09083467 ], [ 115.31216826, 31.09104459 ], [ 115.31218806, 31.09130442 ], [ 115.31221812, 31.09148424 ], [ 115.3123677, 31.09213359 ], [ 115.31253726, 31.09268295 ], [ 115.31264688, 31.09308255 ], [ 115.31269674, 31.09329234 ], [ 115.3127367, 31.09342217 ], [ 115.31277666, 31.09384188 ], [ 115.31279646, 31.09412165 ], [ 115.31279646, 31.09450145 ], [ 115.3128564, 31.09485114 ], [ 115.31291598, 31.09658004 ], [ 115.31295576, 31.09777929 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523344", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.667", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33420476, 31.14697325 ], [ 115.33495338, 31.14759177 ], [ 115.33531266, 31.1479011 ], [ 115.3353726, 31.14795096 ], [ 115.33583178, 31.14844997 ], [ 115.33599144, 31.14862961 ], [ 115.33606128, 31.14872946 ], [ 115.33619088, 31.14896909 ], [ 115.33643046, 31.14927855 ], [ 115.33648032, 31.14939839 ], [ 115.33648032, 31.14942836 ], [ 115.33646016, 31.14958824 ], [ 115.33646016, 31.14961821 ], [ 115.33648014, 31.14965817 ], [ 115.33658994, 31.14992781 ], [ 115.33669956, 31.15023741 ], [ 115.33675932, 31.15042718 ], [ 115.3367694, 31.15051709 ], [ 115.33679928, 31.15061699 ], [ 115.33691898, 31.15077669 ], [ 115.3369989, 31.15085652 ], [ 115.3371186, 31.15095629 ], [ 115.33716846, 31.15101618 ], [ 115.33719852, 31.15108611 ], [ 115.33721832, 31.15110605 ], [ 115.337358, 31.15147559 ], [ 115.3376073, 31.1520348 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523345", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.371", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34722884, 31.16120513 ], [ 115.34773824, 31.16085476 ], [ 115.3483974, 31.16038428 ], [ 115.34911668, 31.1598738 ], [ 115.34934636, 31.15974362 ], [ 115.34996556, 31.15949301 ], [ 115.35016518, 31.15942281 ], [ 115.35043482, 31.15936251 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523346", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.367", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32322152, 31.11759941 ], [ 115.32323142, 31.11768936 ], [ 115.32328128, 31.11798911 ], [ 115.32336102, 31.11829875 ], [ 115.32354066, 31.11872819 ], [ 115.32376998, 31.11915753 ], [ 115.32386988, 31.11932723 ], [ 115.3240794, 31.1197266 ], [ 115.32412926, 31.11980648 ], [ 115.32435858, 31.12017584 ], [ 115.32459816, 31.12053521 ], [ 115.324668, 31.12063502 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523347", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.624", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35043482, 31.15936251 ], [ 115.3511739, 31.15926167 ], [ 115.35157332, 31.15922117 ], [ 115.35217236, 31.1591205 ], [ 115.35251202, 31.15899018 ], [ 115.35266178, 31.15892003 ], [ 115.35282162, 31.15878993 ], [ 115.3529415, 31.15868985 ], [ 115.35316128, 31.15834988 ], [ 115.35331122, 31.1581998 ], [ 115.35356088, 31.1580396 ], [ 115.35377058, 31.15790946 ], [ 115.35393042, 31.15780934 ], [ 115.35410016, 31.1576792 ], [ 115.35424002, 31.15755914 ], [ 115.35431004, 31.15747913 ], [ 115.35447996, 31.15726907 ], [ 115.35451992, 31.15720904 ], [ 115.35460974, 31.15703907 ], [ 115.35468984, 31.15683914 ], [ 115.35480972, 31.1566991 ], [ 115.35505938, 31.15656887 ], [ 115.35525918, 31.15641875 ], [ 115.35529914, 31.15635876 ], [ 115.35530904, 31.15631876 ], [ 115.35527916, 31.15625886 ], [ 115.35524928, 31.15622894 ], [ 115.35515946, 31.15617908 ], [ 115.35496974, 31.1560794 ], [ 115.35484986, 31.15599962 ], [ 115.35482988, 31.15597964 ], [ 115.35481008, 31.15594971 ], [ 115.3547901, 31.1558598 ], [ 115.35477012, 31.15579986 ], [ 115.3547802, 31.15572993 ], [ 115.3547901, 31.15567994 ], [ 115.35482016, 31.15558998 ], [ 115.35489, 31.15551992 ], [ 115.35493986, 31.15545984 ], [ 115.35501978, 31.15539972 ], [ 115.35520932, 31.15525946 ], [ 115.35528924, 31.15518935 ], [ 115.35537906, 31.15510925 ], [ 115.35554862, 31.15492902 ], [ 115.35575814, 31.15466874 ], [ 115.3559178, 31.15453851 ], [ 115.3560375, 31.15450832 ], [ 115.3561275, 31.15449819 ], [ 115.35621732, 31.15451804 ], [ 115.3562472, 31.15453797 ], [ 115.35649686, 31.15470758 ], [ 115.35655662, 31.15475744 ], [ 115.35664644, 31.15478732 ], [ 115.35669648, 31.15478723 ], [ 115.35677622, 31.15475712 ], [ 115.35688602, 31.15465695 ], [ 115.35710562, 31.15436666 ], [ 115.3571355, 31.15432665 ], [ 115.35715548, 31.15426662 ], [ 115.35718536, 31.1541566 ], [ 115.35718536, 31.15411659 ], [ 115.35716538, 31.15406664 ], [ 115.3571553, 31.15403667 ], [ 115.3571454, 31.15399667 ], [ 115.35689574, 31.15372716 ], [ 115.35676596, 31.15352741 ], [ 115.35671592, 31.15336752 ], [ 115.35670602, 31.15329755 ], [ 115.35670602, 31.15322757 ], [ 115.35678576, 31.15314743 ], [ 115.35683562, 31.15314738 ], [ 115.35688566, 31.1531373 ], [ 115.3569654, 31.15314716 ], [ 115.35711516, 31.15320692 ], [ 115.35723504, 31.15325669 ], [ 115.35734484, 31.15329651 ], [ 115.35755436, 31.15334619 ], [ 115.35815322, 31.15346522 ], [ 115.35852258, 31.1535846 ], [ 115.35875226, 31.15364423 ], [ 115.35890202, 31.15367397 ], [ 115.35900174, 31.15368383 ], [ 115.35917148, 31.15370354 ], [ 115.35923142, 31.15371344 ], [ 115.3593711, 31.15370322 ], [ 115.35958062, 31.15361291 ], [ 115.35964056, 31.15358285 ], [ 115.35969042, 31.15355274 ], [ 115.35974028, 31.15351269 ], [ 115.35981012, 31.15346261 ], [ 115.35989994, 31.15339245 ], [ 115.3600596, 31.15323225 ], [ 115.3601595, 31.15315211 ], [ 115.36023924, 31.15311201 ], [ 115.36035912, 31.15304181 ], [ 115.36055874, 31.15303151 ], [ 115.36077834, 31.15311116 ], [ 115.3609479, 31.15317087 ], [ 115.36102782, 31.15318073 ], [ 115.36108776, 31.15318064 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523348", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.662", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36108776, 31.15318064 ], [ 115.36117758, 31.15313051 ], [ 115.3612773, 31.15303038 ], [ 115.36129728, 31.15301036 ], [ 115.36148682, 31.15285007 ], [ 115.3616067, 31.15277991 ], [ 115.36170642, 31.15273977 ], [ 115.36190604, 31.15267947 ], [ 115.3619559, 31.15265936 ], [ 115.36201584, 31.15264928 ], [ 115.36211556, 31.15262912 ], [ 115.3621755, 31.15262903 ], [ 115.36226532, 31.15262889 ], [ 115.36231518, 31.15263879 ], [ 115.36246494, 31.15267857 ], [ 115.36263468, 31.15273829 ], [ 115.36276446, 31.15277807 ], [ 115.36298406, 31.15285772 ], [ 115.36323354, 31.15292729 ], [ 115.36336332, 31.1529371 ], [ 115.36347312, 31.15293692 ], [ 115.36363278, 31.1528867 ], [ 115.36370262, 31.15283657 ], [ 115.36375266, 31.15278653 ], [ 115.36377246, 31.15271651 ], [ 115.36376256, 31.15264653 ], [ 115.36375248, 31.15260653 ], [ 115.36370262, 31.15252665 ], [ 115.36360272, 31.15242684 ], [ 115.36325334, 31.15203746 ], [ 115.36324326, 31.1519975 ], [ 115.3632033, 31.15189755 ], [ 115.3631934, 31.15182762 ], [ 115.3632033, 31.1517576 ], [ 115.36322328, 31.15163759 ], [ 115.36325316, 31.15156757 ], [ 115.36328304, 31.15152752 ], [ 115.3634427, 31.15135733 ], [ 115.36357248, 31.15127714 ], [ 115.36364232, 31.15123704 ], [ 115.3637721, 31.15112684 ], [ 115.363782, 31.15110681 ], [ 115.36382196, 31.15101677 ], [ 115.36385184, 31.15064682 ], [ 115.36388172, 31.15056677 ], [ 115.36394148, 31.15050669 ], [ 115.3640214, 31.15047659 ], [ 115.36406136, 31.15046651 ], [ 115.36411122, 31.15045643 ], [ 115.3642509, 31.15041624 ], [ 115.36432074, 31.15038614 ], [ 115.36441056, 31.15033601 ], [ 115.36445052, 31.15026594 ], [ 115.36450038, 31.1501759 ], [ 115.36456032, 31.15011582 ], [ 115.36465014, 31.15007568 ], [ 115.36471998, 31.15004558 ], [ 115.3649097, 31.15004526 ], [ 115.3652589, 31.15003473 ], [ 115.36567812, 31.15000409 ], [ 115.36596756, 31.14996363 ], [ 115.36615728, 31.14992331 ], [ 115.36623702, 31.14988322 ], [ 115.36633692, 31.14981306 ], [ 115.3663767, 31.14976302 ], [ 115.36639668, 31.14970299 ], [ 115.36639668, 31.149653 ], [ 115.36639668, 31.14961304 ], [ 115.36638678, 31.14955305 ], [ 115.36634682, 31.14949311 ], [ 115.3662768, 31.14941324 ], [ 115.36587756, 31.14907394 ], [ 115.36580754, 31.14902408 ], [ 115.36576776, 31.14896414 ], [ 115.3657377, 31.14883422 ], [ 115.36575768, 31.14864423 ], [ 115.36578756, 31.14847422 ], [ 115.36581744, 31.14826425 ], [ 115.3658673, 31.14805419 ], [ 115.36596702, 31.14779409 ], [ 115.3660068, 31.14772403 ], [ 115.36604676, 31.147664 ], [ 115.36609662, 31.14760392 ], [ 115.3662264, 31.14753372 ], [ 115.36631622, 31.1474736 ], [ 115.366446, 31.14744341 ], [ 115.36658568, 31.14744318 ], [ 115.36676532, 31.14749291 ], [ 115.3668852, 31.14749273 ], [ 115.36697502, 31.14747257 ], [ 115.36702488, 31.14744251 ], [ 115.36705476, 31.14737249 ], [ 115.36707474, 31.14730247 ], [ 115.36708464, 31.14724244 ], [ 115.36708464, 31.14718245 ], [ 115.36707474, 31.14710249 ], [ 115.36706466, 31.14690255 ], [ 115.36706466, 31.14680256 ], [ 115.36708446, 31.1465826 ], [ 115.36717428, 31.14631251 ], [ 115.36718418, 31.14627251 ], [ 115.36724412, 31.14618242 ], [ 115.36729398, 31.14608238 ], [ 115.36734384, 31.14600233 ], [ 115.3675035, 31.1458221 ], [ 115.36792254, 31.14542151 ], [ 115.36812216, 31.14524124 ], [ 115.36852158, 31.1448209 ], [ 115.3688913, 31.14449078 ], [ 115.36903116, 31.14436077 ], [ 115.36916112, 31.14427073 ], [ 115.36942086, 31.1441306 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.523349", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.117", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3376073, 31.1520348 ], [ 115.3378368, 31.15259406 ], [ 115.33788666, 31.15269392 ], [ 115.33802634, 31.15302345 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525722", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.240", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38738576, 31.13581095 ], [ 115.38776556, 31.13548088 ], [ 115.38832518, 31.13497076 ], [ 115.38914454, 31.13426057 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525734", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.122", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37921304, 31.13862606 ], [ 115.38025182, 31.13894493 ], [ 115.38042174, 31.13899475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525735", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.065", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38914454, 31.13426057 ], [ 115.38986418, 31.13365037 ], [ 115.38992412, 31.13359038 ], [ 115.39000404, 31.13351037 ], [ 115.390044, 31.13345039 ], [ 115.390134, 31.13331039 ], [ 115.39018386, 31.1332104 ], [ 115.39019394, 31.13317044 ], [ 115.390224, 31.13310047 ], [ 115.390224, 31.13299053 ], [ 115.390224, 31.13287065 ], [ 115.39019412, 31.13271077 ], [ 115.39013418, 31.13257091 ], [ 115.38995454, 31.13226131 ], [ 115.38985464, 31.13207154 ], [ 115.38975474, 31.13190176 ], [ 115.38972486, 31.13179187 ], [ 115.38972486, 31.13173188 ], [ 115.38976482, 31.13166191 ], [ 115.38979488, 31.13161191 ], [ 115.38984474, 31.13156192 ], [ 115.38992484, 31.13151188 ], [ 115.3900647, 31.13149176 ], [ 115.3903644, 31.13156147 ], [ 115.39046412, 31.13157137 ], [ 115.39061406, 31.13158122 ], [ 115.39074402, 31.13157114 ], [ 115.39100376, 31.13152092 ], [ 115.39112364, 31.13150085 ], [ 115.3915731, 31.13154041 ], [ 115.39168308, 31.13153033 ], [ 115.3917729, 31.13153024 ], [ 115.39190286, 31.13153015 ], [ 115.39233234, 31.13160971 ], [ 115.39250208, 31.13166951 ], [ 115.39272186, 31.13173926 ], [ 115.39296162, 31.13179902 ], [ 115.39306152, 31.13180892 ], [ 115.39315152, 31.13179884 ], [ 115.39326132, 31.13177877 ], [ 115.3933812, 31.13173868 ], [ 115.39359108, 31.13165858 ], [ 115.39369098, 31.13160854 ], [ 115.39379088, 31.13156844 ], [ 115.39388088, 31.13148843 ], [ 115.39392084, 31.13142845 ], [ 115.39394082, 31.13136846 ], [ 115.39394082, 31.1313285 ], [ 115.39394082, 31.13127855 ], [ 115.39391094, 31.1312286 ], [ 115.39390086, 31.13120862 ], [ 115.3938609, 31.13116871 ], [ 115.39376118, 31.13108883 ], [ 115.3936413, 31.13099901 ], [ 115.39352142, 31.13087922 ], [ 115.39316196, 31.13049978 ], [ 115.39304208, 31.13027006 ], [ 115.3928124, 31.1299605 ], [ 115.39262268, 31.12955096 ], [ 115.39263276, 31.12940106 ], [ 115.39271268, 31.12932105 ], [ 115.3928925, 31.12924095 ], [ 115.39295262, 31.12923092 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525736", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.352", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3757061, 31.13949848 ], [ 115.37614584, 31.13932824 ], [ 115.37633556, 31.13926808 ], [ 115.37653554, 31.13922794 ], [ 115.37672526, 31.1391878 ], [ 115.37750466, 31.13893733 ], [ 115.3788534, 31.13859641 ], [ 115.3789632, 31.13858628 ], [ 115.37921304, 31.13862606 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525742", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.045", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39295262, 31.12923092 ], [ 115.3932723, 31.12917066 ], [ 115.39341216, 31.12915055 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525898", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75857214, 31.07012378 ], [ 114.75792144, 31.07054291 ], [ 114.75734076, 31.07093207 ], [ 114.75722052, 31.0710119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525916", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.484", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74810838, 31.07898671 ], [ 114.74794836, 31.07920658 ], [ 114.74745876, 31.07985665 ], [ 114.74693928, 31.08048678 ], [ 114.74649972, 31.0808669 ], [ 114.7456602, 31.08150716 ], [ 114.74513064, 31.08185735 ], [ 114.7447809, 31.08210746 ], [ 114.74470098, 31.08216749 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525917", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.310", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76067418, 31.06808658 ], [ 114.76053396, 31.06849617 ], [ 114.76038366, 31.0687259 ], [ 114.76017342, 31.06896557 ], [ 114.75970308, 31.06938501 ], [ 114.75942282, 31.06957473 ], [ 114.75925272, 31.06968458 ], [ 114.75888246, 31.06993419 ], [ 114.75857214, 31.07012378 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525925", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.040", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75012168, 31.07651103 ], [ 114.75000162, 31.07660085 ], [ 114.74991144, 31.07668073 ], [ 114.74983134, 31.07677055 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525926", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.296", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74983134, 31.07677055 ], [ 114.74964108, 31.07696018 ], [ 114.74923032, 31.07744933 ], [ 114.74898984, 31.07780874 ], [ 114.74810838, 31.07898671 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525927", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.592", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7657131, 31.05345146 ], [ 114.7656429, 31.05358133 ], [ 114.76506222, 31.05474008 ], [ 114.76458144, 31.05579893 ], [ 114.7639806, 31.05702761 ], [ 114.76331964, 31.05836618 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.525928", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "1.111", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.76331964, 31.05836618 ], [ 114.76313946, 31.05872577 ], [ 114.7626387, 31.05983457 ], [ 114.76235826, 31.06062378 ], [ 114.76201734, 31.06214231 ], [ 114.76165644, 31.06378071 ], [ 114.76129554, 31.06536921 ], [ 114.76084446, 31.06739723 ], [ 114.76075428, 31.06783683 ], [ 114.76067418, 31.06808658 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526586", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.196", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08200748, 30.91987535 ], [ 115.08360516, 30.91877415 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526587", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.455", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01452062, 31.00219331 ], [ 115.01452062, 31.00213332 ], [ 115.01459046, 31.00115372 ], [ 115.01461062, 31.00000437 ], [ 115.01460072, 30.99986447 ], [ 115.01467056, 30.99865505 ], [ 115.01469054, 30.99809529 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526588", "Name": "振兴路", "pyname": "zxl", "kind": "0301", "width": "55", "length": "0.335", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02416952, 30.96396729 ], [ 115.02573498, 30.96236448 ], [ 115.02612396, 30.96198378 ], [ 115.02624366, 30.9618536 ], [ 115.02643302, 30.96166325 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526600", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.250", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02096048, 30.97054292 ], [ 115.0195356, 30.968658 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526601", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.103", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02184716, 30.97410845 ], [ 115.02208638, 30.97357803 ], [ 115.02216612, 30.97336793 ], [ 115.022196, 30.97322789 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526602", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.264", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.022196, 30.97322789 ], [ 115.02223578, 30.97299794 ], [ 115.02224586, 30.97254812 ], [ 115.0221861, 30.97231844 ], [ 115.02209646, 30.97207881 ], [ 115.02183726, 30.97166981 ], [ 115.02136908, 30.97110146 ], [ 115.0213392, 30.97107153 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526603", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.069", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0213392, 30.97107153 ], [ 115.02114984, 30.97080221 ], [ 115.02104022, 30.97064264 ], [ 115.02096048, 30.97054292 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526604", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0440039, 30.93784628 ], [ 115.0440138, 30.9378263 ], [ 115.04433294, 30.93741576 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.526605", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.916", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03584594, 30.95301609 ], [ 115.03586592, 30.95299602 ], [ 115.03681326, 30.95203437 ], [ 115.03704258, 30.951774 ], [ 115.03744146, 30.95138327 ], [ 115.03758114, 30.95125304 ], [ 115.03783044, 30.95102255 ], [ 115.04069226, 30.94815749 ], [ 115.0412805, 30.94753649 ], [ 115.04162952, 30.94724583 ], [ 115.04192868, 30.94708518 ], [ 115.0422876, 30.94697439 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527465", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.201", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00995258, 31.0436523 ], [ 115.00994268, 31.04350241 ], [ 115.0099227, 31.04325261 ], [ 115.009893, 31.04184353 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527466", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.035", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01326998, 31.05210758 ], [ 115.01309052, 31.05238797 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527467", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.486", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01326998, 31.05210758 ], [ 115.01349912, 31.05167715 ], [ 115.01373834, 31.05131661 ], [ 115.01377812, 31.05124655 ], [ 115.01394768, 31.05089622 ], [ 115.01398746, 31.05085613 ], [ 115.01411706, 31.05057591 ], [ 115.01425656, 31.05041558 ], [ 115.01451558, 31.04989511 ], [ 115.01456544, 31.04980497 ], [ 115.01468496, 31.0496747 ], [ 115.0147548, 31.04951459 ], [ 115.01535276, 31.04848337 ], [ 115.01540262, 31.04839328 ], [ 115.01541252, 31.04831331 ], [ 115.01541252, 31.04816337 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527468", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01476506, 31.04421746 ], [ 115.01467542, 31.04382794 ], [ 115.01464554, 31.04364816 ], [ 115.01464554, 31.04361815 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527469", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.458", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01464554, 31.04361815 ], [ 115.01390808, 31.04360037 ], [ 115.01356932, 31.04359137 ], [ 115.01290188, 31.04362341 ], [ 115.01216442, 31.0436856 ], [ 115.01073972, 31.04383982 ], [ 115.01054046, 31.04385039 ], [ 115.01031132, 31.04385111 ], [ 115.01024148, 31.0438413 ], [ 115.01018172, 31.0438215 ], [ 115.01013186, 31.04380166 ], [ 115.00995258, 31.0436523 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527470", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.113", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0151436, 31.04657505 ], [ 115.01512362, 31.04647515 ], [ 115.01507376, 31.04625542 ], [ 115.01498412, 31.04556606 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527471", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.321", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99691464, 31.0827173 ], [ 114.99686478, 31.08290733 ], [ 114.99686478, 31.08310722 ], [ 114.99691464, 31.08332696 ], [ 114.99691464, 31.08340692 ], [ 114.99695442, 31.08357671 ], [ 114.9969843, 31.08367656 ], [ 114.99709392, 31.08408602 ], [ 114.99716358, 31.08434567 ], [ 114.99729318, 31.08478505 ], [ 114.99737292, 31.08498471 ], [ 114.99749244, 31.08530421 ], [ 114.9975522, 31.0855239 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527472", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.196", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0035039, 31.06910723 ], [ 115.0032348, 31.06961762 ], [ 115.00278606, 31.07063817 ], [ 115.0027164, 31.07073834 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527473", "Name": "S206", "pyname": "s206", "kind": "0308", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01541252, 31.04816337 ], [ 115.01541252, 31.04803346 ], [ 115.01539254, 31.04798355 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527474", "Name": "S206", "pyname": "s206", "kind": "0308", "width": "55", "length": "0.158", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01539254, 31.04798355 ], [ 115.01537274, 31.04789364 ], [ 115.01525322, 31.04726436 ], [ 115.01518338, 31.04671487 ], [ 115.0151436, 31.04657505 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527475", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.486", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01094024, 31.03425486 ], [ 115.01332218, 31.03128954 ], [ 115.01385048, 31.03065837 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527482", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.450", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00559676, 31.06548306 ], [ 115.0054173, 31.06576346 ], [ 115.0052778, 31.06596375 ], [ 115.00504866, 31.06637424 ], [ 115.0047198, 31.06694489 ], [ 115.00464006, 31.06713501 ], [ 115.00451064, 31.06732532 ], [ 115.00366356, 31.068797 ], [ 115.0035039, 31.06910723 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527483", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01449074, 31.00334265 ], [ 115.01449074, 31.00330269 ], [ 115.01449074, 31.00322273 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527484", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01371224, 31.01320881 ], [ 115.013772, 31.0129988 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527485", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.759", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.013772, 31.0129988 ], [ 115.01384184, 31.01259888 ], [ 115.01386182, 31.01226903 ], [ 115.01401158, 31.01055975 ], [ 115.01404164, 31.00997012 ], [ 115.01421156, 31.00795097 ], [ 115.01433108, 31.00618152 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527486", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.951", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01385048, 31.03065837 ], [ 115.0143786, 31.03000713 ], [ 115.01455788, 31.02971675 ], [ 115.01468748, 31.02942654 ], [ 115.01475714, 31.02912648 ], [ 115.01482698, 31.02883646 ], [ 115.01482698, 31.02854661 ], [ 115.01468766, 31.02666809 ], [ 115.01452836, 31.02497951 ], [ 115.0144587, 31.02398028 ], [ 115.01421966, 31.0215024 ], [ 115.01415, 31.02039324 ], [ 115.01394102, 31.01821511 ], [ 115.01387118, 31.01745573 ], [ 115.01386128, 31.01707598 ], [ 115.01374176, 31.01573709 ], [ 115.01372196, 31.01505759 ], [ 115.01372214, 31.01359856 ], [ 115.01371224, 31.01333873 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527487", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.014", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01371224, 31.01333873 ], [ 115.01371224, 31.01320881 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527529", "Name": "振兴大道", "pyname": "zxdd", "kind": "0308", "width": "55", "length": "0.105", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32207168, 31.04231459 ], [ 115.32241098, 31.04230401 ], [ 115.32292992, 31.04232309 ], [ 115.32309948, 31.04231279 ], [ 115.32316932, 31.04231265 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527530", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.240", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31327976, 31.04876687 ], [ 115.3134594, 31.04858664 ], [ 115.31376882, 31.04832627 ], [ 115.31392848, 31.04821602 ], [ 115.31400822, 31.0481559 ], [ 115.31454714, 31.04765523 ], [ 115.3150362, 31.04722458 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.527531", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.221", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3150362, 31.04722458 ], [ 115.31556504, 31.04676387 ], [ 115.31601414, 31.04633327 ], [ 115.31647314, 31.04595266 ], [ 115.31657304, 31.04585253 ], [ 115.3166328, 31.04578247 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550857", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.046", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02049428, 31.16651481 ], [ 115.02055422, 31.16666457 ], [ 115.02063396, 31.16691428 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550858", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.157", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02063396, 31.16691428 ], [ 115.02100278, 31.16801291 ], [ 115.0211025, 31.16826257 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550859", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.188", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02017532, 31.16562597 ], [ 115.01998596, 31.16507666 ], [ 115.0199262, 31.16494688 ], [ 115.01969688, 31.16436786 ], [ 115.01963712, 31.1642181 ], [ 115.01956746, 31.16401839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550860", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.101", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01956746, 31.16401839 ], [ 115.0195176, 31.16387862 ], [ 115.01939808, 31.16360912 ], [ 115.0193583, 31.16349927 ], [ 115.01924868, 31.16321973 ], [ 115.0192188, 31.16315988 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550861", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.013", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0192188, 31.16315988 ], [ 115.01917884, 31.16305004 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550862", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.085", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01917884, 31.16305004 ], [ 115.01904942, 31.16276055 ], [ 115.01886006, 31.16234133 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550863", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.177", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01886006, 31.16234133 ], [ 115.01879022, 31.16219162 ], [ 115.0186608, 31.16195208 ], [ 115.01859096, 31.16181236 ], [ 115.01841168, 31.16146307 ], [ 115.01818254, 31.16101397 ], [ 115.0181127, 31.16088423 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550864", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.053", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0181127, 31.16088423 ], [ 115.01784378, 31.16035526 ], [ 115.0176942, 31.16007585 ], [ 115.01749494, 31.15969659 ], [ 115.0172658, 31.15927746 ], [ 115.0169967, 31.15874853 ], [ 115.01675766, 31.15827945 ], [ 115.01664804, 31.15807988 ], [ 115.0165584, 31.15791023 ], [ 115.01626932, 31.15735133 ], [ 115.01608014, 31.15699205 ], [ 115.01588088, 31.15661283 ], [ 115.01576118, 31.15639328 ], [ 115.0155918, 31.15606392 ], [ 115.0154424, 31.15576454 ], [ 115.0153128, 31.15551501 ], [ 115.01499402, 31.15492623 ], [ 115.01492418, 31.1547965 ], [ 115.01479476, 31.15451705 ], [ 115.01465526, 31.15427756 ], [ 115.0143165, 31.15359887 ], [ 115.01413704, 31.15326956 ], [ 115.01382816, 31.15266075 ], [ 115.0136289, 31.15224153 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550865", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.421", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0136289, 31.15224153 ], [ 115.01356914, 31.15212179 ], [ 115.01332002, 31.15162274 ], [ 115.01312076, 31.15122354 ], [ 115.01281188, 31.15066469 ], [ 115.01227386, 31.14956682 ], [ 115.01216424, 31.14935726 ], [ 115.0119351, 31.14891815 ], [ 115.01186526, 31.14877842 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550866", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.097", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00692444, 31.13627981 ], [ 115.00701408, 31.13619957 ], [ 115.00766172, 31.13567793 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550867", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00622712, 31.13680163 ], [ 115.0062768, 31.13675154 ], [ 115.00635654, 31.13669133 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550868", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.071", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00635654, 31.13669133 ], [ 115.00644618, 31.13663108 ], [ 115.00662564, 31.13647061 ], [ 115.0068348, 31.13636004 ], [ 115.00692444, 31.13627981 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550869", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.078", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00604766, 31.13747181 ], [ 115.00603776, 31.13731193 ], [ 115.00604766, 31.13719196 ], [ 115.00609752, 31.13704193 ], [ 115.00622712, 31.13680163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550870", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.328", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01186526, 31.14877842 ], [ 115.01162622, 31.14832932 ], [ 115.01143686, 31.1479601 ], [ 115.01117784, 31.14743112 ], [ 115.0109388, 31.1469521 ], [ 115.01080938, 31.14671265 ], [ 115.0106499, 31.14639329 ], [ 115.01062002, 31.14636341 ], [ 115.01000244, 31.14520587 ], [ 115.00973352, 31.14473693 ], [ 115.0094745, 31.14423797 ], [ 115.00923546, 31.14381888 ], [ 115.00900632, 31.14337982 ], [ 115.0087572, 31.14291083 ], [ 115.00847838, 31.14241191 ], [ 115.00826904, 31.14203274 ], [ 115.00812972, 31.14177332 ], [ 115.0078905, 31.14131427 ], [ 115.00780086, 31.14114462 ], [ 115.00765146, 31.14081522 ], [ 115.0074324, 31.14041612 ], [ 115.00712352, 31.13984736 ], [ 115.0068645, 31.13933841 ], [ 115.0065855, 31.13879949 ], [ 115.00646598, 31.13856999 ], [ 115.00619706, 31.13799111 ], [ 115.00616718, 31.13790125 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550871", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.049", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00616718, 31.13790125 ], [ 115.00606764, 31.13765168 ], [ 115.00604766, 31.13747181 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550872", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.055", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01166834, 31.13258828 ], [ 115.0115985, 31.13272841 ], [ 115.01130942, 31.13295908 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550873", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.856", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0097751, 31.12523721 ], [ 115.01000424, 31.12571628 ], [ 115.0102035, 31.12616543 ], [ 115.0103529, 31.12646486 ], [ 115.01050248, 31.12679426 ], [ 115.01074152, 31.1272934 ], [ 115.01084124, 31.12749302 ], [ 115.01105058, 31.12795224 ], [ 115.01126982, 31.1284314 ], [ 115.01149896, 31.12894053 ], [ 115.01159868, 31.12914024 ], [ 115.0116786, 31.12937996 ], [ 115.01171838, 31.12955982 ], [ 115.01173854, 31.12974972 ], [ 115.01176824, 31.13043926 ], [ 115.01178822, 31.13080898 ], [ 115.01178822, 31.13103888 ], [ 115.01179812, 31.13137863 ], [ 115.01181792, 31.13187831 ], [ 115.01181792, 31.13212815 ], [ 115.01180784, 31.13231805 ], [ 115.01166834, 31.13258828 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550874", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.563", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00756362, 31.12029639 ], [ 115.0075836, 31.12032632 ], [ 115.00766316, 31.12052598 ], [ 115.00770312, 31.12060581 ], [ 115.0078923, 31.121055 ], [ 115.00801182, 31.12134449 ], [ 115.00810146, 31.12153412 ], [ 115.00880886, 31.12303122 ], [ 115.00897824, 31.12344054 ], [ 115.00907778, 31.12364012 ], [ 115.00921728, 31.12397951 ], [ 115.00926714, 31.12407932 ], [ 115.00943652, 31.12446861 ], [ 115.0094763, 31.12456847 ], [ 115.00967556, 31.12501761 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550875", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.026", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00967556, 31.12501761 ], [ 115.0097751, 31.12523721 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550876", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.506", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0056909, 31.11604421 ], [ 115.00586028, 31.11641352 ], [ 115.00594992, 31.11663312 ], [ 115.00606944, 31.11689264 ], [ 115.00624872, 31.11732185 ], [ 115.00639812, 31.11768122 ], [ 115.00689618, 31.11875919 ], [ 115.00710534, 31.11925829 ], [ 115.00741422, 31.119957 ], [ 115.00756362, 31.12029639 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550877", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.089", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00469478, 31.11379839 ], [ 115.00484418, 31.11416775 ], [ 115.00500366, 31.11455709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550878", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.178", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00500366, 31.11455709 ], [ 115.00505334, 31.11466685 ], [ 115.00527258, 31.11512598 ], [ 115.00549164, 31.11561504 ], [ 115.0056909, 31.11604421 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550879", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.076", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0032114, 31.10232893 ], [ 115.00322148, 31.1023589 ], [ 115.00344054, 31.10295789 ], [ 115.00344054, 31.10297792 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550880", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.213", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00344054, 31.10297792 ], [ 115.00352028, 31.10320755 ], [ 115.00355016, 31.10329742 ], [ 115.00359984, 31.10349713 ], [ 115.00368948, 31.10390667 ], [ 115.00372926, 31.1043663 ], [ 115.00374924, 31.10493591 ], [ 115.00376904, 31.10518575 ], [ 115.00379892, 31.10566541 ], [ 115.00379892, 31.10568539 ], [ 115.0038288, 31.10624501 ], [ 115.0038486, 31.10664474 ], [ 115.00386858, 31.10711441 ], [ 115.00389846, 31.1076041 ], [ 115.00391826, 31.10787387 ], [ 115.00394814, 31.1081936 ], [ 115.00397802, 31.10855333 ], [ 115.0040178, 31.10887305 ], [ 115.00405758, 31.1092727 ], [ 115.00408746, 31.10956245 ], [ 115.004187, 31.11041174 ], [ 115.00428654, 31.11161081 ], [ 115.0043562, 31.11234021 ], [ 115.00438608, 31.11254001 ], [ 115.00447572, 31.11316938 ], [ 115.00454538, 31.11340905 ], [ 115.00469478, 31.11379839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550881", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.634", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00081002, 31.09595886 ], [ 115.00091964, 31.09625838 ], [ 115.00102926, 31.09657793 ], [ 115.00118874, 31.09700727 ], [ 115.00131834, 31.09732677 ], [ 115.00149762, 31.09778609 ], [ 115.00152768, 31.09790597 ], [ 115.00161732, 31.09815558 ], [ 115.00166718, 31.09828541 ], [ 115.00196616, 31.09905423 ], [ 115.0020459, 31.09927392 ], [ 115.0021755, 31.0996634 ], [ 115.00223526, 31.09982315 ], [ 115.00229502, 31.09995293 ], [ 115.0024545, 31.10037224 ], [ 115.00252416, 31.10057195 ], [ 115.00272342, 31.10106105 ], [ 115.0027632, 31.1011709 ], [ 115.00285284, 31.10138051 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550882", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.111", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00285284, 31.10138051 ], [ 115.00293258, 31.10158017 ], [ 115.00307208, 31.10196956 ], [ 115.0032114, 31.10232893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550883", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.101", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00032186, 31.09445109 ], [ 115.0004214, 31.09473063 ], [ 115.00050114, 31.09498029 ], [ 115.000551, 31.09516007 ], [ 115.00059078, 31.09532985 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550884", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.073", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00059078, 31.09532985 ], [ 115.00060086, 31.09534979 ], [ 115.00073028, 31.09572923 ], [ 115.00081002, 31.09595886 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550885", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.344", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9976818, 31.08602327 ], [ 114.9977016, 31.08612317 ], [ 114.99776136, 31.08628292 ], [ 114.99778134, 31.08636279 ], [ 114.99791094, 31.08672225 ], [ 114.9979806, 31.08691193 ], [ 114.99803046, 31.0870517 ], [ 114.9981102, 31.0873613 ], [ 114.99828948, 31.08792051 ], [ 114.99842898, 31.08834986 ], [ 114.99863814, 31.08899889 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550886", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.628", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99863814, 31.08899889 ], [ 114.99872778, 31.08928847 ], [ 114.99875766, 31.08944831 ], [ 114.99885738, 31.08976785 ], [ 114.99899688, 31.09021722 ], [ 114.99909642, 31.09052673 ], [ 114.99923592, 31.09099608 ], [ 114.99952482, 31.09189478 ], [ 114.99973398, 31.0925538 ], [ 114.99982362, 31.09291335 ], [ 114.99991344, 31.09318295 ], [ 115.00000308, 31.09350254 ], [ 115.00010262, 31.09386204 ], [ 115.00019226, 31.09412165 ], [ 115.00030188, 31.09440119 ], [ 115.00032186, 31.09445109 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550887", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.216", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08298488, 31.16515613 ], [ 115.0836741, 31.16507567 ], [ 115.08379398, 31.16506554 ], [ 115.08384402, 31.16506554 ], [ 115.0838739, 31.16507549 ], [ 115.08523254, 31.1649345 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550888", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08523254, 31.1649345 ], [ 115.0854822, 31.16490431 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550889", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.306", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08896862, 31.16446182 ], [ 115.08912846, 31.16441174 ], [ 115.08923826, 31.16434167 ], [ 115.08944814, 31.16417162 ], [ 115.08947802, 31.16415159 ], [ 115.08973794, 31.16401151 ], [ 115.08990768, 31.16390144 ], [ 115.09044714, 31.16360111 ], [ 115.09077672, 31.1634108 ], [ 115.0912161, 31.16317046 ], [ 115.0916157, 31.1629203 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550890", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.196", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0916157, 31.1629203 ], [ 115.09205526, 31.16264013 ], [ 115.09235478, 31.16244002 ], [ 115.0926345, 31.16225988 ], [ 115.09290468, 31.16210004 ], [ 115.09310466, 31.16197022 ], [ 115.09325478, 31.16185034 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550891", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9972237, 31.08210683 ], [ 114.99691464, 31.0827173 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550892", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.697", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00013448, 31.07612223 ], [ 115.00009452, 31.07617232 ], [ 114.99999498, 31.0763525 ], [ 114.9998454, 31.07661278 ], [ 114.9997257, 31.07685294 ], [ 114.99910776, 31.07813391 ], [ 114.99898806, 31.07842407 ], [ 114.99873894, 31.07888451 ], [ 114.99841998, 31.07954498 ], [ 114.99824052, 31.07994525 ], [ 114.99816078, 31.08016535 ], [ 114.99805116, 31.08036555 ], [ 114.99793146, 31.08055577 ], [ 114.99754266, 31.08145631 ], [ 114.99732342, 31.08190667 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550893", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.99732342, 31.08190667 ], [ 114.9972237, 31.08210683 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550894", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.528", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0027164, 31.07073834 ], [ 115.00262658, 31.07089845 ], [ 115.00244712, 31.07129868 ], [ 115.0014204, 31.07338029 ], [ 115.00118118, 31.07392065 ], [ 115.00104168, 31.07419088 ], [ 115.00079238, 31.0748112 ], [ 115.00065288, 31.07510141 ], [ 115.0006329, 31.07514146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550895", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0006329, 31.07514146 ], [ 115.00041348, 31.07567174 ], [ 115.00013448, 31.07612223 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550896", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.317", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01164566, 31.05487089 ], [ 115.01158572, 31.054991 ], [ 115.01150616, 31.05508118 ], [ 115.01137656, 31.05528147 ], [ 115.01134668, 31.0553415 ], [ 115.01134668, 31.05541148 ], [ 115.01129682, 31.05549158 ], [ 115.01112744, 31.05572193 ], [ 115.01084844, 31.05626247 ], [ 115.01057934, 31.05670302 ], [ 115.01003124, 31.05765414 ], [ 115.00983198, 31.05789462 ], [ 115.00977204, 31.05809465 ], [ 115.00957278, 31.05845505 ], [ 115.00932366, 31.05884561 ], [ 115.00915428, 31.05901598 ], [ 115.00893504, 31.05941643 ], [ 115.0088454, 31.05955661 ], [ 115.00881552, 31.05961668 ], [ 115.00879554, 31.05975663 ], [ 115.00842672, 31.06040738 ], [ 115.00835706, 31.06056753 ], [ 115.00824744, 31.06072773 ], [ 115.0070517, 31.06284017 ], [ 115.00656336, 31.06371114 ], [ 115.00602516, 31.06465223 ], [ 115.00592562, 31.06489239 ], [ 115.00565652, 31.06535297 ], [ 115.00559676, 31.06548306 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550897", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.262", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01309052, 31.05238797 ], [ 115.01302086, 31.05247811 ], [ 115.01290116, 31.05266837 ], [ 115.01261226, 31.05318893 ], [ 115.01239302, 31.05354938 ], [ 115.01211402, 31.05408992 ], [ 115.0120242, 31.05419013 ], [ 115.01185482, 31.05449046 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550898", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01185482, 31.05449046 ], [ 115.01182494, 31.05455054 ], [ 115.01175528, 31.05463068 ], [ 115.01164566, 31.05487089 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550899", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.135", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01498412, 31.04556606 ], [ 115.01493444, 31.04524643 ], [ 115.01483472, 31.04474697 ], [ 115.01480484, 31.04446721 ], [ 115.01478486, 31.04436735 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550900", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01478486, 31.04436735 ], [ 115.01476506, 31.04421746 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550901", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.800", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01469054, 30.99809529 ], [ 115.01474058, 30.99654612 ], [ 115.01483022, 30.99573635 ], [ 115.01489016, 30.99543638 ], [ 115.01481042, 30.99482699 ], [ 115.0148205, 30.99422732 ], [ 115.01486046, 30.99369753 ], [ 115.01490024, 30.99341759 ], [ 115.01486046, 30.99314786 ], [ 115.01487054, 30.99287799 ], [ 115.01494038, 30.99203829 ], [ 115.0150401, 30.99123851 ], [ 115.01514972, 30.99067853 ], [ 115.0151697, 30.99047859 ], [ 115.01522946, 30.99007868 ], [ 115.01538912, 30.98942861 ], [ 115.0155684, 30.98879852 ], [ 115.01577792, 30.98798838 ], [ 115.01604702, 30.9871481 ], [ 115.01625618, 30.98662776 ], [ 115.01646552, 30.98615742 ], [ 115.01661492, 30.98578721 ], [ 115.01678448, 30.9854169 ], [ 115.01746218, 30.9838658 ], [ 115.01752194, 30.98374569 ], [ 115.01764146, 30.98347547 ], [ 115.0177212, 30.98335532 ], [ 115.01774118, 30.98324529 ], [ 115.01788068, 30.98296508 ], [ 115.01801028, 30.98263487 ], [ 115.0181397, 30.98235465 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550902", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.278", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0181397, 30.98235465 ], [ 115.0182495, 30.98210445 ], [ 115.01858826, 30.98146383 ], [ 115.01889714, 30.98068335 ], [ 115.01918622, 30.98013282 ], [ 115.019226, 30.98003274 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550903", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.704", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.019226, 30.98003274 ], [ 115.01943534, 30.97950242 ], [ 115.0197543, 30.9788019 ], [ 115.02000342, 30.97830146 ], [ 115.02059148, 30.97689048 ], [ 115.02088038, 30.97631997 ], [ 115.02099, 30.97601982 ], [ 115.02113958, 30.97570959 ], [ 115.0212492, 30.97541943 ], [ 115.02184716, 30.97410845 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550904", "Name": "振兴路", "pyname": "zxl", "kind": "0301", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0195356, 30.968658 ], [ 115.01969508, 30.96847764 ], [ 115.01986446, 30.96829728 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550905", "Name": "振兴路", "pyname": "zxl", "kind": "0301", "width": "55", "length": "0.632", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01986446, 30.96829728 ], [ 115.02005382, 30.96810684 ], [ 115.02054216, 30.96760572 ], [ 115.02080118, 30.96734513 ], [ 115.02169812, 30.96644306 ], [ 115.0218576, 30.96629267 ], [ 115.02292392, 30.96524021 ], [ 115.02396036, 30.96416781 ], [ 115.02412974, 30.96400739 ], [ 115.02416952, 30.96396729 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550906", "Name": "振兴路", "pyname": "zxl", "kind": "0301", "width": "55", "length": "0.615", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02643302, 30.96166325 ], [ 115.0277094, 30.96048092 ], [ 115.02936468, 30.95912781 ], [ 115.02964386, 30.9588773 ], [ 115.02999288, 30.95858664 ], [ 115.03030194, 30.95832605 ], [ 115.03050138, 30.95815568 ], [ 115.03096002, 30.95779478 ], [ 115.0309998, 30.95776472 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550907", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.702", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0309998, 30.95776472 ], [ 115.03133892, 30.95751407 ], [ 115.03260522, 30.95629178 ], [ 115.03380186, 30.95508969 ], [ 115.03459962, 30.95428824 ], [ 115.03584594, 30.95301609 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550908", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.043", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0422876, 30.94697439 ], [ 115.04272626, 30.94687341 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550909", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.185", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04272626, 30.94687341 ], [ 115.04282598, 30.94685316 ], [ 115.04295558, 30.94681289 ], [ 115.04312496, 30.94672253 ], [ 115.04320488, 30.94666236 ], [ 115.0433046, 30.94649222 ], [ 115.04335446, 30.9463722 ], [ 115.04333448, 30.94602246 ], [ 115.0434243, 30.94587234 ], [ 115.04360376, 30.9456221 ], [ 115.04365362, 30.94557201 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550910", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.979", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04365362, 30.94557201 ], [ 115.043913, 30.94527159 ], [ 115.0444215, 30.94478064 ], [ 115.04477052, 30.94437006 ], [ 115.04483028, 30.94425999 ], [ 115.04489022, 30.94404003 ], [ 115.0449102, 30.94386008 ], [ 115.04487042, 30.94361037 ], [ 115.0447707, 30.94340072 ], [ 115.04470086, 30.94321104 ], [ 115.04448162, 30.94281185 ], [ 115.04407302, 30.94250306 ], [ 115.0437141, 30.94223409 ], [ 115.04352474, 30.94202471 ], [ 115.04346498, 30.94185497 ], [ 115.0434351, 30.94171511 ], [ 115.043445, 30.9412854 ], [ 115.04344518, 30.94108551 ], [ 115.04333556, 30.9405861 ], [ 115.04305638, 30.93976733 ], [ 115.0430166, 30.93950759 ], [ 115.04303658, 30.93922773 ], [ 115.04317626, 30.93894756 ], [ 115.04355516, 30.93838704 ], [ 115.0440039, 30.93784628 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550911", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04433294, 30.93741576 ], [ 115.04446254, 30.93725556 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550912", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.070", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04446254, 30.93725556 ], [ 115.0448715, 30.93673491 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550913", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.939", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0448715, 30.93673491 ], [ 115.04509074, 30.93649452 ], [ 115.04522052, 30.93637433 ], [ 115.04539998, 30.93627393 ], [ 115.04561922, 30.93616346 ], [ 115.04667618, 30.93579113 ], [ 115.04725434, 30.93570981 ], [ 115.04745378, 30.93569933 ], [ 115.04760336, 30.93569897 ], [ 115.04772306, 30.93571863 ], [ 115.04789244, 30.9357482 ], [ 115.04815164, 30.93582753 ], [ 115.04852046, 30.93599651 ], [ 115.04875986, 30.93612584 ], [ 115.04945754, 30.9366338 ], [ 115.05020526, 30.93716165 ], [ 115.0506738, 30.93748029 ], [ 115.05083328, 30.93756984 ], [ 115.05098286, 30.93763941 ], [ 115.05117222, 30.93771893 ], [ 115.0513317, 30.93776847 ], [ 115.05152124, 30.93781802 ], [ 115.05163086, 30.93783773 ], [ 115.05181032, 30.93785726 ], [ 115.05189006, 30.93786707 ], [ 115.05203964, 30.93785672 ], [ 115.0521093, 30.93784655 ], [ 115.05216924, 30.93782639 ], [ 115.05230874, 30.93778607 ], [ 115.05241854, 30.93770588 ], [ 115.05249828, 30.93763572 ], [ 115.05257802, 30.9375356 ], [ 115.05264786, 30.93742548 ], [ 115.0527375, 30.93720543 ], [ 115.05282732, 30.93696536 ], [ 115.05286728, 30.93686537 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550914", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.283", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05286728, 30.93686537 ], [ 115.05290724, 30.93676533 ], [ 115.05300696, 30.93653525 ], [ 115.05306672, 30.93641514 ], [ 115.05328614, 30.93582501 ], [ 115.05340584, 30.93551496 ], [ 115.05352554, 30.93514488 ], [ 115.05359538, 30.93472499 ], [ 115.05365532, 30.93450498 ], [ 115.0536951, 30.93442497 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550915", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.064", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0536951, 30.93442497 ], [ 115.05375504, 30.93428489 ], [ 115.05390462, 30.93393479 ], [ 115.0539345, 30.93388475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550916", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.137", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0539345, 30.93388475 ], [ 115.0541739, 30.93355436 ], [ 115.05476196, 30.93288323 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550917", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.108", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05476196, 30.93288323 ], [ 115.05528054, 30.93239228 ], [ 115.05541014, 30.93232203 ], [ 115.0555599, 30.93225183 ], [ 115.05558996, 30.9322418 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550918", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.138", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05558996, 30.9322418 ], [ 115.05639852, 30.93196086 ], [ 115.05693762, 30.93180026 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550919", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.181", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05693762, 30.93180026 ], [ 115.05752658, 30.93161954 ], [ 115.05776616, 30.93153926 ], [ 115.05781602, 30.93147923 ], [ 115.05796578, 30.93138909 ], [ 115.05803562, 30.93128906 ], [ 115.05808566, 30.93115905 ], [ 115.05823542, 30.93079905 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550920", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.211", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05823542, 30.93079905 ], [ 115.05832524, 30.93056906 ], [ 115.05838518, 30.93039909 ], [ 115.05849498, 30.93022904 ], [ 115.05855492, 30.93014898 ], [ 115.0586847, 30.93002888 ], [ 115.05908394, 30.92980847 ], [ 115.0593435, 30.92960826 ], [ 115.05941352, 30.92952821 ], [ 115.0595433, 30.92933813 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550921", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.154", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0595433, 30.92933813 ], [ 115.05962322, 30.9292281 ], [ 115.060302, 30.92835767 ], [ 115.06043178, 30.92817762 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550922", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.152", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06043178, 30.92817762 ], [ 115.06128048, 30.92701712 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550923", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "2.232", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06128048, 30.92701712 ], [ 115.06152006, 30.92667701 ], [ 115.06165992, 30.92652689 ], [ 115.06184946, 30.92641668 ], [ 115.06194936, 30.92639657 ], [ 115.06216896, 30.92635629 ], [ 115.06283784, 30.92622548 ], [ 115.06305744, 30.9261452 ], [ 115.06318722, 30.92608508 ], [ 115.06326714, 30.92597505 ], [ 115.06329702, 30.92577512 ], [ 115.06329702, 30.92543532 ], [ 115.0633071, 30.92511546 ], [ 115.06331718, 30.92478566 ], [ 115.06342698, 30.92453564 ], [ 115.06355676, 30.92436558 ], [ 115.06370652, 30.92421546 ], [ 115.06454514, 30.92361467 ], [ 115.06493448, 30.92333432 ], [ 115.0657929, 30.9227135 ], [ 115.06641192, 30.92231291 ], [ 115.06660164, 30.92226264 ], [ 115.06679118, 30.92227241 ], [ 115.06704084, 30.92238198 ], [ 115.06714056, 30.92245182 ], [ 115.06733028, 30.9226415 ], [ 115.06752018, 30.92293116 ], [ 115.06762998, 30.92306099 ], [ 115.06777974, 30.92318078 ], [ 115.06785966, 30.92323064 ], [ 115.06796946, 30.9232805 ], [ 115.06878828, 30.92366939 ], [ 115.06924764, 30.92394875 ], [ 115.0695171, 30.92410836 ], [ 115.06970682, 30.9241881 ], [ 115.0699266, 30.92424782 ], [ 115.07016618, 30.92425754 ], [ 115.0704657, 30.9242372 ], [ 115.07082516, 30.92412681 ], [ 115.07159394, 30.92392598 ], [ 115.07213304, 30.92387535 ], [ 115.07292198, 30.92386446 ], [ 115.0734411, 30.92385384 ], [ 115.07403024, 30.92386316 ], [ 115.07441958, 30.92392265 ], [ 115.0749288, 30.92405202 ], [ 115.07520834, 30.92409167 ], [ 115.07541804, 30.9240914 ], [ 115.07564772, 30.92407115 ], [ 115.07594724, 30.92401085 ], [ 115.07655636, 30.92387018 ], [ 115.07706558, 30.92378958 ], [ 115.07793426, 30.92369859 ], [ 115.0784235, 30.92364806 ], [ 115.07882274, 30.92355761 ], [ 115.0789725, 30.92349749 ], [ 115.07914224, 30.92340731 ], [ 115.079382, 30.92327708 ], [ 115.07979132, 30.92303669 ], [ 115.08023052, 30.92275629 ], [ 115.0803504, 30.92267619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550924", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.252", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0803504, 30.92267619 ], [ 115.0804701, 30.92259605 ], [ 115.08072966, 30.92241582 ], [ 115.08084954, 30.92230575 ], [ 115.08091938, 30.92221571 ], [ 115.08096942, 30.92212566 ], [ 115.0810092, 30.92201568 ], [ 115.08101928, 30.9219057 ], [ 115.08102918, 30.9218157 ], [ 115.08101928, 30.92164578 ], [ 115.08102918, 30.9213459 ], [ 115.08102918, 30.92107599 ], [ 115.08103908, 30.92088609 ], [ 115.08108894, 30.92064611 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550925", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08108894, 30.92064611 ], [ 115.08114888, 30.92050611 ], [ 115.08121872, 30.92042606 ], [ 115.08130854, 30.92035595 ], [ 115.08136848, 30.92030591 ], [ 115.08140844, 30.92027589 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550926", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.073", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08140844, 30.92027589 ], [ 115.08149826, 30.92020583 ], [ 115.0817679, 30.92002556 ], [ 115.08191766, 30.91992543 ], [ 115.08200748, 30.91987535 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550927", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.187", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08360516, 30.91877415 ], [ 115.08397506, 30.91851428 ], [ 115.08480486, 30.91790448 ], [ 115.08511482, 30.91770455 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550928", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.121", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.08511482, 30.91770455 ], [ 115.08527484, 30.91759461 ], [ 115.08560478, 30.91731471 ], [ 115.08597468, 30.91690494 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550929", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.126", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.091244, 30.91108802 ], [ 115.091424, 30.91096805 ], [ 115.0917138, 30.91070817 ], [ 115.09214382, 30.9102584 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550930", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.187", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.09214382, 30.9102584 ], [ 115.09247376, 30.90991856 ], [ 115.0926138, 30.90978864 ], [ 115.09303374, 30.90936884 ], [ 115.0931637, 30.9092189 ], [ 115.09336368, 30.90894908 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550931", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.166", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.104231, 30.89877359 ], [ 115.10434098, 30.89877359 ], [ 115.10463078, 30.89874353 ], [ 115.10484084, 30.89868359 ], [ 115.1050707, 30.89856362 ], [ 115.10521074, 30.89845368 ], [ 115.1054406, 30.89825379 ], [ 115.1055306, 30.8981439 ], [ 115.1056206, 30.89801399 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550932", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.346", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1056206, 30.89801399 ], [ 115.1057007, 30.89789406 ], [ 115.10593074, 30.89761425 ], [ 115.10644068, 30.89695469 ], [ 115.10658072, 30.89682477 ], [ 115.10673066, 30.89673482 ], [ 115.1068806, 30.89667483 ], [ 115.1070705, 30.89665481 ], [ 115.10751042, 30.89673468 ], [ 115.10776026, 30.89676465 ], [ 115.1079102, 30.89675462 ], [ 115.10813016, 30.89669463 ], [ 115.1083701, 30.89654474 ], [ 115.10839008, 30.89653475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550933", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.083", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10839008, 30.89653475 ], [ 115.10909028, 30.89608515 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550934", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.269", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.10909028, 30.89608515 ], [ 115.10968068, 30.89571579 ], [ 115.1098407, 30.89562593 ], [ 115.11013104, 30.89552621 ], [ 115.11038124, 30.89545641 ], [ 115.11057132, 30.89542653 ], [ 115.11079146, 30.89533676 ], [ 115.11111168, 30.89516706 ], [ 115.1113419, 30.89493734 ], [ 115.1114319, 30.89482745 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550935", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.054", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1114319, 30.89482745 ], [ 115.1116821, 30.89438789 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550936", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "1.005", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1116821, 30.89438789 ], [ 115.1117622, 30.89426801 ], [ 115.11192222, 30.89393829 ], [ 115.11262278, 30.89267951 ], [ 115.11305316, 30.89190024 ], [ 115.11309312, 30.89177033 ], [ 115.1131131, 30.89159046 ], [ 115.1131131, 30.89147054 ], [ 115.11308304, 30.89138054 ], [ 115.112943, 30.89102067 ], [ 115.11289296, 30.89086074 ], [ 115.11288306, 30.89075076 ], [ 115.11289296, 30.89069082 ], [ 115.1129331, 30.89059092 ], [ 115.11340344, 30.8899116 ], [ 115.11343332, 30.88985166 ], [ 115.1134434, 30.88972175 ], [ 115.11345348, 30.88883228 ], [ 115.11347346, 30.88868238 ], [ 115.11364356, 30.88803285 ], [ 115.1138538, 30.88738337 ], [ 115.11392382, 30.88721349 ], [ 115.1141139, 30.88694381 ], [ 115.11430398, 30.88673402 ], [ 115.11464436, 30.88638446 ], [ 115.11492444, 30.88612481 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550937", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.262", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11492444, 30.88612481 ], [ 115.11532476, 30.88574528 ], [ 115.115625, 30.88550565 ], [ 115.11577512, 30.88541579 ], [ 115.1159553, 30.88532597 ], [ 115.11628542, 30.88520627 ], [ 115.1169759, 30.88501682 ], [ 115.1172261, 30.88493703 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550949", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.676", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33869918, 30.99061323 ], [ 115.33863942, 30.9905334 ], [ 115.33860954, 30.9904835 ], [ 115.33848966, 30.99035381 ], [ 115.3383201, 30.99021422 ], [ 115.33806072, 30.9900848 ], [ 115.3377315, 30.98991551 ], [ 115.3371528, 30.98963682 ], [ 115.33666392, 30.98940791 ], [ 115.33616514, 30.98914902 ], [ 115.33578588, 30.98896988 ], [ 115.33543668, 30.98877066 ], [ 115.3351773, 30.98861127 ], [ 115.3350576, 30.98852154 ], [ 115.33497768, 30.98846174 ], [ 115.33484808, 30.98834208 ], [ 115.33473828, 30.98824236 ], [ 115.33463856, 30.98812262 ], [ 115.33451886, 30.98799293 ], [ 115.33440906, 30.98784321 ], [ 115.33432932, 30.98772342 ], [ 115.33402998, 30.98722433 ], [ 115.333641, 30.98661543 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550950", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.129", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.333641, 30.98661543 ], [ 115.33358106, 30.98652561 ], [ 115.3333017, 30.9860964 ], [ 115.33307238, 30.98574707 ], [ 115.33298256, 30.9856073 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550951", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.407", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3301796, 30.97918665 ], [ 115.33023936, 30.97932647 ], [ 115.3303191, 30.97947623 ], [ 115.33043898, 30.9796659 ], [ 115.33045878, 30.97969587 ], [ 115.33060854, 30.98005538 ], [ 115.3306584, 30.98014524 ], [ 115.33090788, 30.98056451 ], [ 115.33104738, 30.98097401 ], [ 115.33119714, 30.98123352 ], [ 115.33129686, 30.98135327 ], [ 115.33144644, 30.98165279 ], [ 115.33157622, 30.98188238 ], [ 115.3317357, 30.98256165 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550952", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.490", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3271664, 30.97567418 ], [ 115.32732606, 30.97583379 ], [ 115.32753558, 30.97602329 ], [ 115.3278648, 30.97632254 ], [ 115.32804444, 30.97651208 ], [ 115.3284534, 30.9769011 ], [ 115.32876282, 30.97721039 ], [ 115.32904218, 30.97750968 ], [ 115.32918186, 30.97763937 ], [ 115.32935142, 30.97778895 ], [ 115.32952098, 30.97797854 ], [ 115.3296009, 30.97807835 ], [ 115.32974058, 30.97827797 ], [ 115.32978036, 30.97833786 ], [ 115.3298304, 30.97842773 ], [ 115.32993012, 30.97865741 ], [ 115.3301796, 30.97918665 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550953", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.517", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32384396, 30.97202238 ], [ 115.32422304, 30.9724614 ], [ 115.32444246, 30.97273086 ], [ 115.32464208, 30.97294038 ], [ 115.32490146, 30.97326974 ], [ 115.32552012, 30.97400814 ], [ 115.32584934, 30.97437737 ], [ 115.32609882, 30.97465673 ], [ 115.32627828, 30.9748163 ], [ 115.32654774, 30.97507568 ], [ 115.32688704, 30.97543482 ], [ 115.32698676, 30.97550462 ], [ 115.3271664, 30.97567418 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550954", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.318", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32192822, 30.9696872 ], [ 115.32212784, 30.96993672 ], [ 115.3226565, 30.97056537 ], [ 115.32318534, 30.97122404 ], [ 115.32325518, 30.97131386 ], [ 115.32347478, 30.9715533 ], [ 115.32374406, 30.97191263 ], [ 115.32384396, 30.97202238 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550955", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.511", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31908476, 30.96581463 ], [ 115.31920446, 30.9660143 ], [ 115.31944386, 30.96645359 ], [ 115.31958354, 30.96669321 ], [ 115.3200825, 30.96743189 ], [ 115.32030192, 30.96769131 ], [ 115.32048156, 30.96791087 ], [ 115.3207908, 30.9682701 ], [ 115.32115998, 30.96874913 ], [ 115.32177864, 30.9695076 ], [ 115.32192822, 30.9696872 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550956", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.088", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31863584, 30.96512582 ], [ 115.3186857, 30.96521568 ], [ 115.31905488, 30.96575469 ], [ 115.31908476, 30.96581463 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550957", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.018", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3165707, 30.96077225 ], [ 115.31660058, 30.96091211 ], [ 115.31660058, 30.96093209 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550958", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.321", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31720916, 30.96252005 ], [ 115.317279, 30.96269978 ], [ 115.31730888, 30.96275972 ], [ 115.31742858, 30.96300933 ], [ 115.31746854, 30.96307922 ], [ 115.3176282, 30.96335876 ], [ 115.31795742, 30.96393782 ], [ 115.31826666, 30.96447692 ], [ 115.31847618, 30.9648663 ], [ 115.31863584, 30.96512582 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550959", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.142", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31660058, 30.96093209 ], [ 115.31661048, 30.96097205 ], [ 115.31664054, 30.96103199 ], [ 115.3169298, 30.96171104 ], [ 115.31700954, 30.96199071 ], [ 115.31706948, 30.96214052 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550960", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.044", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31706948, 30.96214052 ], [ 115.31712924, 30.96229032 ], [ 115.31720916, 30.96252005 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550966", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.042", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34432544, 31.01420957 ], [ 115.3442754, 31.01404977 ], [ 115.34421564, 31.01383998 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550967", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.346", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34421564, 31.01383998 ], [ 115.3440162, 31.01318073 ], [ 115.34382666, 31.01255141 ], [ 115.34371686, 31.0122018 ], [ 115.34356692, 31.01169213 ], [ 115.34341698, 31.01118255 ], [ 115.34330718, 31.01080289 ], [ 115.34314752, 31.01029344 ], [ 115.3430379, 31.00988381 ], [ 115.34296788, 31.00965404 ], [ 115.34278842, 31.00901468 ], [ 115.34261868, 31.00846523 ], [ 115.34246892, 31.00793571 ], [ 115.34233932, 31.00751622 ], [ 115.34207994, 31.00662725 ], [ 115.34194026, 31.0061678 ], [ 115.34180076, 31.00569831 ], [ 115.34160114, 31.00498911 ], [ 115.3412721, 31.00392041 ], [ 115.34122224, 31.00371062 ], [ 115.3411623, 31.00351086 ], [ 115.3410426, 31.00318128 ], [ 115.34098284, 31.00299152 ], [ 115.34076342, 31.00216244 ], [ 115.34075334, 31.00211249 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550968", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.159", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3503612, 31.03299819 ], [ 115.3503513, 31.03296822 ], [ 115.35032124, 31.0328883 ], [ 115.35031134, 31.03279835 ], [ 115.35034122, 31.03235852 ], [ 115.3503612, 31.03209864 ], [ 115.35033132, 31.0318988 ], [ 115.35033132, 31.03178886 ], [ 115.35033132, 31.03157903 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550969", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.074", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35055074, 31.03379744 ], [ 115.35054084, 31.03359755 ], [ 115.35043104, 31.03319795 ], [ 115.35041106, 31.033148 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550970", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.017", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35041106, 31.033148 ], [ 115.3503711, 31.03302812 ], [ 115.3503612, 31.03299819 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550971", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.695", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34101128, 31.03498422 ], [ 115.3415403, 31.03497324 ], [ 115.34236848, 31.03496177 ], [ 115.34330646, 31.03494003 ], [ 115.3435059, 31.03493967 ], [ 115.34397498, 31.03493882 ], [ 115.34480316, 31.03489733 ], [ 115.34525226, 31.03487654 ], [ 115.34539194, 31.03485629 ], [ 115.34563134, 31.03482587 ], [ 115.34643972, 31.03469447 ], [ 115.34674896, 31.03462395 ], [ 115.347168, 31.03453323 ], [ 115.34775678, 31.0343922 ], [ 115.34821578, 31.0342914 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550972", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34821578, 31.0342914 ], [ 115.34826564, 31.03428132 ], [ 115.34846526, 31.034241 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550973", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.013", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35033132, 31.03157903 ], [ 115.35033132, 31.03153902 ], [ 115.35033132, 31.03147908 ], [ 115.35033132, 31.0314591 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550974", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "2.005", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35033132, 31.0314591 ], [ 115.35033132, 31.03140911 ], [ 115.35031152, 31.03134921 ], [ 115.35030144, 31.03130925 ], [ 115.35015186, 31.03083977 ], [ 115.34994234, 31.03031043 ], [ 115.34970276, 31.02969123 ], [ 115.349643, 31.02951141 ], [ 115.34944338, 31.02902204 ], [ 115.34928372, 31.02857258 ], [ 115.34912424, 31.02819309 ], [ 115.3488348, 31.02745401 ], [ 115.34870502, 31.02710445 ], [ 115.34851548, 31.02660504 ], [ 115.34832594, 31.02605568 ], [ 115.34799672, 31.02521675 ], [ 115.3477773, 31.02462747 ], [ 115.34749794, 31.02391836 ], [ 115.34733828, 31.0234689 ], [ 115.3471986, 31.02308937 ], [ 115.34698908, 31.02256004 ], [ 115.34675958, 31.02195078 ], [ 115.34655006, 31.02138149 ], [ 115.34635044, 31.02087213 ], [ 115.34606118, 31.02010304 ], [ 115.34597136, 31.01985338 ], [ 115.3459314, 31.01972351 ], [ 115.34587164, 31.01949374 ], [ 115.3458018, 31.01910413 ], [ 115.34573196, 31.01886437 ], [ 115.34549256, 31.01812524 ], [ 115.34528304, 31.01740605 ], [ 115.34517324, 31.01705645 ], [ 115.34490396, 31.01613746 ], [ 115.3447443, 31.01558805 ], [ 115.34443506, 31.01456921 ], [ 115.34432544, 31.01420957 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550975", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.114", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34846526, 31.034241 ], [ 115.34908392, 31.03411991 ], [ 115.34935338, 31.03405947 ], [ 115.34962284, 31.033989 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550976", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.091", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34962284, 31.033989 ], [ 115.3497924, 31.03393874 ], [ 115.35055074, 31.03379744 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550977", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.188", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32316932, 31.04231265 ], [ 115.32346866, 31.04231216 ], [ 115.32370824, 31.04228174 ], [ 115.32410748, 31.04221109 ], [ 115.32437694, 31.04214066 ], [ 115.32490578, 31.04198982 ], [ 115.32508542, 31.04194955 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550978", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.438", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32508542, 31.04194955 ], [ 115.32524508, 31.04190927 ], [ 115.3255644, 31.04182877 ], [ 115.32572424, 31.04177855 ], [ 115.32610332, 31.04167793 ], [ 115.32715128, 31.04141621 ], [ 115.3280493, 31.04120471 ], [ 115.32949614, 31.04084223 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550979", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.335", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32949614, 31.04084223 ], [ 115.329546, 31.04083215 ], [ 115.3298754, 31.0407516 ], [ 115.33001508, 31.04072136 ], [ 115.33039416, 31.04067069 ], [ 115.3306737, 31.04059023 ], [ 115.33075344, 31.04056008 ], [ 115.33098294, 31.04045973 ], [ 115.33116258, 31.04034944 ], [ 115.33127238, 31.04027928 ], [ 115.33131216, 31.04023923 ], [ 115.33135212, 31.04018919 ], [ 115.33138218, 31.04015913 ], [ 115.33150188, 31.03991906 ], [ 115.33165146, 31.039439 ], [ 115.33178124, 31.03907895 ], [ 115.33186116, 31.03893891 ], [ 115.33196088, 31.03880877 ], [ 115.33203072, 31.03873866 ], [ 115.33219038, 31.03859849 ], [ 115.33280904, 31.03815758 ], [ 115.33334796, 31.03777679 ], [ 115.33367718, 31.03759625 ], [ 115.33378698, 31.03753608 ], [ 115.33401648, 31.03743573 ], [ 115.33476474, 31.03712451 ], [ 115.3359522, 31.03664261 ], [ 115.3368702, 31.03627113 ], [ 115.33774842, 31.03590969 ], [ 115.33870638, 31.03553813 ], [ 115.3392651, 31.03532721 ], [ 115.33941486, 31.035267 ], [ 115.3396044, 31.03520666 ], [ 115.33987386, 31.03513623 ], [ 115.34010336, 31.03509582 ], [ 115.3404027, 31.0350353 ], [ 115.3406322, 31.03501491 ], [ 115.34072202, 31.03500474 ], [ 115.34101128, 31.03498422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550980", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.092", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3044468, 31.06169474 ], [ 115.30445688, 31.06155483 ], [ 115.30448676, 31.06134491 ], [ 115.3045368, 31.06119497 ], [ 115.30460664, 31.06105493 ], [ 115.30471644, 31.06091489 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550981", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.426", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30471644, 31.06091489 ], [ 115.30505592, 31.06048469 ], [ 115.30520568, 31.06028457 ], [ 115.30564506, 31.05978422 ], [ 115.30701216, 31.05763295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550982", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.254", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30701216, 31.05763295 ], [ 115.30722186, 31.05731277 ], [ 115.30742148, 31.05685265 ], [ 115.30756116, 31.05656258 ], [ 115.3076409, 31.05642249 ], [ 115.30778076, 31.05610241 ], [ 115.30794042, 31.05570236 ], [ 115.30802016, 31.05552231 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550983", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.155", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30802016, 31.05552231 ], [ 115.30804014, 31.05546228 ], [ 115.3082997, 31.05499208 ], [ 115.30839942, 31.05478202 ], [ 115.30854918, 31.05437198 ], [ 115.30859904, 31.05422195 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550984", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.551", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30859904, 31.05422195 ], [ 115.30865898, 31.05405194 ], [ 115.30878876, 31.05375188 ], [ 115.30895832, 31.05342176 ], [ 115.30907802, 31.05325161 ], [ 115.30941732, 31.05287123 ], [ 115.30990638, 31.05237065 ], [ 115.3104552, 31.0518 ], [ 115.31084454, 31.05136953 ], [ 115.31127366, 31.05089906 ], [ 115.31142324, 31.0506989 ], [ 115.3117926, 31.05030848 ], [ 115.31189232, 31.05018837 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550985", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31189232, 31.05018837 ], [ 115.31218176, 31.04983809 ], [ 115.31263104, 31.0493277 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550986", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.088", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31263104, 31.0493277 ], [ 115.31269098, 31.04926763 ], [ 115.31288052, 31.04910743 ], [ 115.31293038, 31.04906733 ], [ 115.31309022, 31.04894714 ], [ 115.31327976, 31.04876687 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550987", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.384", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3166328, 31.04578247 ], [ 115.31678256, 31.04562227 ], [ 115.31722158, 31.04517173 ], [ 115.31782044, 31.04457093 ], [ 115.31807982, 31.04430062 ], [ 115.31827944, 31.04405042 ], [ 115.31844918, 31.04383023 ], [ 115.31851902, 31.04371017 ], [ 115.31884824, 31.04314988 ], [ 115.31893824, 31.04296983 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550988", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31893824, 31.04296983 ], [ 115.31895804, 31.04293977 ], [ 115.31903796, 31.04281971 ], [ 115.3192176, 31.04261951 ], [ 115.31923758, 31.04259948 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550989", "Name": "振兴大道", "pyname": "zxdd", "kind": "0301", "width": "55", "length": "0.277", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31923758, 31.04259948 ], [ 115.31931732, 31.04252937 ], [ 115.31938716, 31.04248928 ], [ 115.31948706, 31.0424391 ], [ 115.3196865, 31.04239874 ], [ 115.32029526, 31.04234771 ], [ 115.32062466, 31.04235711 ], [ 115.32097386, 31.04235648 ], [ 115.32144294, 31.04234568 ], [ 115.32200184, 31.04231472 ], [ 115.32207168, 31.04231459 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550990", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.934", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3044468, 31.06169474 ], [ 115.3044468, 31.06188464 ], [ 115.3044567, 31.06210446 ], [ 115.30448658, 31.06256414 ], [ 115.30449648, 31.06292387 ], [ 115.30451646, 31.0630338 ], [ 115.30454634, 31.06316367 ], [ 115.30461636, 31.06337346 ], [ 115.30472616, 31.06356323 ], [ 115.30486584, 31.0637529 ], [ 115.3050255, 31.06398258 ], [ 115.30518534, 31.06418225 ], [ 115.30538496, 31.06442183 ], [ 115.30557468, 31.06466145 ], [ 115.30579428, 31.064931 ], [ 115.30604376, 31.06522049 ], [ 115.30626336, 31.06549998 ], [ 115.30637316, 31.06563971 ], [ 115.30653282, 31.06590926 ], [ 115.30661256, 31.06607904 ], [ 115.30682208, 31.06657841 ], [ 115.30699164, 31.06702787 ], [ 115.30718136, 31.06753722 ], [ 115.30740078, 31.06803659 ], [ 115.30752048, 31.06836617 ], [ 115.3076103, 31.06871582 ], [ 115.30769004, 31.06896552 ], [ 115.30787958, 31.06939496 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550991", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.351", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3121391, 31.08245954 ], [ 115.31236842, 31.08290886 ], [ 115.3124982, 31.08317846 ], [ 115.31257794, 31.08332822 ], [ 115.31278746, 31.08369762 ], [ 115.31290716, 31.08392726 ], [ 115.3129671, 31.08408705 ], [ 115.31301696, 31.08425684 ], [ 115.31303694, 31.08442671 ], [ 115.31304684, 31.08461661 ], [ 115.31301678, 31.08479657 ], [ 115.31290698, 31.08542639 ], [ 115.31290698, 31.08544637 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550992", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.033", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30991448, 31.0775765 ], [ 115.30993428, 31.07764643 ], [ 115.30996434, 31.07775632 ], [ 115.31000412, 31.07786616 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550993", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.551", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31000412, 31.07786616 ], [ 115.3100241, 31.0779261 ], [ 115.31009394, 31.07810583 ], [ 115.31019366, 31.07834555 ], [ 115.31034342, 31.07863508 ], [ 115.3106226, 31.0792442 ], [ 115.31098188, 31.08000312 ], [ 115.31106162, 31.08014289 ], [ 115.3113309, 31.08075201 ], [ 115.31157048, 31.08122132 ], [ 115.31176992, 31.0816107 ], [ 115.31189952, 31.08194028 ], [ 115.31208906, 31.08236967 ], [ 115.3121391, 31.08245954 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550994", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.722", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30787958, 31.06939496 ], [ 115.30792944, 31.06951479 ], [ 115.30812906, 31.07004413 ], [ 115.30817892, 31.07020397 ], [ 115.30823868, 31.07039373 ], [ 115.30835838, 31.07069334 ], [ 115.30850814, 31.07108282 ], [ 115.308558, 31.07122263 ], [ 115.3086777, 31.07151225 ], [ 115.30887714, 31.07207156 ], [ 115.30901682, 31.07246108 ], [ 115.3090368, 31.07252102 ], [ 115.30912662, 31.0727907 ], [ 115.30929618, 31.07324012 ], [ 115.30937592, 31.0735098 ], [ 115.30955556, 31.07414912 ], [ 115.30965528, 31.07450871 ], [ 115.3097451, 31.07485836 ], [ 115.30978488, 31.07526804 ], [ 115.30979478, 31.07559785 ], [ 115.30979478, 31.0756478 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.550995", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.215", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30979478, 31.0756478 ], [ 115.30980468, 31.07620746 ], [ 115.30980468, 31.07656728 ], [ 115.30981476, 31.07690708 ], [ 115.30982466, 31.07703695 ], [ 115.30985454, 31.0772268 ], [ 115.30988442, 31.07741666 ], [ 115.30991448, 31.0775765 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551039", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.027", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01449074, 31.00322273 ], [ 115.01450064, 31.00298288 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551040", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.088", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01450064, 31.00298288 ], [ 115.01452062, 31.00219331 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551041", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.235", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01433108, 31.00618152 ], [ 115.01447058, 31.00427217 ], [ 115.01447058, 31.00407228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551042", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.081", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01447058, 31.00407228 ], [ 115.01446068, 31.00358259 ], [ 115.01449074, 31.00334265 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551043", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.558", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.009893, 31.04184353 ], [ 115.0099029, 31.0416336 ], [ 115.00987302, 31.0414338 ], [ 115.00986312, 31.04122397 ], [ 115.0098831, 31.04077415 ], [ 115.00985322, 31.03969487 ], [ 115.00980354, 31.03882551 ], [ 115.00973406, 31.03682688 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551044", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.239", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00973406, 31.03682688 ], [ 115.00971426, 31.03626726 ], [ 115.00974414, 31.03600734 ], [ 115.00984386, 31.0357472 ], [ 115.00998336, 31.03548696 ], [ 115.01016282, 31.03522659 ], [ 115.0104717, 31.03484589 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551045", "Name": "S206", "pyname": "s206", "kind": "0301", "width": "55", "length": "0.079", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0104717, 31.03484589 ], [ 115.01094024, 31.03425486 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551158", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.225", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.77236806, 31.04595941 ], [ 114.77220786, 31.04609927 ], [ 114.77184768, 31.04642889 ], [ 114.77148732, 31.04675852 ], [ 114.7707468, 31.04742771 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551159", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.834", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.7707468, 31.04742771 ], [ 114.77064672, 31.04751762 ], [ 114.76995624, 31.04813691 ], [ 114.76768482, 31.05022451 ], [ 114.76743462, 31.05048425 ], [ 114.7671945, 31.05070398 ], [ 114.76708434, 31.05085383 ], [ 114.76681416, 31.05124349 ], [ 114.766524, 31.05173309 ], [ 114.7661937, 31.05244256 ], [ 114.7657131, 31.05345146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551160", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.167", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75722052, 31.0710119 ], [ 114.7569201, 31.07123145 ], [ 114.75599904, 31.07194007 ], [ 114.75590886, 31.07200991 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551161", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.744", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75590886, 31.07200991 ], [ 114.75541836, 31.07239916 ], [ 114.75481752, 31.07285825 ], [ 114.75438696, 31.0731876 ], [ 114.75366624, 31.07373651 ], [ 114.7524246, 31.0747046 ], [ 114.75189396, 31.0750938 ], [ 114.75093276, 31.07586231 ], [ 114.75012168, 31.07651103 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551197", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.440", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74407134, 31.08260768 ], [ 114.74315208, 31.08323799 ], [ 114.74298216, 31.08333803 ], [ 114.74063388, 31.0849488 ], [ 114.74044398, 31.08505887 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551198", "Name": "S304", "pyname": "s304", "kind": "0301", "width": "55", "length": "0.090", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.74044398, 31.08505887 ], [ 114.7400244, 31.08528909 ], [ 114.73967466, 31.08552917 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551207", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.131", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2342225, 31.18220294 ], [ 115.23415248, 31.1821929 ], [ 115.23407238, 31.18217288 ], [ 115.2339624, 31.18211289 ], [ 115.23390246, 31.1820629 ], [ 115.23382236, 31.18199288 ], [ 115.23374226, 31.18189289 ], [ 115.2336123, 31.18167293 ], [ 115.2335223, 31.18154292 ], [ 115.23336228, 31.18133295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551208", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.388", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.242174, 31.18330467 ], [ 115.2420039, 31.18318466 ], [ 115.2418239, 31.18306469 ], [ 115.2417438, 31.18301465 ], [ 115.24162392, 31.18294467 ], [ 115.24150386, 31.18291461 ], [ 115.24134384, 31.18287461 ], [ 115.24116366, 31.18286457 ], [ 115.24095378, 31.18286448 ], [ 115.24087368, 31.18287447 ], [ 115.24057362, 31.18288437 ], [ 115.24027356, 31.18290431 ], [ 115.24003362, 31.18294422 ], [ 115.2398736, 31.18297419 ], [ 115.23960342, 31.18306406 ], [ 115.2393534, 31.18313399 ], [ 115.23904344, 31.1832239 ], [ 115.2383634, 31.18345362 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551209", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.456", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2383634, 31.18345362 ], [ 115.23776328, 31.18365342 ], [ 115.23760326, 31.18369334 ], [ 115.23749328, 31.18372331 ], [ 115.23735324, 31.18374329 ], [ 115.2372132, 31.18376322 ], [ 115.23708324, 31.18376318 ], [ 115.23698316, 31.1837432 ], [ 115.23680316, 31.18367313 ], [ 115.23667302, 31.18360316 ], [ 115.236513, 31.18348314 ], [ 115.23637296, 31.18337312 ], [ 115.23623292, 31.18324311 ], [ 115.23612294, 31.18315311 ], [ 115.23585276, 31.18297311 ], [ 115.23565278, 31.18286309 ], [ 115.23557286, 31.18281309 ], [ 115.23538278, 31.18269308 ], [ 115.23514266, 31.18251308 ], [ 115.23487266, 31.18234307 ], [ 115.23479256, 31.18231305 ], [ 115.23470256, 31.18228304 ], [ 115.23451248, 31.18224299 ], [ 115.2344025, 31.18223295 ], [ 115.2342225, 31.18220294 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551210", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.583", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25548662, 31.18559751 ], [ 115.2551565, 31.18549743 ], [ 115.2548064, 31.18535739 ], [ 115.2547065, 31.18529741 ], [ 115.25455638, 31.18518738 ], [ 115.25443632, 31.1850374 ], [ 115.25437638, 31.18480745 ], [ 115.2543762, 31.18469751 ], [ 115.25441634, 31.18457754 ], [ 115.2544563, 31.18451756 ], [ 115.25451624, 31.18445762 ], [ 115.25456628, 31.18441761 ], [ 115.2546363, 31.18434768 ], [ 115.25479632, 31.18424774 ], [ 115.25506632, 31.18404789 ], [ 115.25520636, 31.18387797 ], [ 115.25523624, 31.18378802 ], [ 115.25524632, 31.18363803 ], [ 115.25516622, 31.18345808 ], [ 115.25506614, 31.18336808 ], [ 115.25496624, 31.18331808 ], [ 115.25489622, 31.18329806 ], [ 115.25478624, 31.18326804 ], [ 115.2544761, 31.18327794 ], [ 115.25382594, 31.18340772 ], [ 115.25308596, 31.18357751 ], [ 115.25299596, 31.18360748 ], [ 115.25264586, 31.18368735 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551211", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.078", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.257366, 31.18590702 ], [ 115.25655654, 31.18577751 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551212", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25655654, 31.18577751 ], [ 115.2561267, 31.18570763 ], [ 115.25557662, 31.18561754 ], [ 115.25548662, 31.18559751 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551213", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.064", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2580356, 31.18589672 ], [ 115.25797566, 31.18590675 ], [ 115.2575559, 31.18591692 ], [ 115.257366, 31.18590702 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551214", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.320", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25754636, 31.18422807 ], [ 115.25735646, 31.18425813 ], [ 115.25730642, 31.18428815 ], [ 115.25725638, 31.18433814 ], [ 115.25724648, 31.18438809 ], [ 115.25725638, 31.18441806 ], [ 115.25730642, 31.18442805 ], [ 115.25740632, 31.18446797 ], [ 115.25746626, 31.18450793 ], [ 115.2575262, 31.18460783 ], [ 115.25754618, 31.18479768 ], [ 115.2576261, 31.18503749 ], [ 115.2577359, 31.18527725 ], [ 115.25776596, 31.18532724 ], [ 115.25780592, 31.18535717 ], [ 115.25785578, 31.18540712 ], [ 115.2579357, 31.18543709 ], [ 115.25803578, 31.18545702 ], [ 115.2581256, 31.18545698 ], [ 115.2583155, 31.18542687 ], [ 115.25842548, 31.1854568 ], [ 115.2585153, 31.18552673 ], [ 115.25858532, 31.18561664 ], [ 115.25857524, 31.18570659 ], [ 115.2585054, 31.18579655 ], [ 115.25845536, 31.18582656 ], [ 115.25839542, 31.1858366 ], [ 115.2580356, 31.18589672 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551215", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.576", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26286338, 31.18252662 ], [ 115.26276348, 31.18251668 ], [ 115.26231366, 31.18254687 ], [ 115.2622638, 31.18255686 ], [ 115.26221376, 31.18257689 ], [ 115.26200388, 31.18264695 ], [ 115.26192396, 31.18271693 ], [ 115.26183396, 31.18279694 ], [ 115.26173406, 31.18288694 ], [ 115.26164406, 31.18295691 ], [ 115.26148404, 31.1830569 ], [ 115.26136416, 31.18310694 ], [ 115.26134418, 31.18311693 ], [ 115.26120432, 31.18315698 ], [ 115.26110424, 31.18318704 ], [ 115.26100434, 31.18330701 ], [ 115.26097428, 31.1834669 ], [ 115.26101424, 31.18349687 ], [ 115.26116418, 31.18346681 ], [ 115.26130422, 31.18344674 ], [ 115.26137406, 31.18344674 ], [ 115.26148404, 31.18347666 ], [ 115.2615339, 31.18350659 ], [ 115.26158394, 31.18355654 ], [ 115.2616239, 31.1835965 ], [ 115.26166386, 31.18363646 ], [ 115.26167376, 31.18371638 ], [ 115.26165378, 31.18380633 ], [ 115.2615339, 31.18392635 ], [ 115.26147396, 31.18396631 ], [ 115.26142392, 31.18399632 ], [ 115.26132402, 31.18404636 ], [ 115.26119406, 31.18409636 ], [ 115.26098418, 31.18416642 ], [ 115.26056442, 31.18431654 ], [ 115.26024456, 31.18441662 ], [ 115.25968494, 31.18457678 ], [ 115.259535, 31.18459685 ], [ 115.25940504, 31.18460693 ], [ 115.2592551, 31.18460697 ], [ 115.25918526, 31.18460702 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551216", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.253", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25918526, 31.18460702 ], [ 115.25892534, 31.18459716 ], [ 115.25881536, 31.18459721 ], [ 115.25860548, 31.18461728 ], [ 115.2584757, 31.18465733 ], [ 115.25833566, 31.18470737 ], [ 115.25823576, 31.18472739 ], [ 115.25817582, 31.18473743 ], [ 115.25811588, 31.18472744 ], [ 115.25807592, 31.18469747 ], [ 115.25802588, 31.18463757 ], [ 115.2580059, 31.1845676 ], [ 115.257996, 31.18451765 ], [ 115.25798592, 31.18442769 ], [ 115.257996, 31.18434777 ], [ 115.25802606, 31.1842778 ], [ 115.25805594, 31.18421781 ], [ 115.25814594, 31.1841378 ], [ 115.258176, 31.18409784 ], [ 115.258176, 31.18405788 ], [ 115.25814594, 31.18404789 ], [ 115.25809608, 31.18404789 ], [ 115.25793606, 31.18414793 ], [ 115.25775624, 31.18420796 ], [ 115.25763618, 31.18421804 ], [ 115.25754636, 31.18422807 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551217", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.202", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26380244, 31.18410513 ], [ 115.26373242, 31.1838453 ], [ 115.26367266, 31.18359551 ], [ 115.26362262, 31.18347563 ], [ 115.2635427, 31.18327578 ], [ 115.26325308, 31.18295615 ], [ 115.26302322, 31.18264646 ], [ 115.2629433, 31.18256654 ], [ 115.26286338, 31.18252662 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551218", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.535", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26692058, 31.18346402 ], [ 115.2666108, 31.1835641 ], [ 115.26647076, 31.18358417 ], [ 115.266141, 31.18361432 ], [ 115.26599106, 31.18365437 ], [ 115.26591114, 31.18369437 ], [ 115.26587118, 31.18374437 ], [ 115.26587118, 31.18380431 ], [ 115.26589116, 31.18391424 ], [ 115.26591114, 31.18397418 ], [ 115.26594102, 31.1841041 ], [ 115.26594102, 31.18414406 ], [ 115.26593094, 31.18421403 ], [ 115.26583104, 31.18423406 ], [ 115.2656712, 31.18424414 ], [ 115.26553134, 31.1842242 ], [ 115.26540138, 31.18421426 ], [ 115.26534144, 31.1842143 ], [ 115.26525144, 31.18424432 ], [ 115.26518142, 31.1843043 ], [ 115.26497154, 31.18451427 ], [ 115.26476166, 31.1846643 ], [ 115.26449184, 31.18486428 ], [ 115.26432192, 31.18502426 ], [ 115.2641619, 31.18517424 ], [ 115.26405192, 31.18525425 ], [ 115.26399198, 31.18527423 ], [ 115.26391206, 31.18528427 ], [ 115.26386202, 31.18523432 ], [ 115.26383214, 31.18518437 ], [ 115.26381216, 31.18513442 ], [ 115.2638523, 31.18469472 ], [ 115.2638622, 31.18451481 ], [ 115.26383232, 31.18425498 ], [ 115.26380244, 31.18410513 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551219", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.225", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2691992, 31.18317314 ], [ 115.26882948, 31.18312332 ], [ 115.2685296, 31.1830835 ], [ 115.26817986, 31.18308368 ], [ 115.26793002, 31.18312377 ], [ 115.2676701, 31.18320383 ], [ 115.26695064, 31.18345403 ], [ 115.26692058, 31.18346402 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551220", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.480", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27253604, 31.18421007 ], [ 115.27253604, 31.18419005 ], [ 115.27251588, 31.18360023 ], [ 115.27248582, 31.18347032 ], [ 115.27246584, 31.18344035 ], [ 115.27242588, 31.18338041 ], [ 115.27238592, 31.18335044 ], [ 115.2722862, 31.18331057 ], [ 115.27206642, 31.18328082 ], [ 115.27183674, 31.1832711 ], [ 115.27170696, 31.18327124 ], [ 115.2714573, 31.18327151 ], [ 115.27138728, 31.1832716 ], [ 115.27131744, 31.18329167 ], [ 115.27116768, 31.18333181 ], [ 115.27111764, 31.18336187 ], [ 115.27106778, 31.1834219 ], [ 115.2710478, 31.18349192 ], [ 115.2710379, 31.18362188 ], [ 115.27098804, 31.1836919 ], [ 115.270938, 31.18381187 ], [ 115.27090794, 31.18383185 ], [ 115.27086798, 31.18384188 ], [ 115.27079796, 31.18383194 ], [ 115.270758, 31.18382195 ], [ 115.27069806, 31.18376201 ], [ 115.27061814, 31.1835222 ], [ 115.27057836, 31.18343229 ], [ 115.27055838, 31.18339233 ], [ 115.27048836, 31.18335237 ], [ 115.27040844, 31.18334243 ], [ 115.27028856, 31.18333248 ], [ 115.27020846, 31.18334252 ], [ 115.27009866, 31.18332258 ], [ 115.26995862, 31.18330269 ], [ 115.26978888, 31.18326278 ], [ 115.26933906, 31.18319303 ], [ 115.2691992, 31.18317314 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551221", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.859", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27930656, 31.18948016 ], [ 115.27889706, 31.1893407 ], [ 115.27883712, 31.18931078 ], [ 115.27868736, 31.18925097 ], [ 115.2781083, 31.18905176 ], [ 115.27735932, 31.18881272 ], [ 115.27682022, 31.18865342 ], [ 115.2766305, 31.1885937 ], [ 115.27640082, 31.188524 ], [ 115.27624098, 31.18846419 ], [ 115.2760113, 31.18837451 ], [ 115.27582158, 31.18828478 ], [ 115.27572168, 31.18823492 ], [ 115.27544214, 31.18807535 ], [ 115.27532244, 31.18797554 ], [ 115.27500294, 31.18765608 ], [ 115.27485318, 31.18746632 ], [ 115.27476318, 31.18733649 ], [ 115.27459344, 31.18706681 ], [ 115.27451352, 31.18696691 ], [ 115.27437384, 31.18683713 ], [ 115.27430382, 31.18679726 ], [ 115.27415406, 31.18672746 ], [ 115.27382466, 31.18659791 ], [ 115.27351506, 31.18645832 ], [ 115.27328538, 31.18635864 ], [ 115.27323552, 31.18632872 ], [ 115.27311564, 31.18627886 ], [ 115.2730656, 31.18623894 ], [ 115.27297578, 31.18618904 ], [ 115.27290594, 31.18612914 ], [ 115.27287588, 31.18609917 ], [ 115.27280604, 31.18602929 ], [ 115.27272612, 31.18593938 ], [ 115.27263612, 31.18580955 ], [ 115.27259616, 31.1857196 ], [ 115.2725463, 31.1856197 ], [ 115.27249626, 31.18543979 ], [ 115.27248618, 31.18530983 ], [ 115.27249626, 31.18510989 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551222", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.100", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.27249626, 31.18510989 ], [ 115.27253604, 31.18421007 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551223", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.109", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29590004, 31.20091385 ], [ 115.2958302, 31.2010439 ], [ 115.29557064, 31.20153413 ], [ 115.2955107, 31.20163416 ], [ 115.29548082, 31.20167421 ], [ 115.29543096, 31.20172425 ], [ 115.29536112, 31.20176435 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551224", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "2.173", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29536112, 31.20176435 ], [ 115.29521118, 31.20185448 ], [ 115.29505152, 31.20191465 ], [ 115.29500148, 31.20192468 ], [ 115.2948618, 31.20194484 ], [ 115.29475182, 31.20193499 ], [ 115.2946521, 31.20192513 ], [ 115.29452214, 31.20191528 ], [ 115.29437238, 31.20187545 ], [ 115.29417276, 31.20179576 ], [ 115.2939231, 31.20163614 ], [ 115.2938133, 31.20152634 ], [ 115.29356382, 31.20126683 ], [ 115.29327438, 31.20097734 ], [ 115.29277524, 31.20043829 ], [ 115.29214632, 31.19979942 ], [ 115.2920664, 31.19970956 ], [ 115.29106812, 31.19851152 ], [ 115.29090846, 31.19827185 ], [ 115.2908685, 31.19820192 ], [ 115.29079866, 31.1980721 ], [ 115.29062892, 31.19774247 ], [ 115.29050922, 31.19755275 ], [ 115.29036936, 31.197353 ], [ 115.2902196, 31.19716328 ], [ 115.28992008, 31.19685381 ], [ 115.28986032, 31.19678393 ], [ 115.2897804, 31.19668407 ], [ 115.28974044, 31.19661414 ], [ 115.28963064, 31.1964044 ], [ 115.28952084, 31.19617467 ], [ 115.28947098, 31.19609475 ], [ 115.28931114, 31.19588505 ], [ 115.2890316, 31.19561555 ], [ 115.28887194, 31.19543582 ], [ 115.28850258, 31.19500652 ], [ 115.28842266, 31.19493663 ], [ 115.28840268, 31.19491665 ], [ 115.28829288, 31.19481684 ], [ 115.2879633, 31.19457735 ], [ 115.28758404, 31.19429795 ], [ 115.28714466, 31.19397863 ], [ 115.28690508, 31.19377905 ], [ 115.28664552, 31.19352948 ], [ 115.28644572, 31.19336978 ], [ 115.28627598, 31.19325008 ], [ 115.2861363, 31.19318024 ], [ 115.28591652, 31.19310054 ], [ 115.28578674, 31.19306072 ], [ 115.28552718, 31.19302103 ], [ 115.28505774, 31.19297157 ], [ 115.28437878, 31.1929124 ], [ 115.28417898, 31.19289264 ], [ 115.28413902, 31.19289269 ], [ 115.28401914, 31.19288283 ], [ 115.2839394, 31.19287293 ], [ 115.28381952, 31.19283306 ], [ 115.28374968, 31.19279319 ], [ 115.28366976, 31.19276327 ], [ 115.28353998, 31.19267349 ], [ 115.28344008, 31.19260365 ], [ 115.28328042, 31.19243391 ], [ 115.28296092, 31.19212445 ], [ 115.28273124, 31.1919548 ], [ 115.28270118, 31.19192487 ], [ 115.28253144, 31.19180513 ], [ 115.28233182, 31.19163548 ], [ 115.28228196, 31.19156555 ], [ 115.282242, 31.19150565 ], [ 115.2822321, 31.19146565 ], [ 115.28210232, 31.19117598 ], [ 115.28208234, 31.19113602 ], [ 115.2820323, 31.19108612 ], [ 115.28196246, 31.19101623 ], [ 115.28188254, 31.19095638 ], [ 115.28165304, 31.19082669 ], [ 115.28126352, 31.19063724 ], [ 115.28119368, 31.19060736 ], [ 115.28113374, 31.19055746 ], [ 115.28103384, 31.19048762 ], [ 115.28100396, 31.19044766 ], [ 115.28080434, 31.19019804 ], [ 115.28072442, 31.19009819 ], [ 115.28066448, 31.19001827 ], [ 115.28056458, 31.18993844 ], [ 115.2804348, 31.18983863 ], [ 115.28026506, 31.18976888 ], [ 115.2800154, 31.18967919 ], [ 115.27939638, 31.18951004 ], [ 115.27930656, 31.18948016 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551225", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.392", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.29688824, 31.19873319 ], [ 115.29719766, 31.19842287 ], [ 115.29752706, 31.19802251 ], [ 115.2977166, 31.19784228 ], [ 115.29789624, 31.19768208 ], [ 115.29808596, 31.19750186 ], [ 115.29812592, 31.19746181 ], [ 115.29820566, 31.19736173 ], [ 115.29825552, 31.19727173 ], [ 115.29828558, 31.1971617 ], [ 115.29830556, 31.19691182 ], [ 115.29833544, 31.19674185 ], [ 115.29835542, 31.19661189 ], [ 115.29838548, 31.19650187 ], [ 115.29841536, 31.19644188 ], [ 115.29846522, 31.19635184 ], [ 115.29850518, 31.1963018 ], [ 115.29855504, 31.19625171 ], [ 115.29878472, 31.19610141 ], [ 115.29908406, 31.19596101 ], [ 115.29942336, 31.19573057 ], [ 115.29953316, 31.19566041 ], [ 115.29973278, 31.19549018 ], [ 115.29985266, 31.19538002 ], [ 115.29991242, 31.19531 ], [ 115.30002222, 31.19515988 ], [ 115.300152, 31.19490977 ], [ 115.30031166, 31.19459967 ], [ 115.30041156, 31.19441963 ], [ 115.30057122, 31.19425943 ], [ 115.30067112, 31.19409936 ], [ 115.300701, 31.19398934 ], [ 115.30073106, 31.19387936 ], [ 115.30076094, 31.19376938 ], [ 115.30082088, 31.19364932 ], [ 115.3009206, 31.19350923 ], [ 115.30126998, 31.19303889 ], [ 115.30130994, 31.19298885 ], [ 115.30139976, 31.19289876 ], [ 115.30149948, 31.19282861 ], [ 115.30155942, 31.19277857 ], [ 115.30184886, 31.19260815 ], [ 115.30196856, 31.192538 ], [ 115.30217826, 31.19234774 ], [ 115.30228806, 31.19221764 ], [ 115.30233792, 31.1921676 ], [ 115.3024776, 31.1920574 ], [ 115.3025775, 31.19200727 ], [ 115.30270728, 31.19195709 ], [ 115.3030365, 31.19182659 ], [ 115.30371528, 31.19157563 ], [ 115.3039149, 31.19150534 ], [ 115.30422414, 31.19141484 ], [ 115.30432404, 31.19138469 ], [ 115.30453356, 31.1913144 ], [ 115.30498266, 31.19114376 ], [ 115.30512252, 31.19108355 ], [ 115.30524222, 31.19102339 ], [ 115.305372, 31.19093321 ], [ 115.30554156, 31.19080302 ], [ 115.30578114, 31.1905827 ], [ 115.30596078, 31.19038254 ], [ 115.3062702, 31.19007218 ], [ 115.30641996, 31.18995198 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551226", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.341", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.30641996, 31.18995198 ], [ 115.30679922, 31.18961156 ], [ 115.30700892, 31.1893713 ], [ 115.30708866, 31.18928121 ], [ 115.30712862, 31.18922118 ], [ 115.3071585, 31.18918118 ], [ 115.30719846, 31.18914113 ], [ 115.30722834, 31.1891211 ], [ 115.30727838, 31.18910103 ], [ 115.30734822, 31.18908092 ], [ 115.30741806, 31.1890608 ], [ 115.30746792, 31.18905072 ], [ 115.3075878, 31.18905054 ], [ 115.30779732, 31.18905018 ], [ 115.3080369, 31.18901981 ], [ 115.30807668, 31.18900973 ], [ 115.30852578, 31.18894902 ], [ 115.30870542, 31.18892877 ], [ 115.30880532, 31.18889862 ], [ 115.30885518, 31.18887855 ], [ 115.30890504, 31.18883846 ], [ 115.308945, 31.18879841 ], [ 115.30896498, 31.18874841 ], [ 115.30899486, 31.18860846 ], [ 115.3090449, 31.18835849 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551227", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.726", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3090449, 31.18835849 ], [ 115.30906488, 31.18822853 ], [ 115.30910484, 31.18813848 ], [ 115.30922454, 31.18786844 ], [ 115.30942416, 31.18742834 ], [ 115.30962378, 31.18701821 ], [ 115.30988334, 31.18645805 ], [ 115.31000322, 31.18620798 ], [ 115.31010294, 31.18599792 ], [ 115.31017278, 31.1858879 ], [ 115.3102527, 31.18578782 ], [ 115.31034252, 31.18571771 ], [ 115.31039238, 31.18569764 ], [ 115.31052216, 31.18568742 ], [ 115.31062188, 31.18568724 ], [ 115.3108116, 31.18572693 ], [ 115.31100114, 31.18577657 ], [ 115.31134044, 31.18589591 ], [ 115.3115001, 31.18595558 ], [ 115.31186928, 31.18607487 ], [ 115.31210886, 31.18615439 ], [ 115.31236824, 31.18625388 ], [ 115.3124181, 31.18625379 ], [ 115.31249802, 31.18628363 ], [ 115.31262762, 31.18629339 ], [ 115.31268756, 31.18629326 ], [ 115.3127475, 31.18629317 ], [ 115.31294694, 31.18628282 ], [ 115.31307672, 31.18625258 ], [ 115.3133163, 31.18617221 ], [ 115.31341602, 31.18614201 ], [ 115.31381526, 31.18605134 ], [ 115.31421432, 31.18596066 ], [ 115.31425428, 31.18596062 ], [ 115.31439396, 31.18592039 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551228", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.979", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32122982, 31.18091045 ], [ 115.32126978, 31.18081046 ], [ 115.32136968, 31.18060035 ], [ 115.3215792, 31.18033013 ], [ 115.3216791, 31.18019 ], [ 115.32172896, 31.18009995 ], [ 115.32177882, 31.17997994 ], [ 115.32182868, 31.17988989 ], [ 115.32186864, 31.17977987 ], [ 115.32193848, 31.17954987 ], [ 115.32196854, 31.17932991 ], [ 115.3220184, 31.17908993 ], [ 115.32205836, 31.17895992 ], [ 115.32209832, 31.17881993 ], [ 115.32218814, 31.17860987 ], [ 115.32242754, 31.17803972 ], [ 115.32265722, 31.17746961 ], [ 115.32277692, 31.17714953 ], [ 115.32305646, 31.17648938 ], [ 115.32318624, 31.17614927 ], [ 115.32333582, 31.17578918 ], [ 115.32339576, 31.17548925 ], [ 115.32339576, 31.17540929 ], [ 115.3233459, 31.17520949 ], [ 115.32329604, 31.1750996 ], [ 115.32314646, 31.17490997 ], [ 115.32291696, 31.17467052 ], [ 115.32255768, 31.17431133 ], [ 115.32246786, 31.17421157 ], [ 115.32238812, 31.17409178 ], [ 115.32234816, 31.17404187 ], [ 115.3223082, 31.17396195 ], [ 115.3222884, 31.17385206 ], [ 115.3222884, 31.17379208 ], [ 115.3223082, 31.1737221 ], [ 115.32236814, 31.17356204 ], [ 115.32246804, 31.17339194 ], [ 115.32261762, 31.17325176 ], [ 115.3228572, 31.17313139 ], [ 115.32301686, 31.1731011 ], [ 115.32307662, 31.17309102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551229", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.599", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32307662, 31.17309102 ], [ 115.32312666, 31.17309093 ], [ 115.32329622, 31.1731106 ], [ 115.32340602, 31.17314039 ], [ 115.32348576, 31.17316023 ], [ 115.3237752, 31.17332961 ], [ 115.32391488, 31.17338933 ], [ 115.3240146, 31.17340913 ], [ 115.32407454, 31.17340904 ], [ 115.32413448, 31.17340895 ], [ 115.32417426, 31.17339887 ], [ 115.32431412, 31.17334865 ], [ 115.3244538, 31.17321846 ], [ 115.32454362, 31.17312833 ], [ 115.32464334, 31.17306816 ], [ 115.32470328, 31.17304809 ], [ 115.3247931, 31.17303792 ], [ 115.32489282, 31.17304773 ], [ 115.32501252, 31.17308751 ], [ 115.32520224, 31.17317711 ], [ 115.32533184, 31.17319686 ], [ 115.32538188, 31.17319677 ], [ 115.32547152, 31.17317661 ], [ 115.3255914, 31.17312644 ], [ 115.32567114, 31.17311631 ], [ 115.32575106, 31.17309615 ], [ 115.32584088, 31.17310601 ], [ 115.32592062, 31.17312585 ], [ 115.32602052, 31.17316563 ], [ 115.3261701, 31.17325532 ], [ 115.32621006, 31.17326526 ], [ 115.3262898, 31.17327507 ], [ 115.32633984, 31.17324501 ], [ 115.32636972, 31.17319497 ], [ 115.32640968, 31.17300503 ], [ 115.32648942, 31.17272499 ], [ 115.3265094, 31.17266501 ], [ 115.32652938, 31.17260498 ], [ 115.32654936, 31.17254499 ], [ 115.32659922, 31.17247493 ], [ 115.32664908, 31.17246485 ], [ 115.32670902, 31.17246471 ], [ 115.32676896, 31.1724846 ], [ 115.32679884, 31.17254454 ], [ 115.32678876, 31.1726745 ], [ 115.32665916, 31.17320447 ], [ 115.32667896, 31.17328439 ], [ 115.32669894, 31.17332435 ], [ 115.32675888, 31.17334419 ], [ 115.32677886, 31.17331418 ], [ 115.32682872, 31.17320415 ], [ 115.32692844, 31.17296408 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551230", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.080", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32692844, 31.17296408 ], [ 115.3269585, 31.17289406 ], [ 115.32702834, 31.17283398 ], [ 115.32712806, 31.17280379 ], [ 115.32722796, 31.17280361 ], [ 115.3275372, 31.17285306 ], [ 115.32761712, 31.17287291 ], [ 115.32766698, 31.17288281 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551231", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.401", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32766698, 31.17288281 ], [ 115.32816594, 31.17299184 ], [ 115.32871476, 31.17322071 ], [ 115.329024, 31.17336008 ], [ 115.3291437, 31.17340985 ], [ 115.32951306, 31.17354912 ], [ 115.3295928, 31.17357896 ], [ 115.32964266, 31.17358886 ], [ 115.3297026, 31.17358877 ], [ 115.32978234, 31.1735786 ], [ 115.32991212, 31.1735484 ], [ 115.33013172, 31.17351803 ], [ 115.33029138, 31.1735277 ], [ 115.33036122, 31.1735376 ], [ 115.33041108, 31.17356748 ], [ 115.33049082, 31.17360731 ], [ 115.33087008, 31.17384653 ], [ 115.33104972, 31.17394611 ], [ 115.33115934, 31.17398594 ], [ 115.33148874, 31.17412526 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551232", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.549", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33148874, 31.17412526 ], [ 115.33181796, 31.17426458 ], [ 115.33197762, 31.17432425 ], [ 115.33213728, 31.17436394 ], [ 115.3322172, 31.17435381 ], [ 115.33228704, 31.1743337 ], [ 115.3323468, 31.1742936 ], [ 115.33238676, 31.17424356 ], [ 115.33241682, 31.17417354 ], [ 115.3324467, 31.17391362 ], [ 115.33240674, 31.17360384 ], [ 115.33242672, 31.17353382 ], [ 115.3324368, 31.17348387 ], [ 115.33250664, 31.17341376 ], [ 115.3325664, 31.17340364 ], [ 115.33262634, 31.17342353 ], [ 115.33265622, 31.17344346 ], [ 115.33270626, 31.17350336 ], [ 115.33272606, 31.17358328 ], [ 115.33280598, 31.1740529 ], [ 115.33283586, 31.17422277 ], [ 115.33286574, 31.17434265 ], [ 115.33287582, 31.17437262 ], [ 115.33294566, 31.17443247 ], [ 115.33300542, 31.17443234 ], [ 115.33305528, 31.17440228 ], [ 115.33306536, 31.17435228 ], [ 115.33306536, 31.1742923 ], [ 115.33304538, 31.1741924 ], [ 115.3330254, 31.17402252 ], [ 115.33304538, 31.17390255 ], [ 115.33309524, 31.17384248 ], [ 115.33317516, 31.17381233 ], [ 115.33331484, 31.1738121 ], [ 115.33368402, 31.1738814 ], [ 115.33390362, 31.17387101 ], [ 115.334163, 31.17383055 ], [ 115.33432266, 31.1737703 ], [ 115.3345023, 31.17363003 ], [ 115.33454226, 31.17357999 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551233", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.309", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33454226, 31.17357999 ], [ 115.33459212, 31.17350993 ], [ 115.33462218, 31.17336993 ], [ 115.33462218, 31.17325001 ], [ 115.33465206, 31.17311001 ], [ 115.33469202, 31.17297002 ], [ 115.33490154, 31.17274974 ], [ 115.33532076, 31.17237917 ], [ 115.33548042, 31.17224894 ], [ 115.33568994, 31.17213864 ], [ 115.33582962, 31.17208838 ], [ 115.33613904, 31.1719779 ], [ 115.33628862, 31.17192764 ], [ 115.33643838, 31.17190739 ], [ 115.3365183, 31.17187724 ], [ 115.33659804, 31.17185712 ], [ 115.33669776, 31.17177698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551234", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.295", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34861178, 31.17326414 ], [ 115.34852196, 31.17317436 ], [ 115.34844204, 31.17308454 ], [ 115.34821272, 31.17285509 ], [ 115.34795316, 31.17262563 ], [ 115.3476639, 31.1724063 ], [ 115.34718492, 31.17201737 ], [ 115.34689548, 31.17175799 ], [ 115.3466262, 31.17157857 ], [ 115.34641668, 31.17140906 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551235", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.725", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34861178, 31.17326414 ], [ 115.34987898, 31.17430134 ], [ 115.34994882, 31.1743512 ], [ 115.35006852, 31.1744709 ], [ 115.35012846, 31.1745308 ], [ 115.35028812, 31.17467043 ], [ 115.35036786, 31.17474023 ], [ 115.35046758, 31.17483999 ], [ 115.35051762, 31.17487991 ], [ 115.35062724, 31.17496964 ], [ 115.35076692, 31.17509933 ], [ 115.35090678, 31.17520908 ], [ 115.35101658, 31.17529886 ], [ 115.35105654, 31.17532878 ], [ 115.35116634, 31.17543854 ], [ 115.35127596, 31.17552836 ], [ 115.35138576, 31.17563811 ], [ 115.35148566, 31.17571794 ], [ 115.35158538, 31.17581771 ], [ 115.35173514, 31.17593745 ], [ 115.35183504, 31.17602723 ], [ 115.35191478, 31.17609707 ], [ 115.3520046, 31.1761769 ], [ 115.35209442, 31.17624674 ], [ 115.35218424, 31.17632652 ], [ 115.35227424, 31.17640635 ], [ 115.35237396, 31.17648618 ], [ 115.35246378, 31.176576 ], [ 115.35256368, 31.17665579 ], [ 115.3526634, 31.17674561 ], [ 115.3527633, 31.17682539 ], [ 115.35286302, 31.17691521 ], [ 115.35297282, 31.17700499 ], [ 115.35307272, 31.17709481 ], [ 115.35318252, 31.17718458 ], [ 115.35328224, 31.17727436 ], [ 115.35347196, 31.17742403 ], [ 115.35356178, 31.17750381 ], [ 115.35375132, 31.17768345 ], [ 115.35397092, 31.17787299 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551236", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.889", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35397092, 31.17787299 ], [ 115.35408072, 31.17795282 ], [ 115.35439014, 31.17824217 ], [ 115.35449994, 31.17833195 ], [ 115.35477948, 31.17855141 ], [ 115.35501888, 31.17877097 ], [ 115.35526854, 31.17898044 ], [ 115.35551802, 31.17920994 ], [ 115.3557675, 31.17944943 ], [ 115.35601698, 31.17969891 ], [ 115.35626664, 31.17996837 ], [ 115.35651612, 31.18024782 ], [ 115.35675552, 31.18053731 ], [ 115.3569951, 31.18082675 ], [ 115.35724458, 31.18111623 ], [ 115.35748416, 31.18140567 ], [ 115.35772356, 31.18169511 ], [ 115.35797304, 31.1819846 ], [ 115.35822252, 31.18227404 ], [ 115.3584621, 31.18253351 ], [ 115.35870168, 31.18279298 ], [ 115.3589211, 31.18307247 ], [ 115.35916068, 31.18334198 ], [ 115.35939018, 31.18361144 ], [ 115.35962976, 31.18387095 ], [ 115.3598193, 31.18407053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551237", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.376", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36477992, 31.18844066 ], [ 115.3646901, 31.18835084 ], [ 115.36466022, 31.18831092 ], [ 115.36462026, 31.188281 ], [ 115.36448058, 31.18814127 ], [ 115.36439076, 31.1880515 ], [ 115.36432074, 31.1879916 ], [ 115.36422102, 31.18789184 ], [ 115.3641213, 31.18779203 ], [ 115.3640214, 31.18769226 ], [ 115.36394148, 31.18761239 ], [ 115.36389162, 31.18755254 ], [ 115.36383186, 31.18750263 ], [ 115.36377192, 31.18747275 ], [ 115.36366212, 31.18738293 ], [ 115.36361226, 31.18735305 ], [ 115.36341246, 31.18720343 ], [ 115.36331274, 31.1871236 ], [ 115.36323282, 31.18706375 ], [ 115.36315308, 31.18702388 ], [ 115.36306326, 31.18696407 ], [ 115.36301322, 31.18691417 ], [ 115.36295346, 31.18687425 ], [ 115.3629135, 31.18684433 ], [ 115.36282368, 31.18675455 ], [ 115.36276374, 31.18669466 ], [ 115.3627038, 31.18665474 ], [ 115.36264404, 31.18659489 ], [ 115.36257402, 31.18653504 ], [ 115.36245432, 31.18643528 ], [ 115.3623744, 31.18635545 ], [ 115.36231464, 31.18630554 ], [ 115.36226478, 31.18625564 ], [ 115.3621449, 31.18615587 ], [ 115.3620252, 31.18604612 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551238", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.200", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3620252, 31.18604612 ], [ 115.3618056, 31.18584654 ], [ 115.3617057, 31.18576676 ], [ 115.3614663, 31.18551728 ], [ 115.36130646, 31.18539758 ], [ 115.3612467, 31.18533768 ], [ 115.36105698, 31.18517807 ], [ 115.36079742, 31.18495856 ], [ 115.36055802, 31.18475903 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551239", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.104", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36055802, 31.18475903 ], [ 115.36052796, 31.1847291 ], [ 115.36027848, 31.1844996 ], [ 115.360029, 31.1842701 ], [ 115.3598193, 31.18407053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551240", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.233", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36506936, 31.18892 ], [ 115.36510932, 31.18898993 ], [ 115.36520922, 31.18920975 ], [ 115.36529904, 31.18939956 ], [ 115.3653291, 31.1895095 ], [ 115.36540902, 31.18965935 ], [ 115.36551882, 31.18991913 ], [ 115.36561872, 31.19016893 ], [ 115.36572852, 31.19042871 ], [ 115.3658385, 31.19068845 ], [ 115.36592832, 31.19087831 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551241", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.359", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36592832, 31.19087831 ], [ 115.3659483, 31.19093825 ], [ 115.36601832, 31.19110812 ], [ 115.36610814, 31.19138789 ], [ 115.3661481, 31.19158778 ], [ 115.36620804, 31.19181759 ], [ 115.3662579, 31.19205744 ], [ 115.36630794, 31.1922873 ], [ 115.3663479, 31.19252715 ], [ 115.36637778, 31.192767 ], [ 115.36643772, 31.19300685 ], [ 115.36647768, 31.19323667 ], [ 115.36652754, 31.19346653 ], [ 115.3665675, 31.19368635 ], [ 115.36660728, 31.19389619 ], [ 115.36663734, 31.19404608 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551242", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.031", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36506936, 31.18892 ], [ 115.36503948, 31.18885007 ], [ 115.36499952, 31.18879013 ], [ 115.36495956, 31.18871021 ], [ 115.36492968, 31.18867029 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551243", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36492968, 31.18867029 ], [ 115.3649097, 31.18864032 ], [ 115.36488972, 31.18860041 ], [ 115.36486974, 31.18857044 ], [ 115.36485984, 31.18853048 ], [ 115.36482978, 31.18850055 ], [ 115.36477992, 31.18844066 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551244", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.137", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3694133, 31.19832104 ], [ 115.36914366, 31.19789156 ], [ 115.368984, 31.19760185 ], [ 115.36893396, 31.19752193 ], [ 115.36874424, 31.19723231 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551245", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.109", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36874424, 31.19723231 ], [ 115.3685745, 31.1969826 ], [ 115.36820514, 31.1963733 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551246", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.062", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36820514, 31.1963733 ], [ 115.36806528, 31.19616356 ], [ 115.36787556, 31.19589387 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551247", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.237", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36787556, 31.19589387 ], [ 115.3676259, 31.19552433 ], [ 115.36738632, 31.19518472 ], [ 115.36728642, 31.1950449 ], [ 115.36706664, 31.1946953 ], [ 115.36663734, 31.19404608 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551248", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.390", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37780202, 31.20850728 ], [ 115.37775198, 31.20844734 ], [ 115.37733258, 31.20796805 ], [ 115.37691318, 31.2074487 ], [ 115.37613432, 31.20651 ], [ 115.37500572, 31.20514187 ], [ 115.37475606, 31.20484226 ], [ 115.374087, 31.20406335 ], [ 115.3736775, 31.203554 ], [ 115.37334792, 31.20315453 ], [ 115.37305848, 31.20275507 ], [ 115.3728387, 31.20243543 ], [ 115.37277876, 31.20236555 ], [ 115.37254908, 31.20200595 ], [ 115.37235936, 31.20168632 ], [ 115.37218962, 31.20143661 ], [ 115.37201988, 31.2011969 ], [ 115.37178012, 31.20090732 ], [ 115.37155044, 31.20065766 ], [ 115.37126082, 31.20037812 ], [ 115.37100126, 31.20014849 ], [ 115.37088138, 31.20004868 ], [ 115.37057178, 31.19974911 ], [ 115.37036208, 31.19955944 ], [ 115.37018226, 31.19939969 ], [ 115.37010234, 31.19930982 ], [ 115.3698228, 31.19896031 ], [ 115.36974288, 31.19885042 ], [ 115.36956306, 31.19855076 ], [ 115.3694133, 31.19832104 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551249", "Name": null, "pyname": null, "kind": "0301", "width": "30", "length": "0.006", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37783154, 31.21072605 ], [ 115.37785152, 31.210776 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551250", "Name": null, "pyname": null, "kind": "0308", "width": "30", "length": "0.180", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37836128, 31.20920636 ], [ 115.37816148, 31.20933645 ], [ 115.37808156, 31.20940652 ], [ 115.37797158, 31.20952658 ], [ 115.37789166, 31.20962657 ], [ 115.37783172, 31.20973659 ], [ 115.37774172, 31.20990656 ], [ 115.37771184, 31.20999656 ], [ 115.37769186, 31.21012652 ], [ 115.3776717, 31.21024649 ], [ 115.3776717, 31.21036641 ], [ 115.37769168, 31.21051631 ], [ 115.37771166, 31.21062624 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551251", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.038", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39866384, 31.22259566 ], [ 115.39854396, 31.22246574 ], [ 115.3984239, 31.22232584 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551252", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.555", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3997334, 31.22742339 ], [ 115.39972332, 31.22725347 ], [ 115.3997235, 31.22712351 ], [ 115.39971342, 31.22707352 ], [ 115.3996335, 31.22621388 ], [ 115.39958346, 31.22588403 ], [ 115.39947348, 31.22474454 ], [ 115.3994535, 31.22461458 ], [ 115.3993635, 31.22410482 ], [ 115.39928358, 31.22360505 ], [ 115.3991736, 31.2233252 ], [ 115.39901376, 31.2229854 ], [ 115.39866384, 31.22259566 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551253", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.294", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40131272, 31.23392027 ], [ 115.400763, 31.23241106 ], [ 115.40045304, 31.23152154 ], [ 115.40041308, 31.23139158 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551254", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.448", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40041308, 31.23139158 ], [ 115.40031318, 31.23115173 ], [ 115.4001033, 31.23049203 ], [ 115.4000133, 31.23011223 ], [ 115.39995336, 31.22973239 ], [ 115.39986336, 31.22864285 ], [ 115.3998234, 31.22824302 ], [ 115.39975338, 31.22778326 ], [ 115.3997334, 31.22742339 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551255", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.065", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40628378, 31.2460065 ], [ 115.40591352, 31.2456663 ], [ 115.40539296, 31.24517603 ], [ 115.40494242, 31.24477575 ], [ 115.40485242, 31.24468571 ], [ 115.40470212, 31.24451561 ], [ 115.40460204, 31.24433552 ], [ 115.40455182, 31.24422545 ], [ 115.40455182, 31.24420542 ], [ 115.40438154, 31.24362542 ], [ 115.40429154, 31.24329557 ], [ 115.40401164, 31.24232604 ], [ 115.40378178, 31.2416564 ], [ 115.40374182, 31.24147649 ], [ 115.40359188, 31.24093676 ], [ 115.40337192, 31.24019714 ], [ 115.40305206, 31.23907767 ], [ 115.4028321, 31.23833805 ], [ 115.40257236, 31.23747846 ], [ 115.40248236, 31.23719861 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551256", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.128", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40248236, 31.23719861 ], [ 115.4023623, 31.23680877 ], [ 115.40211246, 31.23608918 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551257", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.503", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41964032, 31.24836095 ], [ 115.41888936, 31.24847012 ], [ 115.41833856, 31.24855949 ], [ 115.417908, 31.248639 ], [ 115.41741786, 31.2487488 ], [ 115.41709782, 31.24883885 ], [ 115.41667788, 31.24894887 ], [ 115.4160981, 31.24911888 ], [ 115.41532824, 31.24936899 ], [ 115.41457836, 31.24957901 ], [ 115.41455838, 31.24958904 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551258", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.081", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.42202334, 31.24800351 ], [ 115.42177296, 31.24804325 ], [ 115.4211822, 31.24813262 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551259", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.149", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4211822, 31.24813262 ], [ 115.4207817, 31.24819215 ], [ 115.41985056, 31.24833116 ], [ 115.41964032, 31.24836095 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551260", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.046", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03957428, 31.16942474 ], [ 115.04005272, 31.16938352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551261", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.392", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04005272, 31.16938352 ], [ 115.04142846, 31.16927007 ], [ 115.0416378, 31.16925954 ], [ 115.04181726, 31.1692491 ], [ 115.04194668, 31.16923875 ], [ 115.04218608, 31.16923817 ], [ 115.04248506, 31.16926737 ], [ 115.04298348, 31.16933604 ], [ 115.04325258, 31.16939531 ], [ 115.04404008, 31.16955321 ], [ 115.04411982, 31.16956298 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551262", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.263", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06048974, 31.17001068 ], [ 115.06162824, 31.16933991 ], [ 115.06193784, 31.1691497 ], [ 115.06254714, 31.1687793 ], [ 115.06275684, 31.16865915 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551263", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.391", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05616596, 31.17220443 ], [ 115.05652506, 31.17218369 ], [ 115.05685428, 31.17213311 ], [ 115.05710394, 31.17204293 ], [ 115.05729366, 31.17196278 ], [ 115.05781296, 31.17168239 ], [ 115.05801276, 31.1715423 ], [ 115.05865194, 31.17116187 ], [ 115.05918132, 31.17084152 ], [ 115.05968064, 31.17051122 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551264", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.095", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05968064, 31.17051122 ], [ 115.05980052, 31.17043112 ], [ 115.06029984, 31.17013079 ], [ 115.06048974, 31.17001068 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551265", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.075", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0554078, 31.17203609 ], [ 115.05602628, 31.17218472 ], [ 115.05616596, 31.17220443 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551266", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.820", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04411982, 31.16956298 ], [ 115.04490732, 31.16973087 ], [ 115.04564496, 31.16988887 ], [ 115.04591406, 31.16994813 ], [ 115.04640258, 31.17007679 ], [ 115.04745918, 31.17027398 ], [ 115.04826648, 31.17046176 ], [ 115.04974248, 31.17079841 ], [ 115.05066012, 31.17098642 ], [ 115.0517772, 31.17124395 ], [ 115.05243564, 31.17140253 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551267", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05243564, 31.17140253 ], [ 115.05281454, 31.17149172 ], [ 115.05295422, 31.17152142 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551268", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0301", "width": "130", "length": "0.241", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.05295422, 31.17152142 ], [ 115.0543107, 31.17179849 ], [ 115.05535794, 31.17202619 ], [ 115.0554078, 31.17203609 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551269", "Name": null, "pyname": null, "kind": "0312", "width": "30", "length": "0.027", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0398234, 31.16952405 ], [ 115.03990314, 31.16946384 ], [ 115.04005272, 31.16938352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551270", "Name": null, "pyname": null, "kind": "0312", "width": "30", "length": "0.024", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03958418, 31.16972453 ], [ 115.0396938, 31.16961432 ], [ 115.03975356, 31.16956419 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551271", "Name": null, "pyname": null, "kind": "0312", "width": "30", "length": "0.008", "speedclass": "7" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03975356, 31.16956419 ], [ 115.0398234, 31.16952405 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551272", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.127", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03139994, 31.16973551 ], [ 115.03216764, 31.16958363 ], [ 115.03243674, 31.16955294 ], [ 115.03270584, 31.16954228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551273", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.167", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03270584, 31.16954228 ], [ 115.0327458, 31.16954219 ], [ 115.0334037, 31.16958044 ], [ 115.03411146, 31.16966859 ], [ 115.03435068, 31.16971796 ], [ 115.03444032, 31.16972772 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551274", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.124", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03141992, 31.16986538 ], [ 115.03220742, 31.16971346 ], [ 115.03245672, 31.16967282 ], [ 115.03269594, 31.1696622 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551463", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.170", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03269594, 31.1696622 ], [ 115.0327458, 31.16966207 ], [ 115.03337382, 31.16970045 ], [ 115.0340616, 31.16978865 ], [ 115.03430082, 31.16983797 ], [ 115.03443042, 31.16985764 ], [ 115.0344603, 31.16985755 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551464", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.129", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0293663, 31.17028037 ], [ 115.02961542, 31.17022974 ], [ 115.0306821, 31.17001716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551465", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302|0304", "width": "55", "length": "0.012", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0306821, 31.17001716 ], [ 115.0308018, 31.16999687 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551466", "Name": null, "pyname": null, "kind": "0302|0304", "width": "30", "length": "0.015", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0308018, 31.16999687 ], [ 115.03071216, 31.16988716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551467", "Name": null, "pyname": null, "kind": "0302|0304", "width": "30", "length": "0.015", "speedclass": "5" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03071216, 31.16988716 ], [ 115.0306821, 31.17001716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551468", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.231", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02599652, 31.17145824 ], [ 115.02604638, 31.17143813 ], [ 115.02682416, 31.17105635 ], [ 115.02725274, 31.1708354 ], [ 115.0275519, 31.1707247 ], [ 115.02772128, 31.17066431 ], [ 115.02801054, 31.17056364 ], [ 115.02809028, 31.17054344 ], [ 115.02815004, 31.17052332 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551469", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02815004, 31.17052332 ], [ 115.0285887, 31.17042225 ], [ 115.0293663, 31.17028037 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551470", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.237", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02589698, 31.17135857 ], [ 115.02671454, 31.17095672 ], [ 115.0271532, 31.17073572 ], [ 115.02746226, 31.17061503 ], [ 115.02763164, 31.17056463 ], [ 115.0279407, 31.17045389 ], [ 115.02803052, 31.17043368 ], [ 115.02812016, 31.17041348 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551471", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.119", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02812016, 31.17041348 ], [ 115.02852894, 31.17030251 ], [ 115.02932634, 31.17016053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551472", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.025", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02180954, 31.17254828 ], [ 115.02205884, 31.17248766 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551473", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.188", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02205884, 31.17248766 ], [ 115.0223778, 31.17240689 ], [ 115.02310554, 31.17218517 ], [ 115.0239429, 31.17198317 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551474", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.238", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01915778, 31.17332457 ], [ 115.01936712, 31.17326405 ], [ 115.01976582, 31.17315312 ], [ 115.02084258, 31.17287052 ], [ 115.02150048, 31.17273894 ], [ 115.02155034, 31.17272882 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551475", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.028", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.02155034, 31.17272882 ], [ 115.02183942, 31.17266811 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551476", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.102", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01518158, 31.17432515 ], [ 115.01595864, 31.17412296 ], [ 115.01619786, 31.17405231 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551477", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.191", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01619786, 31.17405231 ], [ 115.01722404, 31.17378942 ], [ 115.01749314, 31.17371868 ], [ 115.0179714, 31.17358742 ], [ 115.01811108, 31.17355709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551478", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.191", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01616798, 31.17394242 ], [ 115.01715438, 31.17367967 ], [ 115.0174233, 31.17359894 ], [ 115.01790174, 31.17347766 ], [ 115.0180812, 31.17342726 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551479", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01509176, 31.17416549 ], [ 115.01557002, 31.17407414 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551781", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.088", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41351852, 31.2498891 ], [ 115.4132685, 31.24994913 ], [ 115.41302856, 31.25000916 ], [ 115.41285864, 31.25005916 ], [ 115.4127087, 31.25010915 ], [ 115.41263868, 31.25011919 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551782", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.773", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41263868, 31.25011919 ], [ 115.41257856, 31.25011919 ], [ 115.41249864, 31.25012918 ], [ 115.41234852, 31.25009912 ], [ 115.41222846, 31.25005911 ], [ 115.41207852, 31.25000907 ], [ 115.41196836, 31.24994904 ], [ 115.41186828, 31.249899 ], [ 115.41130794, 31.2496088 ], [ 115.41050748, 31.24915848 ], [ 115.40934666, 31.24851809 ], [ 115.40851614, 31.24809779 ], [ 115.40826594, 31.24796769 ], [ 115.40792574, 31.24775754 ], [ 115.40786562, 31.24771754 ], [ 115.40777562, 31.24764752 ], [ 115.40767554, 31.24754744 ], [ 115.40752524, 31.24736735 ], [ 115.4069946, 31.24670693 ], [ 115.4068344, 31.24653683 ], [ 115.40649402, 31.24620662 ], [ 115.40628378, 31.2460065 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551783", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.020", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01557002, 31.17407414 ], [ 115.01576928, 31.17403355 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551784", "Name": "杜鹃大道", "pyname": "djdd", "kind": "0302", "width": "55", "length": "0.039", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.01576928, 31.17403355 ], [ 115.01588898, 31.17401321 ], [ 115.01616798, 31.17394242 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551785", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.026", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37836128, 31.20920636 ], [ 115.37820144, 31.20901659 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551786", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.068", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37820144, 31.20901659 ], [ 115.37808156, 31.20887678 ], [ 115.37780202, 31.20850728 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551787", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.379", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33669776, 31.17177698 ], [ 115.33679766, 31.17167681 ], [ 115.33688748, 31.17153672 ], [ 115.33696722, 31.17132666 ], [ 115.3369971, 31.17113667 ], [ 115.33701708, 31.17098669 ], [ 115.3369872, 31.17065693 ], [ 115.33695732, 31.17050703 ], [ 115.33695732, 31.17042707 ], [ 115.33695732, 31.1703471 ], [ 115.3369872, 31.17026709 ], [ 115.33701708, 31.17023703 ], [ 115.33705704, 31.17018699 ], [ 115.33712688, 31.17011688 ], [ 115.33722678, 31.17005672 ], [ 115.33734648, 31.17001653 ], [ 115.33785534, 31.16988563 ], [ 115.33818456, 31.16977506 ], [ 115.3383543, 31.16970477 ], [ 115.33850388, 31.16962454 ], [ 115.33872348, 31.16950416 ], [ 115.33884318, 31.16942397 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551788", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.152", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33884318, 31.16942397 ], [ 115.33886316, 31.16941394 ], [ 115.33922244, 31.16923335 ], [ 115.3395018, 31.16907293 ], [ 115.3401903, 31.16869182 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551789", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.684", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23336228, 31.18133295 ], [ 115.2332721, 31.18120299 ], [ 115.23315204, 31.181013 ], [ 115.23308202, 31.18091301 ], [ 115.23305214, 31.18089303 ], [ 115.23299202, 31.18085303 ], [ 115.2329121, 31.18082301 ], [ 115.23287196, 31.18081298 ], [ 115.23272202, 31.18079295 ], [ 115.23260196, 31.18081293 ], [ 115.23237192, 31.18084286 ], [ 115.23180186, 31.18094267 ], [ 115.23161178, 31.18098258 ], [ 115.23142188, 31.18103253 ], [ 115.23122172, 31.18109247 ], [ 115.23109176, 31.18114242 ], [ 115.2308817, 31.18127234 ], [ 115.23072168, 31.18134227 ], [ 115.23068172, 31.18135226 ], [ 115.2306018, 31.18138223 ], [ 115.23047166, 31.18140216 ], [ 115.23031164, 31.18141211 ], [ 115.23014172, 31.18141206 ], [ 115.22978154, 31.18139199 ], [ 115.22949156, 31.18136193 ], [ 115.2293715, 31.1813519 ], [ 115.22922156, 31.18134186 ], [ 115.22896146, 31.18133178 ], [ 115.2286614, 31.18135172 ], [ 115.22832138, 31.18140162 ], [ 115.22823138, 31.18142156 ], [ 115.22790126, 31.18150143 ], [ 115.22764116, 31.1815413 ], [ 115.22749104, 31.18156124 ], [ 115.22725092, 31.18159112 ], [ 115.22716092, 31.18159107 ], [ 115.22712096, 31.18159107 ], [ 115.22708082, 31.18159103 ], [ 115.22687076, 31.18153095 ], [ 115.22673072, 31.18145094 ], [ 115.22650068, 31.1813109 ], [ 115.22627046, 31.18118085 ], [ 115.22595042, 31.18102079 ], [ 115.22581038, 31.18095072 ], [ 115.22567034, 31.18085073 ], [ 115.2254502, 31.18069067 ], [ 115.22535012, 31.18054068 ], [ 115.22522016, 31.18035074 ], [ 115.22500002, 31.1799708 ], [ 115.22496996, 31.17989079 ], [ 115.22488986, 31.17973082 ], [ 115.22460978, 31.17926088 ], [ 115.2245898, 31.17923091 ], [ 115.2244998, 31.17905096 ], [ 115.22413962, 31.17848103 ], [ 115.22401956, 31.17825104 ], [ 115.22378952, 31.17780113 ], [ 115.2234693, 31.17735117 ], [ 115.22313918, 31.1768712 ], [ 115.22277882, 31.17618108 ], [ 115.2227187, 31.17607106 ], [ 115.22256858, 31.17579102 ], [ 115.22250846, 31.17570098 ], [ 115.2224685, 31.17562097 ], [ 115.22236824, 31.1755109 ], [ 115.2223182, 31.17545087 ], [ 115.22226816, 31.17541082 ], [ 115.22211804, 31.17530066 ], [ 115.22179764, 31.17507035 ], [ 115.22170746, 31.17499029 ], [ 115.22150712, 31.1748201 ], [ 115.22137698, 31.17469001 ], [ 115.22129688, 31.17457994 ], [ 115.22118672, 31.17444989 ], [ 115.22104668, 31.17424977 ], [ 115.2209466, 31.17410973 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.551790", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.172", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2209466, 31.17410973 ], [ 115.22072628, 31.17380958 ], [ 115.22036574, 31.17334937 ], [ 115.22018556, 31.17314921 ], [ 115.2200655, 31.17301911 ], [ 115.21988514, 31.17285896 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552267", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.387", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15766004, 31.13524755 ], [ 115.15759992, 31.13553726 ], [ 115.15748958, 31.13600679 ], [ 115.15729914, 31.13668607 ], [ 115.15709862, 31.13737529 ], [ 115.15680792, 31.1383742 ], [ 115.15672782, 31.13863389 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552268", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.345", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15672782, 31.13863389 ], [ 115.15651722, 31.13934314 ], [ 115.15610628, 31.14073157 ], [ 115.1558055, 31.14137066 ], [ 115.15564512, 31.14158027 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552269", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.967", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16763942, 31.13703473 ], [ 115.16711832, 31.13713373 ], [ 115.16686776, 31.13718323 ], [ 115.16612634, 31.13714192 ], [ 115.16553522, 31.13683101 ], [ 115.16514462, 31.1364405 ], [ 115.16497416, 31.13617037 ], [ 115.1647839, 31.13591018 ], [ 115.16477382, 31.13587017 ], [ 115.16467374, 31.13558015 ], [ 115.16459364, 31.13546009 ], [ 115.16442336, 31.13531982 ], [ 115.16438322, 31.13527977 ], [ 115.16408262, 31.13511935 ], [ 115.16392242, 31.13505909 ], [ 115.16368194, 31.13497868 ], [ 115.1636418, 31.1349686 ], [ 115.1634915, 31.13495834 ], [ 115.16340132, 31.13496819 ], [ 115.16333112, 31.13497805 ], [ 115.16277006, 31.13507696 ], [ 115.16241942, 31.13518626 ], [ 115.1621289, 31.13523572 ], [ 115.16189832, 31.13531523 ], [ 115.16139738, 31.13551422 ], [ 115.1610867, 31.13563356 ], [ 115.1608662, 31.13570313 ], [ 115.16069592, 31.13574278 ], [ 115.16064588, 31.13575272 ], [ 115.16036526, 31.13576217 ], [ 115.16001462, 31.13573157 ], [ 115.15970394, 31.13567105 ], [ 115.1595738, 31.13564081 ], [ 115.1594334, 31.13560058 ], [ 115.15917294, 31.13551017 ], [ 115.1590527, 31.13545995 ], [ 115.15892256, 31.13541977 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552270", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.051", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.15892256, 31.13541977 ], [ 115.15842162, 31.13524895 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552271", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.005", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14993372, 31.14723713 ], [ 115.14991374, 31.14727709 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552272", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.028", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14991374, 31.14727709 ], [ 115.14981384, 31.14751698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552273", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.247", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14981384, 31.14751698 ], [ 115.14952368, 31.1482166 ], [ 115.14947364, 31.14828653 ], [ 115.1494236, 31.14832644 ], [ 115.14934368, 31.14836636 ], [ 115.14914334, 31.14845618 ], [ 115.14828258, 31.1486553 ], [ 115.14794238, 31.14873495 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552274", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.106", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.14794238, 31.14873495 ], [ 115.1475219, 31.1488245 ], [ 115.14667122, 31.14902363 ], [ 115.14583044, 31.14921276 ], [ 115.14551004, 31.14926244 ], [ 115.14533004, 31.14928224 ], [ 115.14505968, 31.14929201 ], [ 115.14474936, 31.14931167 ], [ 115.1444691, 31.1493614 ], [ 115.14377844, 31.14946067 ], [ 115.1429877, 31.1495999 ], [ 115.14246732, 31.14968936 ], [ 115.14211686, 31.14973899 ], [ 115.14148632, 31.14984834 ], [ 115.14096576, 31.14987782 ], [ 115.13990484, 31.14989676 ], [ 115.13949444, 31.14987638 ], [ 115.13877372, 31.14986567 ], [ 115.13848338, 31.14986535 ], [ 115.13823318, 31.14987512 ], [ 115.13791278, 31.14990477 ], [ 115.13733228, 31.14995418 ], [ 115.13717208, 31.14997403 ], [ 115.13694186, 31.14999378 ], [ 115.13654154, 31.14999342 ], [ 115.13646144, 31.14998334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552275", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.234", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13646144, 31.14998334 ], [ 115.1359209, 31.14992282 ], [ 115.13531016, 31.14981221 ], [ 115.1349399, 31.14977184 ], [ 115.13448936, 31.1497214 ], [ 115.13414898, 31.14967109 ], [ 115.13402892, 31.14967095 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552276", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.213", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13402892, 31.14967095 ], [ 115.13370852, 31.14967064 ], [ 115.13345832, 31.14968036 ], [ 115.13325816, 31.14971019 ], [ 115.13294784, 31.14979983 ], [ 115.13282778, 31.14985973 ], [ 115.13246742, 31.15000935 ], [ 115.1321373, 31.15019898 ], [ 115.1319771, 31.15030883 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552277", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.237", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1319771, 31.15030883 ], [ 115.13191698, 31.15034874 ], [ 115.13166678, 31.15050849 ], [ 115.13123658, 31.15078803 ], [ 115.13101644, 31.15094778 ], [ 115.1307963, 31.15109754 ], [ 115.13060604, 31.15123731 ], [ 115.13006568, 31.15159673 ], [ 115.13002572, 31.1516267 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552278", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.083", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13002572, 31.1516267 ], [ 115.1298756, 31.15172651 ], [ 115.12976544, 31.15177641 ], [ 115.12956528, 31.1518562 ], [ 115.12942506, 31.15189607 ], [ 115.12923498, 31.15191587 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552279", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.030", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12923498, 31.15191587 ], [ 115.12911492, 31.15192572 ], [ 115.12892466, 31.15192554 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552280", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.510", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12892466, 31.15192554 ], [ 115.1287245, 31.15191537 ], [ 115.1284842, 31.15189512 ], [ 115.12805382, 31.1518647 ], [ 115.12770336, 31.15184436 ], [ 115.12736316, 31.15185399 ], [ 115.1270829, 31.15187375 ], [ 115.1267625, 31.15193342 ], [ 115.12633212, 31.15208295 ], [ 115.12612206, 31.15217273 ], [ 115.12596186, 31.15226255 ], [ 115.12571166, 31.15243229 ], [ 115.12549152, 31.15263204 ], [ 115.12539144, 31.15273194 ], [ 115.12527138, 31.1528718 ], [ 115.1251713, 31.15304168 ], [ 115.12502136, 31.15335146 ], [ 115.12479132, 31.15383116 ], [ 115.12475118, 31.15389114 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552281", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.348", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12475118, 31.15389114 ], [ 115.12459116, 31.15412096 ], [ 115.1244711, 31.15429079 ], [ 115.12426104, 31.15447056 ], [ 115.12416096, 31.15452047 ], [ 115.12399068, 31.15458027 ], [ 115.12324998, 31.15464953 ], [ 115.12278954, 31.15463909 ], [ 115.1223192, 31.15473858 ], [ 115.12191888, 31.15493816 ], [ 115.12176876, 31.15521797 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552282", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.029", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18952292, 31.12556036 ], [ 115.18906212, 31.12533972 ], [ 115.1884809, 31.1251388 ], [ 115.1880201, 31.12502805 ], [ 115.18622676, 31.12475504 ], [ 115.18553538, 31.12461392 ], [ 115.18494426, 31.1242631 ], [ 115.18418286, 31.12389194 ], [ 115.18394238, 31.12372161 ], [ 115.1838423, 31.12366145 ], [ 115.18342146, 31.12344081 ], [ 115.18180848, 31.12255836 ], [ 115.181037, 31.12239704 ], [ 115.18078644, 31.12234664 ], [ 115.18052598, 31.12229619 ], [ 115.18018542, 31.12217564 ], [ 115.1799048, 31.12208519 ], [ 115.1798346, 31.12205508 ], [ 115.17966432, 31.12202475 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552283", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.034", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19628498, 31.12586163 ], [ 115.19616492, 31.12580147 ], [ 115.1961147, 31.12577141 ], [ 115.1959545, 31.12570116 ], [ 115.1956539, 31.12560072 ], [ 115.1955738, 31.1255906 ], [ 115.19544366, 31.12557039 ], [ 115.195113, 31.12553988 ], [ 115.19456202, 31.12547895 ], [ 115.19402112, 31.1254281 ], [ 115.19384076, 31.12536785 ], [ 115.1937306, 31.12530768 ], [ 115.1936604, 31.12526759 ], [ 115.19349012, 31.12517736 ], [ 115.19321976, 31.12505699 ], [ 115.19314956, 31.1250069 ], [ 115.19313966, 31.12496694 ], [ 115.19314974, 31.124867 ], [ 115.1931897, 31.1248071 ], [ 115.19322984, 31.12477722 ], [ 115.19334, 31.12472741 ], [ 115.19343018, 31.12467764 ], [ 115.19350038, 31.12463777 ], [ 115.1935605, 31.12456793 ], [ 115.19358066, 31.12445804 ], [ 115.19358066, 31.12441803 ], [ 115.1935605, 31.12433807 ], [ 115.19352054, 31.12427804 ], [ 115.19341038, 31.12419794 ], [ 115.19333028, 31.12414781 ], [ 115.19319996, 31.12411761 ], [ 115.19306982, 31.12408742 ], [ 115.19291952, 31.12407716 ], [ 115.19274924, 31.12407689 ], [ 115.19260884, 31.12407662 ], [ 115.19253882, 31.12406654 ], [ 115.19242866, 31.12404633 ], [ 115.19237844, 31.12401627 ], [ 115.1923284, 31.1239962 ], [ 115.1922483, 31.12393608 ], [ 115.19218818, 31.12389599 ], [ 115.19208792, 31.12383587 ], [ 115.19196768, 31.12381566 ], [ 115.1918775, 31.12382547 ], [ 115.19178732, 31.12384532 ], [ 115.19170722, 31.12388514 ], [ 115.19167716, 31.12391511 ], [ 115.19162712, 31.12397496 ], [ 115.19160696, 31.12401492 ], [ 115.19159706, 31.12405488 ], [ 115.19161704, 31.12418484 ], [ 115.19170722, 31.12459475 ], [ 115.1917272, 31.12463475 ], [ 115.19175726, 31.12476471 ], [ 115.19183718, 31.1251046 ], [ 115.19183718, 31.12516458 ], [ 115.1918271, 31.12521453 ], [ 115.1918172, 31.12525449 ], [ 115.19170686, 31.12546415 ], [ 115.19158662, 31.12566381 ], [ 115.19150634, 31.12575359 ], [ 115.19146638, 31.12580349 ], [ 115.19143632, 31.12582343 ], [ 115.19135604, 31.12586325 ], [ 115.19117568, 31.12596288 ], [ 115.19075502, 31.12595217 ], [ 115.1899335, 31.12576092 ], [ 115.18952292, 31.12556036 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552284", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.360", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19938026, 31.12729587 ], [ 115.19912988, 31.12691571 ], [ 115.19904978, 31.12680564 ], [ 115.1989596, 31.12671555 ], [ 115.19892954, 31.12667555 ], [ 115.19884944, 31.12661547 ], [ 115.19873928, 31.12654532 ], [ 115.19859906, 31.1264951 ], [ 115.19853894, 31.12648502 ], [ 115.19846874, 31.12647489 ], [ 115.19816832, 31.12645442 ], [ 115.1980281, 31.12643417 ], [ 115.1978778, 31.12636397 ], [ 115.19763732, 31.12621367 ], [ 115.1973369, 31.12600334 ], [ 115.19728686, 31.12597323 ], [ 115.1971866, 31.12593309 ], [ 115.1971065, 31.12591298 ], [ 115.19699634, 31.12590281 ], [ 115.19688618, 31.12590263 ], [ 115.19669574, 31.12593228 ], [ 115.19655552, 31.12594205 ], [ 115.19648532, 31.12594191 ], [ 115.19638524, 31.12591176 ], [ 115.19628498, 31.12586163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552285", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.131", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20273438, 31.13386695 ], [ 115.20271422, 31.13384693 ], [ 115.2021735, 31.13341632 ], [ 115.20196308, 31.13324609 ], [ 115.20191304, 31.13316603 ], [ 115.20190296, 31.13310609 ], [ 115.20190296, 31.13308611 ], [ 115.2019332, 31.13298621 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552286", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.755", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2019332, 31.13298621 ], [ 115.20197316, 31.13293631 ], [ 115.2024642, 31.13261739 ], [ 115.20258444, 31.13238776 ], [ 115.20259452, 31.13233781 ], [ 115.2026046, 31.13221788 ], [ 115.20261468, 31.13210799 ], [ 115.2025947, 31.13195805 ], [ 115.20257454, 31.13187809 ], [ 115.20250452, 31.13172806 ], [ 115.20247446, 31.13167806 ], [ 115.20240444, 31.131608 ], [ 115.20217404, 31.13138777 ], [ 115.20210402, 31.13130767 ], [ 115.20207396, 31.13124768 ], [ 115.2020439, 31.13115768 ], [ 115.20199386, 31.13101769 ], [ 115.20197388, 31.13094771 ], [ 115.20191376, 31.13083769 ], [ 115.20185364, 31.13074764 ], [ 115.20162324, 31.13051742 ], [ 115.20155322, 31.13044736 ], [ 115.20152316, 31.13039732 ], [ 115.2014031, 31.13008736 ], [ 115.20131292, 31.12988733 ], [ 115.20126288, 31.12979733 ], [ 115.20119286, 31.12970724 ], [ 115.20110268, 31.12961715 ], [ 115.20095238, 31.12946703 ], [ 115.20091242, 31.12942698 ], [ 115.20083232, 31.12931691 ], [ 115.20073206, 31.12912688 ], [ 115.2006921, 31.12899692 ], [ 115.20055188, 31.12856699 ], [ 115.20049194, 31.12847694 ], [ 115.20046188, 31.12840692 ], [ 115.20038178, 31.12831688 ], [ 115.2002115, 31.12819664 ], [ 115.20001116, 31.12806641 ], [ 115.19994096, 31.12801632 ], [ 115.19986086, 31.12794626 ], [ 115.19973072, 31.12781612 ], [ 115.19963064, 31.12768602 ], [ 115.19938026, 31.12729587 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552287", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.293", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2039258, 31.13587755 ], [ 115.20387576, 31.13581752 ], [ 115.20386586, 31.13573756 ], [ 115.20388584, 31.13567762 ], [ 115.203906, 31.13561772 ], [ 115.20394596, 31.13555783 ], [ 115.2039861, 31.13548794 ], [ 115.2040563, 31.13536815 ], [ 115.20408636, 31.13525826 ], [ 115.20406638, 31.1351783 ], [ 115.20394614, 31.1350482 ], [ 115.20391608, 31.13500815 ], [ 115.2038961, 31.13499812 ], [ 115.20387612, 31.13498813 ], [ 115.20378594, 31.13495798 ], [ 115.20339516, 31.13486739 ], [ 115.20333504, 31.13484728 ], [ 115.20326502, 31.13479719 ], [ 115.20323496, 31.13475719 ], [ 115.20318492, 31.13468712 ], [ 115.20317484, 31.13457719 ], [ 115.2031149, 31.13438724 ], [ 115.20308484, 31.13424729 ], [ 115.2030348, 31.13415725 ], [ 115.2029547, 31.13405721 ], [ 115.20273438, 31.13386695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552288", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.024", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20411624, 31.13601777 ], [ 115.20402606, 31.13596769 ], [ 115.20393588, 31.13589758 ], [ 115.2039258, 31.13587755 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552289", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.052", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20918378, 31.14127269 ], [ 115.20906354, 31.14125253 ], [ 115.20887328, 31.14121221 ], [ 115.20857268, 31.14112176 ], [ 115.20853272, 31.14111173 ], [ 115.20833238, 31.14105143 ], [ 115.20819198, 31.14100121 ], [ 115.20796176, 31.14089091 ], [ 115.20757098, 31.1406404 ], [ 115.20744084, 31.14054027 ], [ 115.2073908, 31.14047021 ], [ 115.20737082, 31.14044019 ], [ 115.20735066, 31.14040019 ], [ 115.20736074, 31.14034025 ], [ 115.2073908, 31.14027036 ], [ 115.20745092, 31.14021051 ], [ 115.20752112, 31.14017064 ], [ 115.20759114, 31.14014081 ], [ 115.20775152, 31.14010107 ], [ 115.20778158, 31.14008114 ], [ 115.2082926, 31.14006206 ], [ 115.20857304, 31.14001256 ], [ 115.20864324, 31.13994272 ], [ 115.20866322, 31.13991279 ], [ 115.2086832, 31.13989281 ], [ 115.20871344, 31.13981294 ], [ 115.20873342, 31.13972303 ], [ 115.20873342, 31.13964306 ], [ 115.20872352, 31.13959311 ], [ 115.20870336, 31.13955311 ], [ 115.20868338, 31.1395131 ], [ 115.20863334, 31.13947305 ], [ 115.2085833, 31.13945298 ], [ 115.20850302, 31.13943282 ], [ 115.20837288, 31.1394326 ], [ 115.2082125, 31.13943233 ], [ 115.20808236, 31.13943215 ], [ 115.20801216, 31.13943201 ], [ 115.20795204, 31.13938193 ], [ 115.20795204, 31.13933198 ], [ 115.20791226, 31.13883225 ], [ 115.20787212, 31.13876223 ], [ 115.20786222, 31.13874225 ], [ 115.207812, 31.1386622 ], [ 115.2077319, 31.13860212 ], [ 115.2076518, 31.13858201 ], [ 115.2075816, 31.13858187 ], [ 115.20748152, 31.13860167 ], [ 115.20726102, 31.13868128 ], [ 115.20714078, 31.13869104 ], [ 115.20709074, 31.13866098 ], [ 115.2070407, 31.13862093 ], [ 115.2068904, 31.13841083 ], [ 115.20682038, 31.13834076 ], [ 115.2067302, 31.13828064 ], [ 115.20653994, 31.13819037 ], [ 115.2064197, 31.13810024 ], [ 115.20635958, 31.13802018 ], [ 115.20630954, 31.13793018 ], [ 115.2062496, 31.13774019 ], [ 115.20615942, 31.13760015 ], [ 115.20606924, 31.13752005 ], [ 115.20599922, 31.13747996 ], [ 115.20589896, 31.13742983 ], [ 115.20574866, 31.13729964 ], [ 115.2056286, 31.13715956 ], [ 115.20553842, 31.13699954 ], [ 115.20551844, 31.13695949 ], [ 115.20537822, 31.13675942 ], [ 115.2053181, 31.13667936 ], [ 115.20521802, 31.13658927 ], [ 115.20503766, 31.13647902 ], [ 115.2049977, 31.136459 ], [ 115.20482742, 31.13638875 ], [ 115.20457686, 31.13626838 ], [ 115.20444672, 31.1362182 ], [ 115.2042264, 31.13608793 ], [ 115.20411624, 31.13601777 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552290", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.216", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21133766, 31.14151619 ], [ 115.21103706, 31.14134582 ], [ 115.21087686, 31.14127557 ], [ 115.21072656, 31.14122535 ], [ 115.2105363, 31.14120506 ], [ 115.21043604, 31.14121487 ], [ 115.2100854, 31.14126423 ], [ 115.20982494, 31.14133376 ], [ 115.20966456, 31.14133349 ], [ 115.20959454, 31.14133335 ], [ 115.20953442, 31.14132327 ], [ 115.2094041, 31.14132305 ], [ 115.20918378, 31.14127269 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552291", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.568", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21641456, 31.14421164 ], [ 115.21598418, 31.14405131 ], [ 115.21476252, 31.14342005 ], [ 115.2142317, 31.14314946 ], [ 115.21406142, 31.14304929 ], [ 115.21371096, 31.14283892 ], [ 115.21297008, 31.14241812 ], [ 115.21284984, 31.14234797 ], [ 115.21242918, 31.14211752 ], [ 115.21217898, 31.14199724 ], [ 115.21133766, 31.14151619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552292", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.022", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21699506, 31.1443821 ], [ 115.21681488, 31.14434196 ], [ 115.21677492, 31.14433193 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552293", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.037", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21677492, 31.14433193 ], [ 115.21659474, 31.14427176 ], [ 115.21641456, 31.14421164 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552294", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.050", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21964556, 31.16879118 ], [ 115.21965564, 31.16873124 ], [ 115.2196857, 31.16845148 ], [ 115.21970586, 31.16812172 ], [ 115.21973592, 31.16794185 ], [ 115.21974582, 31.16788191 ], [ 115.21981602, 31.16770214 ], [ 115.22010672, 31.16672312 ], [ 115.2201267, 31.16666322 ], [ 115.22029698, 31.16603385 ], [ 115.2204273, 31.1655843 ], [ 115.22052756, 31.16529459 ], [ 115.22056752, 31.16511473 ], [ 115.22061756, 31.16491488 ], [ 115.2206577, 31.16471499 ], [ 115.22076786, 31.16441529 ], [ 115.2209079, 31.1642055 ], [ 115.22092788, 31.16417553 ], [ 115.22113812, 31.16388591 ], [ 115.22140848, 31.16349635 ], [ 115.2216288, 31.16317671 ], [ 115.22174886, 31.16296692 ], [ 115.22180898, 31.16285708 ], [ 115.22188908, 31.16267721 ], [ 115.2222093, 31.16176799 ], [ 115.22240964, 31.16127843 ], [ 115.22250972, 31.16098868 ], [ 115.22271996, 31.16045916 ], [ 115.22275992, 31.16036925 ], [ 115.22284002, 31.16011946 ], [ 115.2229302, 31.15989963 ], [ 115.22294028, 31.15985967 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552295", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.208", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22294028, 31.15985967 ], [ 115.22298024, 31.15972976 ], [ 115.22302038, 31.15935 ], [ 115.2230103, 31.15881027 ], [ 115.2230103, 31.15846044 ], [ 115.22302038, 31.15831055 ], [ 115.22305044, 31.15815066 ], [ 115.2230805, 31.15797075 ], [ 115.22311056, 31.15780088 ], [ 115.22314044, 31.15769099 ], [ 115.22319066, 31.15752111 ], [ 115.22321064, 31.15746117 ], [ 115.22342088, 31.15702157 ], [ 115.2234909, 31.15687172 ], [ 115.223571, 31.15660194 ], [ 115.22362104, 31.15642208 ], [ 115.22366118, 31.15608228 ], [ 115.22370114, 31.1559224 ], [ 115.22375118, 31.15575252 ], [ 115.22384136, 31.15554273 ], [ 115.22387142, 31.15542281 ], [ 115.22403162, 31.15499319 ], [ 115.22447208, 31.15375425 ], [ 115.2246123, 31.15333458 ], [ 115.22460222, 31.15287482 ], [ 115.22458224, 31.15248498 ], [ 115.22458224, 31.1521352 ], [ 115.22459232, 31.1517554 ], [ 115.22460222, 31.15166544 ], [ 115.22472246, 31.15097591 ], [ 115.22486268, 31.15039635 ], [ 115.22489256, 31.15020645 ], [ 115.22492262, 31.14995661 ], [ 115.22494278, 31.14922703 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552296", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.270", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22494278, 31.14922703 ], [ 115.22495286, 31.14886721 ], [ 115.22495286, 31.1482575 ], [ 115.22497284, 31.14779778 ], [ 115.22498292, 31.14745794 ], [ 115.22503296, 31.14679838 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552297", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.093", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34022018, 31.16770218 ], [ 115.34032008, 31.16777198 ], [ 115.34072904, 31.16812104 ], [ 115.34079888, 31.16820087 ], [ 115.34090868, 31.16829065 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552298", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.128", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34152734, 31.16518083 ], [ 115.34142762, 31.16535098 ], [ 115.34067918, 31.16607206 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552299", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.217", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34067918, 31.16607206 ], [ 115.34013036, 31.16666282 ], [ 115.34002074, 31.16679296 ], [ 115.3399608, 31.16687301 ], [ 115.33989096, 31.16697309 ], [ 115.33988088, 31.16703312 ], [ 115.33987098, 31.16713307 ], [ 115.33989096, 31.16725299 ], [ 115.33993092, 31.16737287 ], [ 115.3399707, 31.16744276 ], [ 115.34003064, 31.16752263 ], [ 115.34022018, 31.16770218 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552300", "Name": "S309", "pyname": "s309", "kind": "0308", "width": "55", "length": "0.408", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34152734, 31.16518083 ], [ 115.34162724, 31.16511068 ], [ 115.34203638, 31.16485004 ], [ 115.34313384, 31.16405835 ], [ 115.34416236, 31.16337728 ], [ 115.34486148, 31.16287679 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552301", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.292", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34486148, 31.16287679 ], [ 115.34632992, 31.16182577 ], [ 115.34679936, 31.16147544 ], [ 115.34722884, 31.16120513 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552302", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.284", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33802634, 31.15302345 ], [ 115.33811598, 31.1532332 ], [ 115.33822578, 31.15347287 ], [ 115.3384353, 31.15395221 ], [ 115.33862484, 31.15440158 ], [ 115.33873446, 31.15466123 ], [ 115.33885416, 31.15491089 ], [ 115.33902372, 31.15525041 ], [ 115.33906368, 31.15531031 ], [ 115.33931316, 31.15567967 ], [ 115.33959252, 31.15605902 ], [ 115.33979214, 31.15634855 ], [ 115.33988196, 31.15648832 ], [ 115.34017122, 31.15690758 ], [ 115.3403109, 31.15714721 ], [ 115.34058036, 31.15752656 ], [ 115.34070006, 31.15771628 ], [ 115.34086962, 31.15821564 ], [ 115.34092938, 31.15849532 ], [ 115.34094936, 31.15860521 ], [ 115.34095926, 31.15871514 ], [ 115.34095926, 31.15884501 ], [ 115.3409589, 31.15933461 ], [ 115.34098878, 31.15960434 ], [ 115.34102874, 31.1597442 ], [ 115.34102874, 31.15976418 ], [ 115.34111838, 31.16003387 ], [ 115.3412082, 31.16041353 ], [ 115.34124816, 31.16046344 ], [ 115.34134788, 31.16149277 ], [ 115.34133798, 31.16177267 ], [ 115.34134788, 31.16191262 ], [ 115.34145768, 31.16247215 ], [ 115.34146758, 31.16265206 ], [ 115.3414476, 31.16278202 ], [ 115.3415574, 31.16383137 ], [ 115.3415673, 31.16394131 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552303", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.139", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3415673, 31.16394131 ], [ 115.34161716, 31.16439104 ], [ 115.34162724, 31.1649008 ], [ 115.34152734, 31.16518083 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552304", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.282", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3283193, 31.12496577 ], [ 115.32847896, 31.12514537 ], [ 115.32859866, 31.12534503 ], [ 115.32863862, 31.1254349 ], [ 115.3286586, 31.12548485 ], [ 115.3286685, 31.12556477 ], [ 115.3286685, 31.12561476 ], [ 115.32864852, 31.1258147 ], [ 115.32857868, 31.12611462 ], [ 115.32847878, 31.12662452 ], [ 115.32828906, 31.12736445 ], [ 115.32811932, 31.12806438 ], [ 115.32804948, 31.12840431 ], [ 115.3280196, 31.12862423 ], [ 115.32799944, 31.12905402 ], [ 115.32798954, 31.12941384 ], [ 115.32798936, 31.1298336 ], [ 115.32797946, 31.1305032 ], [ 115.32796938, 31.13119283 ], [ 115.32797928, 31.13176248 ], [ 115.3279692, 31.13203235 ], [ 115.3279692, 31.13264201 ], [ 115.32796902, 31.13321166 ], [ 115.32797892, 31.13393126 ], [ 115.32796884, 31.13413115 ], [ 115.32796884, 31.13445096 ], [ 115.3280088, 31.13470076 ], [ 115.3281285, 31.13510027 ], [ 115.32820824, 31.13533998 ], [ 115.328268, 31.13545977 ], [ 115.3283877, 31.13567942 ], [ 115.32855744, 31.13591895 ], [ 115.32877686, 31.13620839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552305", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "1.387", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32877686, 31.13620839 ], [ 115.32879684, 31.13623832 ], [ 115.32927564, 31.13684703 ], [ 115.32962484, 31.13726616 ], [ 115.32986424, 31.1375655 ], [ 115.33032306, 31.13812431 ], [ 115.33060242, 31.13844359 ], [ 115.33076208, 31.13865315 ], [ 115.3308618, 31.13879288 ], [ 115.33093164, 31.13891271 ], [ 115.3309716, 31.13900258 ], [ 115.33103136, 31.13911238 ], [ 115.33108122, 31.13926218 ], [ 115.33116096, 31.13953187 ], [ 115.33120092, 31.13972168 ], [ 115.3312209, 31.1399915 ], [ 115.3312308, 31.14010139 ], [ 115.33121082, 31.14035127 ], [ 115.33118076, 31.14139068 ], [ 115.3311507, 31.14170055 ], [ 115.33110084, 31.14232038 ], [ 115.33111092, 31.14260033 ], [ 115.33104126, 31.14314033 ], [ 115.33108104, 31.14356999 ], [ 115.3311606, 31.14409946 ], [ 115.33118058, 31.14423932 ], [ 115.33121046, 31.14436919 ], [ 115.3312704, 31.14451899 ], [ 115.33137012, 31.14466871 ], [ 115.33152978, 31.14485838 ], [ 115.3320588, 31.14527738 ], [ 115.33224852, 31.14543699 ], [ 115.3327275, 31.14580608 ], [ 115.33339638, 31.14631481 ], [ 115.33405518, 31.14685355 ], [ 115.33420476, 31.14697325 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552306", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.178", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32723192, 31.12366851 ], [ 115.32755124, 31.12404773 ], [ 115.3277208, 31.12425729 ], [ 115.3283193, 31.12496577 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552307", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.077", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.324668, 31.12063502 ], [ 115.32473766, 31.12072484 ], [ 115.32496716, 31.12102422 ], [ 115.32507696, 31.12115396 ], [ 115.32512682, 31.12120382 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552308", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.340", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32512682, 31.12120382 ], [ 115.32533634, 31.12143332 ], [ 115.3256058, 31.12171268 ], [ 115.32603474, 31.12223157 ], [ 115.32649356, 31.12281036 ], [ 115.32664332, 31.12298001 ], [ 115.32720204, 31.1236286 ], [ 115.32723192, 31.12366851 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552309", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.969", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31907144, 31.10986139 ], [ 115.31914128, 31.1099612 ], [ 115.31966994, 31.11063984 ], [ 115.3201788, 31.11127857 ], [ 115.32056796, 31.11173757 ], [ 115.320987, 31.11225651 ], [ 115.32171528, 31.11313469 ], [ 115.32212424, 31.11365367 ], [ 115.3224036, 31.11399297 ], [ 115.32246354, 31.11406281 ], [ 115.32248352, 31.11413274 ], [ 115.32261312, 31.11466221 ], [ 115.32273282, 31.11519168 ], [ 115.32286242, 31.11572115 ], [ 115.3229922, 31.1162706 ], [ 115.32314178, 31.11694992 ], [ 115.32320154, 31.11742958 ], [ 115.32322152, 31.11759941 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552310", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.090", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3185525, 31.1091827 ], [ 115.31874204, 31.10944221 ], [ 115.31907144, 31.10986139 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552311", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.459", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31699622, 31.1053077 ], [ 115.3171161, 31.10569727 ], [ 115.31742516, 31.10681606 ], [ 115.31757492, 31.1071856 ], [ 115.31766474, 31.10747526 ], [ 115.31776446, 31.10771498 ], [ 115.31788416, 31.10806454 ], [ 115.31809368, 31.10854388 ], [ 115.31825316, 31.10878346 ], [ 115.3185525, 31.1091827 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552312", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.180", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31295576, 31.09777929 ], [ 115.31297574, 31.09856882 ], [ 115.31305548, 31.09876857 ], [ 115.3131453, 31.0989483 ], [ 115.3132452, 31.099158 ], [ 115.31332494, 31.0992678 ], [ 115.31335482, 31.0993277 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552313", "Name": "S203", "pyname": "s203", "kind": "0301", "width": "55", "length": "0.786", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31335482, 31.0993277 ], [ 115.31341476, 31.09944753 ], [ 115.3136142, 31.09972703 ], [ 115.31399346, 31.10009612 ], [ 115.314642, 31.10048469 ], [ 115.31498112, 31.10070393 ], [ 115.31540016, 31.10093303 ], [ 115.31574936, 31.10124222 ], [ 115.31594898, 31.10162162 ], [ 115.31606868, 31.10197122 ], [ 115.316298, 31.10277033 ], [ 115.3164078, 31.10314995 ], [ 115.3164177, 31.1031999 ], [ 115.31657736, 31.10386923 ], [ 115.31658726, 31.1038992 ], [ 115.31699622, 31.1053077 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552314", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.738", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36942086, 31.1441306 ], [ 115.36945092, 31.14411057 ], [ 115.36999038, 31.14386028 ], [ 115.3703601, 31.1436801 ], [ 115.37051004, 31.14359006 ], [ 115.3706499, 31.14350996 ], [ 115.37079984, 31.14333995 ], [ 115.37099964, 31.14308997 ], [ 115.37107956, 31.14301995 ], [ 115.37116956, 31.14293994 ], [ 115.37124948, 31.14289989 ], [ 115.3713393, 31.14284985 ], [ 115.37166906, 31.14274964 ], [ 115.37190882, 31.14259952 ], [ 115.3720089, 31.14250952 ], [ 115.37242848, 31.14212945 ], [ 115.37289828, 31.14169934 ], [ 115.37334792, 31.14128925 ], [ 115.37398746, 31.14069912 ], [ 115.37427726, 31.14041904 ], [ 115.37446716, 31.14023904 ], [ 115.3749168, 31.13986892 ], [ 115.37497674, 31.13981888 ], [ 115.3750068, 31.13979885 ], [ 115.3751166, 31.13974881 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552315", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.063", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3751166, 31.13974881 ], [ 115.3752066, 31.13969877 ], [ 115.37532648, 31.1396387 ], [ 115.3757061, 31.13949848 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552316", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.047", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38042174, 31.13899475 ], [ 115.38084114, 31.13913425 ], [ 115.3808811, 31.13914424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552317", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.825", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3808811, 31.13914424 ], [ 115.381071, 31.13917403 ], [ 115.38125082, 31.13914388 ], [ 115.3813806, 31.13909384 ], [ 115.38153054, 31.13899376 ], [ 115.3817604, 31.1388237 ], [ 115.38183042, 31.13877366 ], [ 115.38192024, 31.13866368 ], [ 115.3819602, 31.13859366 ], [ 115.38198036, 31.13852373 ], [ 115.3820403, 31.13826386 ], [ 115.38210042, 31.13793405 ], [ 115.38216036, 31.13776409 ], [ 115.38227034, 31.13765411 ], [ 115.38254016, 31.13741403 ], [ 115.38266994, 31.137314 ], [ 115.3828998, 31.1371839 ], [ 115.38311958, 31.13707379 ], [ 115.38327942, 31.13700368 ], [ 115.38340938, 31.13697357 ], [ 115.38350928, 31.1369535 ], [ 115.38355932, 31.13695346 ], [ 115.38372906, 31.13698329 ], [ 115.38395874, 31.13705304 ], [ 115.38443826, 31.13720253 ], [ 115.3847079, 31.13729222 ], [ 115.38488772, 31.13733204 ], [ 115.38496764, 31.13734199 ], [ 115.38501768, 31.13734194 ], [ 115.38506754, 31.13735189 ], [ 115.38512748, 31.1373518 ], [ 115.38523746, 31.13735171 ], [ 115.3854072, 31.1373216 ], [ 115.38546714, 31.13731157 ], [ 115.38554706, 31.13728151 ], [ 115.3856871, 31.13720145 ], [ 115.38587682, 31.13704139 ], [ 115.38623664, 31.13677125 ], [ 115.38650646, 31.13658117 ], [ 115.38688626, 31.13624111 ], [ 115.38712602, 31.13603105 ], [ 115.38738576, 31.13581095 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552318", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.162", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39341216, 31.12915055 ], [ 115.39364184, 31.12910037 ], [ 115.39409148, 31.12905002 ], [ 115.39429128, 31.12904984 ], [ 115.39441116, 31.12905974 ], [ 115.39449108, 31.12907967 ], [ 115.39461096, 31.12910955 ], [ 115.3950705, 31.12923906 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552319", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.418", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3950705, 31.12923906 ], [ 115.3952802, 31.12929882 ], [ 115.39544994, 31.12948854 ], [ 115.39562976, 31.1297382 ], [ 115.39584936, 31.13006774 ], [ 115.39613898, 31.13052719 ], [ 115.39619874, 31.13060706 ], [ 115.39620882, 31.13062704 ], [ 115.39628874, 31.13073689 ], [ 115.39638864, 31.13083674 ], [ 115.39655838, 31.13091653 ], [ 115.3967382, 31.13097633 ], [ 115.3968381, 31.13096625 ], [ 115.39692792, 31.13090622 ], [ 115.397028, 31.13078621 ], [ 115.39707804, 31.13059631 ], [ 115.39710792, 31.13047638 ], [ 115.397118, 31.13031645 ], [ 115.39713798, 31.13021651 ], [ 115.39717812, 31.13004663 ], [ 115.39721808, 31.12997661 ], [ 115.39733796, 31.12988661 ], [ 115.397421571444809, 31.129836334329429 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552349", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.244", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06850892, 31.16755364 ], [ 115.06881834, 31.16749334 ], [ 115.0689483, 31.16746323 ], [ 115.06908798, 31.16741306 ], [ 115.07040558, 31.16691135 ], [ 115.0708347, 31.16677082 ], [ 115.07088474, 31.16675075 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.552350", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "1.171", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07088474, 31.16675075 ], [ 115.07113422, 31.16667042 ], [ 115.07119416, 31.16666034 ], [ 115.07163336, 31.1665298 ], [ 115.07198274, 31.16646932 ], [ 115.07230206, 31.1664389 ], [ 115.07271138, 31.16641838 ], [ 115.07317056, 31.16638778 ], [ 115.07385942, 31.16637684 ], [ 115.07488758, 31.16630547 ], [ 115.07587596, 31.16623419 ], [ 115.07677434, 31.16617299 ], [ 115.07773266, 31.16610171 ], [ 115.07839146, 31.16603084 ], [ 115.07858118, 31.16601059 ], [ 115.0790004, 31.16595006 ], [ 115.07978898, 31.16581902 ], [ 115.08017832, 31.16576849 ], [ 115.08058764, 31.16570796 ], [ 115.08139638, 31.16549718 ], [ 115.08244542, 31.16525652 ], [ 115.0827651, 31.16519631 ], [ 115.08298488, 31.16515613 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.554906", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.740", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25264586, 31.18368735 ], [ 115.25257584, 31.18370733 ], [ 115.25237586, 31.18375724 ], [ 115.25134572, 31.18410689 ], [ 115.2509157, 31.18420674 ], [ 115.25063562, 31.18429661 ], [ 115.2504855, 31.18433657 ], [ 115.24999554, 31.18448637 ], [ 115.2494055, 31.18468617 ], [ 115.24911534, 31.18479606 ], [ 115.24884534, 31.18489596 ], [ 115.24874526, 31.18492593 ], [ 115.24849524, 31.18499586 ], [ 115.24828518, 31.1850158 ], [ 115.24802526, 31.18503569 ], [ 115.24775526, 31.18504563 ], [ 115.24738518, 31.18503555 ], [ 115.24721508, 31.18501548 ], [ 115.24687506, 31.18495541 ], [ 115.246665, 31.18490537 ], [ 115.24634496, 31.18484534 ], [ 115.24583484, 31.1847552 ], [ 115.24532472, 31.18474508 ], [ 115.2451746, 31.18473504 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_provincial_highway_pl.554907", "Name": "S309", "pyname": "s309", "kind": "0301", "width": "55", "length": "0.057", "speedclass": "6" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2451746, 31.18473504 ], [ 115.2450747, 31.184735 ], [ 115.24503474, 31.184735 ], [ 115.24494456, 31.18472496 ], [ 115.2448947, 31.18470498 ], [ 115.24477464, 31.18467497 ], [ 115.24460454, 31.18461494 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/铁路.geojson b/public/mapbox/geojson/铁路.geojson new file mode 100644 index 0000000..409a33f --- /dev/null +++ b/public/mapbox/geojson/铁路.geojson @@ -0,0 +1,49 @@ +{ +"type": "FeatureCollection", +"name": "铁路", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.17225", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95862396, 31.09214322 ], [ 114.95844432, 31.09637466 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.17226", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95844432, 31.09637466 ], [ 114.95842848, 31.09675167 ], [ 114.95897496, 31.10344002 ], [ 114.96141324, 31.10990832 ], [ 114.96349188, 31.11633 ], [ 114.9653268, 31.12179669 ], [ 114.96645684, 31.12609671 ], [ 114.96639168, 31.12776504 ], [ 114.96624336, 31.12859997 ], [ 114.966135, 31.12909326 ], [ 114.96588156, 31.12986834 ], [ 114.96582324, 31.13002674 ], [ 114.96567672, 31.13037 ], [ 114.96554316, 31.13069328 ], [ 114.9653682, 31.1310333 ], [ 114.96517668, 31.13137827 ], [ 114.96500316, 31.13170497 ], [ 114.96475512, 31.13204328 ], [ 114.96449016, 31.13240499 ], [ 114.9642216, 31.13278002 ], [ 114.96392316, 31.13321166 ], [ 114.96364488, 31.13360829 ], [ 114.96336012, 31.134015 ], [ 114.9630966, 31.1343867 ], [ 114.9628032, 31.13481168 ], [ 114.96213756, 31.13576847 ], [ 114.961509, 31.1372172 ], [ 114.96085128, 31.13912052 ], [ 114.96040164, 31.14042102 ], [ 114.95999664, 31.14155529 ], [ 114.95834748, 31.14617634 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33654", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.882737399614044, 31.472197660407133 ], [ 114.8826996, 31.47190308 ], [ 114.88223952, 31.46850558 ], [ 114.88208364, 31.46788728 ], [ 114.88187304, 31.46714262 ], [ 114.88141332, 31.46615847 ], [ 114.88095324, 31.46523426 ], [ 114.88051692, 31.46430339 ], [ 114.8802516, 31.46356539 ], [ 114.88013496, 31.46300019 ], [ 114.88004928, 31.46224941 ], [ 114.88007268, 31.46128587 ], [ 114.88023612, 31.46034231 ], [ 114.88058676, 31.45827591 ], [ 114.88066452, 31.45752513 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33691", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86656692, 31.41409554 ], [ 114.86479104, 31.41146988 ], [ 114.85996956, 31.40433702 ], [ 114.85938564, 31.40337969 ], [ 114.85892592, 31.40250894 ], [ 114.85855224, 31.40145846 ], [ 114.8582484, 31.40043471 ], [ 114.85810044, 31.3995771 ], [ 114.85744596, 31.39573437 ], [ 114.8570568, 31.39309647 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33692", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.855975, 31.38679044 ], [ 114.85571796, 31.38512247 ], [ 114.85377216, 31.37327316 ], [ 114.85342944, 31.37116644 ], [ 114.85314144, 31.37006313 ], [ 114.85224648, 31.36774347 ], [ 114.8518026, 31.36642083 ], [ 114.85162368, 31.36562991 ], [ 114.85148328, 31.3644069 ], [ 114.85125, 31.36283163 ], [ 114.85116432, 31.36182786 ], [ 114.85117188, 31.36099041 ], [ 114.85126548, 31.3602327 ], [ 114.85149912, 31.35936186 ], [ 114.85185696, 31.35856419 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33693", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8825034, 31.29233544 ], [ 114.88234788, 31.29037299 ], [ 114.88184244, 31.28218668 ], [ 114.881679, 31.28011344 ], [ 114.8817024, 31.27944222 ], [ 114.88182696, 31.27840551 ], [ 114.8821146, 31.27721598 ], [ 114.88254984, 31.27624578 ], [ 114.88550472, 31.27114854 ], [ 114.88908132, 31.26482136 ], [ 114.8907996, 31.26167766 ], [ 114.8942988, 31.25554938 ], [ 114.89624244, 31.25275758 ], [ 114.8969736, 31.25165418 ], [ 114.8977044, 31.25019177 ], [ 114.8984586, 31.24856313 ], [ 114.89879304, 31.24761246 ], [ 114.89896404, 31.24654227 ], [ 114.89908068, 31.24472076 ], [ 114.89917392, 31.2433713 ], [ 114.89928264, 31.24248048 ], [ 114.899454, 31.24170936 ], [ 114.8997726, 31.24079856 ], [ 114.90005268, 31.24016703 ], [ 114.90055812, 31.23932274 ], [ 114.90125796, 31.23844524 ], [ 114.90212844, 31.23757422 ], [ 114.90310836, 31.23671661 ], [ 114.90934428, 31.23148428 ], [ 114.9106194, 31.23053352 ], [ 114.91174692, 31.22984196 ], [ 114.91876836, 31.22617851 ], [ 114.92012124, 31.22563329 ], [ 114.92137296, 31.22522766 ], [ 114.92266356, 31.22494182 ], [ 114.9262326, 31.22425017 ], [ 114.92764776, 31.22386461 ], [ 114.9287364, 31.22345898 ], [ 114.93001152, 31.22274087 ], [ 114.93096804, 31.22197623 ], [ 114.93181548, 31.22099874 ], [ 114.9323598, 31.22012097 ], [ 114.93296604, 31.21877781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33694", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87178512, 31.42209168 ], [ 114.87150468, 31.4211213 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33695", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86718216, 31.41497286 ], [ 114.86656692, 31.41409554 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33696", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85635624, 31.38908301 ], [ 114.855975, 31.38679044 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33697", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87499956, 31.31771526 ], [ 114.87491388, 31.3170237 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33698", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85649628, 31.3899867 ], [ 114.85635624, 31.38908301 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33699", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88066452, 31.45752513 ], [ 114.88067244, 31.4567676 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33700", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8736762, 31.33160622 ], [ 114.87371508, 31.33126053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33701", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8769882, 31.44446793 ], [ 114.87656772, 31.44052071 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33702", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8570568, 31.39309647 ], [ 114.85649628, 31.3899867 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33703", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87491388, 31.3170237 ], [ 114.8745402, 31.31484237 ], [ 114.87448584, 31.31425062 ], [ 114.8744934, 31.31340597 ], [ 114.87457908, 31.31269443 ], [ 114.87477384, 31.31198946 ], [ 114.87514752, 31.31109828 ], [ 114.8754744, 31.3105662 ], [ 114.87706236, 31.30787268 ], [ 114.87738924, 31.30728084 ], [ 114.87759948, 31.30649604 ], [ 114.87778632, 31.30557156 ], [ 114.87826116, 31.30138143 ], [ 114.8784246, 31.3006365 ], [ 114.87867372, 31.29987159 ], [ 114.87900852, 31.29923304 ], [ 114.87946752, 31.29854796 ], [ 114.88133592, 31.29604038 ], [ 114.88167828, 31.29550821 ], [ 114.88198968, 31.2948963 ], [ 114.8822154, 31.29429762 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33704", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85390428, 31.35607146 ], [ 114.8547294, 31.35553308 ], [ 114.85576476, 31.35494808 ], [ 114.85986696, 31.35287412 ], [ 114.86066112, 31.35252177 ], [ 114.86143152, 31.35222927 ], [ 114.8624748, 31.35189033 ], [ 114.86562732, 31.35097287 ], [ 114.86667816, 31.35054078 ], [ 114.86762784, 31.35004893 ], [ 114.8686866, 31.34934423 ], [ 114.87057804, 31.34798802 ], [ 114.87147336, 31.34728341 ], [ 114.8721894, 31.34660526 ], [ 114.87274992, 31.34579418 ], [ 114.87319344, 31.34504304 ], [ 114.87352068, 31.34433159 ], [ 114.87370716, 31.34350728 ], [ 114.87380076, 31.34260314 ], [ 114.87384756, 31.34189844 ], [ 114.87373056, 31.34114046 ], [ 114.87304584, 31.3380423 ], [ 114.87294468, 31.33731762 ], [ 114.87299112, 31.33639998 ], [ 114.8736762, 31.33160622 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33705", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8822154, 31.29429762 ], [ 114.88240224, 31.29359247 ], [ 114.8825034, 31.29299388 ], [ 114.8825034, 31.29233544 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33706", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85185696, 31.35856419 ], [ 114.85231632, 31.35779316 ], [ 114.85277568, 31.35716829 ], [ 114.8532894, 31.35661002 ], [ 114.85390428, 31.35607146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33707", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87656772, 31.44052071 ], [ 114.87635748, 31.43906541 ], [ 114.87585888, 31.43720466 ], [ 114.87518892, 31.43477241 ], [ 114.87405168, 31.43053242 ], [ 114.87178512, 31.42209168 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33708", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87371508, 31.33126053 ], [ 114.87394872, 31.32783612 ], [ 114.87417444, 31.32473751 ], [ 114.87447036, 31.32302193 ], [ 114.87502296, 31.3198965 ], [ 114.87513168, 31.3189389 ], [ 114.87504636, 31.31806779 ], [ 114.87499956, 31.31771526 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33709", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.87150468, 31.4211213 ], [ 114.87124764, 31.42030374 ], [ 114.87099096, 31.41970551 ], [ 114.87064824, 31.41910071 ], [ 114.87025872, 31.41847593 ], [ 114.86968236, 31.41777789 ], [ 114.86778948, 31.41573732 ], [ 114.86718216, 31.41497286 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33710", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88067244, 31.4567676 ], [ 114.88062564, 31.45600341 ], [ 114.88046184, 31.45525254 ], [ 114.8802048, 31.4544681 ], [ 114.8777514, 31.44888666 ], [ 114.8774166, 31.44800961 ], [ 114.87723732, 31.4471259 ], [ 114.87711276, 31.44612924 ], [ 114.8769882, 31.44446793 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33711", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93296604, 31.21877781 ], [ 114.933456, 31.21737471 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33712", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94945872, 31.16990574 ], [ 114.94969164, 31.16895543 ], [ 114.9504606, 31.16670264 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33713", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.933456, 31.21737471 ], [ 114.93393048, 31.21602489 ], [ 114.93420264, 31.21514037 ], [ 114.93431928, 31.21428258 ], [ 114.93454464, 31.2102261 ], [ 114.93470016, 31.20920856 ], [ 114.93494136, 31.20829092 ], [ 114.93525996, 31.20747948 ], [ 114.93570312, 31.20661503 ], [ 114.93624744, 31.20577704 ], [ 114.93928764, 31.20131448 ], [ 114.93976212, 31.20044976 ], [ 114.94023624, 31.19943888 ], [ 114.94324548, 31.19208939 ], [ 114.94375848, 31.19108499 ], [ 114.94420164, 31.19042646 ], [ 114.94499508, 31.18924917 ], [ 114.94627776, 31.18793211 ], [ 114.94844748, 31.1859432 ], [ 114.94910052, 31.18517163 ], [ 114.9495048, 31.18450644 ], [ 114.94983132, 31.18382793 ], [ 114.95010348, 31.18290993 ], [ 114.95030544, 31.18223223 ], [ 114.95039076, 31.18138173 ], [ 114.95030544, 31.18040487 ], [ 114.94961424, 31.17539466 ], [ 114.9492258, 31.1725107 ], [ 114.94921032, 31.17161358 ], [ 114.94928016, 31.17071646 ], [ 114.94945872, 31.16990574 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33714", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9504606, 31.16670264 ], [ 114.95125296, 31.16442312 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33715", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96497328, 31.12489557 ], [ 114.96560976, 31.12517466 ], [ 114.96613788, 31.12550028 ], [ 114.96664224, 31.12591887 ], [ 114.96703032, 31.12638408 ], [ 114.96734856, 31.12690896 ], [ 114.9675426, 31.12742061 ], [ 114.96764376, 31.12798536 ], [ 114.96762828, 31.12849044 ], [ 114.96755808, 31.12899543 ], [ 114.96737988, 31.1294871 ], [ 114.96716244, 31.12993233 ], [ 114.96689856, 31.13031114 ], [ 114.96532248, 31.13209836 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33716", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9095484, 31.1329593 ], [ 114.91555032, 31.13260344 ], [ 114.92278488, 31.13223129 ], [ 114.92429076, 31.13223804 ], [ 114.93441288, 31.13241066 ], [ 114.93672588, 31.13241066 ], [ 114.93773496, 31.13233101 ], [ 114.93876744, 31.13216487 ], [ 114.93988524, 31.13186589 ], [ 114.94980576, 31.12890237 ], [ 114.9528942, 31.12796781 ], [ 114.95948544, 31.12574616 ], [ 114.96211668, 31.12482924 ], [ 114.96298608, 31.12466967 ], [ 114.96356064, 31.12466301 ], [ 114.96422808, 31.12472952 ], [ 114.96497328, 31.12489557 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33717", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86960136, 31.13455788 ], [ 114.86980332, 31.13468424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33718", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89562432, 31.13375949 ], [ 114.89627628, 31.13371296 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33719", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90659892, 31.13311212 ], [ 114.9095484, 31.1329593 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33720", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9528942, 31.12796781 ], [ 114.95726532, 31.12681599 ], [ 114.95968704, 31.12629102 ], [ 114.96070404, 31.12609833 ], [ 114.96141828, 31.12606512 ], [ 114.96213216, 31.12614477 ], [ 114.9628698, 31.12634421 ], [ 114.96351384, 31.12665651 ], [ 114.964065, 31.12699536 ], [ 114.9645618, 31.12750701 ], [ 114.96498876, 31.12810506 ], [ 114.96527604, 31.12868979 ], [ 114.96536928, 31.12923456 ], [ 114.96541572, 31.12987923 ], [ 114.96532248, 31.13043066 ], [ 114.96512088, 31.13096886 ], [ 114.96477924, 31.13148708 ], [ 114.96307932, 31.13409168 ], [ 114.96226428, 31.13528112 ], [ 114.96193056, 31.13596539 ], [ 114.96164328, 31.13664309 ], [ 114.96120084, 31.13782578 ], [ 114.96085128, 31.13912052 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33721", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86960136, 31.13455788 ], [ 114.8684832, 31.13376696 ], [ 114.86810268, 31.133448 ], [ 114.86779236, 31.13311572 ], [ 114.86754396, 31.13271018 ], [ 114.86735748, 31.13231148 ], [ 114.86722536, 31.13191926 ], [ 114.86717892, 31.13140086 ], [ 114.86725668, 31.13070309 ], [ 114.86737296, 31.13023779 ], [ 114.86755152, 31.12974603 ], [ 114.86797848, 31.12917444 ], [ 114.86834352, 31.12879554 ], [ 114.8687784, 31.12844328 ], [ 114.86925216, 31.12821063 ], [ 114.86982672, 31.12802451 ], [ 114.87045564, 31.12791147 ], [ 114.87104568, 31.12789824 ], [ 114.87161232, 31.12794477 ], [ 114.87448548, 31.12872237 ], [ 114.8747958, 31.12881552 ], [ 114.88146552, 31.13076294 ], [ 114.88958496, 31.13312166 ], [ 114.89085828, 31.13346717 ], [ 114.89185188, 31.13371296 ], [ 114.8927832, 31.13385246 ], [ 114.8937534, 31.13383932 ], [ 114.89562432, 31.13375949 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33722", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89627628, 31.13371296 ], [ 114.89822352, 31.13361036 ], [ 114.90659892, 31.13311212 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33723", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86980332, 31.13468424 ], [ 114.87300984, 31.13689059 ], [ 114.87367764, 31.13722962 ], [ 114.87433788, 31.13744886 ], [ 114.87498228, 31.13758179 ], [ 114.87554136, 31.13760843 ], [ 114.87943116, 31.13758854 ], [ 114.892002, 31.13752869 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33724", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.96532248, 31.13209836 ], [ 114.96434472, 31.13322804 ], [ 114.9628698, 31.13490897 ], [ 114.96248928, 31.13544717 ], [ 114.96215556, 31.13600526 ], [ 114.96182976, 31.13660322 ], [ 114.96134844, 31.1379453 ], [ 114.96052548, 31.14027738 ], [ 114.95999664, 31.14155529 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33725", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95125296, 31.16442312 ], [ 114.951447, 31.16391804 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.33726", "Name": "京九线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.951447, 31.16391804 ], [ 114.95210724, 31.16198412 ], [ 114.95433528, 31.15611459 ], [ 114.95699568, 31.1500278 ], [ 114.95834748, 31.14617634 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.34907", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.941173610621675, 30.997826629854696 ], [ 114.941669357211651, 30.999449522043211 ] ], [ [ 114.941750380660011, 30.999714763043507 ], [ 114.9420366, 31.00065174 ], [ 114.9444666, 31.0064067 ], [ 114.94652832, 31.01220999 ], [ 114.94824336, 31.01824503 ], [ 114.95003688, 31.02438168 ], [ 114.95247984, 31.03035498 ], [ 114.95427012, 31.03635168 ], [ 114.95522016, 31.04255502 ], [ 114.95619684, 31.04893998 ], [ 114.95721996, 31.05545499 ], [ 114.95791332, 31.06215828 ], [ 114.95781504, 31.06905003 ], [ 114.95784996, 31.07605671 ], [ 114.95890332, 31.08305997 ], [ 114.95871684, 31.08995667 ], [ 114.95862396, 31.09214322 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.73925", "Name": null, "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.698109379496103, 31.040383475393323 ], [ 114.69936852, 31.04062137 ], [ 114.70547844, 31.04136603 ], [ 114.71860008, 31.04299314 ], [ 114.7219794, 31.04340669 ], [ 114.72305256, 31.04364573 ], [ 114.72409296, 31.04402256 ], [ 114.72555204, 31.04481312 ], [ 114.73438212, 31.05008919 ], [ 114.73614144, 31.05134847 ], [ 114.73709652, 31.05237789 ], [ 114.73821216, 31.05433557 ], [ 114.7396176, 31.05732267 ], [ 114.74091576, 31.05874728 ], [ 114.74229996, 31.05977661 ], [ 114.74727804, 31.06325061 ], [ 114.75470232, 31.06663263 ], [ 114.77040948, 31.07736594 ], [ 114.77487276, 31.0790934 ], [ 114.7849578, 31.08309957 ], [ 114.79950612, 31.09399641 ], [ 114.80497776, 31.09802958 ], [ 114.80682312, 31.09900338 ], [ 114.80905476, 31.09968324 ], [ 114.81220368, 31.10073507 ], [ 114.82406964, 31.10470371 ], [ 114.84280224, 31.11087672 ], [ 114.85059156, 31.11493671 ], [ 114.86619108, 31.12312959 ], [ 114.86998908, 31.12594002 ], [ 114.87203316, 31.12752888 ], [ 114.87337416, 31.12824978 ], [ 114.8747958, 31.12881552 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_railway_pl.73928", "Name": "合武客运专线", "fclass": "rail" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.455151554369138, 31.306256265903045 ], [ 115.43944716, 31.29786297 ], [ 115.43587704, 31.29734502 ], [ 115.43369688, 31.29710202 ], [ 115.42639212, 31.29647499 ], [ 115.27960284, 31.28270004 ], [ 115.27890984, 31.282515 ], [ 115.26964704, 31.28051196 ], [ 115.26677316, 31.28000796 ], [ 115.26387696, 31.27962501 ], [ 115.26169212, 31.27941999 ], [ 115.25875812, 31.27926798 ], [ 115.247043, 31.27891203 ], [ 115.243353, 31.27874004 ], [ 115.21962792, 31.27488201 ], [ 115.21898784, 31.274685 ], [ 115.21756188, 31.27445802 ], [ 115.20758808, 31.272435 ], [ 115.19762508, 31.27032504 ], [ 115.18358508, 31.26686499 ], [ 115.16378184, 31.26334698 ], [ 115.16289192, 31.263372 ], [ 115.16219784, 31.26319299 ], [ 115.15860216, 31.26268503 ], [ 115.14053988, 31.26021498 ], [ 115.13622996, 31.25950002 ], [ 115.13338704, 31.25889999 ], [ 115.12987704, 31.25801502 ], [ 115.12642284, 31.25697696 ], [ 115.12303812, 31.25581803 ], [ 115.12037988, 31.25476197 ], [ 115.11647496, 31.25304297 ], [ 115.10572716, 31.24764702 ], [ 115.10013312, 31.24468998 ], [ 115.09696188, 31.24315701 ], [ 115.09437996, 31.24199304 ], [ 115.08393708, 31.23746298 ], [ 115.08136812, 31.23625698 ], [ 115.07821704, 31.23465696 ], [ 115.07574312, 31.23331299 ], [ 115.07330988, 31.231917 ], [ 115.03232784, 31.20765804 ], [ 115.03028988, 31.20652197 ], [ 115.02827496, 31.205475 ], [ 115.02429192, 31.20362802 ], [ 115.02185004, 31.20263199 ], [ 115.01945712, 31.20174297 ], [ 115.01576208, 31.20056802 ], [ 115.01372988, 31.20001461 ], [ 115.00533288, 31.19746203 ], [ 115.00358508, 31.19688297 ], [ 114.99920208, 31.19567697 ], [ 114.99060816, 31.19309199 ], [ 114.98940144, 31.19272173 ], [ 114.98619492, 31.191678 ], [ 114.98371848, 31.1909742 ], [ 114.9834096, 31.19089437 ], [ 114.980742, 31.19002704 ], [ 114.97959288, 31.18973796 ], [ 114.97336308, 31.18788702 ], [ 114.97212288, 31.18755996 ], [ 114.9659658, 31.18564296 ], [ 114.96390336, 31.18501899 ], [ 114.95673972, 31.18285134 ], [ 114.95388024, 31.18199319 ], [ 114.94723068, 31.17999762 ], [ 114.94418004, 31.17903498 ], [ 114.94175256, 31.17826224 ], [ 114.9403356, 31.17776193 ], [ 114.938343, 31.17696498 ], [ 114.93489816, 31.17549798 ], [ 114.93227988, 31.17425697 ], [ 114.93052992, 31.17335004 ], [ 114.92744292, 31.17164499 ], [ 114.91236324, 31.16314269 ], [ 114.90813504, 31.16075841 ], [ 114.90624864, 31.15969479 ], [ 114.89799384, 31.1550399 ], [ 114.89603004, 31.15389699 ], [ 114.89162508, 31.15164996 ], [ 114.88664988, 31.14932922 ], [ 114.88572576, 31.14888408 ], [ 114.87849804, 31.14526698 ], [ 114.87561192, 31.14377001 ], [ 114.87333708, 31.14248202 ], [ 114.87110508, 31.141098 ], [ 114.86652444, 31.13807868 ], [ 114.86605284, 31.13776791 ], [ 114.86499192, 31.13701758 ], [ 114.86480868, 31.13688798 ], [ 114.860637, 31.13393796 ], [ 114.85774692, 31.13210502 ], [ 114.854112, 31.130055 ], [ 114.845355, 31.12550496 ], [ 114.84232308, 31.12376697 ], [ 114.84114696, 31.12302501 ], [ 114.838272, 31.12109496 ], [ 114.82512156, 31.11160266 ], [ 114.82432992, 31.11101703 ], [ 114.82203204, 31.10946498 ], [ 114.819642, 31.10802804 ], [ 114.81780996, 31.10699799 ], [ 114.80724792, 31.10142699 ], [ 114.764778, 31.07868192 ], [ 114.76210104, 31.07724786 ], [ 114.74669016, 31.06899297 ], [ 114.73488792, 31.06272699 ], [ 114.72134184, 31.05538803 ], [ 114.71817996, 31.05387801 ], [ 114.712992, 31.05162 ], [ 114.694838186140714, 31.043433653938365 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/高速.geojson b/public/mapbox/geojson/高速.geojson new file mode 100644 index 0000000..78b2f89 --- /dev/null +++ b/public/mapbox/geojson/高速.geojson @@ -0,0 +1,491 @@ +{ +"type": "FeatureCollection", +"name": "高速", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1405", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39339", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30672", "enodeid": "30665", "funcclass": "1", "length": "0.078", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "341524", "admincoder": "341524", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1200", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.452435712342833, 31.283442507738609 ], [ 115.45233372, 31.2834119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1407", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39344", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30647", "enodeid": "30671", "funcclass": "1", "length": "0.072", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "341524", "admincoder": "341524", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.452558814892299, 31.283351417396378 ], [ 115.45245414, 31.28332217 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1408", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39345", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30673", "enodeid": "30675", "funcclass": "1", "length": "0.256", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44550614, 31.2790473 ], [ 115.44560622, 31.27914738 ], [ 115.44625728, 31.279748 ], [ 115.44729858, 31.28057883 ], [ 115.44741882, 31.28066892 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1409", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39346", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30675", "enodeid": "30671", "funcclass": "1", "length": "0.564", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44741882, 31.28066892 ], [ 115.4480796, 31.28114939 ], [ 115.44890058, 31.28166995 ], [ 115.44969132, 31.28213043 ], [ 115.4506923, 31.28262093 ], [ 115.45180308, 31.28309145 ], [ 115.45245414, 31.28332217 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1410", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39347", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30674", "enodeid": "30676", "funcclass": "1", "length": "0.257", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44537618, 31.27910733 ], [ 115.44554646, 31.27927752 ], [ 115.44612732, 31.27981802 ], [ 115.4471787, 31.28065889 ], [ 115.44729894, 31.28073894 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1411", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39348", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30677", "enodeid": "30673", "funcclass": "1", "length": "1.272", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44000138, 31.26876881 ], [ 115.44015204, 31.26945911 ], [ 115.44039288, 31.27053951 ], [ 115.44072444, 31.27160034 ], [ 115.44110604, 31.27265132 ], [ 115.44159762, 31.27375229 ], [ 115.44190866, 31.27436289 ], [ 115.44212934, 31.27479327 ], [ 115.4427408, 31.27576419 ], [ 115.44336216, 31.27664498 ], [ 115.44417378, 31.27763592 ], [ 115.44466464, 31.27819649 ], [ 115.44550614, 31.2790473 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1412", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39349", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30678", "enodeid": "30674", "funcclass": "1", "length": "1.278", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43985126, 31.26877871 ], [ 115.44000174, 31.26947895 ], [ 115.44026274, 31.27057943 ], [ 115.4405844, 31.27165038 ], [ 115.440966, 31.27271135 ], [ 115.44141762, 31.27372227 ], [ 115.44176862, 31.2744029 ], [ 115.44203952, 31.27490334 ], [ 115.44258078, 31.27576415 ], [ 115.44326226, 31.27673507 ], [ 115.44404382, 31.277696 ], [ 115.44454476, 31.27827654 ], [ 115.44537618, 31.27910733 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1413", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39350", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30679", "enodeid": "30677", "funcclass": "1", "length": "0.355", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4392686, 31.26562754 ], [ 115.43941926, 31.2662678 ], [ 115.43967018, 31.26732822 ], [ 115.4399211, 31.26840867 ], [ 115.44000138, 31.26876881 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1414", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39351", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30680", "enodeid": "30678", "funcclass": "1", "length": "0.354", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43912856, 31.26564743 ], [ 115.43927904, 31.26628769 ], [ 115.43952996, 31.26734811 ], [ 115.43977098, 31.26842856 ], [ 115.43985126, 31.26877871 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1415", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39352", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002913187", "enodeid": "30681", "funcclass": "1", "length": "0.084", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43347692, 31.25193273 ], [ 115.43403762, 31.25252291 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1416", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39353", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30681", "enodeid": "30679", "funcclass": "1", "length": "1.556", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43403762, 31.25252291 ], [ 115.43410764, 31.25260292 ], [ 115.43483898, 31.25344374 ], [ 115.43563062, 31.25449467 ], [ 115.43605146, 31.25513516 ], [ 115.43646222, 31.25583558 ], [ 115.43698332, 31.25688606 ], [ 115.43740416, 31.25790639 ], [ 115.43771466, 31.25890652 ], [ 115.43799528, 31.25995659 ], [ 115.43823576, 31.26103655 ], [ 115.43847606, 31.26209657 ], [ 115.4387367, 31.26317657 ], [ 115.43894748, 31.26418695 ], [ 115.43917824, 31.26521736 ], [ 115.4392686, 31.26562754 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1417", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39354", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002913186", "enodeid": "30682", "funcclass": "1", "length": "0.090", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43328666, 31.25193251 ], [ 115.43388732, 31.25256269 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1418", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39355", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30682", "enodeid": "30680", "funcclass": "1", "length": "1.554", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.43388732, 31.25256269 ], [ 115.43394744, 31.25262272 ], [ 115.43473872, 31.25353352 ], [ 115.43547024, 31.25450439 ], [ 115.4359512, 31.25524496 ], [ 115.43634198, 31.25590533 ], [ 115.43682294, 31.25688579 ], [ 115.43726376, 31.25795612 ], [ 115.43757444, 31.25895624 ], [ 115.43785488, 31.25997635 ], [ 115.43809536, 31.2610563 ], [ 115.43833584, 31.26211632 ], [ 115.4385864, 31.26319646 ], [ 115.43880726, 31.26420684 ], [ 115.43902812, 31.26523725 ], [ 115.43912856, 31.26564743 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.1419", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "39357", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30683", "enodeid": "30665", "funcclass": "1", "length": "0.118", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1200", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.45120278, 31.28298134 ], [ 115.4517633, 31.28322159 ], [ 115.45233372, 31.2834119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.9493", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "87773810", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "30676", "enodeid": "74185406", "funcclass": "1", "length": "0.379", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.44729894, 31.28073894 ], [ 115.4479698, 31.28122944 ], [ 115.44888078, 31.28182007 ], [ 115.44956136, 31.28221049 ], [ 115.45055226, 31.28270099 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.9494", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465573", "id": "87773811", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185406", "enodeid": "30683", "funcclass": "1", "length": "0.069", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1200", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.45055226, 31.28270099 ], [ 115.45063236, 31.28274104 ], [ 115.45098264, 31.2828912 ], [ 115.45120278, 31.28298134 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125618", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098169", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20003010829", "enodeid": "2359517", "funcclass": "1", "length": "0.321", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.902865, 31.41889974 ], [ 114.90261498, 31.4191296 ], [ 114.90238494, 31.41932949 ], [ 114.9021549, 31.41952938 ], [ 114.90192486, 31.41971928 ], [ 114.90153462, 31.4200391 ], [ 114.90113466, 31.42033889 ], [ 114.90074442, 31.42063872 ], [ 114.9004143, 31.42088856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125619", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098171", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359517", "enodeid": "2359515", "funcclass": "1", "length": "0.598", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003098171" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9004143, 31.42088856 ], [ 114.90034428, 31.42093851 ], [ 114.89995422, 31.42123835 ], [ 114.89954418, 31.42153814 ], [ 114.89915412, 31.42185795 ], [ 114.898734, 31.42216778 ], [ 114.8983038, 31.42249754 ], [ 114.8978637, 31.42282734 ], [ 114.8974335, 31.42314711 ], [ 114.8969934, 31.42348691 ], [ 114.89654322, 31.42382666 ], [ 114.8961231, 31.42416645 ], [ 114.89572296, 31.42447623 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125620", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098173", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20003010806", "enodeid": "2359518", "funcclass": "1", "length": "0.334", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90305508, 31.41889979 ], [ 114.90274494, 31.41919967 ], [ 114.9025149, 31.41938952 ], [ 114.90228486, 31.4195994 ], [ 114.90205482, 31.4197893 ], [ 114.90166476, 31.42010912 ], [ 114.90126462, 31.42040891 ], [ 114.90087456, 31.42071873 ], [ 114.90051438, 31.42097856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125621", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098174", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359518", "enodeid": "2359516", "funcclass": "1", "length": "0.596", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003098174" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90051438, 31.42097856 ], [ 114.90047442, 31.42101857 ], [ 114.90007428, 31.42130837 ], [ 114.89967414, 31.42161815 ], [ 114.89928408, 31.42192797 ], [ 114.89885388, 31.42224779 ], [ 114.89842386, 31.42256756 ], [ 114.89799366, 31.42290735 ], [ 114.89755356, 31.42322712 ], [ 114.89711346, 31.42355693 ], [ 114.89667318, 31.42389668 ], [ 114.89625306, 31.42423647 ], [ 114.89583294, 31.42455624 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125622", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098177", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359521", "enodeid": "2359519", "funcclass": "1", "length": "0.512", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003098177" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88576842, 31.4641769 ], [ 114.88579812, 31.46452664 ], [ 114.88584744, 31.46545593 ], [ 114.88586706, 31.46610542 ], [ 114.8859063, 31.46697477 ], [ 114.88593564, 31.46783409 ], [ 114.88595526, 31.46827374 ], [ 114.88595508, 31.4687034 ], [ 114.8859549, 31.46878337 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125623", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098178", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359522", "enodeid": "2359520", "funcclass": "1", "length": "0.513", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003098178" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88591854, 31.46416695 ], [ 114.88593816, 31.46451669 ], [ 114.88598748, 31.46545598 ], [ 114.8860071, 31.46610546 ], [ 114.88604634, 31.46696478 ], [ 114.88607568, 31.46783414 ], [ 114.8860953, 31.46827379 ], [ 114.88609512, 31.46870345 ], [ 114.88609494, 31.46878341 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125624", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098185", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359525", "enodeid": "2359524", "funcclass": "1", "length": "0.462", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88420422, 31.45643249 ], [ 114.88433382, 31.45691214 ], [ 114.88456314, 31.45775157 ], [ 114.88480254, 31.45858097 ], [ 114.88503204, 31.45941041 ], [ 114.88524138, 31.46022981 ], [ 114.88530132, 31.46048964 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125625", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098189", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359526", "enodeid": "2359523", "funcclass": "1", "length": "0.464", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88406418, 31.45645242 ], [ 114.88419378, 31.45693212 ], [ 114.8844231, 31.45777151 ], [ 114.8846526, 31.45860095 ], [ 114.88488192, 31.45943034 ], [ 114.88510134, 31.46023976 ], [ 114.8851611, 31.46051957 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125626", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098194", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359528", "enodeid": "10002630372", "funcclass": "1", "length": "3.289", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "411523", "admincoder": "411523", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88547142, 31.47330969 ], [ 114.885446978742209, 31.473487626727781 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.125627", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "3098199", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359529", "enodeid": "10002630373", "funcclass": "1", "length": "3.283", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "411523", "admincoder": "411523", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88561128, 31.47335969 ], [ 114.885584519983468, 31.473562917943177 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142425", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773831", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185416", "enodeid": "2359528", "funcclass": "1", "length": "0.151", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8856624, 31.47196082 ], [ 114.88561218, 31.4723205 ], [ 114.88548132, 31.47324975 ], [ 114.88547142, 31.47330969 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142426", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773833", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185417", "enodeid": "2359529", "funcclass": "1", "length": "0.156", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88580244, 31.47197085 ], [ 114.88575222, 31.47233054 ], [ 114.88563144, 31.47325979 ], [ 114.88561128, 31.47335969 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142427", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773835", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185418", "enodeid": "74185416", "funcclass": "1", "length": "0.092", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88576302, 31.47114146 ], [ 114.88573296, 31.47139125 ], [ 114.8856624, 31.47196082 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142428", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773837", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185419", "enodeid": "74185417", "funcclass": "1", "length": "0.092", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88591314, 31.47115149 ], [ 114.8858829, 31.47140129 ], [ 114.88580244, 31.47197085 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142429", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773838", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359519", "enodeid": "74185420", "funcclass": "1", "length": "0.214", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8859549, 31.46878337 ], [ 114.8859144, 31.4695827 ], [ 114.88584366, 31.47045201 ], [ 114.88581342, 31.47070181 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142430", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773839", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185420", "enodeid": "74185418", "funcclass": "1", "length": "0.049", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88581342, 31.47070181 ], [ 114.88576302, 31.47114146 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142431", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773840", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359520", "enodeid": "74185421", "funcclass": "1", "length": "0.212", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88609494, 31.46878341 ], [ 114.88605426, 31.46958275 ], [ 114.8859837, 31.47045206 ], [ 114.88596354, 31.47068187 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142432", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773841", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185421", "enodeid": "74185419", "funcclass": "1", "length": "0.052", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88596354, 31.47068187 ], [ 114.88591314, 31.47115149 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142433", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773842", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359523", "enodeid": "74185422", "funcclass": "1", "length": "0.060", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8851611, 31.46051957 ], [ 114.88527072, 31.46104917 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142434", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773843", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185422", "enodeid": "2359521", "funcclass": "1", "length": "0.351", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88527072, 31.46104917 ], [ 114.8854302, 31.46182862 ], [ 114.8855697, 31.46257809 ], [ 114.88567914, 31.46335749 ], [ 114.88575852, 31.46408694 ], [ 114.88576842, 31.4641769 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142435", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773844", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359524", "enodeid": "74185423", "funcclass": "1", "length": "0.057", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88530132, 31.46048964 ], [ 114.88541094, 31.46098928 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142436", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773845", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185423", "enodeid": "2359522", "funcclass": "1", "length": "0.357", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88541094, 31.46098928 ], [ 114.88542084, 31.46102924 ], [ 114.88558032, 31.46180868 ], [ 114.88571964, 31.46256815 ], [ 114.88582908, 31.46334755 ], [ 114.88590864, 31.464077 ], [ 114.88591854, 31.46416695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142437", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773847", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185424", "enodeid": "2359526", "funcclass": "1", "length": "2.074", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.88428846, 31.43840909 ], [ 114.8841585, 31.43865897 ], [ 114.88368834, 31.43951861 ], [ 114.88301802, 31.44083805 ], [ 114.88264776, 31.44161777 ], [ 114.88253778, 31.44191765 ], [ 114.88237758, 31.4423375 ], [ 114.88220748, 31.4428073 ], [ 114.88214754, 31.44299724 ], [ 114.88196736, 31.44374699 ], [ 114.88187736, 31.44418686 ], [ 114.88178718, 31.44472668 ], [ 114.88174722, 31.44511656 ], [ 114.88169718, 31.44576636 ], [ 114.8816871, 31.44643619 ], [ 114.88170708, 31.44710606 ], [ 114.881787, 31.4478059 ], [ 114.88189698, 31.44847577 ], [ 114.88203684, 31.44916562 ], [ 114.88220694, 31.4498655 ], [ 114.88230684, 31.45017542 ], [ 114.88240674, 31.45055531 ], [ 114.88262634, 31.45131486 ], [ 114.88283586, 31.45208441 ], [ 114.88304592, 31.45285436 ], [ 114.88327614, 31.45365437 ], [ 114.88338594, 31.45401414 ], [ 114.88351554, 31.45448381 ], [ 114.88372488, 31.45528328 ], [ 114.88396428, 31.45612266 ], [ 114.88406418, 31.45645242 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142438", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773849", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185425", "enodeid": "74185424", "funcclass": "1", "length": "1.328", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89114142, 31.42807389 ], [ 114.89089122, 31.42830375 ], [ 114.89048118, 31.42869354 ], [ 114.89018094, 31.42898334 ], [ 114.88987098, 31.4293032 ], [ 114.88957074, 31.429643 ], [ 114.88928076, 31.42998284 ], [ 114.8889906, 31.43033262 ], [ 114.88869054, 31.43071247 ], [ 114.88841028, 31.43109227 ], [ 114.88814028, 31.43149209 ], [ 114.88784004, 31.43191185 ], [ 114.88759002, 31.4323317 ], [ 114.88733982, 31.43275151 ], [ 114.8870898, 31.4331813 ], [ 114.88687974, 31.43359116 ], [ 114.88663962, 31.43402096 ], [ 114.88641948, 31.43443077 ], [ 114.88619934, 31.43485062 ], [ 114.88595922, 31.43528042 ], [ 114.88572918, 31.43573024 ], [ 114.88548906, 31.43618006 ], [ 114.88524894, 31.43663987 ], [ 114.88499892, 31.43709963 ], [ 114.88454874, 31.4379293 ], [ 114.88431852, 31.4383491 ], [ 114.88428846, 31.43840909 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142439", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773851", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185426", "enodeid": "2359525", "funcclass": "1", "length": "3.387", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89124132, 31.42817388 ], [ 114.89102136, 31.42836378 ], [ 114.89061114, 31.42875357 ], [ 114.89031108, 31.42904337 ], [ 114.89001102, 31.42936319 ], [ 114.88970088, 31.42969304 ], [ 114.8894208, 31.43003283 ], [ 114.88912056, 31.43038266 ], [ 114.88883058, 31.43076246 ], [ 114.88855032, 31.43114231 ], [ 114.88828032, 31.4315321 ], [ 114.88799016, 31.4319519 ], [ 114.88773996, 31.43238174 ], [ 114.88747986, 31.43278152 ], [ 114.88723992, 31.43321136 ], [ 114.88702968, 31.43362118 ], [ 114.88678956, 31.43406101 ], [ 114.88655952, 31.43447082 ], [ 114.88634946, 31.43489063 ], [ 114.88610934, 31.43532047 ], [ 114.88586922, 31.43577024 ], [ 114.8856291, 31.43622006 ], [ 114.88539906, 31.43666988 ], [ 114.88514886, 31.43713968 ], [ 114.88468878, 31.43796935 ], [ 114.88446864, 31.43838915 ], [ 114.88430844, 31.43869902 ], [ 114.88382838, 31.43955866 ], [ 114.88315806, 31.44086811 ], [ 114.88279788, 31.44164778 ], [ 114.88267782, 31.44194766 ], [ 114.88251762, 31.44235752 ], [ 114.88234752, 31.44282737 ], [ 114.88229748, 31.44300728 ], [ 114.88211748, 31.44375702 ], [ 114.8820273, 31.4441969 ], [ 114.88192722, 31.44473672 ], [ 114.88189734, 31.4451266 ], [ 114.88183722, 31.44576641 ], [ 114.88183704, 31.44643623 ], [ 114.88185702, 31.44709611 ], [ 114.88192704, 31.44779595 ], [ 114.88203702, 31.44846578 ], [ 114.88218696, 31.44915567 ], [ 114.88235688, 31.44984552 ], [ 114.88244688, 31.45015548 ], [ 114.88254678, 31.45053533 ], [ 114.88276638, 31.45129488 ], [ 114.8829858, 31.45206438 ], [ 114.88319604, 31.45283438 ], [ 114.88342608, 31.45363439 ], [ 114.88352598, 31.45399421 ], [ 114.88366566, 31.45446387 ], [ 114.883875, 31.4552633 ], [ 114.8841144, 31.45610273 ], [ 114.88420422, 31.45643249 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142440", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773853", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185427", "enodeid": "74185425", "funcclass": "1", "length": "0.296", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89341212, 31.42625508 ], [ 114.89306202, 31.42653489 ], [ 114.89263182, 31.42686465 ], [ 114.89217174, 31.42721444 ], [ 114.89172156, 31.42756422 ], [ 114.89129136, 31.42793399 ], [ 114.89114142, 31.42807389 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142441", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773855", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185428", "enodeid": "74185426", "funcclass": "1", "length": "0.296", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8935122, 31.42635507 ], [ 114.89318208, 31.4266149 ], [ 114.89275188, 31.42693467 ], [ 114.8923017, 31.42728446 ], [ 114.89185152, 31.42763424 ], [ 114.8914215, 31.42800401 ], [ 114.89124132, 31.42817388 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142442", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773856", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359516", "enodeid": "74185429", "funcclass": "1", "length": "0.206", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89583294, 31.42455624 ], [ 114.895773, 31.42459625 ], [ 114.89528286, 31.42498599 ], [ 114.89496264, 31.4252258 ], [ 114.89449248, 31.42558557 ], [ 114.89422248, 31.42579545 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142443", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773857", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185429", "enodeid": "74185428", "funcclass": "1", "length": "0.092", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89422248, 31.42579545 ], [ 114.89405238, 31.42592537 ], [ 114.89362218, 31.42626512 ], [ 114.8935122, 31.42635507 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142444", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773858", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2359515", "enodeid": "74185430", "funcclass": "1", "length": "0.209", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89572296, 31.42447623 ], [ 114.89565294, 31.42452623 ], [ 114.8951628, 31.42491597 ], [ 114.89484258, 31.42515578 ], [ 114.89437242, 31.42551555 ], [ 114.89408244, 31.42573542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.142445", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475417", "id": "87773859", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185430", "enodeid": "74185427", "funcclass": "1", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89408244, 31.42573542 ], [ 114.89392242, 31.42585535 ], [ 114.89349222, 31.4261951 ], [ 114.89341212, 31.42625508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144928", "Name": null, "pyname": null, "mapid": "465477", "id": "3629483", "kind_num": "3", "kind": "0005|000b|0012", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693183", "enodeid": "2693184", "funcclass": "4", "length": "0.053", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91237116, 31.31494101 ], [ 114.912441, 31.315001 ], [ 114.91247106, 31.31502098 ], [ 114.91251102, 31.31505095 ], [ 114.91255098, 31.31507093 ], [ 114.91259094, 31.31509091 ], [ 114.91267086, 31.31512088 ], [ 114.91285086, 31.3151508 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144929", "Name": null, "pyname": null, "mapid": "465477", "id": "3629487", "kind_num": "3", "kind": "0005|000b|0012", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693185", "enodeid": "2693186", "funcclass": "5", "length": "0.063", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91228116, 31.31497103 ], [ 114.91229106, 31.31506098 ], [ 114.91230114, 31.31511098 ], [ 114.91230114, 31.31517092 ], [ 114.91229106, 31.31520093 ], [ 114.91228098, 31.3152309 ], [ 114.91227108, 31.31526087 ], [ 114.9122511, 31.3152809 ], [ 114.91222104, 31.31531087 ], [ 114.9121611, 31.31535087 ], [ 114.91211106, 31.31538089 ], [ 114.91204104, 31.31545086 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144930", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629489", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693180", "enodeid": "2693190", "funcclass": "1", "length": "0.426", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90830298, 31.31369258 ], [ 114.90803334, 31.313003 ], [ 114.9079833, 31.31288303 ], [ 114.90795342, 31.31279312 ], [ 114.90783354, 31.31248329 ], [ 114.9074838, 31.31158379 ], [ 114.90729408, 31.31106413 ], [ 114.90714414, 31.31064437 ], [ 114.90702426, 31.31020458 ], [ 114.9069843, 31.31002472 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144931", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629494", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693193", "enodeid": "2693187", "funcclass": "1", "length": "0.165", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9110505, 31.31857922 ], [ 114.91100064, 31.31846933 ], [ 114.9109506, 31.31833941 ], [ 114.91092072, 31.31827947 ], [ 114.91090074, 31.31823947 ], [ 114.91069086, 31.3179597 ], [ 114.91060104, 31.31783982 ], [ 114.91049106, 31.31770991 ], [ 114.9104511, 31.31765996 ], [ 114.91038108, 31.31756006 ], [ 114.91034112, 31.31750012 ], [ 114.91031124, 31.31746011 ], [ 114.91027128, 31.31743014 ], [ 114.91022124, 31.31738019 ], [ 114.9101613, 31.31732025 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144932", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629495", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693189", "enodeid": "2693194", "funcclass": "1", "length": "0.337", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90845292, 31.31368254 ], [ 114.9081633, 31.31293298 ], [ 114.90811326, 31.31282304 ], [ 114.90809328, 31.3127631 ], [ 114.90798348, 31.31245328 ], [ 114.90763374, 31.31156381 ], [ 114.90743394, 31.31103411 ], [ 114.90735402, 31.31079422 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144933", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629496", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693194", "enodeid": "2693181", "funcclass": "1", "length": "0.090", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90735402, 31.31079422 ], [ 114.90728418, 31.31061435 ], [ 114.9071643, 31.31019459 ], [ 114.90712434, 31.31000469 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144934", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629499", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693175", "enodeid": "2693196", "funcclass": "1", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91000146, 31.31737025 ], [ 114.90989148, 31.31716041 ], [ 114.90975162, 31.31689064 ], [ 114.90962184, 31.31667077 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144935", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629500", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693196", "enodeid": "2693188", "funcclass": "1", "length": "0.245", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90962184, 31.31667077 ], [ 114.90958188, 31.31659085 ], [ 114.909462, 31.31636099 ], [ 114.90921216, 31.3158713 ], [ 114.90900228, 31.31541158 ], [ 114.90871266, 31.31473194 ], [ 114.9086727, 31.31462201 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144936", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629501", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693197", "enodeid": "2693199", "funcclass": "1", "length": "0.214", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9075072, 31.28944352 ], [ 114.90762726, 31.28920362 ], [ 114.90796728, 31.28851395 ], [ 114.90830712, 31.28784408 ], [ 114.90839712, 31.28767407 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144937", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629502", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693198", "enodeid": "2693200", "funcclass": "1", "length": "0.215", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90763734, 31.28949351 ], [ 114.9077673, 31.28923364 ], [ 114.9081174, 31.28855396 ], [ 114.90844698, 31.28787396 ], [ 114.90853698, 31.28771394 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144938", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629505", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693201", "enodeid": "2693203", "funcclass": "1", "length": "0.318", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91295274, 31.27831358 ], [ 114.91304256, 31.2780636 ], [ 114.91326234, 31.27740368 ], [ 114.91337232, 31.27708368 ], [ 114.9134922, 31.27670375 ], [ 114.91371198, 31.27596381 ], [ 114.91382196, 31.27554387 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144939", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629506", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693202", "enodeid": "2693204", "funcclass": "1", "length": "0.320", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91309242, 31.27834346 ], [ 114.91319232, 31.27809344 ], [ 114.91341228, 31.27742352 ], [ 114.9134922, 31.27714358 ], [ 114.91364196, 31.27672359 ], [ 114.91385184, 31.2759837 ], [ 114.91397172, 31.27556376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144940", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629507", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693203", "enodeid": "2693205", "funcclass": "1", "length": "0.798", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91382196, 31.27554387 ], [ 114.91390188, 31.27527392 ], [ 114.91409178, 31.27447409 ], [ 114.91425162, 31.27369424 ], [ 114.91441146, 31.27291439 ], [ 114.91452144, 31.27212468 ], [ 114.91458156, 31.27171496 ], [ 114.91464168, 31.27132517 ], [ 114.91472178, 31.27054568 ], [ 114.91481196, 31.26974616 ], [ 114.91487226, 31.26892667 ], [ 114.9149124, 31.26842699 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144941", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629508", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693204", "enodeid": "2693206", "funcclass": "1", "length": "0.799", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91397172, 31.27556376 ], [ 114.91404174, 31.27529381 ], [ 114.91423146, 31.27449393 ], [ 114.91440138, 31.27371408 ], [ 114.91455132, 31.27292429 ], [ 114.91467138, 31.27213463 ], [ 114.91472142, 31.27174484 ], [ 114.91478154, 31.27133511 ], [ 114.91487172, 31.27054559 ], [ 114.91495182, 31.26974607 ], [ 114.91501212, 31.26892662 ], [ 114.91505226, 31.26843693 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144942", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629509", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693205", "enodeid": "2693207", "funcclass": "1", "length": "0.382", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9149124, 31.26842699 ], [ 114.91493238, 31.26809723 ], [ 114.91501266, 31.26726774 ], [ 114.91508286, 31.26643826 ], [ 114.91515306, 31.26560877 ], [ 114.9152031, 31.2649992 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144943", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629510", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693206", "enodeid": "2693208", "funcclass": "1", "length": "0.382", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91505226, 31.26843693 ], [ 114.91508232, 31.26810713 ], [ 114.91515252, 31.26727764 ], [ 114.91523262, 31.26644816 ], [ 114.91530282, 31.26560873 ], [ 114.91535304, 31.2650091 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144944", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629512", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693209", "enodeid": "20002908563", "funcclass": "1", "length": "0.313", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91781184, 31.25484216 ], [ 114.91790184, 31.25466216 ], [ 114.91839126, 31.25377215 ], [ 114.9188409, 31.25296211 ], [ 114.91920054, 31.25228207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144945", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629514", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693210", "enodeid": "20002908560", "funcclass": "1", "length": "0.319", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91794162, 31.25489198 ], [ 114.91804152, 31.254692 ], [ 114.91854102, 31.25380194 ], [ 114.91899066, 31.2529919 ], [ 114.9193503, 31.25228189 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144946", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629515", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693211", "enodeid": "2693197", "funcclass": "1", "length": "1.112", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90583626, 31.29921941 ], [ 114.90580638, 31.29900948 ], [ 114.90575652, 31.29834974 ], [ 114.90571656, 31.29784997 ], [ 114.90569658, 31.29768 ], [ 114.90565662, 31.29680039 ], [ 114.90565662, 31.29602067 ], [ 114.90570684, 31.29522102 ], [ 114.90580692, 31.29439136 ], [ 114.90596694, 31.29356169 ], [ 114.90611706, 31.29297197 ], [ 114.906267, 31.2923822 ], [ 114.9064371, 31.29185246 ], [ 114.90668712, 31.29119276 ], [ 114.9069672, 31.29054305 ], [ 114.90728724, 31.28987331 ], [ 114.9075072, 31.28944352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144947", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629516", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693212", "enodeid": "2693198", "funcclass": "1", "length": "1.106", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9059763, 31.29921941 ], [ 114.90595632, 31.29900953 ], [ 114.90590646, 31.29834978 ], [ 114.90585642, 31.29784997 ], [ 114.90584652, 31.29767006 ], [ 114.90579666, 31.29680039 ], [ 114.90580674, 31.29602072 ], [ 114.90585678, 31.29523101 ], [ 114.90595686, 31.29440135 ], [ 114.90611688, 31.29358172 ], [ 114.906267, 31.29298196 ], [ 114.90640704, 31.29240222 ], [ 114.90658704, 31.29187244 ], [ 114.90682716, 31.29122273 ], [ 114.90711714, 31.29057302 ], [ 114.90742728, 31.28990333 ], [ 114.90763734, 31.28949351 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144948", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629517", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693213", "enodeid": "2693211", "funcclass": "1", "length": "0.314", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90610626, 31.30203852 ], [ 114.90602616, 31.30135875 ], [ 114.90600618, 31.30107881 ], [ 114.9059862, 31.30082888 ], [ 114.90593616, 31.30026903 ], [ 114.90587622, 31.29964925 ], [ 114.90583626, 31.29921941 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144949", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629519", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693214", "enodeid": "2693212", "funcclass": "1", "length": "0.313", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90624612, 31.30202853 ], [ 114.90617628, 31.30134876 ], [ 114.90614622, 31.30104884 ], [ 114.90612624, 31.30082888 ], [ 114.90608628, 31.30025904 ], [ 114.90601626, 31.29963926 ], [ 114.9059763, 31.29921941 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144950", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629524", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003010807", "enodeid": "2693217", "funcclass": "1", "length": "1.525", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91154604, 31.33558053 ], [ 114.91143606, 31.33525064 ], [ 114.9113862, 31.33508072 ], [ 114.91131618, 31.33483083 ], [ 114.91124616, 31.33457096 ], [ 114.91118622, 31.33429106 ], [ 114.91112646, 31.3340112 ], [ 114.91105644, 31.33372131 ], [ 114.91100658, 31.33342143 ], [ 114.91095654, 31.33311156 ], [ 114.91091658, 31.33280169 ], [ 114.91086672, 31.3324718 ], [ 114.91084674, 31.33215194 ], [ 114.91081686, 31.33178208 ], [ 114.91079688, 31.33142222 ], [ 114.91078698, 31.33078245 ], [ 114.91078698, 31.33043262 ], [ 114.91080714, 31.33005282 ], [ 114.9108372, 31.32966299 ], [ 114.91086726, 31.3292732 ], [ 114.91091748, 31.32888336 ], [ 114.91097742, 31.32846356 ], [ 114.91108758, 31.32774392 ], [ 114.91117776, 31.32732411 ], [ 114.9112377, 31.32697424 ], [ 114.91133778, 31.3263945 ], [ 114.91134786, 31.32631458 ], [ 114.91142796, 31.32589473 ], [ 114.91149798, 31.32541499 ], [ 114.9115482, 31.32499518 ], [ 114.9115581, 31.32489524 ], [ 114.91160832, 31.32440546 ], [ 114.9116283, 31.32402566 ], [ 114.9116283, 31.32391568 ], [ 114.91162848, 31.32341595 ], [ 114.91163856, 31.32324603 ], [ 114.91161858, 31.32290619 ], [ 114.91159878, 31.32261639 ], [ 114.91158888, 31.32241655 ], [ 114.91153902, 31.32194684 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144951", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629526", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693190", "enodeid": "2693218", "funcclass": "1", "length": "0.023", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9069843, 31.31002472 ], [ 114.90694434, 31.30982483 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144952", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629528", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003010808", "enodeid": "2693219", "funcclass": "1", "length": "2.033", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91138602, 31.33558053 ], [ 114.9112962, 31.33527071 ], [ 114.91123626, 31.33510074 ], [ 114.91117632, 31.33485086 ], [ 114.9111063, 31.33458099 ], [ 114.91103628, 31.33431108 ], [ 114.91097652, 31.33402124 ], [ 114.91091658, 31.33373135 ], [ 114.91085664, 31.33343147 ], [ 114.9108066, 31.3331216 ], [ 114.91076664, 31.33281173 ], [ 114.91072668, 31.33248183 ], [ 114.9106968, 31.33216197 ], [ 114.91067682, 31.33179212 ], [ 114.91065702, 31.33142226 ], [ 114.91064712, 31.3307825 ], [ 114.91064712, 31.33043267 ], [ 114.91066728, 31.33004288 ], [ 114.91068726, 31.32966303 ], [ 114.9107274, 31.32926325 ], [ 114.91076754, 31.32887342 ], [ 114.91082748, 31.32845361 ], [ 114.91094772, 31.32773397 ], [ 114.91102782, 31.32731417 ], [ 114.91109784, 31.32696429 ], [ 114.91118802, 31.32638456 ], [ 114.911208, 31.32630459 ], [ 114.91127802, 31.32588479 ], [ 114.91134804, 31.32540504 ], [ 114.91140816, 31.32498524 ], [ 114.91141824, 31.32488525 ], [ 114.91146828, 31.32439551 ], [ 114.91147836, 31.3240257 ], [ 114.91147836, 31.32391572 ], [ 114.91148862, 31.323416 ], [ 114.91148862, 31.32324608 ], [ 114.91146864, 31.32291627 ], [ 114.91145874, 31.32261644 ], [ 114.91143894, 31.32242654 ], [ 114.91139916, 31.32194688 ], [ 114.91137918, 31.32177701 ], [ 114.91132932, 31.32145724 ], [ 114.9112395, 31.32098757 ], [ 114.91113978, 31.32053789 ], [ 114.91103988, 31.32012821 ], [ 114.91093008, 31.31970849 ], [ 114.91081038, 31.31931879 ], [ 114.91060068, 31.31866926 ], [ 114.91053084, 31.31846942 ], [ 114.91043094, 31.3181996 ], [ 114.91029108, 31.31790984 ], [ 114.91012134, 31.31759007 ], [ 114.91008138, 31.31753013 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144953", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629529", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693219", "enodeid": "2693175", "funcclass": "1", "length": "0.019", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91008138, 31.31753013 ], [ 114.91000146, 31.31737025 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144954", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629532", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693188", "enodeid": "2693221", "funcclass": "1", "length": "0.022", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9086727, 31.31462201 ], [ 114.90860268, 31.31446212 ], [ 114.90859278, 31.31443215 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144955", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629533", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693221", "enodeid": "2693180", "funcclass": "1", "length": "0.087", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90859278, 31.31443215 ], [ 114.90830298, 31.31369258 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144956", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629534", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693178", "enodeid": "2693222", "funcclass": "1", "length": "0.050", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90880266, 31.314582 ], [ 114.90875262, 31.31443211 ], [ 114.90863274, 31.31415225 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.144957", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "3629535", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693222", "enodeid": "2693189", "funcclass": "1", "length": "0.055", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90863274, 31.31415225 ], [ 114.90845292, 31.31368254 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145232", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674114", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002908593", "enodeid": "2798938", "funcclass": "1", "length": "1.171", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.994674, 31.19744507 ], [ 114.99534144, 31.197573 ], [ 114.9976431, 31.1980059 ], [ 114.99850998, 31.1981832 ], [ 114.9994665, 31.19839025 ], [ 115.00120008, 31.19881482 ], [ 115.00296354, 31.19932931 ], [ 115.00435854, 31.19978489 ], [ 115.00637112, 31.20051852 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145233", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674115", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002908591", "enodeid": "2798939", "funcclass": "1", "length": "1.180", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.994674, 31.19730512 ], [ 114.99541128, 31.19743287 ], [ 114.99781248, 31.19786546 ], [ 114.99856974, 31.1980131 ], [ 114.99958602, 31.19823995 ], [ 115.00124994, 31.19864477 ], [ 115.00297362, 31.19914935 ], [ 115.00452792, 31.19965443 ], [ 115.00647084, 31.20035832 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145234", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674116", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798939", "enodeid": "2798940", "funcclass": "1", "length": "0.089", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00647084, 31.20035832 ], [ 115.0065405, 31.20038811 ], [ 115.00730784, 31.20070572 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145235", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674117", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798938", "enodeid": "2798941", "funcclass": "1", "length": "0.087", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00637112, 31.20051852 ], [ 115.00648074, 31.20055821 ], [ 115.00719822, 31.20084599 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145236", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674118", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798940", "enodeid": "2798942", "funcclass": "1", "length": "3.441", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00730784, 31.20070572 ], [ 115.00824456, 31.20109286 ], [ 115.00912134, 31.20149012 ], [ 115.00982892, 31.20183792 ], [ 115.01030718, 31.20206643 ], [ 115.0121007, 31.2030108 ], [ 115.01343594, 31.20377652 ], [ 115.01386434, 31.20403518 ], [ 115.01514972, 31.20485099 ], [ 115.01690328, 31.20607526 ], [ 115.01820846, 31.20709095 ], [ 115.01837784, 31.20721038 ], [ 115.01936424, 31.20803708 ], [ 115.02090864, 31.20942191 ], [ 115.02258246, 31.21097621 ], [ 115.0238079, 31.21213203 ], [ 115.02468468, 31.21290909 ], [ 115.02560124, 31.21367603 ], [ 115.0262091, 31.21415402 ], [ 115.02713574, 31.214741 ], [ 115.0272054, 31.21478078 ], [ 115.02773352, 31.21508916 ], [ 115.02804258, 31.21524828 ], [ 115.0282818, 31.21536758 ], [ 115.0289595, 31.21568559 ], [ 115.0292187, 31.21581483 ], [ 115.02979668, 31.21603317 ], [ 115.03095282, 31.21643984 ], [ 115.03158066, 31.21660805 ], [ 115.0321788, 31.21674638 ], [ 115.03321524, 31.21696346 ], [ 115.0352685, 31.21730775 ], [ 115.03662426, 31.21753437 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145237", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674119", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798941", "enodeid": "2798943", "funcclass": "1", "length": "3.447", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.00719822, 31.20084599 ], [ 115.00817472, 31.20125297 ], [ 115.00921098, 31.20172974 ], [ 115.00964946, 31.20193836 ], [ 115.01022744, 31.2022166 ], [ 115.01200116, 31.20314103 ], [ 115.01319672, 31.20383718 ], [ 115.01403372, 31.2043545 ], [ 115.01500014, 31.20497136 ], [ 115.01675388, 31.20618564 ], [ 115.01822844, 31.20732077 ], [ 115.01830818, 31.20739052 ], [ 115.01917488, 31.20811758 ], [ 115.02074916, 31.2095223 ], [ 115.02263214, 31.21126592 ], [ 115.02370818, 31.21230222 ], [ 115.02449532, 31.2129896 ], [ 115.02555138, 31.21386606 ], [ 115.02604962, 31.2142644 ], [ 115.02684666, 31.21477182 ], [ 115.0270758, 31.2149111 ], [ 115.02770364, 31.21526916 ], [ 115.02807246, 31.21545807 ], [ 115.02809244, 31.21546802 ], [ 115.02884988, 31.21582581 ], [ 115.02915876, 31.2159749 ], [ 115.02975672, 31.21620318 ], [ 115.03087308, 31.21659 ], [ 115.03163052, 31.21678782 ], [ 115.0320591, 31.21689663 ], [ 115.03321524, 31.21713338 ], [ 115.03522854, 31.21746777 ], [ 115.0365744, 31.21770438 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145238", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674120", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798943", "enodeid": "2798944", "funcclass": "1", "length": "0.790", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0365744, 31.21770438 ], [ 115.03740204, 31.21784244 ], [ 115.03990458, 31.21827647 ], [ 115.04219814, 31.21868106 ], [ 115.04407302, 31.21899674 ], [ 115.04469132, 31.21906532 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145239", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674121", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798942", "enodeid": "2798945", "funcclass": "1", "length": "0.791", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.03662426, 31.21753437 ], [ 115.03768122, 31.21771185 ], [ 115.03996452, 31.21810641 ], [ 115.0423776, 31.21853072 ], [ 115.04414268, 31.21882664 ], [ 115.04475108, 31.21890525 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145240", "Name": null, "pyname": null, "mapid": "465560", "id": "3674123", "kind_num": "2", "kind": "0002|0005", "width": "55", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798948", "enodeid": "2798929", "funcclass": "2", "length": "0.059", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06404888, 31.21153434 ], [ 115.06383936, 31.21122483 ], [ 115.0636995, 31.21109514 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145241", "Name": null, "pyname": null, "mapid": "465560", "id": "3674124", "kind_num": "2", "kind": "0002|0005", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798947", "enodeid": "2798949", "funcclass": "2", "length": "0.144", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06462758, 31.21273278 ], [ 115.06459752, 31.21269287 ], [ 115.0644978, 31.2125031 ], [ 115.06436802, 31.21226343 ], [ 115.06432824, 31.21219355 ], [ 115.06419846, 31.21197386 ], [ 115.06416858, 31.21192395 ], [ 115.06393908, 31.21158447 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145242", "Name": null, "pyname": null, "mapid": "465560", "id": "3674125", "kind_num": "2", "kind": "0002|0005", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798949", "enodeid": "2798929", "funcclass": "2", "length": "0.060", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06393908, 31.21158447 ], [ 115.06372956, 31.21127496 ], [ 115.0636995, 31.21109514 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145243", "Name": null, "pyname": null, "mapid": "465560", "id": "3674126", "kind_num": "2", "kind": "0002|0005", "width": "55", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798946", "enodeid": "2798950", "funcclass": "2", "length": "0.094", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06467744, 31.21253285 ], [ 115.0644978, 31.21222329 ], [ 115.06445802, 31.21215336 ], [ 115.06432824, 31.21193367 ], [ 115.06429836, 31.21188377 ], [ 115.06422852, 31.21178391 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145244", "Name": null, "pyname": null, "mapid": "465560", "id": "3674127", "kind_num": "2", "kind": "0002|0005", "width": "55", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798950", "enodeid": "2798948", "funcclass": "2", "length": "0.033", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06422852, 31.21178391 ], [ 115.06404888, 31.21153434 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145245", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674130", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798951", "enodeid": "2798953", "funcclass": "1", "length": "0.083", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06537656, 31.21412148 ], [ 115.06556628, 31.21409124 ], [ 115.065666, 31.21408116 ], [ 115.06623516, 31.21403049 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145246", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674134", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798945", "enodeid": "2798956", "funcclass": "1", "length": "1.778", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04475108, 31.21890525 ], [ 115.0449804, 31.21893473 ], [ 115.0459677, 31.2190025 ], [ 115.04721438, 31.21904966 ], [ 115.04837124, 31.21900713 ], [ 115.0492887, 31.2189251 ], [ 115.05028608, 31.21880292 ], [ 115.051014, 31.2186614 ], [ 115.05146274, 31.21857041 ], [ 115.05247002, 31.21830828 ], [ 115.05342816, 31.21800687 ], [ 115.05386736, 31.21786629 ], [ 115.0548156, 31.21746507 ], [ 115.0564725, 31.21671299 ], [ 115.05741084, 31.21627181 ], [ 115.0583391, 31.2158606 ], [ 115.05957678, 31.21536902 ], [ 115.0613235, 31.21480665 ], [ 115.0618725, 31.21463592 ], [ 115.06235166, 31.21451528 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145247", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674135", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798956", "enodeid": "2798937", "funcclass": "1", "length": "0.029", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06235166, 31.21451528 ], [ 115.0626411, 31.21444485 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145248", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674138", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798955", "enodeid": "2798958", "funcclass": "1", "length": "0.122", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06772286, 31.21380882 ], [ 115.06805226, 31.21379843 ], [ 115.06900086, 31.21374735 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145249", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674139", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798958", "enodeid": "2798959", "funcclass": "1", "length": "0.107", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06900086, 31.21374735 ], [ 115.07011902, 31.21369605 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145250", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674141", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798960", "enodeid": "2798954", "funcclass": "1", "length": "0.226", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06775274, 31.21394873 ], [ 115.06805226, 31.21392839 ], [ 115.0701192, 31.21382601 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145251", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674142", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798937", "enodeid": "2798961", "funcclass": "1", "length": "0.349", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0626411, 31.21444485 ], [ 115.06371912, 31.21421337 ], [ 115.06528656, 31.2139616 ], [ 115.06546638, 31.21394139 ], [ 115.0655661, 31.21392128 ], [ 115.06605534, 31.21387074 ], [ 115.06623516, 31.21386053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145252", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674143", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798961", "enodeid": "2798955", "funcclass": "1", "length": "0.142", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06623516, 31.21386053 ], [ 115.06675428, 31.21382993 ], [ 115.06772286, 31.21380882 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145253", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674144", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798944", "enodeid": "2798962", "funcclass": "1", "length": "1.820", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.04469132, 31.21906532 ], [ 115.04492064, 31.21909479 ], [ 115.04605752, 31.21918218 ], [ 115.04721438, 31.21921958 ], [ 115.0483014, 31.21918718 ], [ 115.04935854, 31.21909488 ], [ 115.05031596, 31.2189728 ], [ 115.05123342, 31.21879082 ], [ 115.05156246, 31.21872012 ], [ 115.05246012, 31.21849823 ], [ 115.0533981, 31.21818683 ], [ 115.05399714, 31.21800602 ], [ 115.05488544, 31.21763486 ], [ 115.0565823, 31.21685271 ], [ 115.0576803, 31.21634133 ], [ 115.05839886, 31.21603043 ], [ 115.0596765, 31.21550879 ], [ 115.06153302, 31.21492626 ], [ 115.06193244, 31.21479572 ], [ 115.06272084, 31.21460465 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145254", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674145", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798962", "enodeid": "2798951", "funcclass": "1", "length": "0.259", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06272084, 31.21460465 ], [ 115.06349952, 31.21441358 ], [ 115.06379904, 31.21435328 ], [ 115.06537656, 31.21412148 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145255", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674146", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798953", "enodeid": "2798963", "funcclass": "1", "length": "0.063", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06623516, 31.21403049 ], [ 115.06675428, 31.21399989 ], [ 115.06689414, 31.21399971 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145256", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "3674147", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798963", "enodeid": "2798960", "funcclass": "1", "length": "0.082", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06689414, 31.21399971 ], [ 115.06775274, 31.21394873 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145284", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675172", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795312", "enodeid": "2795314", "funcclass": "1", "length": "0.260", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.753730758567528, 31.100640371824312 ], [ 114.75385704, 31.10067545 ], [ 114.75510768, 31.1009558 ], [ 114.75628812, 31.10118611 ], [ 114.75631818, 31.10119614 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145285", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675173", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795313", "enodeid": "2795315", "funcclass": "1", "length": "0.256", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.753789429769057, 31.100515505950913 ], [ 114.75391716, 31.10054558 ], [ 114.75521766, 31.10083592 ], [ 114.756048, 31.10100615 ], [ 114.75635814, 31.10106623 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145286", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675174", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795316", "enodeid": "10002881811", "funcclass": "1", "length": "0.827", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86169828, 31.14064071 ], [ 114.86204856, 31.14080096 ], [ 114.86283912, 31.14112145 ], [ 114.86302938, 31.14118157 ], [ 114.86305926, 31.14119156 ], [ 114.86369988, 31.14141197 ], [ 114.8646105, 31.14170258 ], [ 114.8657013, 31.14202325 ], [ 114.86667204, 31.14228389 ], [ 114.8675427, 31.14251447 ], [ 114.86986452, 31.14315594 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145287", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675175", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795314", "enodeid": "2795317", "funcclass": "1", "length": "10.190", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75631818, 31.10119614 ], [ 114.75781884, 31.10146655 ], [ 114.75894924, 31.1016569 ], [ 114.75964962, 31.10175711 ], [ 114.75979974, 31.10177718 ], [ 114.7612905, 31.10196794 ], [ 114.76287162, 31.10214875 ], [ 114.76430244, 31.10226953 ], [ 114.76673406, 31.10245088 ], [ 114.76938564, 31.10264235 ], [ 114.7722876, 31.10286393 ], [ 114.77407878, 31.10299493 ], [ 114.77412864, 31.10300496 ], [ 114.77565036, 31.10315625 ], [ 114.7768119, 31.10330754 ], [ 114.77816388, 31.10352908 ], [ 114.7797162, 31.10381082 ], [ 114.78116826, 31.10411246 ], [ 114.78245022, 31.10442386 ], [ 114.7838121, 31.10479529 ], [ 114.78537414, 31.10526693 ], [ 114.78622536, 31.10555777 ], [ 114.7871466, 31.10586867 ], [ 114.78828798, 31.10629982 ], [ 114.78985002, 31.1069313 ], [ 114.7909815, 31.1073624 ], [ 114.79186278, 31.1076833 ], [ 114.79311432, 31.10810454 ], [ 114.79425588, 31.10844569 ], [ 114.7959081, 31.10890743 ], [ 114.79696938, 31.10915853 ], [ 114.7975902, 31.1092992 ], [ 114.798942, 31.10960061 ], [ 114.80191722, 31.11028506 ], [ 114.80409144, 31.11078857 ], [ 114.80524362, 31.11109043 ], [ 114.80584482, 31.11126138 ], [ 114.80656626, 31.11150254 ], [ 114.80742792, 31.11181385 ], [ 114.80760828, 31.11188414 ], [ 114.80868018, 31.11231578 ], [ 114.80921136, 31.11256656 ], [ 114.8102433, 31.1130981 ], [ 114.81109488, 31.11355935 ], [ 114.8120568, 31.11419075 ], [ 114.8125977, 31.11454152 ], [ 114.81275808, 31.11465173 ], [ 114.81328908, 31.11503247 ], [ 114.81474186, 31.11615446 ], [ 114.81638508, 31.11739668 ], [ 114.8170563, 31.11788763 ], [ 114.81776766, 31.11835865 ], [ 114.81876972, 31.11895008 ], [ 114.81958134, 31.1194013 ], [ 114.8202225, 31.11971225 ], [ 114.82081362, 31.11998319 ], [ 114.82154514, 31.12029432 ], [ 114.82249698, 31.1206658 ], [ 114.82339878, 31.12098723 ], [ 114.82435062, 31.12126875 ], [ 114.82477146, 31.12138944 ], [ 114.82553286, 31.12159068 ], [ 114.82654482, 31.12185236 ], [ 114.82747668, 31.12210386 ], [ 114.82833834, 31.12235528 ], [ 114.82885944, 31.1225261 ], [ 114.82921008, 31.12264665 ], [ 114.82931034, 31.12268679 ], [ 114.82952076, 31.12276716 ], [ 114.83031222, 31.12309836 ], [ 114.83105364, 31.1234495 ], [ 114.83131428, 31.12357991 ], [ 114.83187534, 31.12389072 ], [ 114.83215578, 31.12404116 ], [ 114.83271702, 31.12438194 ], [ 114.83297748, 31.12455231 ], [ 114.83372898, 31.12508336 ], [ 114.83436006, 31.12558421 ], [ 114.8347008, 31.12587468 ], [ 114.83535204, 31.12647552 ], [ 114.83588304, 31.12700616 ], [ 114.83700516, 31.12821752 ], [ 114.83792694, 31.12918862 ], [ 114.8384178, 31.12964924 ], [ 114.83887878, 31.13005986 ], [ 114.83968032, 31.13070093 ], [ 114.8403816, 31.13120192 ], [ 114.84088254, 31.13152263 ], [ 114.84122328, 31.13172311 ], [ 114.84201474, 31.13216429 ], [ 114.84283644, 31.13256555 ], [ 114.84356778, 31.13287668 ], [ 114.84395856, 31.1330273 ], [ 114.84490032, 31.13336876 ], [ 114.84572202, 31.1336001 ], [ 114.84659376, 31.13382155 ], [ 114.84843732, 31.13421462 ], [ 114.84998046, 31.13456715 ], [ 114.85052154, 31.13469806 ], [ 114.85117278, 31.13488908 ], [ 114.85172376, 31.13506998 ], [ 114.85178388, 31.1350901 ], [ 114.85209456, 31.13520057 ], [ 114.85241514, 31.13533107 ], [ 114.8529762, 31.13555193 ], [ 114.85301634, 31.135572 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145288", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675176", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795315", "enodeid": "2795318", "funcclass": "1", "length": "10.257", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.75635814, 31.10106623 ], [ 114.7578588, 31.10133668 ], [ 114.75901926, 31.10153702 ], [ 114.75969966, 31.1016272 ], [ 114.7598298, 31.10164727 ], [ 114.76135062, 31.10184806 ], [ 114.76290168, 31.10201888 ], [ 114.76435248, 31.10214965 ], [ 114.76674414, 31.10232096 ], [ 114.76939572, 31.10251244 ], [ 114.77229768, 31.10273402 ], [ 114.7741488, 31.10286506 ], [ 114.77417886, 31.10286506 ], [ 114.7757103, 31.10302638 ], [ 114.77689218, 31.10318771 ], [ 114.77820402, 31.10338922 ], [ 114.77962602, 31.1036508 ], [ 114.78125844, 31.10399262 ], [ 114.78260034, 31.10432409 ], [ 114.78372192, 31.10462528 ], [ 114.78549438, 31.10515709 ], [ 114.78628548, 31.1054279 ], [ 114.78716658, 31.10572877 ], [ 114.7885083, 31.1062401 ], [ 114.79008042, 31.10687163 ], [ 114.7910517, 31.10724257 ], [ 114.79186278, 31.10754335 ], [ 114.79318452, 31.10797467 ], [ 114.79422582, 31.10829575 ], [ 114.79600818, 31.1087876 ], [ 114.79701942, 31.10902866 ], [ 114.79764024, 31.10916933 ], [ 114.79899204, 31.10947074 ], [ 114.80196744, 31.11015519 ], [ 114.80420178, 31.11066882 ], [ 114.80514354, 31.11092037 ], [ 114.80597514, 31.11116166 ], [ 114.80657634, 31.11136263 ], [ 114.80711724, 31.11156347 ], [ 114.80765832, 31.11174432 ], [ 114.8087304, 31.11219594 ], [ 114.80927148, 31.11244673 ], [ 114.81033348, 31.1129883 ], [ 114.81119514, 31.1134496 ], [ 114.81265782, 31.1144117 ], [ 114.81270804, 31.11445175 ], [ 114.81287832, 31.114562 ], [ 114.8134194, 31.11495273 ], [ 114.81489216, 31.11609474 ], [ 114.81649524, 31.11730695 ], [ 114.81706638, 31.11771771 ], [ 114.817878, 31.11825888 ], [ 114.81898014, 31.11891048 ], [ 114.81966144, 31.11928151 ], [ 114.82019244, 31.11955232 ], [ 114.82103412, 31.1199336 ], [ 114.82156512, 31.12015442 ], [ 114.82245684, 31.12050582 ], [ 114.82357914, 31.12089759 ], [ 114.82417026, 31.12107854 ], [ 114.82483158, 31.12125962 ], [ 114.82559298, 31.12146086 ], [ 114.8266251, 31.12173257 ], [ 114.82734654, 31.12192373 ], [ 114.82846866, 31.12225556 ], [ 114.82884936, 31.12237616 ], [ 114.82928028, 31.12252686 ], [ 114.82937046, 31.122567 ], [ 114.82968096, 31.12267748 ], [ 114.83037234, 31.12296854 ], [ 114.83112384, 31.12331967 ], [ 114.83141436, 31.12347011 ], [ 114.83164494, 31.12360047 ], [ 114.83237628, 31.12401155 ], [ 114.83269686, 31.12421202 ], [ 114.83309772, 31.12446258 ], [ 114.83385912, 31.12500366 ], [ 114.83441028, 31.1254344 ], [ 114.83492112, 31.12587509 ], [ 114.83542224, 31.12633571 ], [ 114.83605332, 31.12697651 ], [ 114.837426, 31.12844814 ], [ 114.83800704, 31.12906883 ], [ 114.83842788, 31.12945938 ], [ 114.839019, 31.12999016 ], [ 114.83981046, 31.13062119 ], [ 114.84050184, 31.13111219 ], [ 114.84092268, 31.13138277 ], [ 114.84130338, 31.13161331 ], [ 114.8421951, 31.13209467 ], [ 114.84290646, 31.13244572 ], [ 114.84358776, 31.13273678 ], [ 114.84403866, 31.13290751 ], [ 114.84497052, 31.13323898 ], [ 114.84569196, 31.13345012 ], [ 114.84668394, 31.13370176 ], [ 114.84858762, 31.1341149 ], [ 114.8500305, 31.13443733 ], [ 114.85052154, 31.13455811 ], [ 114.85129302, 31.13477937 ], [ 114.85171386, 31.13492004 ], [ 114.85196424, 31.13501045 ], [ 114.85222488, 31.13510085 ], [ 114.8526657, 31.13528153 ], [ 114.85308654, 31.13545221 ], [ 114.85365768, 31.13571308 ], [ 114.85367766, 31.13572311 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145289", "Name": null, "pyname": null, "mapid": "465456", "id": "3675177", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2795320", "enodeid": "2795322", "funcclass": "5", "length": "0.154", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86104776, 31.14049028 ], [ 114.86060748, 31.14031001 ], [ 114.86023704, 31.14011979 ], [ 114.85962666, 31.13981942 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145290", "Name": null, "pyname": null, "mapid": "465456", "id": "3675178", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2795322", "enodeid": "2795321", "funcclass": "5", "length": "0.652", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85962666, 31.13981942 ], [ 114.85908612, 31.13952912 ], [ 114.85882584, 31.13936897 ], [ 114.85830546, 31.13906864 ], [ 114.8580351, 31.13895843 ], [ 114.8577048, 31.13880813 ], [ 114.85741446, 31.1386379 ], [ 114.85694394, 31.1383175 ], [ 114.85654308, 31.13803697 ], [ 114.8562225, 31.13781651 ], [ 114.85605222, 31.13767629 ], [ 114.855912, 31.13753612 ], [ 114.85580166, 31.13737601 ], [ 114.85566144, 31.13723583 ], [ 114.85551114, 31.13712558 ], [ 114.85518048, 31.13687516 ], [ 114.85488996, 31.13668472 ], [ 114.85459944, 31.13649432 ], [ 114.85451934, 31.13642421 ], [ 114.85428876, 31.13619395 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145291", "Name": null, "pyname": null, "mapid": "465456", "id": "3675179", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2795318", "enodeid": "2795323", "funcclass": "5", "length": "0.204", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85367766, 31.13572311 ], [ 114.85380798, 31.1357633 ], [ 114.8539482, 31.13582351 ], [ 114.8545593, 31.13608446 ], [ 114.85517058, 31.13638538 ], [ 114.85556136, 31.13659598 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145292", "Name": null, "pyname": null, "mapid": "465456", "id": "3675180", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2795323", "enodeid": "2795319", "funcclass": "5", "length": "0.542", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85556136, 31.13659598 ], [ 114.85574172, 31.13669624 ], [ 114.85627272, 31.13699702 ], [ 114.8568237, 31.13726787 ], [ 114.8571441, 31.13742816 ], [ 114.85743444, 31.13759831 ], [ 114.85792476, 31.13795858 ], [ 114.8583753, 31.13828883 ], [ 114.85863558, 31.13854898 ], [ 114.85877562, 31.13877902 ], [ 114.85892592, 31.13893908 ], [ 114.85915614, 31.13911922 ], [ 114.85954638, 31.13940947 ], [ 114.85974654, 31.13955954 ], [ 114.85988676, 31.13969963 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145293", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675181", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795317", "enodeid": "2795324", "funcclass": "1", "length": "0.062", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85301634, 31.135572 ], [ 114.85359756, 31.13583291 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145294", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675182", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795324", "enodeid": "2795321", "funcclass": "1", "length": "0.077", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85359756, 31.13583291 ], [ 114.85428876, 31.13619395 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145295", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675183", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795318", "enodeid": "2795325", "funcclass": "1", "length": "0.080", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85367766, 31.13572311 ], [ 114.8543991, 31.13609418 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145296", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675184", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795326", "enodeid": "2795320", "funcclass": "1", "length": "0.145", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8597667, 31.13978954 ], [ 114.86023704, 31.1400698 ], [ 114.86104776, 31.14049028 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145297", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675185", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795319", "enodeid": "2795327", "funcclass": "1", "length": "0.142", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85988676, 31.13969963 ], [ 114.86032704, 31.13995991 ], [ 114.86114784, 31.14039038 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145298", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675186", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795327", "enodeid": "2795316", "funcclass": "1", "length": "0.059", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86114784, 31.14039038 ], [ 114.86124792, 31.14044046 ], [ 114.86169828, 31.14064071 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145299", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675187", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795320", "enodeid": "2795328", "funcclass": "1", "length": "0.021", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86104776, 31.14049028 ], [ 114.86116782, 31.14056039 ], [ 114.86123802, 31.1405904 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145300", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675188", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795328", "enodeid": "10002881810", "funcclass": "1", "length": "0.876", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86123802, 31.1405904 ], [ 114.86198862, 31.14093087 ], [ 114.8627592, 31.14124137 ], [ 114.8630193, 31.14132152 ], [ 114.86362986, 31.14153189 ], [ 114.8644404, 31.14178241 ], [ 114.86583162, 31.1421933 ], [ 114.8666121, 31.1424138 ], [ 114.86748276, 31.14264438 ], [ 114.86986452, 31.14329594 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145301", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675189", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795321", "enodeid": "2795329", "funcclass": "1", "length": "0.152", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.85428876, 31.13619395 ], [ 114.85431882, 31.13620398 ], [ 114.8547096, 31.13641458 ], [ 114.8551605, 31.13667522 ], [ 114.8556114, 31.13696588 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145302", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675190", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795329", "enodeid": "2795326", "funcclass": "1", "length": "0.504", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8556114, 31.13696588 ], [ 114.85567152, 31.13700597 ], [ 114.85672362, 31.13772746 ], [ 114.85849554, 31.13898881 ], [ 114.85940634, 31.13957934 ], [ 114.8597667, 31.13978954 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.145303", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "3675192", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795330", "enodeid": "2795319", "funcclass": "1", "length": "0.033", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8596065, 31.13952948 ], [ 114.85988676, 31.13969963 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146615", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752698", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881758", "enodeid": "2881760", "funcclass": "1", "length": "0.459", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93745056, 31.15247778 ], [ 114.9375501, 31.15210761 ], [ 114.93759996, 31.15189751 ], [ 114.93767952, 31.15160739 ], [ 114.93778932, 31.1511074 ], [ 114.9379092, 31.15058747 ], [ 114.938019, 31.15006758 ], [ 114.9382386, 31.14878787 ], [ 114.93825858, 31.14872784 ], [ 114.93825858, 31.14867789 ], [ 114.93829836, 31.14840794 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146616", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752699", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881756", "enodeid": "2881762", "funcclass": "1", "length": "0.194", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93850824, 31.14591894 ], [ 114.93849834, 31.14578907 ], [ 114.93845838, 31.14547934 ], [ 114.93834894, 31.14482999 ], [ 114.93832896, 31.14475007 ], [ 114.93821934, 31.14421065 ], [ 114.93821934, 31.14419067 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146617", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752707", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881761", "enodeid": "2881767", "funcclass": "1", "length": "0.100", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93865782, 31.14592862 ], [ 114.93863784, 31.14577877 ], [ 114.93859806, 31.14546903 ], [ 114.9385284, 31.14503946 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146618", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752708", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881767", "enodeid": "2881747", "funcclass": "1", "length": "0.098", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9385284, 31.14503946 ], [ 114.93848844, 31.14481968 ], [ 114.93847854, 31.14473976 ], [ 114.93835902, 31.14417038 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146619", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752711", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881770", "enodeid": "2881771", "funcclass": "1", "length": "0.394", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93566046, 31.10862645 ], [ 114.93566046, 31.10860643 ], [ 114.9356205, 31.10848655 ], [ 114.93550062, 31.10813685 ], [ 114.93543078, 31.10793705 ], [ 114.93525114, 31.10740749 ], [ 114.93505134, 31.10688797 ], [ 114.93484182, 31.10634846 ], [ 114.93438246, 31.10525951 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146620", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752712", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881769", "enodeid": "2881772", "funcclass": "1", "length": "0.396", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93553068, 31.10867654 ], [ 114.9355107, 31.10863658 ], [ 114.93548064, 31.10850671 ], [ 114.93536094, 31.10815701 ], [ 114.9352911, 31.10795717 ], [ 114.93510138, 31.10742765 ], [ 114.93490158, 31.10690813 ], [ 114.9342426, 31.10528966 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146621", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752713", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881772", "enodeid": "2881773", "funcclass": "1", "length": "1.476", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9342426, 31.10528966 ], [ 114.93394308, 31.10456034 ], [ 114.9339132, 31.10449041 ], [ 114.93372348, 31.10402084 ], [ 114.9334938, 31.10348133 ], [ 114.93329418, 31.10299182 ], [ 114.93297468, 31.10220257 ], [ 114.93278496, 31.101683 ], [ 114.93267516, 31.10141327 ], [ 114.93259524, 31.10117346 ], [ 114.93240552, 31.10059395 ], [ 114.93223578, 31.10002443 ], [ 114.93207612, 31.09943493 ], [ 114.9320061, 31.09918514 ], [ 114.93185634, 31.09852562 ], [ 114.93176652, 31.09805595 ], [ 114.93174654, 31.09790606 ], [ 114.93170676, 31.09769618 ], [ 114.9316668, 31.09747635 ], [ 114.93157698, 31.09691673 ], [ 114.93153702, 31.09659696 ], [ 114.93143712, 31.09553762 ], [ 114.93138726, 31.09478805 ], [ 114.93136746, 31.09439835 ], [ 114.93134748, 31.0940186 ], [ 114.9313077, 31.09316922 ], [ 114.93126792, 31.09235976 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146622", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752714", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881771", "enodeid": "2881774", "funcclass": "1", "length": "1.471", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93438246, 31.10525951 ], [ 114.93408294, 31.10453019 ], [ 114.93405288, 31.10446026 ], [ 114.93386334, 31.10400068 ], [ 114.93364356, 31.10345123 ], [ 114.93343386, 31.10296167 ], [ 114.93311436, 31.10217242 ], [ 114.93292482, 31.10165289 ], [ 114.93282492, 31.10138312 ], [ 114.9327351, 31.10115335 ], [ 114.93255528, 31.10057384 ], [ 114.93237564, 31.10000432 ], [ 114.93222588, 31.09942476 ], [ 114.93215604, 31.09917497 ], [ 114.93200628, 31.09851545 ], [ 114.93190638, 31.09804583 ], [ 114.9318864, 31.09790592 ], [ 114.93185652, 31.09768605 ], [ 114.93180648, 31.09741623 ], [ 114.93179658, 31.09736628 ], [ 114.93172674, 31.09690661 ], [ 114.93167688, 31.09658679 ], [ 114.93157698, 31.09552745 ], [ 114.93152712, 31.09478792 ], [ 114.93150714, 31.09438818 ], [ 114.93149724, 31.09401842 ], [ 114.93144756, 31.09315905 ], [ 114.93141768, 31.09236957 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146623", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752715", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881773", "enodeid": "2881775", "funcclass": "1", "length": "0.707", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93126792, 31.09235976 ], [ 114.93124812, 31.09188011 ], [ 114.93119826, 31.09100072 ], [ 114.93118836, 31.09070093 ], [ 114.93115848, 31.09008137 ], [ 114.9311187, 31.08913205 ], [ 114.93109872, 31.08865235 ], [ 114.93108882, 31.08827264 ], [ 114.93104904, 31.08761307 ], [ 114.93103914, 31.08734325 ], [ 114.93101916, 31.08681365 ], [ 114.93098928, 31.08630402 ], [ 114.93096948, 31.0859942 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146624", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752716", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881775", "enodeid": "20003289623", "funcclass": "1", "length": "0.034", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93096948, 31.0859942 ], [ 114.93096948, 31.08592427 ], [ 114.9309495, 31.08572438 ], [ 114.9309495, 31.08568442 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146625", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752717", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881774", "enodeid": "2881776", "funcclass": "1", "length": "0.708", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93141768, 31.09236957 ], [ 114.9313878, 31.09186994 ], [ 114.93134802, 31.09100054 ], [ 114.93133812, 31.09070075 ], [ 114.93130824, 31.0900712 ], [ 114.93126846, 31.08913187 ], [ 114.93123858, 31.08865221 ], [ 114.93122868, 31.08827246 ], [ 114.9311988, 31.08761289 ], [ 114.93117882, 31.08734312 ], [ 114.93115902, 31.08681347 ], [ 114.93112914, 31.08630384 ], [ 114.93111924, 31.08599402 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146626", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3752718", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881776", "enodeid": "20003289626", "funcclass": "1", "length": "0.034", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93111924, 31.08599402 ], [ 114.93110916, 31.08592409 ], [ 114.93109926, 31.08571421 ], [ 114.93109926, 31.08568424 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146634", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754269", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002881810", "enodeid": "2881812", "funcclass": "1", "length": "2.930", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86986452, 31.14329594 ], [ 114.87103542, 31.14360666 ], [ 114.87172608, 31.14378711 ], [ 114.87344724, 31.14424823 ], [ 114.8743881, 31.14453884 ], [ 114.87446802, 31.14455891 ], [ 114.87475836, 31.14465908 ], [ 114.87496842, 31.14474921 ], [ 114.87628962, 31.14534002 ], [ 114.87670992, 31.14556029 ], [ 114.8772204, 31.14586058 ], [ 114.87759066, 31.14610079 ], [ 114.87834144, 31.14665123 ], [ 114.87910212, 31.14726165 ], [ 114.87958254, 31.14775188 ], [ 114.87975282, 31.14793197 ], [ 114.88007304, 31.14828212 ], [ 114.88048344, 31.1488223 ], [ 114.8808339, 31.14933246 ], [ 114.88138452, 31.1502227 ], [ 114.88198536, 31.15125293 ], [ 114.88215546, 31.15153301 ], [ 114.8825259, 31.15208313 ], [ 114.88290642, 31.15256333 ], [ 114.88336686, 31.15309356 ], [ 114.8838174, 31.15355378 ], [ 114.88401756, 31.15376388 ], [ 114.88443786, 31.15412411 ], [ 114.88486824, 31.15445436 ], [ 114.88537872, 31.15479465 ], [ 114.8860593, 31.15525505 ], [ 114.88733046, 31.1560358 ], [ 114.88760082, 31.15620594 ], [ 114.88768074, 31.15625598 ], [ 114.88848156, 31.15674644 ], [ 114.88948236, 31.15738701 ], [ 114.89029308, 31.15794749 ], [ 114.89067342, 31.15824768 ], [ 114.89100372, 31.1585279 ], [ 114.89139414, 31.15888808 ], [ 114.89189472, 31.15939833 ], [ 114.89246532, 31.16005862 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146635", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754270", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002881811", "enodeid": "2881813", "funcclass": "1", "length": "2.943", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.86986452, 31.14315594 ], [ 114.87109554, 31.14347675 ], [ 114.87178602, 31.1436572 ], [ 114.87343716, 31.14410828 ], [ 114.87445812, 31.14441891 ], [ 114.87453804, 31.14444897 ], [ 114.87476826, 31.14452912 ], [ 114.87501846, 31.14461925 ], [ 114.87641958, 31.14524012 ], [ 114.87679992, 31.14544037 ], [ 114.87725028, 31.14571064 ], [ 114.87771072, 31.14601088 ], [ 114.8784714, 31.14657131 ], [ 114.8792022, 31.14717174 ], [ 114.87971268, 31.147682 ], [ 114.87992292, 31.1478921 ], [ 114.88015314, 31.1481522 ], [ 114.88066362, 31.14881244 ], [ 114.88094388, 31.14923256 ], [ 114.88152474, 31.15017279 ], [ 114.8821254, 31.15120302 ], [ 114.88224564, 31.15139306 ], [ 114.882696, 31.15205325 ], [ 114.88299642, 31.1524434 ], [ 114.88353696, 31.15306368 ], [ 114.88388724, 31.15343385 ], [ 114.88417758, 31.15370399 ], [ 114.88451796, 31.15400418 ], [ 114.88492836, 31.1543244 ], [ 114.88548888, 31.15470474 ], [ 114.88616946, 31.15514511 ], [ 114.88704012, 31.15568565 ], [ 114.88762062, 31.15605596 ], [ 114.88778082, 31.15615608 ], [ 114.88858146, 31.15665653 ], [ 114.88959234, 31.1572971 ], [ 114.89041314, 31.15785758 ], [ 114.89073354, 31.15810778 ], [ 114.89125392, 31.15855805 ], [ 114.89147424, 31.15875816 ], [ 114.89202468, 31.15930847 ], [ 114.89259528, 31.15996871 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146636", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754271", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881812", "enodeid": "2881814", "funcclass": "1", "length": "0.266", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89246532, 31.16005862 ], [ 114.89358636, 31.16133918 ], [ 114.894117, 31.16189943 ], [ 114.89417712, 31.16194947 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146637", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754272", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881814", "enodeid": "10002908592", "funcclass": "1", "length": "1.313", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89417712, 31.16194947 ], [ 114.89446728, 31.16221961 ], [ 114.895098, 31.16277995 ], [ 114.89553828, 31.16314022 ], [ 114.89596866, 31.16347043 ], [ 114.89690898, 31.16408045 ], [ 114.89849856, 31.16502 ], [ 114.9011181, 31.16656926 ], [ 114.90520752, 31.16899814 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146638", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754273", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881813", "enodeid": "2881815", "funcclass": "1", "length": "0.266", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.89259528, 31.15996871 ], [ 114.89374656, 31.16129927 ], [ 114.89419692, 31.16177951 ], [ 114.894297, 31.16186955 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146639", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465457", "id": "3754274", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881815", "enodeid": "10002908590", "funcclass": "1", "length": "1.335", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.894297, 31.16186955 ], [ 114.89462748, 31.16217974 ], [ 114.89513796, 31.16262002 ], [ 114.89566842, 31.1630603 ], [ 114.89602878, 31.16333052 ], [ 114.89700888, 31.1639805 ], [ 114.89860872, 31.16492006 ], [ 114.90122826, 31.16646936 ], [ 114.90554736, 31.16899818 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146640", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754278", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881762", "enodeid": "2881816", "funcclass": "1", "length": "0.187", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93821934, 31.14419067 ], [ 114.9381297, 31.14379112 ], [ 114.93808974, 31.14358133 ], [ 114.93795024, 31.143002 ], [ 114.9378606, 31.14265244 ], [ 114.93782082, 31.14254259 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146641", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754279", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881816", "enodeid": "2881769", "funcclass": "1", "length": "3.818", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93782082, 31.14254259 ], [ 114.93777096, 31.14237281 ], [ 114.93768114, 31.14208319 ], [ 114.9375816, 31.1417636 ], [ 114.93748188, 31.14146403 ], [ 114.93737226, 31.14114449 ], [ 114.93726264, 31.14083493 ], [ 114.93715302, 31.14055535 ], [ 114.93702342, 31.14018585 ], [ 114.93695358, 31.13998614 ], [ 114.93684396, 31.13968658 ], [ 114.93681408, 31.1396067 ], [ 114.93673434, 31.13941698 ], [ 114.93663462, 31.1391374 ], [ 114.9365349, 31.13885777 ], [ 114.93642528, 31.13856824 ], [ 114.93631566, 31.13827866 ], [ 114.93620604, 31.13798909 ], [ 114.93609642, 31.13769951 ], [ 114.93607644, 31.13762958 ], [ 114.9359967, 31.13740989 ], [ 114.93588708, 31.13711033 ], [ 114.9358473, 31.13701052 ], [ 114.93577746, 31.13682075 ], [ 114.93566784, 31.1365112 ], [ 114.9355782, 31.13622158 ], [ 114.93547848, 31.13590203 ], [ 114.9354486, 31.13577216 ], [ 114.93538884, 31.13557241 ], [ 114.93529902, 31.13524283 ], [ 114.93521928, 31.13490321 ], [ 114.93515952, 31.13464347 ], [ 114.93513954, 31.13455356 ], [ 114.9350697, 31.1341838 ], [ 114.93500976, 31.13384405 ], [ 114.93494982, 31.13342433 ], [ 114.93489006, 31.13295462 ], [ 114.93486, 31.1325449 ], [ 114.93486, 31.13251488 ], [ 114.93483012, 31.13208513 ], [ 114.93482022, 31.1316354 ], [ 114.93482022, 31.13115566 ], [ 114.9348303, 31.13079584 ], [ 114.9348402, 31.1306459 ], [ 114.93486018, 31.13018609 ], [ 114.93490014, 31.12965635 ], [ 114.93495018, 31.12914654 ], [ 114.93499014, 31.12882668 ], [ 114.93501012, 31.12858679 ], [ 114.93505008, 31.12809701 ], [ 114.93511002, 31.12755719 ], [ 114.93516006, 31.12703744 ], [ 114.93516996, 31.12692746 ], [ 114.93522, 31.12649762 ], [ 114.93526986, 31.12595789 ], [ 114.9353199, 31.12539809 ], [ 114.93538974, 31.12484832 ], [ 114.93542988, 31.12429856 ], [ 114.93548982, 31.12379874 ], [ 114.93553968, 31.12317905 ], [ 114.93557964, 31.12289915 ], [ 114.93559962, 31.12261925 ], [ 114.9356196, 31.12242935 ], [ 114.93565956, 31.12205949 ], [ 114.9357195, 31.12147971 ], [ 114.93577944, 31.12095992 ], [ 114.93583938, 31.12038018 ], [ 114.93587952, 31.12000034 ], [ 114.9358995, 31.11983037 ], [ 114.93594936, 31.11927062 ], [ 114.9359994, 31.11870087 ], [ 114.93606924, 31.11814107 ], [ 114.9360993, 31.11777126 ], [ 114.93611928, 31.11758132 ], [ 114.93617922, 31.11702156 ], [ 114.93622908, 31.11645177 ], [ 114.93627912, 31.11589202 ], [ 114.93631908, 31.11532227 ], [ 114.93634914, 31.11476256 ], [ 114.93635904, 31.11457262 ], [ 114.93635904, 31.11423282 ], [ 114.93634914, 31.11369309 ], [ 114.93632916, 31.1131634 ], [ 114.93629928, 31.11269369 ], [ 114.9362793, 31.1124438 ], [ 114.93621954, 31.11193413 ], [ 114.93620946, 31.11176426 ], [ 114.93617958, 31.1115344 ], [ 114.93613962, 31.11128456 ], [ 114.93606978, 31.11089486 ], [ 114.93596988, 31.11038519 ], [ 114.93587016, 31.10991557 ], [ 114.93580014, 31.10965574 ], [ 114.9357402, 31.10940594 ], [ 114.9356205, 31.10897628 ], [ 114.93553068, 31.10867654 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146642", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754280", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881747", "enodeid": "2881817", "funcclass": "1", "length": "0.035", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93835902, 31.14417038 ], [ 114.93829908, 31.14386069 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146643", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754281", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881817", "enodeid": "2881770", "funcclass": "1", "length": "3.974", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93829908, 31.14386069 ], [ 114.93827928, 31.14378077 ], [ 114.93822942, 31.14357102 ], [ 114.93808992, 31.1429817 ], [ 114.93800028, 31.14263214 ], [ 114.93792054, 31.14234248 ], [ 114.93783072, 31.14206285 ], [ 114.93773118, 31.1417433 ], [ 114.93763146, 31.14144369 ], [ 114.93751176, 31.14112415 ], [ 114.93740214, 31.14081459 ], [ 114.93729252, 31.14053501 ], [ 114.93716292, 31.14016556 ], [ 114.93709326, 31.13996585 ], [ 114.93699354, 31.13966624 ], [ 114.93695376, 31.13958636 ], [ 114.93688392, 31.13938665 ], [ 114.9367842, 31.13911706 ], [ 114.93667458, 31.13882748 ], [ 114.93657486, 31.13853791 ], [ 114.93646524, 31.13824833 ], [ 114.93635562, 31.13796875 ], [ 114.936246, 31.13767917 ], [ 114.93621612, 31.13760929 ], [ 114.93613638, 31.13737961 ], [ 114.93602676, 31.13709003 ], [ 114.93599688, 31.13698019 ], [ 114.93591714, 31.13679047 ], [ 114.93581742, 31.13649086 ], [ 114.93572778, 31.13622126 ], [ 114.9357177, 31.13619129 ], [ 114.93562806, 31.13588169 ], [ 114.9355881, 31.13576186 ], [ 114.93552834, 31.13555211 ], [ 114.9354486, 31.13523248 ], [ 114.93535896, 31.13489291 ], [ 114.9352992, 31.13462322 ], [ 114.93527922, 31.13453331 ], [ 114.93521946, 31.13417367 ], [ 114.93514962, 31.13383392 ], [ 114.93508968, 31.13341421 ], [ 114.93503982, 31.1329445 ], [ 114.93500994, 31.13253473 ], [ 114.93500994, 31.13251475 ], [ 114.93497988, 31.132085 ], [ 114.93496008, 31.13163527 ], [ 114.93496998, 31.13115548 ], [ 114.93496998, 31.13079566 ], [ 114.93498006, 31.13064572 ], [ 114.93500004, 31.13019594 ], [ 114.9350499, 31.12966616 ], [ 114.93509004, 31.12914641 ], [ 114.93513, 31.1288265 ], [ 114.93515988, 31.1285966 ], [ 114.93519984, 31.12810682 ], [ 114.93525978, 31.12755705 ], [ 114.93529974, 31.12704729 ], [ 114.93531972, 31.12693731 ], [ 114.93536976, 31.12650747 ], [ 114.93541962, 31.12595771 ], [ 114.93546966, 31.12540794 ], [ 114.9355296, 31.12485818 ], [ 114.93557964, 31.12430841 ], [ 114.9356295, 31.12379861 ], [ 114.93568944, 31.12318886 ], [ 114.9357195, 31.12289897 ], [ 114.93574938, 31.1226291 ], [ 114.93576936, 31.12243916 ], [ 114.93580932, 31.1220693 ], [ 114.93586944, 31.12148957 ], [ 114.9359193, 31.12096977 ], [ 114.93597924, 31.12038999 ], [ 114.93602928, 31.11998018 ], [ 114.93603918, 31.11983024 ], [ 114.93608922, 31.11927048 ], [ 114.93614916, 31.11871073 ], [ 114.9362091, 31.11815093 ], [ 114.93624906, 31.11777108 ], [ 114.93626904, 31.11758118 ], [ 114.93632898, 31.11702138 ], [ 114.93636894, 31.11645164 ], [ 114.93641898, 31.11590187 ], [ 114.93645894, 31.11533213 ], [ 114.93648882, 31.11476238 ], [ 114.9364989, 31.11457248 ], [ 114.93650898, 31.11423264 ], [ 114.936489, 31.11369296 ], [ 114.9364791, 31.11316322 ], [ 114.93644904, 31.11268352 ], [ 114.93641916, 31.11243368 ], [ 114.9363693, 31.111934 ], [ 114.93634932, 31.11177411 ], [ 114.93631926, 31.11152427 ], [ 114.93627948, 31.11127443 ], [ 114.93621954, 31.11088469 ], [ 114.93610974, 31.11037506 ], [ 114.93601992, 31.1099054 ], [ 114.9359499, 31.10963562 ], [ 114.93589014, 31.10939582 ], [ 114.93577026, 31.10896616 ], [ 114.93566046, 31.10862645 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146644", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754282", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881759", "enodeid": "2881818", "funcclass": "1", "length": "0.219", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93759024, 31.15250748 ], [ 114.93768978, 31.15211729 ], [ 114.93774954, 31.15190718 ], [ 114.9378192, 31.15161702 ], [ 114.9379389, 31.15111703 ], [ 114.93805878, 31.15060709 ], [ 114.93805878, 31.15057712 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146645", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754283", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881818", "enodeid": "2881748", "funcclass": "1", "length": "0.242", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93805878, 31.15057712 ], [ 114.93816858, 31.15007721 ], [ 114.93839808, 31.14876749 ], [ 114.93839808, 31.14873752 ], [ 114.93840816, 31.14865755 ], [ 114.93843804, 31.14841761 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146646", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754284", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881819", "enodeid": "2881758", "funcclass": "1", "length": "0.024", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9373908, 31.15268789 ], [ 114.93741078, 31.15260788 ], [ 114.93745056, 31.15247778 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146647", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754285", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881748", "enodeid": "2881820", "funcclass": "1", "length": "0.044", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93843804, 31.14841761 ], [ 114.9384879, 31.14802773 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146648", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754286", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881820", "enodeid": "2881761", "funcclass": "1", "length": "0.234", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9384879, 31.14802773 ], [ 114.93854784, 31.14752792 ], [ 114.93866772, 31.14609849 ], [ 114.93865782, 31.14592862 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146649", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754287", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881760", "enodeid": "2881821", "funcclass": "1", "length": "0.112", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93829836, 31.14840794 ], [ 114.93840834, 31.14751824 ], [ 114.93841824, 31.14740826 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146650", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754288", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881821", "enodeid": "2881756", "funcclass": "1", "length": "0.166", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93841824, 31.14740826 ], [ 114.93852822, 31.14609881 ], [ 114.93850824, 31.14591894 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146651", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754289", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881822", "enodeid": "2881819", "funcclass": "1", "length": "0.181", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93692262, 31.15426878 ], [ 114.93697248, 31.15411871 ], [ 114.93711198, 31.15361844 ], [ 114.9372315, 31.1532282 ], [ 114.93726138, 31.15312817 ], [ 114.9373908, 31.15268789 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146652", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754290", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881823", "enodeid": "2881759", "funcclass": "1", "length": "0.205", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9370623, 31.15429848 ], [ 114.93711216, 31.15413837 ], [ 114.93726156, 31.15363806 ], [ 114.937371, 31.15324787 ], [ 114.93740088, 31.15314783 ], [ 114.93756036, 31.1526275 ], [ 114.93759024, 31.15250748 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146653", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754291", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10002908562", "enodeid": "2881824", "funcclass": "1", "length": "1.208", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93453582, 31.16897474 ], [ 114.93450594, 31.16867495 ], [ 114.93448614, 31.16845512 ], [ 114.93446616, 31.16820533 ], [ 114.93443628, 31.16793555 ], [ 114.9344163, 31.16761574 ], [ 114.9343965, 31.16728598 ], [ 114.93437652, 31.16694623 ], [ 114.93437652, 31.16684628 ], [ 114.93436662, 31.16657646 ], [ 114.9343668, 31.16618667 ], [ 114.9343767, 31.16605676 ], [ 114.9343767, 31.16578689 ], [ 114.93437688, 31.16546708 ], [ 114.93438678, 31.16537712 ], [ 114.93439686, 31.16503733 ], [ 114.93441684, 31.16475743 ], [ 114.93443682, 31.16453751 ], [ 114.93446688, 31.16418768 ], [ 114.93446688, 31.16409773 ], [ 114.93451674, 31.16366789 ], [ 114.93456678, 31.16322806 ], [ 114.93463662, 31.16277819 ], [ 114.93470664, 31.16231834 ], [ 114.93478656, 31.16185844 ], [ 114.93488628, 31.16139854 ], [ 114.93499626, 31.1609286 ], [ 114.93511596, 31.16043864 ], [ 114.93525582, 31.15991871 ], [ 114.93541548, 31.15936872 ], [ 114.93555516, 31.15887876 ], [ 114.9356151, 31.15866879 ], [ 114.935715, 31.15834875 ], [ 114.93575478, 31.1582088 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146654", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754292", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881824", "enodeid": "2881822", "funcclass": "1", "length": "0.452", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93575478, 31.1582088 ], [ 114.93586476, 31.1578088 ], [ 114.93602442, 31.1573088 ], [ 114.93619416, 31.15673883 ], [ 114.93635382, 31.15618884 ], [ 114.93651348, 31.15563885 ], [ 114.93668322, 31.15507887 ], [ 114.9367032, 31.1550089 ], [ 114.936813, 31.15462892 ], [ 114.93692262, 31.15426878 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146655", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754293", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10002908561", "enodeid": "2881825", "funcclass": "1", "length": "1.205", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93468558, 31.16897447 ], [ 114.93468558, 31.16895449 ], [ 114.93464562, 31.16866473 ], [ 114.93462582, 31.16845485 ], [ 114.93460584, 31.16820506 ], [ 114.93458586, 31.16792525 ], [ 114.93455598, 31.16761551 ], [ 114.93453618, 31.16727572 ], [ 114.93452628, 31.16694596 ], [ 114.9345162, 31.16684601 ], [ 114.93451638, 31.16657619 ], [ 114.93451638, 31.1661864 ], [ 114.93451638, 31.16605649 ], [ 114.93452646, 31.16578662 ], [ 114.93452646, 31.16546681 ], [ 114.93452646, 31.16537685 ], [ 114.93454644, 31.165047 ], [ 114.93455652, 31.16475716 ], [ 114.9345765, 31.16453724 ], [ 114.93460656, 31.16418741 ], [ 114.93461646, 31.16410745 ], [ 114.93465642, 31.16367761 ], [ 114.93471636, 31.16323778 ], [ 114.93478638, 31.16278791 ], [ 114.93485622, 31.16232806 ], [ 114.93493614, 31.16186816 ], [ 114.93502596, 31.16140826 ], [ 114.93513576, 31.16094831 ], [ 114.93526554, 31.16044836 ], [ 114.9354054, 31.15993842 ], [ 114.93555516, 31.15938848 ], [ 114.93570492, 31.15889847 ], [ 114.93576468, 31.1586885 ], [ 114.93585468, 31.15836851 ], [ 114.93589446, 31.1582385 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146656", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465457", "id": "3754294", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2881825", "enodeid": "2881823", "funcclass": "1", "length": "0.452", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93589446, 31.1582385 ], [ 114.93601434, 31.1578385 ], [ 114.9361641, 31.15732851 ], [ 114.93633384, 31.15675854 ], [ 114.9364935, 31.1562086 ], [ 114.93666324, 31.15565856 ], [ 114.93680292, 31.15515861 ], [ 114.9368328, 31.15508859 ], [ 114.93696258, 31.15464863 ], [ 114.9370623, 31.15429848 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146848", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764751", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2940589", "enodeid": "2940590", "funcclass": "1", "length": "0.418", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23898332, 31.18244409 ], [ 115.23994344, 31.18255434 ], [ 115.24225392, 31.18283487 ], [ 115.24273398, 31.18289495 ], [ 115.2433341, 31.1829651 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146849", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764752", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2940590", "enodeid": "10002940586", "funcclass": "1", "length": "0.122", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2433341, 31.1829651 ], [ 115.24370418, 31.18301519 ], [ 115.24452444, 31.18308539 ], [ 115.24460436, 31.18309538 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146850", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764753", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2940588", "enodeid": "2940591", "funcclass": "1", "length": "0.418", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2390033, 31.18232417 ], [ 115.23996342, 31.18243437 ], [ 115.2422739, 31.1827149 ], [ 115.24284396, 31.18278501 ], [ 115.24335408, 31.18284513 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146851", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764754", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2940591", "enodeid": "10002940587", "funcclass": "1", "length": "0.120", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24335408, 31.18284513 ], [ 115.24354416, 31.1828652 ], [ 115.24455432, 31.18295543 ], [ 115.24460436, 31.18296542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146852", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764755", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943592", "enodeid": "2943593", "funcclass": "1", "length": "0.261", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23284226, 31.18224254 ], [ 115.2334224, 31.18220271 ], [ 115.23348234, 31.18220271 ], [ 115.23415248, 31.1821929 ], [ 115.23470256, 31.18218305 ], [ 115.23558276, 31.1822033 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146853", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764756", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943593", "enodeid": "2940589", "funcclass": "1", "length": "0.325", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23558276, 31.1822033 ], [ 115.23602286, 31.18221338 ], [ 115.23762306, 31.18231377 ], [ 115.23859326, 31.18239401 ], [ 115.23898332, 31.18244409 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146854", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764757", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2940592", "enodeid": "2943594", "funcclass": "1", "length": "0.263", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23282228, 31.18211258 ], [ 115.23337236, 31.18208274 ], [ 115.23340224, 31.18208274 ], [ 115.23390246, 31.1820629 ], [ 115.23470256, 31.18205309 ], [ 115.23558276, 31.18207334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146855", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764758", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943594", "enodeid": "2940588", "funcclass": "1", "length": "0.327", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.23558276, 31.18207334 ], [ 115.23604284, 31.18208342 ], [ 115.23763296, 31.18219385 ], [ 115.23846312, 31.182264 ], [ 115.2390033, 31.18232417 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146856", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764759", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943595", "enodeid": "2940592", "funcclass": "1", "length": "0.517", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22746098, 31.1828207 ], [ 115.22857158, 31.18259129 ], [ 115.22990178, 31.18238172 ], [ 115.23189204, 31.1821623 ], [ 115.23282228, 31.18211258 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146857", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764760", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943596", "enodeid": "2943592", "funcclass": "1", "length": "0.516", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22750094, 31.18295066 ], [ 115.2286416, 31.18271126 ], [ 115.2299718, 31.1824917 ], [ 115.23182202, 31.18229226 ], [ 115.23284226, 31.18224254 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146858", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764761", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943597", "enodeid": "2943596", "funcclass": "1", "length": "0.374", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.22376864, 31.18399799 ], [ 115.22457972, 31.18372902 ], [ 115.22516004, 31.18354938 ], [ 115.22594034, 31.18331984 ], [ 115.22715084, 31.1830205 ], [ 115.22750094, 31.18295066 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146859", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764762", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943598", "enodeid": "2943595", "funcclass": "1", "length": "0.377", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2237087, 31.18388796 ], [ 115.22456964, 31.18358907 ], [ 115.22509992, 31.1834394 ], [ 115.22584026, 31.1832198 ], [ 115.22719098, 31.18288055 ], [ 115.22746098, 31.1828207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146860", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764763", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943599", "enodeid": "2943598", "funcclass": "1", "length": "0.542", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21899108, 31.18656992 ], [ 115.21940184, 31.18622067 ], [ 115.22026314, 31.1855922 ], [ 115.2212247, 31.18501386 ], [ 115.22157534, 31.18482446 ], [ 115.22213622, 31.18453542 ], [ 115.22280726, 31.18423653 ], [ 115.22351826, 31.18394768 ], [ 115.2237087, 31.18388796 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146861", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764764", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943600", "enodeid": "2943597", "funcclass": "1", "length": "0.535", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21910124, 31.18664003 ], [ 115.21948194, 31.1863307 ], [ 115.2203733, 31.18569233 ], [ 115.22131488, 31.18511394 ], [ 115.2216855, 31.18491459 ], [ 115.22214612, 31.18467537 ], [ 115.22298744, 31.18430673 ], [ 115.2235584, 31.18406765 ], [ 115.22376864, 31.18399799 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146862", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764765", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943601", "enodeid": "2943599", "funcclass": "1", "length": "0.264", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2171981, 31.1883764 ], [ 115.21745856, 31.18805694 ], [ 115.2182799, 31.18720856 ], [ 115.21847034, 31.18700894 ], [ 115.21899108, 31.18656992 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146863", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764766", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943602", "enodeid": "2943600", "funcclass": "1", "length": "0.259", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21733832, 31.18841654 ], [ 115.21759878, 31.18809708 ], [ 115.21838016, 31.18729865 ], [ 115.21857042, 31.18709903 ], [ 115.21910124, 31.18664003 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146864", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764767", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943604", "enodeid": "2943605", "funcclass": "1", "length": "0.371", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2133515, 31.19364806 ], [ 115.21340154, 31.19359815 ], [ 115.21358172, 31.19344848 ], [ 115.21415268, 31.19289957 ], [ 115.21507428, 31.19183145 ], [ 115.21564542, 31.19096277 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146865", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764768", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943605", "enodeid": "2943602", "funcclass": "1", "length": "0.326", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21564542, 31.19096277 ], [ 115.21578564, 31.19075307 ], [ 115.2165069, 31.18954478 ], [ 115.21698768, 31.18884584 ], [ 115.21733832, 31.18841654 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146866", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764769", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943603", "enodeid": "2943606", "funcclass": "1", "length": "0.477", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2132813, 31.193528 ], [ 115.21341162, 31.19341824 ], [ 115.21344168, 31.19338832 ], [ 115.21403262, 31.19281947 ], [ 115.21493406, 31.19178128 ], [ 115.21568538, 31.190643 ], [ 115.21607616, 31.18998389 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146867", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764770", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943606", "enodeid": "2943601", "funcclass": "1", "length": "0.208", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21607616, 31.18998389 ], [ 115.2163467, 31.18954455 ], [ 115.21691766, 31.18872578 ], [ 115.2171981, 31.1883764 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146868", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764771", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943607", "enodeid": "2943604", "funcclass": "1", "length": "0.037", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21310094, 31.19390753 ], [ 115.2133515, 31.19364806 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146869", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764772", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943608", "enodeid": "2943603", "funcclass": "1", "length": "0.046", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21292076, 31.19379737 ], [ 115.2132813, 31.193528 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146870", "Name": "G42-侧路潭隧道", "pyname": "g42-cltsd", "mapid": "465561", "id": "3764773", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943609", "enodeid": "2943607", "funcclass": "1", "length": "0.303", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003764773" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21050678, 31.19547303 ], [ 115.21057698, 31.19544315 ], [ 115.21147842, 31.19500467 ], [ 115.21224954, 31.194536 ], [ 115.21275048, 31.19418689 ], [ 115.21301094, 31.19399735 ], [ 115.21310094, 31.19390753 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146871", "Name": "G42-侧路潭隧道", "pyname": "g42-cltsd", "mapid": "465561", "id": "3764774", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943610", "enodeid": "2943608", "funcclass": "1", "length": "0.356", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003764774" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.20983592, 31.19559206 ], [ 115.21049688, 31.19531315 ], [ 115.2107073, 31.19520348 ], [ 115.21116792, 31.19491427 ], [ 115.21174896, 31.19454531 ], [ 115.21263024, 31.19397687 ], [ 115.21292076, 31.19379737 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146872", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764775", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943611", "enodeid": "2943609", "funcclass": "1", "length": "0.041", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003764775" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.21011618, 31.19562243 ], [ 115.21050678, 31.19547303 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146873", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3764776", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943612", "enodeid": "2943611", "funcclass": "1", "length": "1.694", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1943147, 31.2022094 ], [ 115.19488548, 31.20183027 ], [ 115.19647758, 31.20078267 ], [ 115.19803962, 31.199765 ], [ 115.19923122, 31.19905679 ], [ 115.2003627, 31.19847845 ], [ 115.20170442, 31.19789034 ], [ 115.20290592, 31.19745204 ], [ 115.20420768, 31.19707382 ], [ 115.20551952, 31.19677556 ], [ 115.20700146, 31.19649759 ], [ 115.20840366, 31.19619974 ], [ 115.2094653, 31.19588136 ], [ 115.21011618, 31.19562243 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146907", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766240", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943613", "enodeid": "2943610", "funcclass": "1", "length": "1.674", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1942346, 31.20210932 ], [ 115.19478522, 31.20174018 ], [ 115.19636742, 31.20069254 ], [ 115.19793936, 31.19966492 ], [ 115.19914104, 31.19895671 ], [ 115.2002925, 31.19836838 ], [ 115.20161424, 31.19778027 ], [ 115.20287604, 31.19732204 ], [ 115.20409752, 31.19697369 ], [ 115.20557946, 31.1966357 ], [ 115.20687132, 31.19638748 ], [ 115.20836352, 31.19607972 ], [ 115.20945522, 31.19574146 ], [ 115.20983592, 31.19559206 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146908", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766241", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943614", "enodeid": "2943612", "funcclass": "1", "length": "0.210", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19257122, 31.20336581 ], [ 115.1928819, 31.2031665 ], [ 115.19328276, 31.20289736 ], [ 115.1943147, 31.2022094 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146909", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766242", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943615", "enodeid": "2943613", "funcclass": "1", "length": "0.208", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1925012, 31.20325574 ], [ 115.19286192, 31.20301652 ], [ 115.1931825, 31.20280722 ], [ 115.1942346, 31.20210932 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146910", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766243", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943616", "enodeid": "2943618", "funcclass": "1", "length": "0.234", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.18942482, 31.20529905 ], [ 115.18975548, 31.20507977 ], [ 115.19090784, 31.20432228 ], [ 115.1910081, 31.20425249 ], [ 115.19136882, 31.20401327 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146911", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766244", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943618", "enodeid": "2943615", "funcclass": "1", "length": "0.137", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19136882, 31.20401327 ], [ 115.19184978, 31.20368432 ], [ 115.1925012, 31.20325574 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146912", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766245", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943617", "enodeid": "2943619", "funcclass": "1", "length": "0.232", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.189515, 31.20539918 ], [ 115.18986564, 31.2051699 ], [ 115.19055702, 31.20471144 ], [ 115.1909379, 31.20446223 ], [ 115.19139888, 31.20415326 ], [ 115.19143902, 31.20412334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146913", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766246", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943619", "enodeid": "2943614", "funcclass": "1", "length": "0.137", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.19143902, 31.20412334 ], [ 115.19257122, 31.20336581 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146914", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766247", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943621", "enodeid": "2943622", "funcclass": "1", "length": "0.315", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17324246, 31.20774822 ], [ 115.17423444, 31.20775002 ], [ 115.17450498, 31.20776051 ], [ 115.17530652, 31.2078119 ], [ 115.17533658, 31.20781194 ], [ 115.17654888, 31.2079541 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146915", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766248", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943622", "enodeid": "2943616", "funcclass": "1", "length": "1.314", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17654888, 31.2079541 ], [ 115.1767593, 31.20798447 ], [ 115.17874326, 31.20825794 ], [ 115.17968502, 31.20833966 ], [ 115.18062696, 31.20838133 ], [ 115.18174908, 31.2083334 ], [ 115.18227018, 31.20826442 ], [ 115.18303176, 31.20815588 ], [ 115.18433424, 31.20787841 ], [ 115.1854866, 31.20749069 ], [ 115.18649874, 31.20706278 ], [ 115.18748082, 31.20655482 ], [ 115.1882523, 31.20607652 ], [ 115.18942482, 31.20529905 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146916", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766249", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943620", "enodeid": "2943623", "funcclass": "1", "length": "0.311", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17326244, 31.20787823 ], [ 115.17422436, 31.20787994 ], [ 115.17462504, 31.20790064 ], [ 115.17530652, 31.20793187 ], [ 115.17537654, 31.20794199 ], [ 115.17651882, 31.20808397 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146917", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766250", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943623", "enodeid": "2943617", "funcclass": "1", "length": "1.326", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17651882, 31.20808397 ], [ 115.1766792, 31.20809427 ], [ 115.17878322, 31.20838794 ], [ 115.17965496, 31.20845954 ], [ 115.18062696, 31.2085013 ], [ 115.1817291, 31.20845333 ], [ 115.18230024, 31.20838439 ], [ 115.18311186, 31.20827594 ], [ 115.1843544, 31.20800837 ], [ 115.18553682, 31.20761075 ], [ 115.18655886, 31.20718284 ], [ 115.1875809, 31.20664496 ], [ 115.1884728, 31.2060969 ], [ 115.189515, 31.20539918 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146918", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766251", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943624", "enodeid": "2943626", "funcclass": "1", "length": "0.552", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003766251" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16501628, 31.20985251 ], [ 115.16617854, 31.20943478 ], [ 115.16768154, 31.20891773 ], [ 115.16882382, 31.20855993 ], [ 115.1701263, 31.20820245 ], [ 115.17045696, 31.20813306 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146919", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766252", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943626", "enodeid": "2943620", "funcclass": "1", "length": "0.269", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17045696, 31.20813306 ], [ 115.17138882, 31.20799482 ], [ 115.1728416, 31.20787746 ], [ 115.17326244, 31.20787823 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146920", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766253", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943625", "enodeid": "2943627", "funcclass": "1", "length": "0.567", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003766253" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1647056, 31.20982196 ], [ 115.16610852, 31.20932471 ], [ 115.16753124, 31.20883749 ], [ 115.16890392, 31.20840018 ], [ 115.1699661, 31.20810219 ], [ 115.17028668, 31.2080328 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146921", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766254", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943627", "enodeid": "2943628", "funcclass": "1", "length": "0.035", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003766254" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.17028668, 31.2080328 ], [ 115.1706474, 31.20797349 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146922", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766255", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943628", "enodeid": "2943621", "funcclass": "1", "length": "0.248", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1706474, 31.20797349 ], [ 115.17141888, 31.20786491 ], [ 115.17282162, 31.20775749 ], [ 115.17324246, 31.20774822 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146923", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766256", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943629", "enodeid": "2943625", "funcclass": "1", "length": "0.042", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003766256" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16430492, 31.20997118 ], [ 115.1647056, 31.20982196 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146924", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766257", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943630", "enodeid": "2943624", "funcclass": "1", "length": "0.056", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003766257" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1644752, 31.21004147 ], [ 115.16501628, 31.20985251 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146925", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766258", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943632", "enodeid": "2943633", "funcclass": "1", "length": "0.199", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16025672, 31.21155315 ], [ 115.16106834, 31.21127474 ], [ 115.16219064, 31.21086695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146926", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766259", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943633", "enodeid": "2943630", "funcclass": "1", "length": "0.236", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16219064, 31.21086695 ], [ 115.1625915, 31.21071777 ], [ 115.16392404, 31.21024037 ], [ 115.1644752, 31.21004147 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146927", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766260", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943631", "enodeid": "2943634", "funcclass": "1", "length": "0.200", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16021676, 31.21142315 ], [ 115.16100822, 31.21116471 ], [ 115.16216058, 31.21073699 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146928", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766261", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943634", "enodeid": "2943629", "funcclass": "1", "length": "0.221", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.16216058, 31.21073699 ], [ 115.1625213, 31.21060766 ], [ 115.16385402, 31.2101303 ], [ 115.16430492, 31.20997118 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146929", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766262", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002943635", "enodeid": "2943636", "funcclass": "1", "length": "0.030", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11942678, 31.22151156 ], [ 115.11951696, 31.22151161 ], [ 115.11973692, 31.2215117 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146930", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766263", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002940585", "enodeid": "2943637", "funcclass": "1", "length": "0.031", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11942696, 31.22163153 ], [ 115.11951696, 31.22164157 ], [ 115.119747, 31.22163171 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146931", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766264", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943637", "enodeid": "2943638", "funcclass": "1", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.119747, 31.22163171 ], [ 115.12022724, 31.22163194 ], [ 115.1203473, 31.22163198 ], [ 115.12064736, 31.22162213 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146932", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766265", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943636", "enodeid": "2943639", "funcclass": "1", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11973692, 31.2215117 ], [ 115.12021716, 31.22150193 ], [ 115.12033722, 31.22150202 ], [ 115.12063728, 31.22150216 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146933", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766266", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943641", "enodeid": "2943631", "funcclass": "1", "length": "1.409", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1456598, 31.21352739 ], [ 115.14584016, 31.21347767 ], [ 115.14616056, 31.21341818 ], [ 115.14715218, 31.21326972 ], [ 115.14777318, 31.21320069 ], [ 115.1494659, 31.21304333 ], [ 115.15064796, 31.21293533 ], [ 115.15312278, 31.21276977 ], [ 115.154766, 31.21264278 ], [ 115.15638906, 31.21242579 ], [ 115.15789206, 31.21211867 ], [ 115.15922478, 31.21176123 ], [ 115.16021676, 31.21142315 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146934", "Name": "G42-胡家山隧道", "pyname": "g42-hjssd", "mapid": "465561", "id": "3766267", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943642", "enodeid": "2943640", "funcclass": "1", "length": "0.705", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003766267" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1385084, 31.21587558 ], [ 115.13908944, 31.21565652 ], [ 115.14036132, 31.21516868 ], [ 115.14194388, 31.21469127 ], [ 115.14445794, 31.21400534 ], [ 115.1454996, 31.21379703 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146935", "Name": "G42-胡家山隧道", "pyname": "g42-hjssd", "mapid": "465561", "id": "3766268", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943643", "enodeid": "2943641", "funcclass": "1", "length": "0.762", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003766268" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13807784, 31.21572501 ], [ 115.13841822, 31.21558556 ], [ 115.138899, 31.21544637 ], [ 115.14054168, 31.21498904 ], [ 115.14180366, 31.21460109 ], [ 115.1444079, 31.21388532 ], [ 115.1456598, 31.21352739 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146936", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766269", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943644", "enodeid": "2943642", "funcclass": "1", "length": "0.009", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003766269" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13841822, 31.21590542 ], [ 115.1385084, 31.21587558 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146937", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766270", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943645", "enodeid": "2943643", "funcclass": "1", "length": "0.009", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": "500003766270" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13799756, 31.21576484 ], [ 115.13807784, 31.21572501 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146938", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766271", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943638", "enodeid": "2943646", "funcclass": "1", "length": "1.191", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12064736, 31.22162213 ], [ 115.1213976, 31.2216125 ], [ 115.1221779, 31.22154293 ], [ 115.1225982, 31.22151314 ], [ 115.12400922, 31.22134434 ], [ 115.1254206, 31.22112591 ], [ 115.12680192, 31.22080749 ], [ 115.12780308, 31.22054865 ], [ 115.12930446, 31.22007044 ], [ 115.13066598, 31.21955213 ], [ 115.13220822, 31.21885467 ], [ 115.13254878, 31.21868525 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146939", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766272", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943646", "enodeid": "2943644", "funcclass": "1", "length": "0.638", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13254878, 31.21868525 ], [ 115.13312982, 31.21839626 ], [ 115.1336907, 31.21811726 ], [ 115.13564388, 31.21714067 ], [ 115.13585412, 31.21704104 ], [ 115.13798766, 31.2160847 ], [ 115.13841822, 31.21590542 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146940", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766273", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943639", "enodeid": "2943647", "funcclass": "1", "length": "1.185", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.12063728, 31.22150216 ], [ 115.12137762, 31.22148254 ], [ 115.122078, 31.22142287 ], [ 115.12267812, 31.22138318 ], [ 115.12395918, 31.22122433 ], [ 115.12541052, 31.22099595 ], [ 115.12667196, 31.22070741 ], [ 115.127793, 31.22041869 ], [ 115.12923444, 31.2199704 ], [ 115.13053584, 31.21946204 ], [ 115.1321481, 31.21873461 ], [ 115.13247876, 31.21857522 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146941", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766274", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943647", "enodeid": "2943645", "funcclass": "1", "length": "0.611", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.13247876, 31.21857522 ], [ 115.13303964, 31.21828619 ], [ 115.13380086, 31.21790751 ], [ 115.13551356, 31.21697057 ], [ 115.13575404, 31.21684097 ], [ 115.1368758, 31.21627293 ], [ 115.13782728, 31.21582455 ], [ 115.13799756, 31.21576484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146942", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766275", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943640", "enodeid": "2943648", "funcclass": "1", "length": "0.068", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": "500003766275" }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1454996, 31.21379703 ], [ 115.1462007, 31.21366811 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.146943", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465561", "id": "3766276", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2943648", "enodeid": "2943632", "funcclass": "1", "length": "1.362", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.1462007, 31.21366811 ], [ 115.1478432, 31.21339073 ], [ 115.14910518, 31.21321271 ], [ 115.15068792, 31.21305534 ], [ 115.15313268, 31.21289973 ], [ 115.15472586, 31.21277265 ], [ 115.15646934, 31.2125459 ], [ 115.15788216, 31.21224858 ], [ 115.15927482, 31.21188125 ], [ 115.16025672, 31.21155315 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147067", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772479", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913188", "enodeid": "10002913186", "funcclass": "1", "length": "1.384", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.42102506, 31.24536584 ], [ 115.42184568, 31.24574613 ], [ 115.42331664, 31.24636673 ], [ 115.4247174, 31.24696725 ], [ 115.42486752, 31.24702733 ], [ 115.4260584, 31.24751778 ], [ 115.42748994, 31.24814877 ], [ 115.42874148, 31.24873976 ], [ 115.42988286, 31.24935059 ], [ 115.43059368, 31.24981107 ], [ 115.43088402, 31.25000124 ], [ 115.43185512, 31.25069181 ], [ 115.43212548, 31.25092194 ], [ 115.432596, 31.25132217 ], [ 115.43328666, 31.25193251 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147068", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772480", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913189", "enodeid": "10002913187", "funcclass": "1", "length": "1.400", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.42110534, 31.24526603 ], [ 115.42187574, 31.24561631 ], [ 115.42339674, 31.24625693 ], [ 115.42479768, 31.24685745 ], [ 115.425288, 31.24705766 ], [ 115.42623858, 31.24744803 ], [ 115.4274399, 31.24797885 ], [ 115.42881168, 31.24862991 ], [ 115.42997304, 31.24926077 ], [ 115.43085414, 31.24983132 ], [ 115.43098428, 31.24991142 ], [ 115.4319354, 31.250592 ], [ 115.43227578, 31.25087217 ], [ 115.43270616, 31.25125238 ], [ 115.43341698, 31.25186271 ], [ 115.43347692, 31.25193273 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147069", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772489", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913201", "enodeid": "2913192", "funcclass": "1", "length": "0.131", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38123642, 31.21726914 ], [ 115.3818657, 31.21759836 ], [ 115.38241506, 31.21786769 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147070", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772490", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913195", "enodeid": "2913202", "funcclass": "1", "length": "0.132", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38137628, 31.21710912 ], [ 115.38199548, 31.21746831 ], [ 115.38254484, 31.21773764 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147071", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772491", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913203", "enodeid": "2913196", "funcclass": "1", "length": "0.018", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37622288, 31.21285649 ], [ 115.37633268, 31.21298631 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147072", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772498", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913192", "enodeid": "2913208", "funcclass": "1", "length": "0.043", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38241506, 31.21786769 ], [ 115.38280458, 31.21806717 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147073", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772499", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913202", "enodeid": "2913209", "funcclass": "1", "length": "0.037", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38254484, 31.21773764 ], [ 115.38284454, 31.21788726 ], [ 115.38287442, 31.2179072 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147074", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772500", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913208", "enodeid": "2913210", "funcclass": "1", "length": "0.216", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38280458, 31.21806717 ], [ 115.38296424, 31.21813697 ], [ 115.38399312, 31.21857572 ], [ 115.38481212, 31.21897473 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147075", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772501", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913209", "enodeid": "2913211", "funcclass": "1", "length": "0.220", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38287442, 31.2179072 ], [ 115.38407304, 31.21847573 ], [ 115.38488196, 31.2188747 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147076", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772502", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913210", "enodeid": "2913212", "funcclass": "1", "length": "0.375", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38481212, 31.21897473 ], [ 115.38529146, 31.21921413 ], [ 115.38661986, 31.21984247 ], [ 115.38797832, 31.22051076 ], [ 115.38823788, 31.22063042 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147077", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772503", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913211", "enodeid": "2913213", "funcclass": "1", "length": "0.375", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38488196, 31.2188747 ], [ 115.38537138, 31.2191141 ], [ 115.38669978, 31.21974243 ], [ 115.38806814, 31.22041073 ], [ 115.3883178, 31.22052044 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147078", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772504", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913199", "enodeid": "2913214", "funcclass": "1", "length": "0.323", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3762029, 31.21304639 ], [ 115.37647254, 31.21335599 ], [ 115.37654238, 31.21343586 ], [ 115.37708166, 31.21399503 ], [ 115.37771094, 31.21458408 ], [ 115.3782702, 31.21510325 ], [ 115.37843004, 31.21523303 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147079", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772505", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913214", "enodeid": "2913193", "funcclass": "1", "length": "0.213", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37843004, 31.21523303 ], [ 115.37863974, 31.21541271 ], [ 115.3792089, 31.2158619 ], [ 115.3795185, 31.21609149 ], [ 115.37959842, 31.21615139 ], [ 115.38008784, 31.2165207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147080", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772506", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913200", "enodeid": "2913215", "funcclass": "1", "length": "0.105", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38029772, 31.21634061 ], [ 115.38096678, 31.21683966 ], [ 115.38113652, 31.21694942 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147081", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772507", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913215", "enodeid": "2913195", "funcclass": "1", "length": "0.029", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38113652, 31.21694942 ], [ 115.38137628, 31.21710912 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147082", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772508", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913193", "enodeid": "2913216", "funcclass": "1", "length": "0.041", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38008784, 31.2165207 ], [ 115.38041742, 31.21676024 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147083", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772509", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913216", "enodeid": "2913201", "funcclass": "1", "length": "0.097", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38041742, 31.21676024 ], [ 115.38097668, 31.2171395 ], [ 115.38123642, 31.21726914 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147084", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772510", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002913185", "enodeid": "2913218", "funcclass": "1", "length": "0.046", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36941204, 31.20473759 ], [ 115.36952202, 31.20483744 ], [ 115.3697517, 31.20503711 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147085", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772511", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002913217", "enodeid": "2913219", "funcclass": "1", "length": "0.031", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36941204, 31.2049175 ], [ 115.36964172, 31.20511716 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147086", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772512", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913218", "enodeid": "2913220", "funcclass": "1", "length": "0.229", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3697517, 31.20503711 ], [ 115.37018118, 31.20542645 ], [ 115.37082036, 31.20604551 ], [ 115.37133966, 31.2065847 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147087", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772513", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913220", "enodeid": "2913203", "funcclass": "1", "length": "0.838", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37133966, 31.2065847 ], [ 115.37154936, 31.20680435 ], [ 115.37163918, 31.2069042 ], [ 115.37207856, 31.2074235 ], [ 115.3725579, 31.20801273 ], [ 115.3730772, 31.20870182 ], [ 115.37356662, 31.20937101 ], [ 115.37405586, 31.21002014 ], [ 115.37455518, 31.21068929 ], [ 115.37506458, 31.21136843 ], [ 115.37551386, 31.21196769 ], [ 115.37605314, 31.21265678 ], [ 115.37622288, 31.21285649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147088", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772514", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913219", "enodeid": "2913221", "funcclass": "1", "length": "0.225", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36964172, 31.20511716 ], [ 115.37005122, 31.20547658 ], [ 115.3707903, 31.20620544 ], [ 115.3712097, 31.20663479 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147089", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772515", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913221", "enodeid": "2913199", "funcclass": "1", "length": "0.857", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3712097, 31.20663479 ], [ 115.3714095, 31.20684449 ], [ 115.37155926, 31.20702422 ], [ 115.37194878, 31.20749361 ], [ 115.37248806, 31.20814274 ], [ 115.37294742, 31.20875195 ], [ 115.37343666, 31.2094211 ], [ 115.37392608, 31.21008026 ], [ 115.3744254, 31.21073942 ], [ 115.37493462, 31.21142855 ], [ 115.37545392, 31.21211763 ], [ 115.37592336, 31.21271685 ], [ 115.3762029, 31.21304639 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147090", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772516", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913213", "enodeid": "2913222", "funcclass": "1", "length": "1.147", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3883178, 31.22052044 ], [ 115.38937692, 31.22103942 ], [ 115.3907865, 31.22170866 ], [ 115.3917261, 31.22215817 ], [ 115.39185606, 31.2222281 ], [ 115.3927359, 31.22266766 ], [ 115.39389546, 31.223277 ], [ 115.395165, 31.22398629 ], [ 115.39552482, 31.22420607 ], [ 115.3961847, 31.22460572 ], [ 115.39725426, 31.22528508 ], [ 115.3982439, 31.22597448 ], [ 115.3984239, 31.22610435 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147091", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772517", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913212", "enodeid": "2913223", "funcclass": "1", "length": "1.143", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38823788, 31.22063042 ], [ 115.389297, 31.22113941 ], [ 115.39070658, 31.22180865 ], [ 115.39133622, 31.22211834 ], [ 115.39177614, 31.22233808 ], [ 115.3926459, 31.22276765 ], [ 115.39392534, 31.22343693 ], [ 115.395075, 31.22408628 ], [ 115.3954548, 31.22431605 ], [ 115.39608462, 31.22470571 ], [ 115.39715436, 31.22537508 ], [ 115.39813392, 31.22605449 ], [ 115.39831392, 31.22618436 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147092", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772518", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913223", "enodeid": "2913224", "funcclass": "1", "length": "0.417", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.39831392, 31.22618436 ], [ 115.39904364, 31.2267339 ], [ 115.39972332, 31.22725347 ], [ 115.3999134, 31.22739333 ], [ 115.39995336, 31.2274233 ], [ 115.400763, 31.22808278 ], [ 115.40092302, 31.22821269 ], [ 115.4015028, 31.22871228 ], [ 115.40152278, 31.22873226 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147093", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772519", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913222", "enodeid": "2913225", "funcclass": "1", "length": "0.418", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3984239, 31.22610435 ], [ 115.3991736, 31.22666388 ], [ 115.39971342, 31.22707352 ], [ 115.40002338, 31.22731332 ], [ 115.40022318, 31.22747321 ], [ 115.40079306, 31.22793284 ], [ 115.40089296, 31.22801276 ], [ 115.40161278, 31.22864226 ], [ 115.40164266, 31.22866224 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147094", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772520", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913225", "enodeid": "2913228", "funcclass": "1", "length": "0.460", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40164266, 31.22866224 ], [ 115.40240262, 31.22934188 ], [ 115.4030526, 31.22996162 ], [ 115.4037825, 31.23063126 ], [ 115.40460258, 31.2314009 ], [ 115.40492244, 31.23170078 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147095", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772521", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913228", "enodeid": "2913226", "funcclass": "1", "length": "0.280", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40492244, 31.23170078 ], [ 115.40535246, 31.23211059 ], [ 115.40611242, 31.23279023 ], [ 115.40620242, 31.23288023 ], [ 115.4067624, 31.23341996 ], [ 115.40691234, 31.23355986 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147096", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772522", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913224", "enodeid": "2913229", "funcclass": "1", "length": "0.461", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40152278, 31.22873226 ], [ 115.40226258, 31.22939187 ], [ 115.40304252, 31.23013154 ], [ 115.40384262, 31.23087116 ], [ 115.40448252, 31.23147087 ], [ 115.40481246, 31.23178074 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147097", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772523", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913229", "enodeid": "2913227", "funcclass": "1", "length": "0.277", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40481246, 31.23178074 ], [ 115.40520252, 31.23215055 ], [ 115.40596248, 31.23283023 ], [ 115.4061225, 31.23299016 ], [ 115.40664234, 31.23348989 ], [ 115.40678238, 31.23361985 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147098", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3772524", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913227", "enodeid": "2913230", "funcclass": "1", "length": "0.064", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40678238, 31.23361985 ], [ 115.40724228, 31.23403965 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147106", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773865", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913226", "enodeid": "2913231", "funcclass": "1", "length": "0.150", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40691234, 31.23355986 ], [ 115.40749266, 31.23408987 ], [ 115.40798334, 31.23455022 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147107", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773866", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913232", "enodeid": "2913198", "funcclass": "1", "length": "0.183", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41278934, 31.23899348 ], [ 115.41324006, 31.23937377 ], [ 115.41360042, 31.23966402 ], [ 115.41395088, 31.23993429 ], [ 115.4140911, 31.24006439 ], [ 115.4141712, 31.24014444 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147108", "Name": null, "pyname": null, "mapid": "465563", "id": "3773867", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913231", "enodeid": "2913233", "funcclass": "5", "length": "0.125", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40798334, 31.23455022 ], [ 115.40816352, 31.23464036 ], [ 115.40851398, 31.2348906 ], [ 115.4089845, 31.23528098 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147109", "Name": null, "pyname": null, "mapid": "465563", "id": "3773868", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913233", "enodeid": "2913234", "funcclass": "5", "length": "0.263", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4089845, 31.23528098 ], [ 115.40952522, 31.23579132 ], [ 115.41007602, 31.2363117 ], [ 115.41061656, 31.23683204 ], [ 115.41083688, 31.23704219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147110", "Name": null, "pyname": null, "mapid": "465563", "id": "3773869", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913234", "enodeid": "2913232", "funcclass": "5", "length": "0.285", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41083688, 31.23704219 ], [ 115.41116736, 31.23736241 ], [ 115.41172806, 31.23788279 ], [ 115.41226878, 31.23840317 ], [ 115.41243888, 31.23857327 ], [ 115.41267918, 31.2388434 ], [ 115.41278934, 31.23899348 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147111", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773870", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913236", "enodeid": "2913188", "funcclass": "1", "length": "0.818", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4144115, 31.24071446 ], [ 115.41478194, 31.24106474 ], [ 115.41543282, 31.24165518 ], [ 115.41653316, 31.24259514 ], [ 115.41734334, 31.24322514 ], [ 115.4182437, 31.2438452 ], [ 115.41926412, 31.24447533 ], [ 115.42050486, 31.24512567 ], [ 115.42102506, 31.24536584 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147112", "Name": null, "pyname": null, "mapid": "465563", "id": "3773871", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913235", "enodeid": "2913237", "funcclass": "5", "length": "0.320", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4091447, 31.2358109 ], [ 115.40928492, 31.23604098 ], [ 115.40956536, 31.23637115 ], [ 115.4099358, 31.23672138 ], [ 115.41047652, 31.23725175 ], [ 115.41104712, 31.2378021 ], [ 115.41127752, 31.23803228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147113", "Name": null, "pyname": null, "mapid": "465563", "id": "3773872", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913237", "enodeid": "2913238", "funcclass": "5", "length": "0.222", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41127752, 31.23803228 ], [ 115.41154788, 31.23829247 ], [ 115.41219858, 31.23887288 ], [ 115.41282948, 31.23943335 ], [ 115.4128896, 31.23948339 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147114", "Name": null, "pyname": null, "mapid": "465563", "id": "3773873", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913238", "enodeid": "2913236", "funcclass": "5", "length": "0.199", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4128896, 31.23948339 ], [ 115.41342024, 31.23993375 ], [ 115.41400092, 31.24040418 ], [ 115.41437136, 31.24070442 ], [ 115.4144115, 31.24071446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147115", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773874", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913230", "enodeid": "2913239", "funcclass": "1", "length": "0.090", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40724228, 31.23403965 ], [ 115.40737242, 31.23415971 ], [ 115.40788308, 31.23464009 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147116", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773875", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913239", "enodeid": "2913235", "funcclass": "1", "length": "0.177", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40788308, 31.23464009 ], [ 115.40831364, 31.23504036 ], [ 115.40896452, 31.2356408 ], [ 115.4091447, 31.2358109 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147117", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773876", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913231", "enodeid": "2913240", "funcclass": "1", "length": "0.177", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40798334, 31.23455022 ], [ 115.4080134, 31.23458024 ], [ 115.40879424, 31.23530073 ], [ 115.40924496, 31.23572108 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147118", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773877", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913240", "enodeid": "2913232", "funcclass": "1", "length": "0.495", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.40924496, 31.23572108 ], [ 115.40966544, 31.23610133 ], [ 115.41037626, 31.23678182 ], [ 115.41111732, 31.23746231 ], [ 115.41167802, 31.23798269 ], [ 115.41269934, 31.23892341 ], [ 115.41278934, 31.23899348 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147119", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773878", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913235", "enodeid": "2913241", "funcclass": "1", "length": "0.495", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4091447, 31.2358109 ], [ 115.4095353, 31.2361812 ], [ 115.4102562, 31.23685166 ], [ 115.41099708, 31.23753219 ], [ 115.4117781, 31.23827271 ], [ 115.41213864, 31.23859293 ], [ 115.41268926, 31.23908334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147120", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773879", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913241", "enodeid": "2913236", "funcclass": "1", "length": "0.244", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41268926, 31.23908334 ], [ 115.41311982, 31.23947363 ], [ 115.41372066, 31.24006403 ], [ 115.41404106, 31.24036422 ], [ 115.4144115, 31.24071446 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147121", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773880", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913198", "enodeid": "2913242", "funcclass": "1", "length": "0.065", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4141712, 31.24014444 ], [ 115.41431142, 31.24027454 ], [ 115.41461166, 31.24059471 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147122", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "3773881", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913242", "enodeid": "2913189", "funcclass": "1", "length": "0.812", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41461166, 31.24059471 ], [ 115.41491208, 31.24091493 ], [ 115.41557304, 31.24159533 ], [ 115.41659346, 31.24246536 ], [ 115.41746358, 31.24314536 ], [ 115.41834396, 31.24375538 ], [ 115.4193543, 31.24437557 ], [ 115.42057506, 31.24501587 ], [ 115.42110534, 31.24526603 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147123", "Name": null, "pyname": null, "mapid": "465563", "id": "3773882", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "1", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913233", "enodeid": "2913243", "funcclass": "5", "length": "0.214", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.4089845, 31.23528098 ], [ 115.40919474, 31.2352412 ], [ 115.40935494, 31.23522135 ], [ 115.40948526, 31.23523148 ], [ 115.40956536, 31.23525155 ], [ 115.40971548, 31.23538169 ], [ 115.41021606, 31.23585203 ], [ 115.41069666, 31.23629235 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147124", "Name": null, "pyname": null, "mapid": "465563", "id": "3773883", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "1", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913243", "enodeid": "2913234", "funcclass": "5", "length": "0.100", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41069666, 31.23629235 ], [ 115.41076686, 31.23636237 ], [ 115.41102714, 31.23661257 ], [ 115.41103722, 31.23665253 ], [ 115.41104712, 31.23670253 ], [ 115.41103722, 31.23674253 ], [ 115.41083688, 31.23704219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147125", "Name": null, "pyname": null, "mapid": "465563", "id": "3773884", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "1", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913237", "enodeid": "2913244", "funcclass": "5", "length": "0.145", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41127752, 31.23803228 ], [ 115.41131748, 31.23824225 ], [ 115.41133764, 31.2383322 ], [ 115.41134754, 31.23835223 ], [ 115.41154788, 31.23858236 ], [ 115.41178818, 31.23882248 ], [ 115.41207852, 31.23910269 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.147126", "Name": null, "pyname": null, "mapid": "465563", "id": "3773885", "kind_num": "2", "kind": "0007|000e", "width": "55", "direction": "1", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913244", "enodeid": "2913238", "funcclass": "5", "length": "0.097", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.41207852, 31.23910269 ], [ 115.41213864, 31.23915273 ], [ 115.4124189, 31.23941292 ], [ 115.41251916, 31.23948299 ], [ 115.41258918, 31.23952304 ], [ 115.41266928, 31.23952313 ], [ 115.41271932, 31.23952317 ], [ 115.41275946, 31.23952322 ], [ 115.4128896, 31.23948339 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148168", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816359", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886091", "enodeid": "2886093", "funcclass": "1", "length": "0.385", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25735646, 31.18154927 ], [ 115.25820642, 31.18137953 ], [ 115.26053526, 31.18083885 ], [ 115.26127488, 31.18072856 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148169", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816360", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886092", "enodeid": "2886094", "funcclass": "1", "length": "0.385", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25734638, 31.18141931 ], [ 115.25828652, 31.18117959 ], [ 115.25860638, 31.18106961 ], [ 115.26025554, 31.18068909 ], [ 115.2612549, 31.18054869 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148170", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816361", "kind_num": "1", "kind": "000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886093", "enodeid": "2886095", "funcclass": "1", "length": "0.119", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26127488, 31.18072856 ], [ 115.26132474, 31.18071857 ], [ 115.262514, 31.18056809 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148171", "Name": "G42-大别山隧道", "pyname": "g42-dbssd", "mapid": "465562", "id": "3816363", "kind_num": "2", "kind": "000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886096", "enodeid": "2886097", "funcclass": "1", "length": "4.944", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26237414, 31.18042823 ], [ 115.26382332, 31.18030763 ], [ 115.26497262, 31.18020714 ], [ 115.2681507, 31.18004568 ], [ 115.27397316, 31.18053938 ], [ 115.28664498, 31.18224375 ], [ 115.2893808, 31.18248032 ], [ 115.29217656, 31.18272678 ], [ 115.2960507, 31.18307193 ], [ 115.30117116, 31.18339395 ], [ 115.3059516, 31.18327614 ], [ 115.3108917, 31.18296816 ], [ 115.3139751, 31.18257279 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148172", "Name": "G42-大别山隧道", "pyname": "g42-dbssd", "mapid": "465562", "id": "3816364", "kind_num": "2", "kind": "000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886095", "enodeid": "2886098", "funcclass": "1", "length": "4.947", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.262514, 31.18056809 ], [ 115.26351354, 31.18053762 ], [ 115.26408306, 31.18054734 ], [ 115.26556212, 31.1805666 ], [ 115.26845022, 31.18063518 ], [ 115.27272504, 31.18113063 ], [ 115.27792812, 31.18195454 ], [ 115.28456814, 31.18299602 ], [ 115.28914122, 31.18355024 ], [ 115.29622062, 31.18432127 ], [ 115.30042254, 31.18457457 ], [ 115.30296738, 31.18459037 ], [ 115.3062009, 31.18440515 ], [ 115.31088162, 31.18399767 ], [ 115.31401506, 31.18344228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148173", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816365", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886097", "enodeid": "2886099", "funcclass": "1", "length": "0.114", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3139751, 31.18257279 ], [ 115.31445408, 31.18263188 ], [ 115.31515266, 31.18273056 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148174", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816367", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886099", "enodeid": "2886101", "funcclass": "1", "length": "0.130", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31515266, 31.18273056 ], [ 115.31650968, 31.18282808 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148175", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816368", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886100", "enodeid": "2886102", "funcclass": "1", "length": "0.127", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31517264, 31.18340021 ], [ 115.31649978, 31.18329788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148176", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816369", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886101", "enodeid": "2886103", "funcclass": "1", "length": "0.155", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31650968, 31.18282808 ], [ 115.31813634, 31.18279514 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148177", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816370", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886102", "enodeid": "2886104", "funcclass": "1", "length": "0.142", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31649978, 31.18329788 ], [ 115.3171584, 31.18326669 ], [ 115.31798658, 31.18326516 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148178", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816371", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886104", "enodeid": "2886105", "funcclass": "1", "length": "0.293", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31798658, 31.18326516 ], [ 115.3181862, 31.18325481 ], [ 115.32053124, 31.18325058 ], [ 115.32106008, 31.18326962 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148179", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816372", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886103", "enodeid": "2886106", "funcclass": "1", "length": "0.336", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31813634, 31.18279514 ], [ 115.31821608, 31.182795 ], [ 115.31895462, 31.18280364 ], [ 115.32055122, 31.18283073 ], [ 115.32164886, 31.18289873 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148180", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816375", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886107", "enodeid": "2886109", "funcclass": "1", "length": "1.297", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3256004, 31.18358124 ], [ 115.32792546, 31.18384688 ], [ 115.33138794, 31.18436037 ], [ 115.3344114, 31.18503452 ], [ 115.33682628, 31.18555989 ], [ 115.33785408, 31.18586787 ], [ 115.33879206, 31.18622603 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148181", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816376", "kind_num": "3", "kind": "0002|000c|000f", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886108", "enodeid": "2886110", "funcclass": "1", "length": "1.402", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32547062, 31.18314168 ], [ 115.32712716, 31.18326863 ], [ 115.33129812, 31.18382078 ], [ 115.33331394, 31.18415697 ], [ 115.3344015, 31.18441487 ], [ 115.33650696, 31.18505072 ], [ 115.3384128, 31.18582688 ], [ 115.33952052, 31.18636463 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148182", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816377", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886110", "enodeid": "2886111", "funcclass": "1", "length": "0.007", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33952052, 31.18636463 ], [ 115.33958028, 31.18639451 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148183", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816378", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886109", "enodeid": "2886112", "funcclass": "1", "length": "0.009", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33879206, 31.18622603 ], [ 115.33888188, 31.18625582 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148184", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816379", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886111", "enodeid": "2886113", "funcclass": "1", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33958028, 31.18639451 ], [ 115.34004936, 31.18661352 ], [ 115.34033862, 31.18681292 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148185", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3816380", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886112", "enodeid": "2886114", "funcclass": "1", "length": "0.147", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.33888188, 31.18625582 ], [ 115.33993956, 31.18672368 ], [ 115.34021892, 31.1869031 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148255", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817842", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886113", "enodeid": "2886115", "funcclass": "1", "length": "0.228", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34033862, 31.18681292 ], [ 115.34210478, 31.18802913 ], [ 115.3421946, 31.18809893 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148256", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817844", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886115", "enodeid": "2886117", "funcclass": "1", "length": "1.178", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3421946, 31.18809893 ], [ 115.34489874, 31.190153 ], [ 115.34700402, 31.19171841 ], [ 115.3471338, 31.19178812 ], [ 115.34812164, 31.19239602 ], [ 115.34949864, 31.19311319 ], [ 115.35084576, 31.19373045 ], [ 115.35216282, 31.19422779 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148257", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817845", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886116", "enodeid": "2886118", "funcclass": "1", "length": "1.182", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34209488, 31.18817907 ], [ 115.3450683, 31.19044253 ], [ 115.3469043, 31.19179856 ], [ 115.34709384, 31.19191812 ], [ 115.34809158, 31.19252603 ], [ 115.34934888, 31.19318343 ], [ 115.3508157, 31.19386041 ], [ 115.3520829, 31.19433791 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148258", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817846", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886118", "enodeid": "2886119", "funcclass": "1", "length": "0.134", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3520829, 31.19433791 ], [ 115.3525419, 31.19450697 ], [ 115.35338016, 31.19478534 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148259", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817847", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886117", "enodeid": "2886120", "funcclass": "1", "length": "0.132", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35216282, 31.19422779 ], [ 115.35261192, 31.1943969 ], [ 115.3534401, 31.19467527 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148260", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817848", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886119", "enodeid": "2886121", "funcclass": "1", "length": "0.240", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35338016, 31.19478534 ], [ 115.35445782, 31.19516316 ], [ 115.35570504, 31.19561069 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148261", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817849", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886120", "enodeid": "2886122", "funcclass": "1", "length": "0.240", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3534401, 31.19467527 ], [ 115.35451776, 31.1950431 ], [ 115.35576498, 31.19549063 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148262", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817850", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886122", "enodeid": "2886123", "funcclass": "1", "length": "0.715", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35576498, 31.19549063 ], [ 115.35617394, 31.1956398 ], [ 115.35780042, 31.19634648 ], [ 115.3595664, 31.19732276 ], [ 115.36144326, 31.19852957 ], [ 115.36203222, 31.19896859 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148263", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817851", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886121", "enodeid": "2886124", "funcclass": "1", "length": "0.712", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.35570504, 31.19561069 ], [ 115.35607422, 31.19573993 ], [ 115.35776046, 31.19648648 ], [ 115.35947658, 31.19741285 ], [ 115.36138332, 31.19864958 ], [ 115.3619424, 31.19906867 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148264", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817852", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886124", "enodeid": "2886125", "funcclass": "1", "length": "0.416", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3619424, 31.19906867 ], [ 115.36265124, 31.19960745 ], [ 115.36478802, 31.20126404 ], [ 115.36518744, 31.20157346 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148265", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817853", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886125", "enodeid": "10002913217", "funcclass": "1", "length": "0.548", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36518744, 31.20157346 ], [ 115.36682544, 31.20286118 ], [ 115.36854318, 31.20419876 ], [ 115.36928226, 31.20481769 ], [ 115.36941204, 31.2049175 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148266", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817854", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886123", "enodeid": "2886126", "funcclass": "1", "length": "0.421", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.36203222, 31.19896859 ], [ 115.36300062, 31.19969696 ], [ 115.3649079, 31.20118394 ], [ 115.3653174, 31.20150339 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148267", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "3817855", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886126", "enodeid": "10002913185", "funcclass": "1", "length": "0.531", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3653174, 31.20150339 ], [ 115.36693524, 31.20278108 ], [ 115.36856316, 31.20403883 ], [ 115.36941204, 31.20473759 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148400", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825933", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10002908563", "enodeid": "2908564", "funcclass": "1", "length": "0.198", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91920054, 31.25228207 ], [ 114.91922052, 31.2522521 ], [ 114.9194304, 31.25181209 ], [ 114.9195303, 31.25160212 ], [ 114.91966008, 31.25130215 ], [ 114.91980012, 31.25096217 ], [ 114.91993998, 31.25061221 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148401", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825934", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10002908560", "enodeid": "2908565", "funcclass": "1", "length": "0.194", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9193503, 31.25228189 ], [ 114.91958016, 31.25184188 ], [ 114.91966998, 31.25163191 ], [ 114.91981002, 31.25133194 ], [ 114.91994988, 31.25099196 ], [ 114.92007966, 31.25065203 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148402", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825935", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908564", "enodeid": "2908566", "funcclass": "1", "length": "0.202", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91993998, 31.25061221 ], [ 114.9201099, 31.2501623 ], [ 114.92025966, 31.24975235 ], [ 114.9203997, 31.24930248 ], [ 114.92051958, 31.24886261 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148403", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825936", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908565", "enodeid": "2908567", "funcclass": "1", "length": "0.204", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92007966, 31.25065203 ], [ 114.92008974, 31.25063205 ], [ 114.92024958, 31.2501821 ], [ 114.92040942, 31.24978218 ], [ 114.92054946, 31.24932228 ], [ 114.92065944, 31.24888241 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148404", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825937", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908566", "enodeid": "2908568", "funcclass": "1", "length": "0.255", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92051958, 31.24886261 ], [ 114.92052966, 31.2488226 ], [ 114.92064954, 31.24833278 ], [ 114.9207696, 31.24781294 ], [ 114.92086968, 31.24728315 ], [ 114.9209496, 31.24676336 ], [ 114.92096958, 31.24660343 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148405", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825938", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908567", "enodeid": "2908569", "funcclass": "1", "length": "0.256", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92065944, 31.24888241 ], [ 114.92066934, 31.24884245 ], [ 114.9207993, 31.24834259 ], [ 114.92090928, 31.24782279 ], [ 114.92100936, 31.24729296 ], [ 114.92108946, 31.24677321 ], [ 114.92110944, 31.24661328 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148406", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825941", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908570", "enodeid": "2908572", "funcclass": "1", "length": "0.376", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9220206, 31.23219965 ], [ 114.92206056, 31.23204966 ], [ 114.92220042, 31.23145985 ], [ 114.92235036, 31.23088997 ], [ 114.92250012, 31.23037004 ], [ 114.9225201, 31.23031005 ], [ 114.92269002, 31.22978013 ], [ 114.92288982, 31.22916021 ], [ 114.92296974, 31.22891028 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148407", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825942", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908571", "enodeid": "2908573", "funcclass": "1", "length": "0.373", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92217036, 31.2322095 ], [ 114.92220042, 31.23205952 ], [ 114.92234028, 31.23147969 ], [ 114.92249022, 31.23090981 ], [ 114.92263998, 31.2304199 ], [ 114.92267004, 31.23033989 ], [ 114.92283978, 31.22979998 ], [ 114.92303958, 31.22918006 ], [ 114.9231096, 31.22895011 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148408", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825943", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908572", "enodeid": "2908574", "funcclass": "1", "length": "1.069", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92296974, 31.22891028 ], [ 114.92307954, 31.2285803 ], [ 114.92327934, 31.22800038 ], [ 114.92348922, 31.22742047 ], [ 114.923709, 31.22684051 ], [ 114.92383878, 31.22644059 ], [ 114.92409852, 31.22570066 ], [ 114.9243183, 31.22509073 ], [ 114.9244182, 31.22481078 ], [ 114.9245181, 31.22451081 ], [ 114.92472798, 31.2239309 ], [ 114.9249177, 31.22335098 ], [ 114.92512758, 31.22276103 ], [ 114.92532738, 31.22218112 ], [ 114.92554716, 31.22158118 ], [ 114.92582688, 31.22075129 ], [ 114.9259167, 31.2205113 ], [ 114.92595666, 31.22038134 ], [ 114.92615646, 31.21979139 ], [ 114.92618652, 31.21969145 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148409", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825944", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908573", "enodeid": "2908575", "funcclass": "1", "length": "1.074", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9231096, 31.22895011 ], [ 114.9232194, 31.22860019 ], [ 114.9234192, 31.22803026 ], [ 114.92363898, 31.2274503 ], [ 114.92384886, 31.22686035 ], [ 114.92397864, 31.22646044 ], [ 114.92423838, 31.2257205 ], [ 114.92446824, 31.22511057 ], [ 114.92457804, 31.22478063 ], [ 114.92465796, 31.22453066 ], [ 114.92486784, 31.22395074 ], [ 114.92506764, 31.22337083 ], [ 114.92527734, 31.22278088 ], [ 114.92547714, 31.22220096 ], [ 114.92568702, 31.22160102 ], [ 114.92595666, 31.22081114 ], [ 114.92605656, 31.22053115 ], [ 114.9261066, 31.22040119 ], [ 114.92629632, 31.21981128 ], [ 114.92633628, 31.21969127 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148410", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825945", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908574", "enodeid": "2908576", "funcclass": "1", "length": "0.409", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92618652, 31.21969145 ], [ 114.92633628, 31.21920153 ], [ 114.9265062, 31.21860164 ], [ 114.92655606, 31.21843167 ], [ 114.92665596, 31.21802177 ], [ 114.92678592, 31.21747187 ], [ 114.92679582, 31.21743191 ], [ 114.9269058, 31.21685204 ], [ 114.9270156, 31.2162822 ], [ 114.92704566, 31.21608227 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148411", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825946", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908575", "enodeid": "2908577", "funcclass": "1", "length": "0.408", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92633628, 31.21969127 ], [ 114.92647614, 31.21922138 ], [ 114.92665596, 31.21862148 ], [ 114.926706, 31.21844153 ], [ 114.92679582, 31.21804161 ], [ 114.92692578, 31.21751174 ], [ 114.92693568, 31.21745175 ], [ 114.92705556, 31.21686189 ], [ 114.92715546, 31.21629206 ], [ 114.92718552, 31.21609212 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148412", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825969", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002908592", "enodeid": "2908594", "funcclass": "1", "length": "1.662", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90520752, 31.16899814 ], [ 114.90572736, 31.16928798 ], [ 114.90612732, 31.16951789 ], [ 114.90708708, 31.17000767 ], [ 114.90855696, 31.17062741 ], [ 114.90878682, 31.17071736 ], [ 114.90922674, 31.17086735 ], [ 114.90967674, 31.17101729 ], [ 114.90976674, 31.17104726 ], [ 114.91063614, 31.17128679 ], [ 114.91119558, 31.17140627 ], [ 114.91184484, 31.17153569 ], [ 114.91249428, 31.17165512 ], [ 114.9136929, 31.17187409 ], [ 114.9143922, 31.17201345 ], [ 114.91515144, 31.17216281 ], [ 114.91574076, 31.17229227 ], [ 114.91633008, 31.17245171 ], [ 114.91714926, 31.17271095 ], [ 114.91766874, 31.17290049 ], [ 114.91789842, 31.17299027 ], [ 114.91842798, 31.17322971 ], [ 114.91895736, 31.17349922 ], [ 114.91934688, 31.17369879 ], [ 114.92013618, 31.17413799 ], [ 114.92093538, 31.17464717 ], [ 114.92109522, 31.17476696 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148413", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825970", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002908590", "enodeid": "2908595", "funcclass": "1", "length": "1.637", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90554736, 31.16899818 ], [ 114.90575742, 31.16911811 ], [ 114.90621732, 31.16938797 ], [ 114.90716718, 31.16987775 ], [ 114.908607, 31.1704875 ], [ 114.9089769, 31.17062745 ], [ 114.90930684, 31.17073743 ], [ 114.90968682, 31.17086739 ], [ 114.91024662, 31.17102719 ], [ 114.91064622, 31.17113681 ], [ 114.91125552, 31.17126627 ], [ 114.9119847, 31.17141563 ], [ 114.91254414, 31.17152516 ], [ 114.91373286, 31.17173409 ], [ 114.91444206, 31.17188349 ], [ 114.91525134, 31.17203276 ], [ 114.91573068, 31.17214233 ], [ 114.91639002, 31.17231176 ], [ 114.9172191, 31.17259094 ], [ 114.91767864, 31.17275051 ], [ 114.91804836, 31.17290018 ], [ 114.91848792, 31.17308972 ], [ 114.9190173, 31.17335922 ], [ 114.91944678, 31.17357878 ], [ 114.92024598, 31.17402797 ], [ 114.92104518, 31.17454709 ], [ 114.92120502, 31.17465693 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148414", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825971", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908594", "enodeid": "2908596", "funcclass": "1", "length": "0.119", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92109522, 31.17476696 ], [ 114.92195418, 31.17534593 ], [ 114.92205408, 31.17541581 ], [ 114.92207388, 31.1754258 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148415", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825972", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908595", "enodeid": "2908597", "funcclass": "1", "length": "0.122", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92120502, 31.17465693 ], [ 114.922044, 31.17522591 ], [ 114.92217378, 31.17531578 ], [ 114.92220384, 31.17533571 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148416", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825973", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908598", "enodeid": "2908600", "funcclass": "1", "length": "0.349", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94521756, 31.18794363 ], [ 114.94640484, 31.18831128 ], [ 114.9466842, 31.18840074 ], [ 114.94805094, 31.1888381 ], [ 114.94816074, 31.18887788 ], [ 114.94864962, 31.18902692 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148417", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825974", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908599", "enodeid": "2908601", "funcclass": "1", "length": "0.351", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94526742, 31.18781363 ], [ 114.94652454, 31.18820112 ], [ 114.9470334, 31.18836015 ], [ 114.94811088, 31.18870805 ], [ 114.94864962, 31.18887698 ], [ 114.94872936, 31.18889687 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148418", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825975", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908605", "enodeid": "2908598", "funcclass": "1", "length": "0.250", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94274346, 31.1871987 ], [ 114.94355148, 31.18745705 ], [ 114.9447087, 31.18779468 ], [ 114.94508778, 31.1879039 ], [ 114.94521756, 31.18794363 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148419", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825976", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908606", "enodeid": "2908605", "funcclass": "1", "length": "0.304", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93976068, 31.18624484 ], [ 114.94132686, 31.18679159 ], [ 114.94231452, 31.18708953 ], [ 114.94260378, 31.18717895 ], [ 114.94274346, 31.1871987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148420", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825977", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908603", "enodeid": "2908607", "funcclass": "1", "length": "0.469", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93580932, 31.18965021 ], [ 114.93591912, 31.18937018 ], [ 114.93599886, 31.18913015 ], [ 114.93611874, 31.18879013 ], [ 114.9362784, 31.18824014 ], [ 114.9363783, 31.1878202 ], [ 114.93644814, 31.18748027 ], [ 114.93650808, 31.18716036 ], [ 114.936588, 31.18661055 ], [ 114.93665784, 31.18606074 ], [ 114.936678, 31.18551102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148421", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825978", "kind_num": "3", "kind": "0003|000b|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908608", "enodeid": "2908603", "funcclass": "1", "length": "0.372", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93533088, 31.18646295 ], [ 114.93562014, 31.18684221 ], [ 114.9357798, 31.18708179 ], [ 114.93584964, 31.18720158 ], [ 114.93591948, 31.18736133 ], [ 114.93595926, 31.18750119 ], [ 114.9360192, 31.18774095 ], [ 114.93604908, 31.18795074 ], [ 114.93604908, 31.18803071 ], [ 114.93602892, 31.1884205 ], [ 114.93590922, 31.18907034 ], [ 114.9358392, 31.18933035 ], [ 114.93580932, 31.18954028 ], [ 114.93580932, 31.18965021 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148422", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825979", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908608", "enodeid": "2908609", "funcclass": "1", "length": "0.658", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93533088, 31.18646295 ], [ 114.93509166, 31.18600368 ], [ 114.9350418, 31.18587386 ], [ 114.93501174, 31.18575398 ], [ 114.93499194, 31.18564409 ], [ 114.93498204, 31.18544424 ], [ 114.93499194, 31.18513437 ], [ 114.9350319, 31.18492445 ], [ 114.93510174, 31.18472442 ], [ 114.93517158, 31.18459437 ], [ 114.93521154, 31.18452435 ], [ 114.93528138, 31.18441428 ], [ 114.93542106, 31.18420413 ], [ 114.93552096, 31.18408403 ], [ 114.93579042, 31.18372371 ], [ 114.93595998, 31.18351352 ], [ 114.93599994, 31.18343351 ], [ 114.93601992, 31.18334351 ], [ 114.93601992, 31.18328357 ], [ 114.93600984, 31.1832036 ], [ 114.93597996, 31.18306374 ], [ 114.93590022, 31.18295399 ], [ 114.9358005, 31.18286421 ], [ 114.93567072, 31.18279451 ], [ 114.93558108, 31.18276467 ], [ 114.93553122, 31.18274478 ], [ 114.93547128, 31.18274492 ], [ 114.93537156, 31.18273511 ], [ 114.93529164, 31.18273524 ], [ 114.93518202, 31.18276544 ], [ 114.9350922, 31.18280558 ], [ 114.9349923, 31.18286574 ], [ 114.93493254, 31.18290579 ], [ 114.93484272, 31.18299593 ], [ 114.93482274, 31.18304592 ], [ 114.93480276, 31.18312593 ], [ 114.93481266, 31.18325585 ], [ 114.93483264, 31.1834057 ], [ 114.93485262, 31.18348562 ], [ 114.9348924, 31.1835555 ], [ 114.93502218, 31.18374513 ], [ 114.93506196, 31.18379504 ], [ 114.93522162, 31.18392468 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148423", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825980", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908597", "enodeid": "2908610", "funcclass": "1", "length": "1.091", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92220384, 31.17533571 ], [ 114.92629866, 31.17817058 ], [ 114.92857584, 31.17972771 ], [ 114.92980416, 31.1805662 ], [ 114.93113166, 31.18147376 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148424", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825981", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908607", "enodeid": "2908611", "funcclass": "1", "length": "0.563", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.936678, 31.18551102 ], [ 114.936678, 31.18494137 ], [ 114.936678, 31.18487139 ], [ 114.936678, 31.18479143 ], [ 114.93667818, 31.18470147 ], [ 114.93667818, 31.18454159 ], [ 114.9366582, 31.18429175 ], [ 114.9366582, 31.18421183 ], [ 114.93662832, 31.18391204 ], [ 114.93656856, 31.1833625 ], [ 114.93651888, 31.18281291 ], [ 114.9365088, 31.18278294 ], [ 114.93643914, 31.18227336 ], [ 114.9363594, 31.18171383 ], [ 114.93627966, 31.18116429 ], [ 114.93619992, 31.1806148 ], [ 114.93617994, 31.1804649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148425", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825982", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908612", "enodeid": "2908611", "funcclass": "1", "length": "0.311", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9345135, 31.18266675 ], [ 114.93458334, 31.18264659 ], [ 114.93504234, 31.18243586 ], [ 114.9352119, 31.18233564 ], [ 114.93534168, 31.18224542 ], [ 114.9355413, 31.18207514 ], [ 114.93559116, 31.1820251 ], [ 114.93576072, 31.1818149 ], [ 114.93587052, 31.18165479 ], [ 114.93594036, 31.18152474 ], [ 114.93605016, 31.18119471 ], [ 114.9361101, 31.18092476 ], [ 114.93617994, 31.1804649 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148426", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825983", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908604", "enodeid": "2908613", "funcclass": "1", "length": "0.282", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93596898, 31.18962992 ], [ 114.9360687, 31.18945982 ], [ 114.93609858, 31.18939983 ], [ 114.93630828, 31.18890969 ], [ 114.93645804, 31.18852967 ], [ 114.93680724, 31.18754957 ], [ 114.9369471, 31.18722948 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148427", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825984", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908612", "enodeid": "2908613", "funcclass": "1", "length": "0.747", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9345135, 31.18266675 ], [ 114.93517194, 31.1826555 ], [ 114.9355611, 31.18265478 ], [ 114.93589032, 31.18267413 ], [ 114.93623952, 31.18273349 ], [ 114.93645894, 31.18277304 ], [ 114.9365088, 31.18278294 ], [ 114.93665856, 31.18282263 ], [ 114.93675828, 31.18284243 ], [ 114.93693774, 31.18292204 ], [ 114.9370875, 31.18300173 ], [ 114.93718722, 31.1831015 ], [ 114.93735678, 31.18330103 ], [ 114.93742662, 31.18338086 ], [ 114.93754632, 31.18355055 ], [ 114.93762606, 31.18373028 ], [ 114.93766602, 31.18386015 ], [ 114.9377058, 31.18409991 ], [ 114.9377058, 31.18424985 ], [ 114.93767574, 31.1847696 ], [ 114.93759582, 31.18511952 ], [ 114.93757584, 31.18520952 ], [ 114.93755586, 31.18526951 ], [ 114.93754596, 31.1853195 ], [ 114.93744606, 31.18566947 ], [ 114.93704682, 31.18694949 ], [ 114.9369471, 31.18722948 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148428", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825986", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908609", "enodeid": "2908615", "funcclass": "1", "length": "0.435", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93522162, 31.18392468 ], [ 114.93552096, 31.18408403 ], [ 114.93612936, 31.18443269 ], [ 114.93615942, 31.18444263 ], [ 114.93647856, 31.18460193 ], [ 114.93667818, 31.18470147 ], [ 114.93682776, 31.18478117 ], [ 114.93708714, 31.18491059 ], [ 114.93759582, 31.18511952 ], [ 114.93909234, 31.18575636 ], [ 114.93921204, 31.18580609 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148429", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825988", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908616", "enodeid": "2908615", "funcclass": "1", "length": "0.491", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93723726, 31.1819121 ], [ 114.93751662, 31.18233132 ], [ 114.9376761, 31.18265082 ], [ 114.9378057, 31.18307036 ], [ 114.93786546, 31.18358993 ], [ 114.9379353, 31.18426938 ], [ 114.93797508, 31.18447922 ], [ 114.9380649, 31.18469891 ], [ 114.93815454, 31.18485866 ], [ 114.93829422, 31.18508825 ], [ 114.93840402, 31.18519796 ], [ 114.93848376, 31.18527779 ], [ 114.93859356, 31.18537751 ], [ 114.93921204, 31.18580609 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148430", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825989", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908602", "enodeid": "2908617", "funcclass": "1", "length": "0.268", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93147078, 31.18189289 ], [ 114.93258804, 31.1828702 ], [ 114.9331266, 31.18340889 ], [ 114.93334602, 31.18367831 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148431", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825990", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908617", "enodeid": "2908608", "funcclass": "1", "length": "0.364", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93334602, 31.18367831 ], [ 114.93374508, 31.18417727 ], [ 114.93412416, 31.18469625 ], [ 114.934563, 31.18544501 ], [ 114.93479232, 31.18582436 ], [ 114.93502182, 31.18613373 ], [ 114.93509148, 31.18621356 ], [ 114.9351813, 31.18632332 ], [ 114.93533088, 31.18646295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148432", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3825991", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908616", "enodeid": "2908617", "funcclass": "1", "length": "0.638", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93723726, 31.1819121 ], [ 114.93739674, 31.18240148 ], [ 114.93745668, 31.18275117 ], [ 114.9374565, 31.1829111 ], [ 114.9374367, 31.18303107 ], [ 114.93740664, 31.18317102 ], [ 114.93735678, 31.18330103 ], [ 114.93728694, 31.18353102 ], [ 114.93713718, 31.1837612 ], [ 114.93696762, 31.1839614 ], [ 114.93678798, 31.18410162 ], [ 114.9366582, 31.18421183 ], [ 114.93660834, 31.18425188 ], [ 114.9364188, 31.18435218 ], [ 114.93615942, 31.18444263 ], [ 114.93604962, 31.18448277 ], [ 114.9359598, 31.18450293 ], [ 114.93581022, 31.18454321 ], [ 114.93529146, 31.18459415 ], [ 114.93517158, 31.18459437 ], [ 114.93512172, 31.18459446 ], [ 114.9350121, 31.18458465 ], [ 114.93488232, 31.18455495 ], [ 114.93472266, 31.18450527 ], [ 114.93450324, 31.18441572 ], [ 114.93434358, 31.18433607 ], [ 114.93415404, 31.1842265 ], [ 114.93334602, 31.18367831 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148433", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825992", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908615", "enodeid": "2908618", "funcclass": "1", "length": "0.369", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93921204, 31.18580609 ], [ 114.93964098, 31.1859752 ], [ 114.94070838, 31.18636296 ], [ 114.94168596, 31.18670096 ], [ 114.94279332, 31.18705866 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148434", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825993", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908618", "enodeid": "2908599", "funcclass": "1", "length": "0.251", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94279332, 31.18705866 ], [ 114.94372122, 31.18735679 ], [ 114.9448086, 31.18767453 ], [ 114.94515762, 31.18777385 ], [ 114.94526742, 31.18781363 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148435", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825994", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908619", "enodeid": "2908605", "funcclass": "1", "length": "0.374", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93912222, 31.18592619 ], [ 114.93972072, 31.18616496 ], [ 114.93980046, 31.1861948 ], [ 114.94038906, 31.18640355 ], [ 114.94176588, 31.18689068 ], [ 114.94274346, 31.1871987 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148436", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825995", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908620", "enodeid": "2908619", "funcclass": "1", "length": "0.439", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93510192, 31.18402485 ], [ 114.93542106, 31.18420413 ], [ 114.9359598, 31.18450293 ], [ 114.93604962, 31.18455275 ], [ 114.93637884, 31.18472204 ], [ 114.936678, 31.18487139 ], [ 114.93682776, 31.18494105 ], [ 114.9370173, 31.18504064 ], [ 114.93755586, 31.18526951 ], [ 114.93890262, 31.18584668 ], [ 114.93912222, 31.18592619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148437", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825996", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908610", "enodeid": "2908621", "funcclass": "1", "length": "0.059", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93113166, 31.18147376 ], [ 114.93152064, 31.18173287 ], [ 114.93163044, 31.18179263 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148438", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3825997", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908622", "enodeid": "2908602", "funcclass": "1", "length": "0.055", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93102186, 31.18158387 ], [ 114.93147078, 31.18189289 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148439", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825998", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908623", "enodeid": "2908614", "funcclass": "1", "length": "0.180", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9363297, 31.1804946 ], [ 114.93625986, 31.18002503 ], [ 114.93618012, 31.17949547 ], [ 114.93609048, 31.17888599 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148440", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3825999", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908611", "enodeid": "2908624", "funcclass": "1", "length": "0.174", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93617994, 31.1804649 ], [ 114.93612018, 31.18003529 ], [ 114.93604044, 31.17950573 ], [ 114.9359508, 31.17890624 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148441", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3826000", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908604", "enodeid": "2908625", "funcclass": "1", "length": "0.465", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93596898, 31.18962992 ], [ 114.9360588, 31.18938989 ], [ 114.93613854, 31.1891499 ], [ 114.93625842, 31.18880988 ], [ 114.93641808, 31.1882499 ], [ 114.93652788, 31.18782992 ], [ 114.93659772, 31.18748999 ], [ 114.93664776, 31.18717008 ], [ 114.93672768, 31.18662027 ], [ 114.93679752, 31.18607046 ], [ 114.93682758, 31.18552074 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148442", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3826001", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908625", "enodeid": "2908623", "funcclass": "1", "length": "0.561", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93682758, 31.18552074 ], [ 114.93682776, 31.18500104 ], [ 114.93682776, 31.18494105 ], [ 114.93682776, 31.18478117 ], [ 114.93681786, 31.18454132 ], [ 114.93680796, 31.18428149 ], [ 114.93678798, 31.18410162 ], [ 114.93677808, 31.18391177 ], [ 114.93671832, 31.18336218 ], [ 114.93665856, 31.18282263 ], [ 114.93657882, 31.1822631 ], [ 114.93649908, 31.18170357 ], [ 114.93641934, 31.18115408 ], [ 114.9363495, 31.18060449 ], [ 114.9363297, 31.1804946 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148443", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3826002", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908576", "enodeid": "2908626", "funcclass": "1", "length": "0.669", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92704566, 31.21608227 ], [ 114.9271056, 31.21570238 ], [ 114.92718552, 31.21513259 ], [ 114.92724546, 31.2145628 ], [ 114.92726544, 31.21422291 ], [ 114.9272856, 31.214003 ], [ 114.92732556, 31.21344324 ], [ 114.92734554, 31.21288344 ], [ 114.92736552, 31.2123137 ], [ 114.9273756, 31.21175394 ], [ 114.9273855, 31.2114641 ], [ 114.92739558, 31.21116422 ], [ 114.92740566, 31.21057449 ], [ 114.92741556, 31.21006469 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148488", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827349", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908577", "enodeid": "2908627", "funcclass": "1", "length": "0.670", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92718552, 31.21609212 ], [ 114.92724546, 31.21571223 ], [ 114.92732538, 31.21514244 ], [ 114.92738532, 31.21457265 ], [ 114.92741538, 31.21423277 ], [ 114.92743536, 31.21400286 ], [ 114.92746524, 31.2134531 ], [ 114.9274854, 31.21288331 ], [ 114.92751528, 31.21231356 ], [ 114.92752536, 31.21175381 ], [ 114.92753544, 31.21146392 ], [ 114.92753544, 31.21116408 ], [ 114.92754534, 31.21057436 ], [ 114.92755542, 31.21006455 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148489", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827350", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908627", "enodeid": "2908628", "funcclass": "1", "length": "0.190", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92755542, 31.21006455 ], [ 114.92755542, 31.2100146 ], [ 114.9275655, 31.2097347 ], [ 114.9275754, 31.20944481 ], [ 114.9275754, 31.209125 ], [ 114.92758548, 31.20886508 ], [ 114.92758548, 31.20852524 ], [ 114.92759556, 31.20835532 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148490", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827351", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908626", "enodeid": "2908629", "funcclass": "1", "length": "0.191", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92741556, 31.21006469 ], [ 114.92741556, 31.21001474 ], [ 114.92741556, 31.20973484 ], [ 114.92742564, 31.20944499 ], [ 114.92743572, 31.20912513 ], [ 114.92744562, 31.20886521 ], [ 114.92744562, 31.20872531 ], [ 114.92744562, 31.20861533 ], [ 114.92744562, 31.20834546 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148491", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827352", "kind_num": "3", "kind": "0003|000b|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908610", "enodeid": "2908630", "funcclass": "1", "length": "0.128", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93113166, 31.18147376 ], [ 114.9311916, 31.18148366 ], [ 114.93122148, 31.18151358 ], [ 114.93126144, 31.18153347 ], [ 114.93159048, 31.18173273 ], [ 114.93224892, 31.18209129 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148492", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827353", "kind_num": "3", "kind": "0003|000b|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908630", "enodeid": "2908612", "funcclass": "1", "length": "0.234", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93224892, 31.18209129 ], [ 114.9328575, 31.18242996 ], [ 114.93307692, 31.18253949 ], [ 114.93326646, 31.18260911 ], [ 114.93340614, 31.18263881 ], [ 114.93355572, 31.18266851 ], [ 114.93383508, 31.18270797 ], [ 114.93395478, 31.18271774 ], [ 114.93411444, 31.18271747 ], [ 114.93434394, 31.18269704 ], [ 114.9345135, 31.18266675 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148493", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827355", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908631", "enodeid": "2908604", "funcclass": "1", "length": "0.420", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93404298, 31.19302175 ], [ 114.93426258, 31.19272146 ], [ 114.93440226, 31.19254128 ], [ 114.93462168, 31.19223101 ], [ 114.93474138, 31.19205087 ], [ 114.93501084, 31.19160056 ], [ 114.93515052, 31.19137043 ], [ 114.93533016, 31.19104031 ], [ 114.93557964, 31.19052011 ], [ 114.93574938, 31.19016002 ], [ 114.9358491, 31.18992998 ], [ 114.93596898, 31.18962992 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148494", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827356", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908606", "enodeid": "2908632", "funcclass": "1", "length": "0.281", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93976068, 31.18624484 ], [ 114.93942138, 31.18611555 ], [ 114.9386832, 31.18581707 ], [ 114.93754596, 31.1853195 ], [ 114.93712692, 31.18513041 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148495", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827357", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908632", "enodeid": "2908607", "funcclass": "1", "length": "0.471", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93712692, 31.18513041 ], [ 114.93682776, 31.18500104 ], [ 114.936678, 31.18494137 ], [ 114.93645858, 31.18485182 ], [ 114.93632898, 31.18481208 ], [ 114.93625914, 31.18480223 ], [ 114.93615924, 31.18479242 ], [ 114.9360894, 31.18479255 ], [ 114.93593982, 31.18480281 ], [ 114.93581004, 31.18483305 ], [ 114.9357402, 31.18485317 ], [ 114.93565056, 31.18488332 ], [ 114.93554076, 31.18493349 ], [ 114.93547092, 31.18498358 ], [ 114.9353811, 31.18506372 ], [ 114.93531126, 31.18515377 ], [ 114.9352614, 31.18520385 ], [ 114.93523134, 31.18529385 ], [ 114.93520146, 31.18545383 ], [ 114.93518148, 31.18555377 ], [ 114.93518148, 31.18568373 ], [ 114.93518148, 31.18573368 ], [ 114.93521136, 31.18583358 ], [ 114.93525132, 31.18590347 ], [ 114.93531108, 31.18600328 ], [ 114.9354009, 31.18608306 ], [ 114.93547074, 31.18613292 ], [ 114.9355305, 31.18616276 ], [ 114.9356403, 31.18621253 ], [ 114.93574002, 31.18622234 ], [ 114.93582984, 31.1862222 ], [ 114.93592956, 31.186202 ], [ 114.93601938, 31.18618184 ], [ 114.9360993, 31.18614174 ], [ 114.93623898, 31.1860715 ], [ 114.93628884, 31.18604144 ], [ 114.93635868, 31.18599135 ], [ 114.93641844, 31.18592124 ], [ 114.93648828, 31.1858312 ], [ 114.93660816, 31.18563108 ], [ 114.936678, 31.18551102 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148496", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827358", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908624", "enodeid": "2908633", "funcclass": "1", "length": "0.285", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9359508, 31.17890624 ], [ 114.93587106, 31.17834675 ], [ 114.93579132, 31.17778722 ], [ 114.93571158, 31.17722769 ], [ 114.93563202, 31.17667815 ], [ 114.93558216, 31.17635843 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148497", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827359", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908633", "enodeid": "20002908562", "funcclass": "1", "length": "0.828", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1100", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93558216, 31.17635843 ], [ 114.93556218, 31.1761386 ], [ 114.9355422, 31.1760387 ], [ 114.93551232, 31.17586887 ], [ 114.93547254, 31.17556913 ], [ 114.9353928, 31.1750096 ], [ 114.93531306, 31.17443009 ], [ 114.93523332, 31.17388055 ], [ 114.93515358, 31.17331103 ], [ 114.93507402, 31.1727915 ], [ 114.93504396, 31.17260165 ], [ 114.9349842, 31.17218202 ], [ 114.93490446, 31.17163248 ], [ 114.93488466, 31.17146261 ], [ 114.9348249, 31.17107295 ], [ 114.93480492, 31.17094308 ], [ 114.93476496, 31.17071327 ], [ 114.93476496, 31.1706833 ], [ 114.93473508, 31.1704835 ], [ 114.93466542, 31.16993391 ], [ 114.93462546, 31.16971413 ], [ 114.93458568, 31.16936439 ], [ 114.9345459, 31.16899472 ], [ 114.93453582, 31.16897474 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148498", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827360", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908613", "enodeid": "2908634", "funcclass": "1", "length": "0.259", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9369471, 31.18722948 ], [ 114.93719658, 31.18683929 ], [ 114.9375159, 31.18648887 ], [ 114.9378651, 31.18627836 ], [ 114.93835398, 31.18611753 ], [ 114.93874296, 31.1860868 ], [ 114.93890262, 31.18608653 ], [ 114.93908226, 31.18610619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148499", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "3827361", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908634", "enodeid": "2908606", "funcclass": "1", "length": "0.067", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93908226, 31.18610619 ], [ 114.93910224, 31.18610615 ], [ 114.93930168, 31.18613576 ], [ 114.93954108, 31.18619525 ], [ 114.93976068, 31.18624484 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148500", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827362", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908596", "enodeid": "2908635", "funcclass": "1", "length": "0.993", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92207388, 31.1754258 ], [ 114.92617878, 31.17827066 ], [ 114.92845596, 31.17982779 ], [ 114.92967438, 31.18066623 ], [ 114.93019368, 31.1810256 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148501", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827363", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908635", "enodeid": "2908622", "funcclass": "1", "length": "0.101", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93019368, 31.1810256 ], [ 114.93102186, 31.18158387 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148502", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827364", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908602", "enodeid": "2908636", "funcclass": "1", "length": "0.111", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93147078, 31.18189289 ], [ 114.93242838, 31.18245075 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148503", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827365", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908636", "enodeid": "2908620", "funcclass": "1", "length": "0.310", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93242838, 31.18245075 ], [ 114.93408438, 31.18342707 ], [ 114.9350121, 31.18397504 ], [ 114.93510192, 31.18402485 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148504", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827366", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908600", "enodeid": "2908637", "funcclass": "1", "length": "0.195", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94864962, 31.18902692 ], [ 114.9503058, 31.18954374 ], [ 114.95056518, 31.18963325 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148505", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827367", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908601", "enodeid": "2908638", "funcclass": "1", "length": "0.194", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.94872936, 31.18889687 ], [ 114.95037564, 31.18941365 ], [ 114.95063502, 31.18949316 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148506", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827368", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908637", "enodeid": "2908639", "funcclass": "1", "length": "0.357", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95056518, 31.18963325 ], [ 114.95218158, 31.19014008 ], [ 114.95330892, 31.19048793 ], [ 114.95407716, 31.19073642 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148507", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827369", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908639", "enodeid": "10002908593", "funcclass": "1", "length": "3.959", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95407716, 31.19073642 ], [ 114.95435652, 31.19082588 ], [ 114.95607264, 31.19135256 ], [ 114.95781864, 31.1918792 ], [ 114.95989386, 31.19243522 ], [ 114.96181752, 31.19284989 ], [ 114.96302352, 31.19307656 ], [ 114.96391056, 31.1932341 ], [ 114.96503682, 31.193411 ], [ 114.9663924, 31.19359725 ], [ 114.96803688, 31.19377275 ], [ 114.96911328, 31.19385983 ], [ 114.97014, 31.19392706 ], [ 114.97222314, 31.19401143 ], [ 114.97412682, 31.1940963 ], [ 114.9757416, 31.19422194 ], [ 114.9776154, 31.1944068 ], [ 114.97783464, 31.19443623 ], [ 114.97929984, 31.19463221 ], [ 114.980994, 31.19489735 ], [ 114.9829569, 31.19525127 ], [ 114.98419224, 31.19548748 ], [ 114.9904593, 31.19665811 ], [ 114.99334884, 31.19718915 ], [ 114.994674, 31.19744507 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148508", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827370", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908638", "enodeid": "2908640", "funcclass": "1", "length": "0.361", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95063502, 31.18949316 ], [ 114.95225142, 31.19001003 ], [ 114.95318922, 31.19029821 ], [ 114.95417688, 31.19061632 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148509", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "3827371", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908640", "enodeid": "10002908591", "funcclass": "1", "length": "3.949", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.95417688, 31.19061632 ], [ 114.95427678, 31.19064611 ], [ 114.95614248, 31.19122251 ], [ 114.95793834, 31.19176904 ], [ 114.95987388, 31.19227533 ], [ 114.96190716, 31.19272974 ], [ 114.9630633, 31.19293652 ], [ 114.96384072, 31.19308434 ], [ 114.96507678, 31.19327096 ], [ 114.96647214, 31.19346711 ], [ 114.96806676, 31.19363276 ], [ 114.96916314, 31.19371979 ], [ 114.97016988, 31.19378706 ], [ 114.97233276, 31.19388125 ], [ 114.97416678, 31.19395631 ], [ 114.97576158, 31.19408195 ], [ 114.97785462, 31.19428625 ], [ 114.97791438, 31.1942961 ], [ 114.97932972, 31.19449221 ], [ 114.98090436, 31.19473769 ], [ 114.98300658, 31.19512118 ], [ 114.98422212, 31.19534744 ], [ 114.99049926, 31.19651802 ], [ 114.99338862, 31.1970591 ], [ 114.994674, 31.19730512 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148510", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827372", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908628", "enodeid": "2908641", "funcclass": "1", "length": "0.648", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92759556, 31.20835532 ], [ 114.92759556, 31.20829533 ], [ 114.92760546, 31.2077156 ], [ 114.92760564, 31.20713586 ], [ 114.92762562, 31.20655613 ], [ 114.9276357, 31.20598638 ], [ 114.92765568, 31.2054066 ], [ 114.92767566, 31.20483686 ], [ 114.92771562, 31.20429708 ], [ 114.9277356, 31.20412712 ], [ 114.92776566, 31.20384722 ], [ 114.92778564, 31.20366731 ], [ 114.92787546, 31.20311745 ], [ 114.92795538, 31.2026576 ], [ 114.92798544, 31.20253763 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148511", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827373", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908629", "enodeid": "2908642", "funcclass": "1", "length": "0.650", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92744562, 31.20834546 ], [ 114.92744562, 31.20829547 ], [ 114.9274557, 31.20771573 ], [ 114.92746578, 31.207136 ], [ 114.92748576, 31.20655626 ], [ 114.92748576, 31.20598652 ], [ 114.92750574, 31.20540678 ], [ 114.9275358, 31.20483699 ], [ 114.92757576, 31.20429722 ], [ 114.92759574, 31.20411726 ], [ 114.92761572, 31.2038474 ], [ 114.92764578, 31.20365745 ], [ 114.9277356, 31.2031076 ], [ 114.9278157, 31.20265773 ], [ 114.92784558, 31.20250779 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148512", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827374", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908642", "enodeid": "2908643", "funcclass": "1", "length": "0.163", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92784558, 31.20250779 ], [ 114.92797554, 31.20197792 ], [ 114.92813538, 31.20143801 ], [ 114.92825526, 31.20107805 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148513", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827375", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908643", "enodeid": "2908603", "funcclass": "1", "length": "1.467", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92825526, 31.20107805 ], [ 114.9283251, 31.20087807 ], [ 114.92835516, 31.20078807 ], [ 114.92853498, 31.20033812 ], [ 114.92869464, 31.19993807 ], [ 114.92876448, 31.19977805 ], [ 114.92903394, 31.1992578 ], [ 114.92924346, 31.19884767 ], [ 114.92932338, 31.19868761 ], [ 114.92950302, 31.19838741 ], [ 114.92965278, 31.19815728 ], [ 114.929982, 31.19765697 ], [ 114.9300918, 31.19750685 ], [ 114.9304311, 31.19705649 ], [ 114.93083016, 31.19652603 ], [ 114.93107964, 31.19624573 ], [ 114.93129924, 31.19598549 ], [ 114.9317982, 31.19542484 ], [ 114.93225702, 31.19488425 ], [ 114.93275598, 31.19435352 ], [ 114.93306522, 31.19398313 ], [ 114.93323496, 31.19378292 ], [ 114.93356418, 31.19341244 ], [ 114.93370386, 31.19323226 ], [ 114.93391338, 31.19297202 ], [ 114.9341229, 31.19267174 ], [ 114.93426258, 31.19250155 ], [ 114.934482, 31.19219127 ], [ 114.9346017, 31.19201114 ], [ 114.93486126, 31.19156087 ], [ 114.93501084, 31.19133069 ], [ 114.93518058, 31.19101056 ], [ 114.93543996, 31.19049041 ], [ 114.9356097, 31.19013032 ], [ 114.93570942, 31.18991022 ], [ 114.93580932, 31.18965021 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148514", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827376", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908641", "enodeid": "2911327", "funcclass": "1", "length": "0.162", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92798544, 31.20253763 ], [ 114.9281253, 31.20198777 ], [ 114.92827506, 31.20146784 ], [ 114.92839494, 31.20111788 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.148515", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "3827377", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2911327", "enodeid": "2908631", "funcclass": "1", "length": "1.054", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92839494, 31.20111788 ], [ 114.92847486, 31.20089792 ], [ 114.92849484, 31.20080792 ], [ 114.92867466, 31.20035792 ], [ 114.92884422, 31.19996781 ], [ 114.92891424, 31.19980775 ], [ 114.92917362, 31.19929758 ], [ 114.92939322, 31.19888736 ], [ 114.92947296, 31.19872734 ], [ 114.9296526, 31.19842715 ], [ 114.92980236, 31.19819702 ], [ 114.93012168, 31.19769671 ], [ 114.93023148, 31.19754659 ], [ 114.9305607, 31.19709623 ], [ 114.93096984, 31.19658575 ], [ 114.93121932, 31.1962955 ], [ 114.93142902, 31.19603522 ], [ 114.93193788, 31.19547456 ], [ 114.9323967, 31.19494397 ], [ 114.93288576, 31.19441328 ], [ 114.9332049, 31.19403285 ], [ 114.93337464, 31.19383265 ], [ 114.93370386, 31.19346221 ], [ 114.93384354, 31.19328203 ], [ 114.93404298, 31.19302175 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150603", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975773", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010809", "enodeid": "3010811", "funcclass": "1", "length": "0.597", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.905916, 31.41324194 ], [ 114.90594588, 31.41297198 ], [ 114.90595596, 31.4124921 ], [ 114.90595596, 31.41226215 ], [ 114.90594606, 31.41200219 ], [ 114.9059259, 31.41152231 ], [ 114.90589602, 31.4110224 ], [ 114.90584598, 31.4105225 ], [ 114.90579594, 31.41002259 ], [ 114.9057459, 31.40950266 ], [ 114.90569604, 31.40897279 ], [ 114.905646, 31.40845286 ], [ 114.90558588, 31.40792298 ], [ 114.90558588, 31.40787299 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150604", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975774", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010810", "enodeid": "3010812", "funcclass": "1", "length": "0.597", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90576588, 31.41324189 ], [ 114.90579594, 31.41297194 ], [ 114.90580602, 31.41249206 ], [ 114.90580602, 31.41226211 ], [ 114.90579594, 31.41200214 ], [ 114.90577596, 31.41152226 ], [ 114.9057459, 31.41103235 ], [ 114.90570594, 31.41053244 ], [ 114.905646, 31.41002255 ], [ 114.90559596, 31.40950262 ], [ 114.90554592, 31.40898273 ], [ 114.90549588, 31.40845281 ], [ 114.90544584, 31.40793293 ], [ 114.90543594, 31.40787294 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150605", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975775", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010811", "enodeid": "3010813", "funcclass": "1", "length": "4.315", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90558588, 31.40787299 ], [ 114.90552594, 31.40739306 ], [ 114.90548598, 31.40686319 ], [ 114.90545592, 31.40660322 ], [ 114.90543594, 31.40632328 ], [ 114.905376, 31.40579336 ], [ 114.90531588, 31.40524346 ], [ 114.90526584, 31.40470359 ], [ 114.90521598, 31.40413367 ], [ 114.90515586, 31.40357378 ], [ 114.90510582, 31.40301389 ], [ 114.90507594, 31.40264399 ], [ 114.90505596, 31.402454 ], [ 114.90499584, 31.40189397 ], [ 114.9049656, 31.40159396 ], [ 114.90494562, 31.40130393 ], [ 114.9048954, 31.40074386 ], [ 114.90483528, 31.40017376 ], [ 114.90477516, 31.39960379 ], [ 114.90471522, 31.39903404 ], [ 114.90466554, 31.39847433 ], [ 114.9046056, 31.39790463 ], [ 114.90455592, 31.39733489 ], [ 114.90451596, 31.3967552 ], [ 114.90447618, 31.39619544 ], [ 114.90446628, 31.39602552 ], [ 114.90445638, 31.39561575 ], [ 114.90444666, 31.39504605 ], [ 114.90446682, 31.39471625 ], [ 114.90446682, 31.39445637 ], [ 114.90450696, 31.39389657 ], [ 114.90455682, 31.39331661 ], [ 114.90464664, 31.39273665 ], [ 114.90474654, 31.39213667 ], [ 114.90486642, 31.39155671 ], [ 114.9049962, 31.39101671 ], [ 114.90514614, 31.39045673 ], [ 114.90524604, 31.39013673 ], [ 114.90532596, 31.38989675 ], [ 114.90550578, 31.38933677 ], [ 114.90588558, 31.38837683 ], [ 114.90609546, 31.38789681 ], [ 114.90631524, 31.38739682 ], [ 114.9065451, 31.38687684 ], [ 114.90677496, 31.38634688 ], [ 114.90701472, 31.38581687 ], [ 114.90725466, 31.38527691 ], [ 114.9075045, 31.38472692 ], [ 114.90774426, 31.38416694 ], [ 114.9079941, 31.38360696 ], [ 114.90822396, 31.38306696 ], [ 114.90848388, 31.38248696 ], [ 114.90874362, 31.38191699 ], [ 114.90899346, 31.38134702 ], [ 114.9092433, 31.38078704 ], [ 114.90949314, 31.38021702 ], [ 114.90974298, 31.37964705 ], [ 114.90998274, 31.37906705 ], [ 114.91018272, 31.3785171 ], [ 114.91035246, 31.37795712 ], [ 114.91046244, 31.3776171 ], [ 114.91052238, 31.37737712 ], [ 114.91064226, 31.37682713 ], [ 114.91074216, 31.37625716 ], [ 114.91080192, 31.37569722 ], [ 114.91085178, 31.37514723 ], [ 114.91086168, 31.37470727 ], [ 114.91086168, 31.37459724 ], [ 114.9108516, 31.3740473 ], [ 114.91082154, 31.37351733 ], [ 114.91079148, 31.37297733 ], [ 114.91075134, 31.37244737 ], [ 114.9107112, 31.3720074 ], [ 114.91070112, 31.37186741 ], [ 114.91068114, 31.37167742 ], [ 114.91065108, 31.37130747 ], [ 114.91060104, 31.37075748 ], [ 114.9105609, 31.37018751 ], [ 114.91054092, 31.36989753 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150606", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975776", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010812", "enodeid": "3010814", "funcclass": "1", "length": "4.314", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90543594, 31.40787294 ], [ 114.9053859, 31.40740301 ], [ 114.90533586, 31.40687313 ], [ 114.90531588, 31.40661317 ], [ 114.90528582, 31.40633322 ], [ 114.90522588, 31.40579331 ], [ 114.90517584, 31.40525345 ], [ 114.9051258, 31.40470355 ], [ 114.90506586, 31.40413362 ], [ 114.90501582, 31.40357373 ], [ 114.90495588, 31.40301384 ], [ 114.90492582, 31.40265393 ], [ 114.90490584, 31.40245395 ], [ 114.90484572, 31.40190392 ], [ 114.90481566, 31.40159387 ], [ 114.9047955, 31.40131383 ], [ 114.90474528, 31.40074377 ], [ 114.90468516, 31.40017371 ], [ 114.90463512, 31.39960374 ], [ 114.90457518, 31.39904399 ], [ 114.90451542, 31.39847429 ], [ 114.90446556, 31.39790454 ], [ 114.9044157, 31.39733484 ], [ 114.90436602, 31.3967651 ], [ 114.90433614, 31.3961954 ], [ 114.90432624, 31.39602548 ], [ 114.90431634, 31.39561571 ], [ 114.90430662, 31.39504601 ], [ 114.9043167, 31.39471616 ], [ 114.90432678, 31.39445633 ], [ 114.90435702, 31.39388658 ], [ 114.90441678, 31.39329663 ], [ 114.9044967, 31.39272666 ], [ 114.9045966, 31.39212668 ], [ 114.90471648, 31.39153673 ], [ 114.90484626, 31.39099673 ], [ 114.9050061, 31.39043675 ], [ 114.9050961, 31.39011675 ], [ 114.90517602, 31.38987677 ], [ 114.90536592, 31.38931679 ], [ 114.90574554, 31.3883568 ], [ 114.90594552, 31.38786684 ], [ 114.9061653, 31.38736685 ], [ 114.90639516, 31.38684687 ], [ 114.90663492, 31.38631686 ], [ 114.90687486, 31.3857869 ], [ 114.90711462, 31.3852469 ], [ 114.90735456, 31.38469691 ], [ 114.9076044, 31.38413693 ], [ 114.90785424, 31.38357695 ], [ 114.90808392, 31.38303695 ], [ 114.90834384, 31.38245699 ], [ 114.90859368, 31.38188702 ], [ 114.90885342, 31.381317 ], [ 114.90909336, 31.38075702 ], [ 114.9093531, 31.38018705 ], [ 114.90959304, 31.37961708 ], [ 114.9098328, 31.37904707 ], [ 114.91004268, 31.37849708 ], [ 114.9102126, 31.3779371 ], [ 114.9103125, 31.37759712 ], [ 114.91038234, 31.37735714 ], [ 114.91049232, 31.37681714 ], [ 114.91060212, 31.37624717 ], [ 114.91066206, 31.37569722 ], [ 114.91070184, 31.37513724 ], [ 114.91071174, 31.37470727 ], [ 114.91072182, 31.37459729 ], [ 114.91070166, 31.3740473 ], [ 114.9106716, 31.37352732 ], [ 114.91064136, 31.37297738 ], [ 114.9106014, 31.3724574 ], [ 114.91057134, 31.3720074 ], [ 114.91056126, 31.37187744 ], [ 114.91054128, 31.37167746 ], [ 114.91051122, 31.37131746 ], [ 114.910461, 31.37075748 ], [ 114.91042086, 31.37019755 ], [ 114.9103908, 31.36990757 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150607", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975777", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010813", "enodeid": "3010815", "funcclass": "1", "length": "0.608", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91054092, 31.36989753 ], [ 114.91051086, 31.36963757 ], [ 114.91046064, 31.36905761 ], [ 114.9104205, 31.36848764 ], [ 114.91037046, 31.36790768 ], [ 114.9103305, 31.36732781 ], [ 114.91028064, 31.36673808 ], [ 114.91025076, 31.36641827 ], [ 114.91023078, 31.36613837 ], [ 114.91018092, 31.36554864 ], [ 114.91014114, 31.36494893 ], [ 114.91009128, 31.36442918 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150608", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975778", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010814", "enodeid": "3010816", "funcclass": "1", "length": "0.610", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9103908, 31.36990757 ], [ 114.91037082, 31.36964756 ], [ 114.91032078, 31.36905761 ], [ 114.91027056, 31.36848764 ], [ 114.91023042, 31.36791767 ], [ 114.91018056, 31.36732785 ], [ 114.91014078, 31.36673813 ], [ 114.91011072, 31.36642826 ], [ 114.91009092, 31.3661484 ], [ 114.91004106, 31.36554869 ], [ 114.9099912, 31.36495896 ], [ 114.90994134, 31.36442922 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150609", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975779", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010816", "enodeid": "3010817", "funcclass": "1", "length": "0.539", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90994134, 31.36442922 ], [ 114.90994134, 31.36435925 ], [ 114.90989148, 31.36376952 ], [ 114.9098517, 31.36316981 ], [ 114.90982182, 31.36289994 ], [ 114.90980184, 31.36258008 ], [ 114.90977196, 31.36231022 ], [ 114.90975198, 31.36198037 ], [ 114.9097122, 31.36153059 ], [ 114.90967224, 31.36100085 ], [ 114.90962238, 31.36045113 ], [ 114.9095925, 31.35991136 ], [ 114.9095826, 31.35958151 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150610", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975780", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010815", "enodeid": "3010818", "funcclass": "1", "length": "0.540", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91009128, 31.36442918 ], [ 114.91008138, 31.36435925 ], [ 114.91004142, 31.36375953 ], [ 114.90999156, 31.36316981 ], [ 114.90997176, 31.36289994 ], [ 114.9099417, 31.36257009 ], [ 114.90991182, 31.36230023 ], [ 114.90990192, 31.36198037 ], [ 114.90985206, 31.3615206 ], [ 114.90981228, 31.36099082 ], [ 114.90977232, 31.36045109 ], [ 114.90974244, 31.35991136 ], [ 114.90973254, 31.35957152 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150611", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975781", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010818", "enodeid": "3010819", "funcclass": "1", "length": "0.194", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90973254, 31.35957152 ], [ 114.90972264, 31.35932163 ], [ 114.90972282, 31.35873191 ], [ 114.90974298, 31.35817215 ], [ 114.90976296, 31.35782232 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150612", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975782", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010817", "enodeid": "3010820", "funcclass": "1", "length": "0.195", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9095826, 31.35958151 ], [ 114.9095727, 31.35932163 ], [ 114.90957288, 31.35873191 ], [ 114.90959304, 31.35816216 ], [ 114.9096231, 31.35782232 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150613", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975783", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010820", "enodeid": "3010821", "funcclass": "1", "length": "0.588", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9096231, 31.35782232 ], [ 114.90963318, 31.35759246 ], [ 114.9096933, 31.3570427 ], [ 114.9097734, 31.35648294 ], [ 114.90987348, 31.35594317 ], [ 114.90999354, 31.35541338 ], [ 114.91013358, 31.35485363 ], [ 114.91029378, 31.35431385 ], [ 114.91048386, 31.3537541 ], [ 114.91068384, 31.35323426 ], [ 114.91092378, 31.35266442 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150614", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975784", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010819", "enodeid": "3010822", "funcclass": "1", "length": "0.583", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90976296, 31.35782232 ], [ 114.90978312, 31.35760241 ], [ 114.90983316, 31.35705264 ], [ 114.90991326, 31.35649289 ], [ 114.91001334, 31.35596315 ], [ 114.9101334, 31.35543336 ], [ 114.91028352, 31.35487361 ], [ 114.91043364, 31.35433383 ], [ 114.9106338, 31.35378407 ], [ 114.91083378, 31.35325424 ], [ 114.91105374, 31.35270438 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150615", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975785", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010821", "enodeid": "3010823", "funcclass": "1", "length": "0.172", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91092378, 31.35266442 ], [ 114.91093386, 31.35264444 ], [ 114.91116372, 31.35209459 ], [ 114.9114438, 31.35154469 ], [ 114.91160382, 31.35122478 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150616", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975786", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010822", "enodeid": "3010824", "funcclass": "1", "length": "0.172", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91105374, 31.35270438 ], [ 114.91107372, 31.35267437 ], [ 114.91131366, 31.35212451 ], [ 114.91159374, 31.35157466 ], [ 114.91174368, 31.35127473 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150617", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975787", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010823", "enodeid": "3010825", "funcclass": "1", "length": "1.314", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91160382, 31.35122478 ], [ 114.9117237, 31.35098484 ], [ 114.9119937, 31.35047495 ], [ 114.9122736, 31.34995506 ], [ 114.91255368, 31.34939522 ], [ 114.9128235, 31.34882534 ], [ 114.91307352, 31.34827548 ], [ 114.91311348, 31.34814552 ], [ 114.9132735, 31.34770565 ], [ 114.9134535, 31.3471458 ], [ 114.91359354, 31.346586 ], [ 114.9137136, 31.34604614 ], [ 114.9137937, 31.34549633 ], [ 114.91384374, 31.34493653 ], [ 114.9138738, 31.34439671 ], [ 114.91385382, 31.34379695 ], [ 114.91384392, 31.3433771 ], [ 114.91382394, 31.34326716 ], [ 114.91377408, 31.34276735 ], [ 114.91373412, 31.34250743 ], [ 114.91369416, 31.34224755 ], [ 114.9136641, 31.34207763 ], [ 114.91357428, 31.34169779 ], [ 114.91352442, 31.34146788 ], [ 114.91344432, 31.34118798 ], [ 114.9133545, 31.34088815 ], [ 114.91327458, 31.34064825 ], [ 114.91319466, 31.34039837 ], [ 114.91308468, 31.34012846 ], [ 114.91298478, 31.33983861 ], [ 114.91297488, 31.3398086 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150618", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975788", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010824", "enodeid": "3010826", "funcclass": "1", "length": "1.324", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91174368, 31.35127473 ], [ 114.91187364, 31.35101481 ], [ 114.91213356, 31.35051491 ], [ 114.91242354, 31.34998503 ], [ 114.91269354, 31.34942519 ], [ 114.91297344, 31.34885531 ], [ 114.91321356, 31.34829546 ], [ 114.91326342, 31.3481655 ], [ 114.91342344, 31.34772563 ], [ 114.91359354, 31.34716578 ], [ 114.91374348, 31.34660594 ], [ 114.91385346, 31.34605613 ], [ 114.91393356, 31.34550632 ], [ 114.9139836, 31.34494647 ], [ 114.91401366, 31.34439666 ], [ 114.91400376, 31.3437969 ], [ 114.91398396, 31.34337705 ], [ 114.91397388, 31.34325713 ], [ 114.91391394, 31.34275731 ], [ 114.91388406, 31.34249739 ], [ 114.91383402, 31.34223752 ], [ 114.91380414, 31.3420676 ], [ 114.91372422, 31.34167776 ], [ 114.91366428, 31.34145785 ], [ 114.91358436, 31.34116796 ], [ 114.91349436, 31.34086808 ], [ 114.91342452, 31.34062818 ], [ 114.9133446, 31.3403783 ], [ 114.91323462, 31.34010843 ], [ 114.91313472, 31.33981859 ], [ 114.91311474, 31.33976859 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150619", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975789", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010825", "enodeid": "3010827", "funcclass": "1", "length": "0.354", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91297488, 31.3398086 ], [ 114.9128748, 31.33954872 ], [ 114.912765, 31.33924889 ], [ 114.9126651, 31.33896899 ], [ 114.91254504, 31.33867914 ], [ 114.91242516, 31.33837926 ], [ 114.91231536, 31.33807943 ], [ 114.91197552, 31.3372098 ], [ 114.91187562, 31.33693994 ], [ 114.91181568, 31.33678001 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150620", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975790", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010827", "enodeid": "20003010808", "funcclass": "1", "length": "0.139", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91181568, 31.33678001 ], [ 114.91168572, 31.33643018 ], [ 114.91157592, 31.3361303 ], [ 114.91138602, 31.33558053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150621", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975791", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010826", "enodeid": "3010828", "funcclass": "1", "length": "0.352", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91311474, 31.33976859 ], [ 114.91302474, 31.3395287 ], [ 114.91292484, 31.33925883 ], [ 114.91291494, 31.33922886 ], [ 114.91280496, 31.33894896 ], [ 114.91269498, 31.33865912 ], [ 114.9125751, 31.33835924 ], [ 114.9124653, 31.33805936 ], [ 114.91212546, 31.33717979 ], [ 114.91201566, 31.33691991 ], [ 114.91195572, 31.33675998 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.150622", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "3975792", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3010828", "enodeid": "20003010807", "funcclass": "1", "length": "0.137", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91195572, 31.33675998 ], [ 114.91182576, 31.33640016 ], [ 114.91171578, 31.33610028 ], [ 114.91154604, 31.33558053 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151460", "Name": null, "pyname": null, "mapid": "465447", "id": "4240811", "kind_num": "3", "kind": "0005|000b|0012", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289633", "enodeid": "3289634", "funcclass": "4", "length": "0.051", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92248932, 31.02061302 ], [ 114.92251938, 31.02045309 ], [ 114.92251938, 31.02040314 ], [ 114.92251938, 31.02037317 ], [ 114.92251938, 31.0203432 ], [ 114.9225093, 31.0203032 ], [ 114.92248932, 31.02026324 ], [ 114.92247942, 31.02022328 ], [ 114.92244936, 31.02016334 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151461", "Name": null, "pyname": null, "mapid": "465447", "id": "4240815", "kind_num": "3", "kind": "0005|000b|0012", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289635", "enodeid": "3289636", "funcclass": "3", "length": "0.056", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9226092, 31.02064295 ], [ 114.9226992, 31.02056294 ], [ 114.92271918, 31.02053297 ], [ 114.92274906, 31.02051294 ], [ 114.92277912, 31.02049296 ], [ 114.92281908, 31.02048293 ], [ 114.92284896, 31.02047294 ], [ 114.92287902, 31.0204629 ], [ 114.92295894, 31.02045287 ], [ 114.92301888, 31.02044283 ], [ 114.92310888, 31.02044279 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151462", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240817", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289632", "enodeid": "3289643", "funcclass": "1", "length": "0.231", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91845228, 31.0306698 ], [ 114.9184422, 31.03058988 ], [ 114.9184224, 31.03049997 ], [ 114.91836246, 31.03006037 ], [ 114.91823286, 31.02908117 ], [ 114.918183, 31.02860142 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151463", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240818", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003289626", "enodeid": "3289644", "funcclass": "1", "length": "6.240", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93109926, 31.08568424 ], [ 114.93109926, 31.08565427 ], [ 114.9310593, 31.08530448 ], [ 114.9310494, 31.0851846 ], [ 114.93102942, 31.08491474 ], [ 114.93098946, 31.08458498 ], [ 114.93094968, 31.08424523 ], [ 114.93089982, 31.0838855 ], [ 114.93084978, 31.0834958 ], [ 114.93079002, 31.0831061 ], [ 114.93072018, 31.08269642 ], [ 114.93064026, 31.08229673 ], [ 114.93057042, 31.08189704 ], [ 114.9304806, 31.08153735 ], [ 114.93040086, 31.08117767 ], [ 114.93031104, 31.08082797 ], [ 114.93022104, 31.08048827 ], [ 114.93013122, 31.08015855 ], [ 114.9300414, 31.07981885 ], [ 114.92994168, 31.07948918 ], [ 114.92986176, 31.07915946 ], [ 114.92976204, 31.07884973 ], [ 114.92967222, 31.07854004 ], [ 114.9295824, 31.07824029 ], [ 114.92949258, 31.0779306 ], [ 114.92940276, 31.07762087 ], [ 114.92928288, 31.07725124 ], [ 114.92920314, 31.0769915 ], [ 114.92912322, 31.07667177 ], [ 114.92902332, 31.07633207 ], [ 114.9289236, 31.07601239 ], [ 114.92883378, 31.07569266 ], [ 114.92873388, 31.07537298 ], [ 114.92863416, 31.07504327 ], [ 114.92854434, 31.07471355 ], [ 114.92844444, 31.07437389 ], [ 114.92835462, 31.07404418 ], [ 114.9282648, 31.07370447 ], [ 114.92819496, 31.07345472 ], [ 114.92816508, 31.07336481 ], [ 114.92807526, 31.07302511 ], [ 114.92798544, 31.07267541 ], [ 114.92791542, 31.07236568 ], [ 114.92783568, 31.07203596 ], [ 114.92775576, 31.07168622 ], [ 114.92767602, 31.07131655 ], [ 114.9275961, 31.07093688 ], [ 114.92750628, 31.07053719 ], [ 114.92742654, 31.0701375 ], [ 114.9273567, 31.06973786 ], [ 114.92728686, 31.06931814 ], [ 114.92721702, 31.06890846 ], [ 114.927147, 31.0684788 ], [ 114.92708724, 31.06804914 ], [ 114.92703738, 31.06773936 ], [ 114.9270174, 31.06760945 ], [ 114.92697744, 31.06722974 ], [ 114.9269076, 31.06672011 ], [ 114.92685774, 31.06627043 ], [ 114.92681778, 31.06592064 ], [ 114.92680788, 31.06580072 ], [ 114.92674794, 31.065341 ], [ 114.926688, 31.06485131 ], [ 114.92663814, 31.06434164 ], [ 114.9265881, 31.06386194 ], [ 114.92652834, 31.06336226 ], [ 114.9264783, 31.06293251 ], [ 114.92642844, 31.0625028 ], [ 114.9263685, 31.06200308 ], [ 114.92630856, 31.06153341 ], [ 114.92623872, 31.06101375 ], [ 114.92616888, 31.06049409 ], [ 114.92609886, 31.06004436 ], [ 114.92602902, 31.05956471 ], [ 114.92596908, 31.05916497 ], [ 114.92592912, 31.05890514 ], [ 114.92588916, 31.05871529 ], [ 114.92586918, 31.05862533 ], [ 114.92582922, 31.05839552 ], [ 114.92577936, 31.05816566 ], [ 114.92570952, 31.05771597 ], [ 114.92559972, 31.05717638 ], [ 114.92550972, 31.05673668 ], [ 114.92539002, 31.05621707 ], [ 114.92528004, 31.05577742 ], [ 114.92518032, 31.05534771 ], [ 114.92508042, 31.05492804 ], [ 114.92504046, 31.05477815 ], [ 114.92496054, 31.05449838 ], [ 114.92486064, 31.05410868 ], [ 114.92475084, 31.05372902 ], [ 114.92464104, 31.05330935 ], [ 114.92453124, 31.05295961 ], [ 114.92441136, 31.05257994 ], [ 114.92430156, 31.05220023 ], [ 114.92419158, 31.05188051 ], [ 114.92409186, 31.05156078 ], [ 114.9240618, 31.05146088 ], [ 114.92394192, 31.05114116 ], [ 114.92383212, 31.05081144 ], [ 114.92372232, 31.05046175 ], [ 114.92367246, 31.05032184 ], [ 114.92360244, 31.05013203 ], [ 114.92355258, 31.04997215 ], [ 114.92349264, 31.04979233 ], [ 114.92336286, 31.04945262 ], [ 114.92325288, 31.04912291 ], [ 114.92313318, 31.04877321 ], [ 114.9230232, 31.04843351 ], [ 114.9229035, 31.0480938 ], [ 114.92277372, 31.0477541 ], [ 114.92266374, 31.0474044 ], [ 114.92255394, 31.0470647 ], [ 114.92243406, 31.046715 ], [ 114.92231436, 31.04636531 ], [ 114.9219747, 31.04541612 ], [ 114.92187498, 31.04510639 ], [ 114.921765, 31.04480664 ], [ 114.9216552, 31.04448692 ], [ 114.9215553, 31.04416719 ], [ 114.9213357, 31.04354772 ], [ 114.9212358, 31.04324798 ], [ 114.92111592, 31.04291831 ], [ 114.92104608, 31.04270847 ], [ 114.92100612, 31.04258859 ], [ 114.92089632, 31.04227886 ], [ 114.92078634, 31.04192912 ], [ 114.92073648, 31.04178926 ], [ 114.92067654, 31.04157942 ], [ 114.92055666, 31.04121974 ], [ 114.92044686, 31.04086005 ], [ 114.92023716, 31.04012066 ], [ 114.92012754, 31.03974108 ], [ 114.92002782, 31.03934148 ], [ 114.91992792, 31.03891191 ], [ 114.9198183, 31.03849233 ], [ 114.9197184, 31.0380728 ], [ 114.91961868, 31.03760322 ], [ 114.91952904, 31.03719363 ], [ 114.91944912, 31.03675407 ], [ 114.91935948, 31.03629453 ], [ 114.91927974, 31.03582496 ], [ 114.91927974, 31.03580498 ], [ 114.9192099, 31.03540538 ], [ 114.91918002, 31.03520553 ], [ 114.91912026, 31.0348359 ], [ 114.91905042, 31.03432637 ], [ 114.91898058, 31.03376684 ], [ 114.91892082, 31.03320735 ], [ 114.91885116, 31.03267784 ], [ 114.9187914, 31.03215831 ], [ 114.91873164, 31.03164878 ], [ 114.91869168, 31.03138899 ], [ 114.9186519, 31.03102931 ], [ 114.91859196, 31.03066967 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151464", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240819", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289644", "enodeid": "3289640", "funcclass": "1", "length": "0.232", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91859196, 31.03066967 ], [ 114.91858206, 31.03057976 ], [ 114.91857216, 31.03047981 ], [ 114.91850232, 31.03005024 ], [ 114.9183828, 31.02907109 ], [ 114.91832286, 31.02859134 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151465", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240828", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289642", "enodeid": "3289649", "funcclass": "1", "length": "0.320", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91813296, 31.02716219 ], [ 114.91811298, 31.02707223 ], [ 114.91804314, 31.02652256 ], [ 114.91802316, 31.02641262 ], [ 114.91797312, 31.02607283 ], [ 114.91771338, 31.02488357 ], [ 114.91762338, 31.02449382 ], [ 114.91757352, 31.02432395 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151466", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240829", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289649", "enodeid": "3289637", "funcclass": "1", "length": "0.105", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91757352, 31.02432395 ], [ 114.91746354, 31.0239842 ], [ 114.91733376, 31.0235045 ], [ 114.9173037, 31.02340455 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151467", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240833", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289641", "enodeid": "3289652", "funcclass": "1", "length": "0.887", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91715394, 31.02342462 ], [ 114.91705404, 31.02310485 ], [ 114.91677414, 31.02224544 ], [ 114.91649442, 31.02147599 ], [ 114.91624476, 31.02081647 ], [ 114.91615476, 31.02060663 ], [ 114.91604478, 31.02031683 ], [ 114.915915, 31.02001709 ], [ 114.9156153, 31.01931761 ], [ 114.91549542, 31.01905778 ], [ 114.91529562, 31.01861817 ], [ 114.91514568, 31.01830844 ], [ 114.91497594, 31.01792877 ], [ 114.91464636, 31.01723942 ], [ 114.91443648, 31.01674982 ], [ 114.91432668, 31.01654003 ], [ 114.91403706, 31.01591061 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151468", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240834", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289652", "enodeid": "20003289624", "funcclass": "1", "length": "1.577", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "420117", "admincoder": "420117", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91403706, 31.01591061 ], [ 114.913996422185477, 31.015823496085552 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151470", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240838", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289637", "enodeid": "3289656", "funcclass": "1", "length": "0.022", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9173037, 31.02340455 ], [ 114.91723386, 31.0232147 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151471", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240839", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289656", "enodeid": "3289653", "funcclass": "1", "length": "0.861", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91723386, 31.0232147 ], [ 114.9171939, 31.02308478 ], [ 114.91691418, 31.02222537 ], [ 114.91664436, 31.02144593 ], [ 114.91639452, 31.0207964 ], [ 114.9163047, 31.02058656 ], [ 114.91619472, 31.02029676 ], [ 114.91606494, 31.01999702 ], [ 114.91575516, 31.01928755 ], [ 114.91564518, 31.01902772 ], [ 114.91543548, 31.01858811 ], [ 114.91529562, 31.01827838 ], [ 114.91512588, 31.01789871 ], [ 114.91479612, 31.01720936 ], [ 114.91457652, 31.01671976 ], [ 114.91447662, 31.01650997 ], [ 114.914207740041462, 31.015943353453611 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151472", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240840", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289631", "enodeid": "3289657", "funcclass": "1", "length": "0.220", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9179832, 31.02716228 ], [ 114.91797312, 31.02708231 ], [ 114.9178932, 31.02658263 ], [ 114.9178833, 31.02646271 ], [ 114.91783326, 31.02608291 ], [ 114.91763346, 31.02520347 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151473", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240841", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289657", "enodeid": "3289641", "funcclass": "1", "length": "0.203", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91763346, 31.02520347 ], [ 114.91757352, 31.02490364 ], [ 114.91748352, 31.0245039 ], [ 114.91732368, 31.02400427 ], [ 114.91718382, 31.02352457 ], [ 114.91715394, 31.02342462 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151474", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240842", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003289623", "enodeid": "3289658", "funcclass": "1", "length": "6.215", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9309495, 31.08568442 ], [ 114.93090954, 31.08527469 ], [ 114.93090954, 31.08518474 ], [ 114.93087966, 31.08491492 ], [ 114.93084978, 31.08458516 ], [ 114.93080982, 31.0842554 ], [ 114.93075996, 31.08389567 ], [ 114.9307101, 31.08350597 ], [ 114.93065016, 31.08311622 ], [ 114.93058032, 31.08270654 ], [ 114.93050058, 31.0823069 ], [ 114.93042066, 31.08190721 ], [ 114.93034092, 31.08155751 ], [ 114.93025092, 31.08119783 ], [ 114.9301611, 31.08084813 ], [ 114.93008136, 31.08050843 ], [ 114.92999154, 31.08016872 ], [ 114.92989164, 31.07983901 ], [ 114.92980182, 31.07950934 ], [ 114.929712, 31.07917962 ], [ 114.92962218, 31.07886989 ], [ 114.92952246, 31.0785602 ], [ 114.92943264, 31.0782605 ], [ 114.92934282, 31.07795076 ], [ 114.92925282, 31.07764103 ], [ 114.9291432, 31.0772714 ], [ 114.92906328, 31.07701161 ], [ 114.92897346, 31.07669193 ], [ 114.92887356, 31.07635223 ], [ 114.92878374, 31.07603255 ], [ 114.92869392, 31.07571282 ], [ 114.9285942, 31.0753931 ], [ 114.9284943, 31.07506343 ], [ 114.92839458, 31.07473376 ], [ 114.92830476, 31.07439405 ], [ 114.92820486, 31.07406434 ], [ 114.92811504, 31.07372463 ], [ 114.9280452, 31.07347488 ], [ 114.92802522, 31.07338493 ], [ 114.9279255, 31.07304527 ], [ 114.92784558, 31.07269557 ], [ 114.92776566, 31.07238584 ], [ 114.92769582, 31.07204609 ], [ 114.92761608, 31.07170638 ], [ 114.92752626, 31.07133671 ], [ 114.92745642, 31.07094701 ], [ 114.9273666, 31.07054736 ], [ 114.92728668, 31.07014767 ], [ 114.92721684, 31.06974798 ], [ 114.9271371, 31.06932831 ], [ 114.92706708, 31.06891863 ], [ 114.92700732, 31.06848897 ], [ 114.92693748, 31.06805931 ], [ 114.92688762, 31.06774953 ], [ 114.92687754, 31.06761962 ], [ 114.92683776, 31.06723991 ], [ 114.92676792, 31.06673028 ], [ 114.92671788, 31.06627056 ], [ 114.92667792, 31.06592078 ], [ 114.92665812, 31.06581084 ], [ 114.92660808, 31.06535112 ], [ 114.92654814, 31.06485144 ], [ 114.92648838, 31.06435176 ], [ 114.92643834, 31.06387206 ], [ 114.92638848, 31.06336239 ], [ 114.92632854, 31.06294268 ], [ 114.92627868, 31.06251293 ], [ 114.92621874, 31.06201325 ], [ 114.9261687, 31.06154354 ], [ 114.92609886, 31.06102388 ], [ 114.92602902, 31.06050422 ], [ 114.92595918, 31.06005453 ], [ 114.92588916, 31.05957483 ], [ 114.92582922, 31.0591751 ], [ 114.92577936, 31.05891527 ], [ 114.92577936, 31.0588853 ], [ 114.9257295, 31.05863546 ], [ 114.92568954, 31.05840564 ], [ 114.9256395, 31.05817583 ], [ 114.92555976, 31.0577261 ], [ 114.92544978, 31.0571865 ], [ 114.92535996, 31.05674681 ], [ 114.92525016, 31.05623718 ], [ 114.92514036, 31.05578754 ], [ 114.92503038, 31.05535788 ], [ 114.92494056, 31.05494816 ], [ 114.9249006, 31.05479831 ], [ 114.92482068, 31.05451854 ], [ 114.92472096, 31.05412884 ], [ 114.92461098, 31.05374913 ], [ 114.92449128, 31.05332946 ], [ 114.9243813, 31.05297977 ], [ 114.9242715, 31.05260006 ], [ 114.9241617, 31.05222039 ], [ 114.9240519, 31.05190067 ], [ 114.92394192, 31.05158094 ], [ 114.92391204, 31.05149103 ], [ 114.92379216, 31.05116132 ], [ 114.92368236, 31.0508316 ], [ 114.92357256, 31.05048186 ], [ 114.92352252, 31.050342 ], [ 114.92346258, 31.05015215 ], [ 114.92340282, 31.04999231 ], [ 114.92334288, 31.04981244 ], [ 114.923223, 31.04947274 ], [ 114.9231132, 31.04914302 ], [ 114.92299332, 31.04879333 ], [ 114.92287344, 31.04845362 ], [ 114.92275374, 31.04812395 ], [ 114.92263386, 31.04777426 ], [ 114.92252406, 31.04742452 ], [ 114.92240418, 31.04708481 ], [ 114.9222843, 31.04673512 ], [ 114.92216442, 31.04638542 ], [ 114.92183502, 31.04543624 ], [ 114.92173512, 31.0451265 ], [ 114.92162532, 31.0448268 ], [ 114.92151534, 31.04450708 ], [ 114.92140554, 31.04418735 ], [ 114.92118594, 31.04356788 ], [ 114.92108604, 31.04326814 ], [ 114.92096616, 31.04293842 ], [ 114.92089632, 31.04272863 ], [ 114.92086626, 31.04260871 ], [ 114.92075646, 31.04229897 ], [ 114.92063658, 31.04194928 ], [ 114.92058672, 31.04180942 ], [ 114.92052678, 31.04159958 ], [ 114.92041698, 31.04123985 ], [ 114.920307, 31.04088017 ], [ 114.92009748, 31.04014082 ], [ 114.91998768, 31.0397612 ], [ 114.91987788, 31.03935161 ], [ 114.91977816, 31.03893203 ], [ 114.91967844, 31.03851249 ], [ 114.91957872, 31.03808292 ], [ 114.919479, 31.03761339 ], [ 114.91938918, 31.03721375 ], [ 114.91929936, 31.0367642 ], [ 114.91920972, 31.03630466 ], [ 114.91913988, 31.03589502 ], [ 114.9191298, 31.03583508 ], [ 114.91907004, 31.03542549 ], [ 114.91903026, 31.03521566 ], [ 114.91897032, 31.03484603 ], [ 114.91891056, 31.03433649 ], [ 114.91883082, 31.03377701 ], [ 114.91878114, 31.03321748 ], [ 114.9187113, 31.03268796 ], [ 114.91865154, 31.03215845 ], [ 114.9185817, 31.0316589 ], [ 114.91855182, 31.03139912 ], [ 114.91850214, 31.03103943 ], [ 114.91848216, 31.03088958 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151475", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240843", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289658", "enodeid": "3289632", "funcclass": "1", "length": "0.025", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91848216, 31.03088958 ], [ 114.91845228, 31.0306698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151476", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240844", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289643", "enodeid": "3289659", "funcclass": "1", "length": "0.088", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.918183, 31.02860142 ], [ 114.91810308, 31.02794181 ], [ 114.9180831, 31.0278119 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151477", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240845", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289659", "enodeid": "3289631", "funcclass": "1", "length": "0.073", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9180831, 31.0278119 ], [ 114.9179832, 31.02716228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151478", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240846", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289640", "enodeid": "3289660", "funcclass": "1", "length": "0.100", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91832286, 31.02859134 ], [ 114.91825284, 31.02794172 ], [ 114.91821288, 31.02769188 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.151479", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465447", "id": "4240847", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "3289660", "enodeid": "3289642", "funcclass": "1", "length": "0.059", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91821288, 31.02769188 ], [ 114.91813296, 31.02716219 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.152136", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "14052027", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693217", "enodeid": "11789102", "funcclass": "1", "length": "0.047", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91153902, 31.32194684 ], [ 114.91151904, 31.32176697 ], [ 114.91147926, 31.32152717 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.152137", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "14052028", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "11789102", "enodeid": "2693193", "funcclass": "1", "length": "0.331", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91147926, 31.32152717 ], [ 114.91146918, 31.3214472 ], [ 114.91138944, 31.32097754 ], [ 114.91127964, 31.32041796 ], [ 114.91123986, 31.32010814 ], [ 114.91120998, 31.31978837 ], [ 114.91119, 31.31958852 ], [ 114.9111702, 31.31926875 ], [ 114.91115022, 31.31905887 ], [ 114.9111504, 31.31897895 ], [ 114.91114032, 31.31891897 ], [ 114.91113042, 31.31884904 ], [ 114.9110505, 31.31857922 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.152166", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "14052067", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693187", "enodeid": "11789122", "funcclass": "1", "length": "0.049", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9101613, 31.31732025 ], [ 114.91013142, 31.31729028 ], [ 114.91012134, 31.31726031 ], [ 114.91003152, 31.31712041 ], [ 114.90993162, 31.31693055 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.152167", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "14052068", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "11789122", "enodeid": "2693178", "funcclass": "1", "length": "0.283", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90993162, 31.31693055 ], [ 114.90989166, 31.31686062 ], [ 114.90972174, 31.31654085 ], [ 114.90961194, 31.31633097 ], [ 114.90935202, 31.31584128 ], [ 114.90914232, 31.31538156 ], [ 114.9088626, 31.31471192 ], [ 114.90880266, 31.314582 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.154736", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "49704288", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908614", "enodeid": "47412591", "funcclass": "1", "length": "0.148", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93609048, 31.17888599 ], [ 114.93615042, 31.17899583 ], [ 114.9361803, 31.17907571 ], [ 114.93629982, 31.17984507 ], [ 114.93637956, 31.18018469 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.154737", "Name": "麻城枢纽互通", "pyname": "mcsnht", "mapid": "465467", "id": "49704289", "kind_num": "3", "kind": "0003|000b|000c", "width": "30", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "47412591", "enodeid": "2908616", "funcclass": "1", "length": "0.210", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93637956, 31.18018469 ], [ 114.93639954, 31.18026461 ], [ 114.93649926, 31.1806242 ], [ 114.93666882, 31.18104365 ], [ 114.93691812, 31.18144298 ], [ 114.93723726, 31.1819121 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.154738", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "49704290", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908614", "enodeid": "47412592", "funcclass": "1", "length": "0.084", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93609048, 31.17888599 ], [ 114.93602082, 31.17833645 ], [ 114.93599094, 31.17813665 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.154739", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "49704291", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "47412592", "enodeid": "20002908561", "funcclass": "1", "length": "1.027", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93599094, 31.17813665 ], [ 114.93594108, 31.17777692 ], [ 114.93585126, 31.17721743 ], [ 114.9357717, 31.17666789 ], [ 114.93570186, 31.17613833 ], [ 114.93568188, 31.17602844 ], [ 114.93567198, 31.17592854 ], [ 114.93561222, 31.17555887 ], [ 114.93553248, 31.17499934 ], [ 114.93545274, 31.17441983 ], [ 114.93538308, 31.17387029 ], [ 114.93529326, 31.17330077 ], [ 114.93521352, 31.17278124 ], [ 114.93518364, 31.17259139 ], [ 114.93513396, 31.17217172 ], [ 114.93505422, 31.17162222 ], [ 114.93502434, 31.17145235 ], [ 114.93497448, 31.17106269 ], [ 114.9349545, 31.17093282 ], [ 114.93490464, 31.17066305 ], [ 114.93488484, 31.17047319 ], [ 114.9348051, 31.16992365 ], [ 114.93477522, 31.16970387 ], [ 114.93473526, 31.16935413 ], [ 114.93468558, 31.16897447 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.154740", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "49704294", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2913196", "enodeid": "47412594", "funcclass": "1", "length": "0.073", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37633268, 31.21298631 ], [ 115.37663238, 31.21332584 ], [ 115.37668224, 31.21338573 ], [ 115.37680212, 31.21350557 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155189", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943309", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715546", "enodeid": "2693210", "funcclass": "1", "length": "0.363", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91657254, 31.25794163 ], [ 114.91684254, 31.25720187 ], [ 114.91720236, 31.25637194 ], [ 114.91761204, 31.25553197 ], [ 114.91794162, 31.25489198 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155190", "Name": null, "pyname": null, "mapid": "465477", "id": "84943310", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "72715546", "enodeid": "72715545", "funcclass": "5", "length": "0.210", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91657254, 31.25794163 ], [ 114.91658244, 31.25816145 ], [ 114.91650252, 31.25849126 ], [ 114.9163524, 31.25897109 ], [ 114.91620228, 31.25957081 ], [ 114.9161724, 31.25979072 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155191", "Name": null, "pyname": null, "mapid": "465477", "id": "84943313", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "72715545", "enodeid": "72715547", "funcclass": "5", "length": "0.393", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9161724, 31.25979072 ], [ 114.91620246, 31.26028064 ], [ 114.91620264, 31.26080057 ], [ 114.91611282, 31.26120066 ], [ 114.91576344, 31.26230073 ], [ 114.91558344, 31.26303032 ], [ 114.91549344, 31.26325023 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155192", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943314", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693207", "enodeid": "72715549", "funcclass": "1", "length": "0.149", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9152031, 31.2649992 ], [ 114.91522326, 31.26476934 ], [ 114.91530336, 31.26391988 ], [ 114.91532352, 31.26366005 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155193", "Name": null, "pyname": null, "mapid": "465477", "id": "84943316", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "72715549", "enodeid": "72715548", "funcclass": "5", "length": "0.254", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91532352, 31.26366005 ], [ 114.91529364, 31.26339023 ], [ 114.91533396, 31.26201116 ], [ 114.91529418, 31.26138161 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155194", "Name": null, "pyname": null, "mapid": "465477", "id": "84943319", "kind_num": "2", "kind": "0007|000e", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "72715548", "enodeid": "72715550", "funcclass": "5", "length": "0.344", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91529418, 31.26138161 ], [ 114.91530444, 31.26093188 ], [ 114.91537428, 31.26055199 ], [ 114.9154839, 31.26026183 ], [ 114.9156036, 31.26004164 ], [ 114.91579314, 31.25962139 ], [ 114.91619292, 31.25853162 ], [ 114.91626294, 31.25843163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155195", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943320", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693208", "enodeid": "72715551", "funcclass": "1", "length": "0.150", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91535304, 31.2650091 ], [ 114.91536312, 31.26476925 ], [ 114.91544322, 31.26391979 ], [ 114.91546338, 31.26365996 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155196", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943321", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715551", "enodeid": "72715547", "funcclass": "1", "length": "0.046", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91546338, 31.26365996 ], [ 114.91549344, 31.26325023 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155197", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943322", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715547", "enodeid": "72715552", "funcclass": "1", "length": "0.539", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91549344, 31.26325023 ], [ 114.91550352, 31.26316028 ], [ 114.9156036, 31.26221087 ], [ 114.91570386, 31.26134133 ], [ 114.91585326, 31.26050118 ], [ 114.9159429, 31.2600911 ], [ 114.91604262, 31.25966094 ], [ 114.91627266, 31.2588513 ], [ 114.91639272, 31.25847141 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155198", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943323", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715552", "enodeid": "72715546", "funcclass": "1", "length": "0.061", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91639272, 31.25847141 ], [ 114.91654266, 31.25802159 ], [ 114.91657254, 31.25794163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155199", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943324", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715550", "enodeid": "72715553", "funcclass": "1", "length": "0.062", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91626294, 31.25843163 ], [ 114.9164028, 31.25800179 ], [ 114.91644294, 31.25789181 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155200", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943325", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715553", "enodeid": "2693209", "funcclass": "1", "length": "0.363", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91644294, 31.25789181 ], [ 114.91670286, 31.25717204 ], [ 114.9170625, 31.25634215 ], [ 114.91747218, 31.25550218 ], [ 114.91781184, 31.25484216 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155201", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943326", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715549", "enodeid": "72715554", "funcclass": "1", "length": "0.048", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91532352, 31.26366005 ], [ 114.91535358, 31.2632303 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155202", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "84943327", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72715554", "enodeid": "72715550", "funcclass": "1", "length": "0.542", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91535358, 31.2632303 ], [ 114.91536366, 31.26316037 ], [ 114.91545384, 31.26220097 ], [ 114.91555392, 31.26133148 ], [ 114.91571358, 31.26048143 ], [ 114.91580322, 31.26003134 ], [ 114.91589286, 31.25965122 ], [ 114.9161229, 31.2588315 ], [ 114.91626294, 31.25843163 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155399", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "85346295", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798954", "enodeid": "72946794", "funcclass": "1", "length": "4.825", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0701192, 31.21382601 ], [ 115.07025888, 31.21381584 ], [ 115.0726752, 31.21368309 ], [ 115.07414292, 31.21359138 ], [ 115.07634936, 31.21347884 ], [ 115.0787358, 31.2133361 ], [ 115.08015348, 31.21324448 ], [ 115.08019344, 31.21324443 ], [ 115.08149142, 31.21318292 ], [ 115.08244002, 31.21315182 ], [ 115.0835184, 31.2131606 ], [ 115.08450678, 31.21323944 ], [ 115.08560586, 31.21336872 ], [ 115.08688494, 31.21361807 ], [ 115.0879941, 31.21390746 ], [ 115.08917328, 31.21430675 ], [ 115.09137162, 31.21520535 ], [ 115.09332012, 31.21592418 ], [ 115.0955685, 31.21663289 ], [ 115.09692822, 31.21700261 ], [ 115.09909884, 31.21752326 ], [ 115.09924878, 31.21756331 ], [ 115.10200962, 31.21820411 ], [ 115.10429022, 31.21874478 ], [ 115.10725122, 31.21946582 ], [ 115.10774154, 31.21958606 ], [ 115.1097525, 31.22007696 ], [ 115.11253386, 31.22074827 ], [ 115.11415458, 31.22107902 ], [ 115.11502506, 31.22125943 ], [ 115.11729594, 31.2215405 ], [ 115.11745614, 31.22155058 ], [ 115.11923688, 31.22164143 ], [ 115.11932688, 31.22163149 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155400", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "85346296", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72946794", "enodeid": "10002940585", "funcclass": "1", "length": "0.010", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11932688, 31.22163149 ], [ 115.11937692, 31.22163153 ], [ 115.11942696, 31.22163153 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155401", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "85346297", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2798959", "enodeid": "72946795", "funcclass": "1", "length": "4.825", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.07011902, 31.21369605 ], [ 115.07018904, 31.21369596 ], [ 115.07266512, 31.21355313 ], [ 115.074063, 31.2134715 ], [ 115.0762896, 31.21335896 ], [ 115.07872572, 31.21320614 ], [ 115.0801236, 31.21311456 ], [ 115.08018354, 31.21311447 ], [ 115.08148152, 31.21305296 ], [ 115.08242994, 31.21302186 ], [ 115.08354828, 31.21304058 ], [ 115.08443694, 31.21309953 ], [ 115.0856658, 31.21324875 ], [ 115.08690492, 31.21348815 ], [ 115.08804414, 31.21378749 ], [ 115.08921324, 31.21418682 ], [ 115.0913916, 31.21507544 ], [ 115.0934301, 31.21582419 ], [ 115.09556868, 31.21650297 ], [ 115.09698816, 31.21688268 ], [ 115.09899876, 31.21736328 ], [ 115.09953894, 31.21750341 ], [ 115.10205966, 31.21809417 ], [ 115.1050005, 31.218795 ], [ 115.10730126, 31.21934585 ], [ 115.10816166, 31.21955627 ], [ 115.10980254, 31.21995699 ], [ 115.11248382, 31.22059824 ], [ 115.1141445, 31.22094902 ], [ 115.1150949, 31.22113946 ], [ 115.11726588, 31.22141049 ], [ 115.11745596, 31.22142057 ], [ 115.1192367, 31.22151147 ], [ 115.11932688, 31.22151152 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155402", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465560", "id": "85346298", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "72946795", "enodeid": "10002943635", "funcclass": "1", "length": "0.010", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.11932688, 31.22151152 ], [ 115.11936684, 31.22151152 ], [ 115.11942678, 31.22151156 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155453", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "85552285", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "47412594", "enodeid": "74636289", "funcclass": "1", "length": "0.057", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37680212, 31.21350557 ], [ 115.37716158, 31.21388501 ], [ 115.37718156, 31.21390499 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155454", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465563", "id": "85552286", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74636289", "enodeid": "2913200", "funcclass": "1", "length": "0.402", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37718156, 31.21390499 ], [ 115.3778508, 31.214534 ], [ 115.3785798, 31.21505298 ], [ 115.37891946, 31.21530251 ], [ 115.37943876, 31.21571178 ], [ 115.37961858, 31.21584152 ], [ 115.3796985, 31.21589142 ], [ 115.38027774, 31.21632063 ], [ 115.38029772, 31.21634061 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155736", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "87728785", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908621", "enodeid": "74185789", "funcclass": "1", "length": "0.067", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93163044, 31.18179263 ], [ 114.93218916, 31.18213139 ], [ 114.93220896, 31.18214133 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155737", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465467", "id": "87728786", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185789", "enodeid": "2908609", "funcclass": "1", "length": "0.349", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93220896, 31.18214133 ], [ 114.93253818, 31.18234064 ], [ 114.93420408, 31.18331691 ], [ 114.93510192, 31.18385493 ], [ 114.93522162, 31.18392468 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155774", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773812", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886114", "enodeid": "74185407", "funcclass": "1", "length": "0.090", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34021892, 31.1869031 ], [ 115.34045832, 31.18706258 ], [ 115.34095728, 31.18740152 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155775", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773813", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185407", "enodeid": "2886116", "funcclass": "1", "length": "0.139", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.34095728, 31.18740152 ], [ 115.3420749, 31.18815909 ], [ 115.34209488, 31.18817907 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155776", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773815", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185408", "enodeid": "2886108", "funcclass": "1", "length": "0.068", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32476214, 31.183083 ], [ 115.32547062, 31.18314168 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155777", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773816", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886105", "enodeid": "74185409", "funcclass": "1", "length": "0.230", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32106008, 31.18326962 ], [ 115.32224754, 31.18331745 ], [ 115.3225269, 31.1833269 ], [ 115.32347496, 31.18337519 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155778", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773817", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185409", "enodeid": "2886107", "funcclass": "1", "length": "0.204", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32347496, 31.18337519 ], [ 115.32454254, 31.18345322 ], [ 115.3256004, 31.18358124 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155779", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773818", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886106", "enodeid": "74185410", "funcclass": "1", "length": "0.168", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32164886, 31.18289873 ], [ 115.3221777, 31.18292775 ], [ 115.32242718, 31.18293729 ], [ 115.32340512, 31.18298549 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155780", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773819", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185410", "enodeid": "74185408", "funcclass": "1", "length": "0.130", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.32340512, 31.18298549 ], [ 115.32416346, 31.18303409 ], [ 115.32476214, 31.183083 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155781", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773820", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886098", "enodeid": "74185411", "funcclass": "1", "length": "0.066", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31401506, 31.18344228 ], [ 115.31407482, 31.18344219 ], [ 115.31470356, 31.18342104 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155782", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773821", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185411", "enodeid": "2886100", "funcclass": "1", "length": "0.045", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.31470356, 31.18342104 ], [ 115.31517264, 31.18340021 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155783", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773823", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185412", "enodeid": "2886092", "funcclass": "1", "length": "0.275", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25452596, 31.18197839 ], [ 115.25550606, 31.18177868 ], [ 115.25628618, 31.18162896 ], [ 115.25734638, 31.18141931 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155784", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773825", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185413", "enodeid": "2886091", "funcclass": "1", "length": "0.274", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25454594, 31.18210835 ], [ 115.2555462, 31.18190864 ], [ 115.2572463, 31.1815692 ], [ 115.25735646, 31.18154927 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155785", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773826", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002940587", "enodeid": "74185414", "funcclass": "1", "length": "0.690", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24460436, 31.18296542 ], [ 115.24469436, 31.18297545 ], [ 115.24534452, 31.18302563 ], [ 115.24620456, 31.18306581 ], [ 115.24752486, 31.18306617 ], [ 115.2489051, 31.18298657 ], [ 115.24992534, 31.18286687 ], [ 115.25127552, 31.18263732 ], [ 115.25180562, 31.18252748 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155786", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773827", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185414", "enodeid": "74185412", "funcclass": "1", "length": "0.266", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.25180562, 31.18252748 ], [ 115.2527157, 31.18235778 ], [ 115.2536958, 31.18214808 ], [ 115.25416596, 31.18204827 ], [ 115.25452596, 31.18197839 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155787", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773828", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "20002940586", "enodeid": "74185415", "funcclass": "1", "length": "0.692", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.24460436, 31.18309538 ], [ 115.24467438, 31.18309542 ], [ 115.24532454, 31.18314555 ], [ 115.24618458, 31.18319577 ], [ 115.24754484, 31.18318614 ], [ 115.24885506, 31.18311653 ], [ 115.25000526, 31.18297685 ], [ 115.25135544, 31.18275729 ], [ 115.2518256, 31.18266743 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155788", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "87773829", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185415", "enodeid": "74185413", "funcclass": "1", "length": "0.266", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2518256, 31.18266743 ], [ 115.25275566, 31.18247775 ], [ 115.2535158, 31.182318 ], [ 115.25432598, 31.18214826 ], [ 115.25454594, 31.18210835 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155789", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "87773860", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003010829", "enodeid": "74185431", "funcclass": "1", "length": "0.113", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "800", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.902865, 31.41889974 ], [ 114.90291504, 31.41884979 ], [ 114.90331518, 31.41844997 ], [ 114.90351516, 31.41824009 ], [ 114.90361524, 31.41811017 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155790", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "87773861", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185431", "enodeid": "3010810", "funcclass": "1", "length": "0.586", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90361524, 31.41811017 ], [ 114.90398532, 31.41766035 ], [ 114.90410538, 31.41749043 ], [ 114.90428538, 31.41723056 ], [ 114.90453558, 31.41684072 ], [ 114.90477552, 31.41645089 ], [ 114.90498558, 31.41603104 ], [ 114.90515568, 31.41562118 ], [ 114.90532578, 31.41520133 ], [ 114.90546582, 31.41478143 ], [ 114.90558588, 31.4143416 ], [ 114.9056658, 31.41390168 ], [ 114.90571584, 31.41369176 ], [ 114.9057459, 31.41344183 ], [ 114.90576588, 31.41324189 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155791", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "87773862", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "10003010806", "enodeid": "74185432", "funcclass": "1", "length": "0.115", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "4", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "800", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90305508, 31.41889979 ], [ 114.90345522, 31.41851 ], [ 114.9036552, 31.41829013 ], [ 114.9038154, 31.41809024 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155792", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "475407", "id": "87773863", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185432", "enodeid": "3010809", "funcclass": "1", "length": "0.582", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1000", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9038154, 31.41809024 ], [ 114.90412536, 31.4177004 ], [ 114.90424542, 31.41754047 ], [ 114.9044355, 31.41727061 ], [ 114.90467562, 31.41688073 ], [ 114.90491556, 31.4164809 ], [ 114.9051357, 31.41606105 ], [ 114.9053058, 31.41565119 ], [ 114.90547572, 31.41523134 ], [ 114.90560586, 31.4148015 ], [ 114.90572592, 31.41436163 ], [ 114.90581592, 31.41392175 ], [ 114.90585588, 31.41370179 ], [ 114.90589602, 31.41345186 ], [ 114.905916, 31.41324194 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155793", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773864", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693218", "enodeid": "74185433", "funcclass": "1", "length": "0.318", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90694434, 31.30982483 ], [ 114.90690456, 31.30965491 ], [ 114.9068646, 31.30943504 ], [ 114.90682464, 31.30922511 ], [ 114.90674472, 31.30873538 ], [ 114.90668496, 31.30820568 ], [ 114.90662502, 31.30766595 ], [ 114.90656526, 31.30711623 ], [ 114.90655518, 31.30698632 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155794", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773865", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185433", "enodeid": "2693213", "funcclass": "1", "length": "0.552", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90655518, 31.30698632 ], [ 114.9065253, 31.30654653 ], [ 114.90646554, 31.30594686 ], [ 114.9064056, 31.30534715 ], [ 114.90635592, 31.30469748 ], [ 114.90629598, 31.30405781 ], [ 114.90622614, 31.30343816 ], [ 114.9061662, 31.30269836 ], [ 114.90613614, 31.30240842 ], [ 114.90610626, 31.30203852 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155795", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773866", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693181", "enodeid": "74185434", "funcclass": "1", "length": "0.338", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90712434, 31.31000469 ], [ 114.90704442, 31.30964487 ], [ 114.90701454, 31.30947495 ], [ 114.90697458, 31.30921512 ], [ 114.90688476, 31.30872539 ], [ 114.90682482, 31.30819565 ], [ 114.90677496, 31.30766591 ], [ 114.9067152, 31.3071062 ], [ 114.90670512, 31.30698627 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155796", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773867", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185434", "enodeid": "2693214", "funcclass": "1", "length": "0.553", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90670512, 31.30698627 ], [ 114.90666534, 31.30654649 ], [ 114.90661548, 31.30594682 ], [ 114.90655554, 31.30534715 ], [ 114.90649578, 31.30469748 ], [ 114.90643602, 31.30404782 ], [ 114.90637608, 31.30342812 ], [ 114.90631614, 31.30269836 ], [ 114.90628626, 31.30239843 ], [ 114.90624612, 31.30202853 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155797", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773869", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185435", "enodeid": "2693202", "funcclass": "1", "length": "0.177", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.912513, 31.27985339 ], [ 114.91262298, 31.27959338 ], [ 114.91289262, 31.27886343 ], [ 114.91309242, 31.27834346 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155798", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773871", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185436", "enodeid": "2693201", "funcclass": "1", "length": "0.176", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91237314, 31.27981352 ], [ 114.91247304, 31.27957353 ], [ 114.91275276, 31.27884354 ], [ 114.91295274, 31.27831358 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155799", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773872", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693200", "enodeid": "74185437", "funcclass": "1", "length": "0.643", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90853698, 31.28771394 ], [ 114.90884658, 31.28716386 ], [ 114.90919632, 31.28645381 ], [ 114.90957594, 31.28572377 ], [ 114.90997554, 31.28497371 ], [ 114.91036506, 31.28421362 ], [ 114.91077474, 31.28342355 ], [ 114.91118424, 31.28265351 ], [ 114.91129422, 31.28243346 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155800", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773873", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185437", "enodeid": "74185435", "funcclass": "1", "length": "0.309", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91129422, 31.28243346 ], [ 114.91157394, 31.28188343 ], [ 114.91194348, 31.28112342 ], [ 114.91203348, 31.28093339 ], [ 114.91229322, 31.28036337 ], [ 114.912513, 31.27985339 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155801", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773874", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2693199", "enodeid": "74185438", "funcclass": "1", "length": "0.644", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90839712, 31.28767407 ], [ 114.90870672, 31.28712399 ], [ 114.90904656, 31.28642397 ], [ 114.90942618, 31.2856839 ], [ 114.90982578, 31.28493384 ], [ 114.9102153, 31.28418378 ], [ 114.91062498, 31.28339372 ], [ 114.91103448, 31.28261364 ], [ 114.91115436, 31.28238365 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155802", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465477", "id": "87773875", "kind_num": "3", "kind": "0002|0008|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185438", "enodeid": "74185436", "funcclass": "1", "length": "0.308", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91115436, 31.28238365 ], [ 114.91142418, 31.28185359 ], [ 114.9118038, 31.28109354 ], [ 114.91192368, 31.28083353 ], [ 114.91214346, 31.28033354 ], [ 114.91237314, 31.27981352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155803", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "87773876", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908568", "enodeid": "74185439", "funcclass": "1", "length": "0.602", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92096958, 31.24660343 ], [ 114.92100972, 31.24624361 ], [ 114.92105976, 31.2456839 ], [ 114.9210999, 31.24513413 ], [ 114.92112996, 31.2445944 ], [ 114.92114994, 31.24405463 ], [ 114.92114994, 31.24395468 ], [ 114.92116002, 31.2435149 ], [ 114.9211701, 31.24297512 ], [ 114.92119008, 31.2424254 ], [ 114.92120016, 31.24187564 ], [ 114.92122032, 31.24131593 ], [ 114.92122032, 31.24119596 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155804", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "87773877", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185439", "enodeid": "2908570", "funcclass": "1", "length": "1.005", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92122032, 31.24119596 ], [ 114.92122032, 31.24080617 ], [ 114.9212304, 31.24057626 ], [ 114.9212304, 31.24021644 ], [ 114.92126046, 31.23963671 ], [ 114.92127054, 31.23905697 ], [ 114.92128062, 31.23847724 ], [ 114.9213006, 31.23788751 ], [ 114.92133066, 31.23729779 ], [ 114.92136072, 31.23671805 ], [ 114.92141076, 31.23613827 ], [ 114.9214608, 31.2355485 ], [ 114.9214707, 31.23543857 ], [ 114.92153082, 31.23495873 ], [ 114.92160084, 31.23436896 ], [ 114.92170074, 31.23378914 ], [ 114.92181072, 31.23319932 ], [ 114.9219207, 31.23261954 ], [ 114.9220206, 31.23219965 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155805", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "87773878", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2908569", "enodeid": "74185440", "funcclass": "1", "length": "0.604", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92110944, 31.24661328 ], [ 114.92115948, 31.24624343 ], [ 114.92120952, 31.24568372 ], [ 114.92124966, 31.24514399 ], [ 114.92127972, 31.24460426 ], [ 114.9212997, 31.24405449 ], [ 114.92129988, 31.24386459 ], [ 114.92129988, 31.24351476 ], [ 114.92130996, 31.24297503 ], [ 114.92132994, 31.24242527 ], [ 114.9213501, 31.2418755 ], [ 114.92136, 31.24131579 ], [ 114.92136018, 31.24118583 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.155806", "Name": "G45-大广高速公路", "pyname": "g45-dggsgl", "mapid": "465467", "id": "87773879", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "3", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74185440", "enodeid": "2908571", "funcclass": "1", "length": "1.003", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "2", "lanenums2e": null, "lanenume2s": "2", "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "1100", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92136018, 31.24118583 ], [ 114.92137008, 31.24080603 ], [ 114.92138016, 31.24057613 ], [ 114.92138016, 31.24021631 ], [ 114.92140032, 31.23963657 ], [ 114.9214104, 31.23905684 ], [ 114.92143038, 31.2384771 ], [ 114.92145054, 31.23789737 ], [ 114.92148042, 31.23730764 ], [ 114.92151048, 31.23671792 ], [ 114.92155062, 31.23614813 ], [ 114.92160066, 31.2355584 ], [ 114.92161056, 31.23544842 ], [ 114.92168058, 31.23496859 ], [ 114.9217506, 31.23437882 ], [ 114.9218406, 31.23379904 ], [ 114.92196048, 31.23320918 ], [ 114.92206038, 31.23263939 ], [ 114.92217036, 31.2322095 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.156756", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "88038199", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2795325", "enodeid": "74391867", "funcclass": "1", "length": "0.185", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8543991, 31.13609418 ], [ 114.85441908, 31.13609423 ], [ 114.85478988, 31.13630478 ], [ 114.8551605, 31.13651529 ], [ 114.85589202, 31.13697636 ], [ 114.8559921, 31.13704652 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.156757", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465456", "id": "88038200", "kind_num": "2", "kind": "0002|000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74391867", "enodeid": "2795330", "funcclass": "1", "length": "0.440", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.8559921, 31.13704652 ], [ 114.85668348, 31.13751749 ], [ 114.8586156, 31.13888891 ], [ 114.85942632, 31.13942936 ], [ 114.8596065, 31.13952948 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.156764", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "88038253", "kind_num": "1", "kind": "000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "2886094", "enodeid": "74391894", "funcclass": "1", "length": "0.063", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.2612549, 31.18054869 ], [ 115.26149466, 31.18051859 ], [ 115.26191442, 31.1804784 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.156765", "Name": "G42-沪蓉高速公路", "pyname": "g42-hrgsgl", "mapid": "465562", "id": "88038254", "kind_num": "1", "kind": "000c", "width": "55", "direction": "2", "toll": "1", "const_st": "1", "undconcrid": null, "snodeid": "74391894", "enodeid": "2886096", "funcclass": "1", "length": "0.044", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "3", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11100001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "1000", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.26191442, 31.1804784 ], [ 115.26237414, 31.18042823 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_pl.359641", "Name": null, "pyname": null, "mapid": null, "id": null, "kind_num": null, "kind": null, "width": null, "direction": null, "toll": null, "const_st": null, "undconcrid": null, "snodeid": null, "enodeid": null, "funcclass": null, "length": null, "detailcity": null, "through": null, "unthrucrid": null, "ownership": null, "road_cond": null, "special": null, "admincodel": null, "admincoder": null, "uflag": null, "onewaycrid": null, "accesscrid": null, "speedclass": null, "lanenums2e": null, "lanenume2s": null, "lanenum": null, "vehcl_type": null, "elevated": null, "structure": null, "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": null, "spdsrcs2e": null, "spdsrce2s": null, "dc_type": null, "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.346831112693835, 31.005271622189404 ], [ 115.34790492, 31.01144499 ], [ 115.34904306, 31.01416601 ], [ 115.34957892, 31.015215 ], [ 115.351014947875569, 31.017649250228413 ] ], [ [ 115.360212181881195, 31.039570675690957 ], [ 115.36062894, 31.04081001 ], [ 115.361640088592381, 31.042838969439643 ] ], [ [ 115.368430227160189, 31.06189252962837 ], [ 115.367625, 31.06472598 ], [ 115.36528608, 31.06899 ], [ 115.36337592, 31.07283102 ], [ 115.36238898, 31.07566098 ], [ 115.361874, 31.07819799 ], [ 115.36165908, 31.080614 ], [ 115.36179894, 31.08265398 ], [ 115.36205706, 31.08445502 ], [ 115.36256106, 31.08671501 ], [ 115.363719, 31.09023401 ], [ 115.364331, 31.09236602 ], [ 115.36461, 31.09410198 ], [ 115.36472808, 31.10015601 ], [ 115.36513596, 31.10422599 ], [ 115.36534998, 31.10538299 ], [ 115.36620894, 31.109058 ], [ 115.36657308, 31.11295302 ], [ 115.36637994, 31.11548801 ], [ 115.36608006, 31.118409 ], [ 115.36592994, 31.12101702 ], [ 115.36698096, 31.12794198 ], [ 115.36732404, 31.13084399 ], [ 115.36745292, 31.13538102 ], [ 115.36672392, 31.14120299 ], [ 115.365501, 31.14562901 ], [ 115.361874, 31.15202 ], [ 115.35987906, 31.15552698 ], [ 115.35784002, 31.15877702 ], [ 115.35663906, 31.16173302 ], [ 115.35633792, 31.16357001 ], [ 115.356402, 31.16602998 ], [ 115.35642396, 31.166636 ], [ 115.35661692, 31.16749001 ], [ 115.35685794, 31.16829798 ], [ 115.35744294, 31.17000501 ], [ 115.35884298, 31.17311199 ], [ 115.35967494, 31.17502602 ], [ 115.36065108, 31.17715101 ], [ 115.36125192, 31.17822102 ], [ 115.36215804, 31.17946901 ], [ 115.36365492, 31.18104302 ], [ 115.36544106, 31.18290701 ], [ 115.366455, 31.184343 ], [ 115.36700292, 31.18533399 ], [ 115.36900092, 31.19191299 ], [ 115.36986996, 31.19516199 ], [ 115.37008794, 31.19629401 ], [ 115.37016192, 31.19732699 ], [ 115.37020008, 31.19799299 ], [ 115.370226, 31.19908901 ], [ 115.37014104, 31.199819 ] ] ] } } +] +} diff --git a/public/mapbox/geojson/高速引路.geojson b/public/mapbox/geojson/高速引路.geojson new file mode 100644 index 0000000..41724a3 --- /dev/null +++ b/public/mapbox/geojson/高速引路.geojson @@ -0,0 +1,68 @@ +{ +"type": "FeatureCollection", +"name": "高速引路", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32130", "Name": null, "pyname": null, "mapid": "465477", "id": "3629481", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693183", "enodeid": "2693176", "funcclass": "4", "length": "0.039", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91237116, 31.31494101 ], [ 114.9125409, 31.31526083 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32131", "Name": null, "pyname": null, "mapid": "465477", "id": "3629484", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693177", "enodeid": "2693185", "funcclass": "4", "length": "0.039", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91242102, 31.31530083 ], [ 114.91230114, 31.31501099 ], [ 114.91228116, 31.31497103 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32132", "Name": null, "pyname": null, "mapid": "465477", "id": "3629490", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693182", "enodeid": "2693191", "funcclass": "4", "length": "0.275", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90958278, 31.3126128 ], [ 114.90979266, 31.31265276 ], [ 114.9099426, 31.31268269 ], [ 114.91007256, 31.31273264 ], [ 114.9102324, 31.31279258 ], [ 114.9103224, 31.31284253 ], [ 114.91046226, 31.31291246 ], [ 114.9106122, 31.31299238 ], [ 114.91081218, 31.31312229 ], [ 114.91096212, 31.31323218 ], [ 114.91106202, 31.31332214 ], [ 114.91121196, 31.31345205 ], [ 114.91134174, 31.31359191 ], [ 114.91167168, 31.31392172 ], [ 114.91181154, 31.3140816 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32133", "Name": null, "pyname": null, "mapid": "465477", "id": "3629491", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693191", "enodeid": "2693183", "funcclass": "4", "length": "0.109", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91181154, 31.3140816 ], [ 114.91192152, 31.31421147 ], [ 114.9120513, 31.31440137 ], [ 114.91229106, 31.3148111 ], [ 114.91237116, 31.31494101 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32134", "Name": null, "pyname": null, "mapid": "465477", "id": "3629492", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693185", "enodeid": "2693192", "funcclass": "4", "length": "0.109", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91228116, 31.31497103 ], [ 114.91221114, 31.31482113 ], [ 114.9121512, 31.31470121 ], [ 114.91209126, 31.31459127 ], [ 114.91202142, 31.31446136 ], [ 114.91194132, 31.31434143 ], [ 114.9118515, 31.31422151 ], [ 114.9117615, 31.31410158 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32135", "Name": null, "pyname": null, "mapid": "465477", "id": "3629493", "kind_num": "2", "kind": "0005|000b", "width": "55", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693192", "enodeid": "2693179", "funcclass": "4", "length": "0.142", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "2", "lanenume2s": null, "lanenum": "2", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9117615, 31.31410158 ], [ 114.91164162, 31.31398166 ], [ 114.91151166, 31.31385179 ], [ 114.9113817, 31.31373186 ], [ 114.91124184, 31.31360195 ], [ 114.91110198, 31.31346204 ], [ 114.91092198, 31.31333217 ], [ 114.91073208, 31.31320226 ], [ 114.9107121, 31.31319227 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32136", "Name": null, "pyname": null, "mapid": "465477", "id": "3629497", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693175", "enodeid": "2693195", "funcclass": "4", "length": "0.088", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91000146, 31.31737025 ], [ 114.90992136, 31.31731031 ], [ 114.9098814, 31.31728034 ], [ 114.90984144, 31.3172204 ], [ 114.90962184, 31.31681072 ], [ 114.90955182, 31.31669079 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32137", "Name": null, "pyname": null, "mapid": "465477", "id": "3629498", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693195", "enodeid": "2693182", "funcclass": "4", "length": "0.729", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90955182, 31.31669079 ], [ 114.90951186, 31.31662082 ], [ 114.909372, 31.31638101 ], [ 114.90925212, 31.31613113 ], [ 114.90919218, 31.31602119 ], [ 114.9091722, 31.31599122 ], [ 114.90912216, 31.31592129 ], [ 114.90907212, 31.31586131 ], [ 114.90901218, 31.31580137 ], [ 114.90897222, 31.31576141 ], [ 114.9088923, 31.31568144 ], [ 114.90884226, 31.31565147 ], [ 114.9088023, 31.31561151 ], [ 114.90872238, 31.31556156 ], [ 114.90863238, 31.31550158 ], [ 114.90843258, 31.31540168 ], [ 114.90817266, 31.31529179 ], [ 114.90788286, 31.31518194 ], [ 114.90764292, 31.31509203 ], [ 114.90749298, 31.31500212 ], [ 114.907383, 31.31494214 ], [ 114.90732306, 31.31490218 ], [ 114.9072732, 31.31485223 ], [ 114.9071931, 31.31477231 ], [ 114.90711318, 31.31466237 ], [ 114.90706332, 31.31456243 ], [ 114.90701328, 31.3144425 ], [ 114.9069933, 31.31439251 ], [ 114.9069834, 31.31436254 ], [ 114.9069834, 31.31433257 ], [ 114.90697332, 31.31428257 ], [ 114.9069834, 31.31418263 ], [ 114.90699348, 31.31401271 ], [ 114.90703344, 31.31390277 ], [ 114.90705342, 31.31384279 ], [ 114.90709338, 31.31374284 ], [ 114.90718338, 31.31360289 ], [ 114.90730344, 31.31345291 ], [ 114.90744348, 31.31329298 ], [ 114.90762348, 31.31312301 ], [ 114.90773328, 31.31304305 ], [ 114.90783336, 31.31297303 ], [ 114.9079833, 31.31288303 ], [ 114.90802326, 31.31286305 ], [ 114.90809328, 31.31283303 ], [ 114.90811326, 31.31282304 ], [ 114.9082632, 31.31276306 ], [ 114.90851322, 31.31268305 ], [ 114.9086331, 31.31265303 ], [ 114.90878304, 31.31262302 ], [ 114.90906294, 31.31259296 ], [ 114.9091929, 31.31259291 ], [ 114.90925284, 31.31259291 ], [ 114.90943284, 31.31260286 ], [ 114.90958278, 31.3126128 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32138", "Name": null, "pyname": null, "mapid": "465477", "id": "3629520", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693179", "enodeid": "2693215", "funcclass": "4", "length": "0.105", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9107121, 31.31319227 ], [ 114.91058214, 31.31312234 ], [ 114.91053228, 31.31310236 ], [ 114.91046226, 31.31308238 ], [ 114.91036236, 31.3130624 ], [ 114.91026228, 31.31304246 ], [ 114.91015248, 31.31302248 ], [ 114.9100524, 31.31302253 ], [ 114.9099525, 31.31302253 ], [ 114.90984252, 31.31302257 ], [ 114.90975252, 31.31304255 ], [ 114.90968268, 31.31305259 ], [ 114.90965262, 31.31306258 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32139", "Name": null, "pyname": null, "mapid": "465477", "id": "3629521", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693215", "enodeid": "2693178", "funcclass": "4", "length": "0.207", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90965262, 31.31306258 ], [ 114.90963264, 31.31307257 ], [ 114.90954264, 31.31309259 ], [ 114.90944274, 31.3131326 ], [ 114.90931278, 31.31320257 ], [ 114.90923268, 31.31325257 ], [ 114.90915276, 31.31331255 ], [ 114.90907284, 31.31338257 ], [ 114.9090228, 31.31344251 ], [ 114.90896286, 31.3135025 ], [ 114.90892272, 31.31356248 ], [ 114.90887286, 31.31364245 ], [ 114.9088428, 31.31371242 ], [ 114.90881274, 31.31379239 ], [ 114.90879276, 31.31386236 ], [ 114.90877278, 31.31402229 ], [ 114.90877278, 31.31411225 ], [ 114.90878268, 31.31426219 ], [ 114.90881256, 31.3144421 ], [ 114.90881256, 31.31449205 ], [ 114.90880266, 31.314582 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32140", "Name": null, "pyname": null, "mapid": "465477", "id": "3629522", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693179", "enodeid": "2693216", "funcclass": "4", "length": "0.100", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9107121, 31.31319227 ], [ 114.9105123, 31.31305241 ], [ 114.91039224, 31.31298243 ], [ 114.91015248, 31.31287254 ], [ 114.90999246, 31.31280261 ], [ 114.90983262, 31.31275271 ], [ 114.90980256, 31.31275271 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32141", "Name": null, "pyname": null, "mapid": "465477", "id": "3629523", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693216", "enodeid": "2693180", "funcclass": "4", "length": "0.560", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90980256, 31.31275271 ], [ 114.90971274, 31.31273273 ], [ 114.9094728, 31.31269281 ], [ 114.90933276, 31.31269286 ], [ 114.90926292, 31.31268287 ], [ 114.9089229, 31.31271293 ], [ 114.90865308, 31.31276297 ], [ 114.90852312, 31.31279298 ], [ 114.9083631, 31.31284298 ], [ 114.9081633, 31.31293298 ], [ 114.90809328, 31.31296299 ], [ 114.90803334, 31.313003 ], [ 114.90782328, 31.31312297 ], [ 114.90775326, 31.31317296 ], [ 114.90769332, 31.31322296 ], [ 114.90758334, 31.3133229 ], [ 114.90736338, 31.31356284 ], [ 114.90722334, 31.31376278 ], [ 114.90717348, 31.31385273 ], [ 114.90713334, 31.31395272 ], [ 114.90711336, 31.31404268 ], [ 114.90710346, 31.31409263 ], [ 114.90710328, 31.3141626 ], [ 114.90711336, 31.31420261 ], [ 114.90711336, 31.31425256 ], [ 114.90715332, 31.31434251 ], [ 114.90720318, 31.31443247 ], [ 114.90723324, 31.31448242 ], [ 114.90728328, 31.31452238 ], [ 114.90732324, 31.31454236 ], [ 114.9073632, 31.31457233 ], [ 114.90740316, 31.31458232 ], [ 114.9074631, 31.31461229 ], [ 114.90751314, 31.31463227 ], [ 114.90757308, 31.31464226 ], [ 114.90762312, 31.31464226 ], [ 114.90769296, 31.31464226 ], [ 114.90773292, 31.31464221 ], [ 114.90779304, 31.31463222 ], [ 114.90790302, 31.31460221 ], [ 114.90795288, 31.31458223 ], [ 114.908013, 31.31454222 ], [ 114.90804288, 31.31451221 ], [ 114.90809292, 31.31447225 ], [ 114.90812298, 31.31444223 ], [ 114.90815286, 31.31439224 ], [ 114.90818292, 31.31436227 ], [ 114.9082128, 31.31430228 ], [ 114.90822288, 31.31426232 ], [ 114.90823296, 31.31420234 ], [ 114.90825294, 31.31403242 ], [ 114.90826302, 31.31387249 ], [ 114.908283, 31.31378253 ], [ 114.90830298, 31.31369258 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32142", "Name": null, "pyname": null, "mapid": "465477", "id": "3629530", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693181", "enodeid": "2693220", "funcclass": "4", "length": "0.055", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90712434, 31.31000469 ], [ 114.90733404, 31.31046441 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32143", "Name": null, "pyname": null, "mapid": "465477", "id": "3629531", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2693220", "enodeid": "2693182", "funcclass": "4", "length": "0.344", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.90733404, 31.31046441 ], [ 114.9073641, 31.31054433 ], [ 114.90745392, 31.3107642 ], [ 114.90754392, 31.31097408 ], [ 114.90769368, 31.31139384 ], [ 114.90783372, 31.31165367 ], [ 114.90787368, 31.31171366 ], [ 114.90806358, 31.31192349 ], [ 114.90827346, 31.31209337 ], [ 114.90841332, 31.3122033 ], [ 114.90858324, 31.31229321 ], [ 114.9086232, 31.31231319 ], [ 114.90867324, 31.31233317 ], [ 114.90877314, 31.31237313 ], [ 114.9092829, 31.31253293 ], [ 114.90958278, 31.3126128 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32206", "Name": null, "pyname": null, "mapid": "465560", "id": "3674122", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798937", "enodeid": "2798947", "funcclass": "2", "length": "0.305", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.0626411, 31.21444485 ], [ 115.0636392, 31.21414349 ], [ 115.06399866, 31.21400309 ], [ 115.0641783, 31.21390292 ], [ 115.06431798, 31.21379276 ], [ 115.06443786, 31.21366266 ], [ 115.06456764, 31.21350255 ], [ 115.06462758, 31.21338249 ], [ 115.06467744, 31.21323246 ], [ 115.06469742, 31.21302254 ], [ 115.06468734, 31.21292259 ], [ 115.06462758, 31.21273278 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32207", "Name": null, "pyname": null, "mapid": "465560", "id": "3674131", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798953", "enodeid": "2798946", "funcclass": "2", "length": "0.607", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06623516, 31.21403049 ], [ 115.06643478, 31.21404026 ], [ 115.06663458, 31.21404003 ], [ 115.0668243, 31.21406978 ], [ 115.06709394, 31.21413948 ], [ 115.0672437, 31.21424928 ], [ 115.06731354, 31.21431917 ], [ 115.06741344, 31.21445903 ], [ 115.06743342, 31.21454898 ], [ 115.0674435, 31.21463894 ], [ 115.06742352, 31.21474896 ], [ 115.06738356, 31.21482897 ], [ 115.06731372, 31.21493904 ], [ 115.06721382, 31.21502913 ], [ 115.06714398, 31.21506923 ], [ 115.0670241, 31.21511936 ], [ 115.06688442, 31.21514951 ], [ 115.06675464, 31.21514964 ], [ 115.0665849, 31.21509987 ], [ 115.06635522, 31.21499016 ], [ 115.06619538, 31.21484036 ], [ 115.065666, 31.21408116 ], [ 115.0655661, 31.21392128 ], [ 115.06537638, 31.21366158 ], [ 115.06508676, 31.21321199 ], [ 115.06467744, 31.21253285 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32208", "Name": null, "pyname": null, "mapid": "465560", "id": "3674133", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798946", "enodeid": "2798955", "funcclass": "2", "length": "0.336", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "400", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06467744, 31.21253285 ], [ 115.06492692, 31.21278233 ], [ 115.0651467, 31.21298199 ], [ 115.0654761, 31.21322157 ], [ 115.06574574, 31.2133712 ], [ 115.06601538, 31.21349085 ], [ 115.06627494, 31.21360056 ], [ 115.06654458, 31.21367022 ], [ 115.0669539, 31.2137397 ], [ 115.06746312, 31.21376913 ], [ 115.06772286, 31.21380882 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32209", "Name": null, "pyname": null, "mapid": "465560", "id": "3674136", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798947", "enodeid": "2798957", "funcclass": "2", "length": "0.658", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06462758, 31.21273278 ], [ 115.06487706, 31.21307226 ], [ 115.0652565, 31.21364174 ], [ 115.06546638, 31.21394139 ], [ 115.06556628, 31.21409124 ], [ 115.065666, 31.21422111 ], [ 115.06605552, 31.21477056 ], [ 115.06619538, 31.21495034 ], [ 115.06635522, 31.21509011 ], [ 115.06660488, 31.21520981 ], [ 115.06672458, 31.21522965 ], [ 115.06685436, 31.2152495 ], [ 115.0670142, 31.21522934 ], [ 115.06713408, 31.2151892 ], [ 115.0672338, 31.21513911 ], [ 115.06735368, 31.21505897 ], [ 115.06751334, 31.21489881 ], [ 115.0676631, 31.21468871 ], [ 115.06784274, 31.21444854 ], [ 115.06797252, 31.21430841 ], [ 115.06805244, 31.21424834 ], [ 115.0682121, 31.21415816 ], [ 115.0684218, 31.21407792 ], [ 115.06870134, 31.21399764 ], [ 115.06908078, 31.2139472 ], [ 115.06935024, 31.21391691 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32210", "Name": null, "pyname": null, "mapid": "465560", "id": "3674137", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2798957", "enodeid": "2798954", "funcclass": "2", "length": "0.074", "detailcity": "1", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "6", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "400", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.06935024, 31.21391691 ], [ 115.06996944, 31.21385621 ], [ 115.0701192, 31.21382601 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32555", "Name": null, "pyname": null, "mapid": "465457", "id": "3752694", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881751", "enodeid": "2881752", "funcclass": "2", "length": "0.357", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92799696, 31.14963194 ], [ 114.9284565, 31.14974151 ], [ 114.92885592, 31.14993105 ], [ 114.92929548, 31.1501106 ], [ 114.92943534, 31.15015047 ], [ 114.92965494, 31.15020024 ], [ 114.92982486, 31.15022009 ], [ 114.92994474, 31.15022999 ], [ 114.93002466, 31.15022994 ], [ 114.9302844, 31.15021973 ], [ 114.93042426, 31.1502096 ], [ 114.93057402, 31.15018953 ], [ 114.9306939, 31.15015943 ], [ 114.93084384, 31.15010934 ], [ 114.93113346, 31.15000917 ], [ 114.93153306, 31.14985896 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32556", "Name": null, "pyname": null, "mapid": "465457", "id": "3752697", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881757", "enodeid": "2881758", "funcclass": "2", "length": "0.486", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93588528, 31.1491031 ], [ 114.93631404, 31.14912213 ], [ 114.93648342, 31.14914171 ], [ 114.93658314, 31.14916146 ], [ 114.93665298, 31.1491913 ], [ 114.93686232, 31.14928076 ], [ 114.93695214, 31.14933053 ], [ 114.93703188, 31.14939029 ], [ 114.93720144, 31.14950981 ], [ 114.93732096, 31.14961947 ], [ 114.93743076, 31.14974916 ], [ 114.93755028, 31.14989879 ], [ 114.93763002, 31.15000854 ], [ 114.93767988, 31.15012833 ], [ 114.93772974, 31.15027809 ], [ 114.93776952, 31.15043789 ], [ 114.93776952, 31.15058778 ], [ 114.93776952, 31.15074767 ], [ 114.93775944, 31.15092758 ], [ 114.93771948, 31.15114749 ], [ 114.93767952, 31.15137744 ], [ 114.93744048, 31.15240785 ], [ 114.93744048, 31.15243782 ], [ 114.93745056, 31.15247778 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32557", "Name": null, "pyname": null, "mapid": "465457", "id": "3752700", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881753", "enodeid": "2881763", "funcclass": "2", "length": "0.260", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93168282, 31.14990878 ], [ 114.93177282, 31.14985874 ], [ 114.93210258, 31.14971856 ], [ 114.9322923, 31.14965849 ], [ 114.9324822, 31.14959837 ], [ 114.93263196, 31.14955827 ], [ 114.9327918, 31.14952817 ], [ 114.93314136, 31.1494779 ], [ 114.9335109, 31.14942755 ], [ 114.93388044, 31.14938718 ], [ 114.9342597, 31.14934673 ], [ 114.93429966, 31.14933665 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32558", "Name": null, "pyname": null, "mapid": "465457", "id": "3752701", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881763", "enodeid": "2881757", "funcclass": "2", "length": "0.154", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93429966, 31.14933665 ], [ 114.93464868, 31.14928589 ], [ 114.93501768, 31.14922505 ], [ 114.93541656, 31.14916416 ], [ 114.93585522, 31.14910319 ], [ 114.93588528, 31.1491031 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32559", "Name": null, "pyname": null, "mapid": "465457", "id": "3752702", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881752", "enodeid": "2881764", "funcclass": "2", "length": "0.272", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93153306, 31.14985896 ], [ 114.9315831, 31.14983894 ], [ 114.9316929, 31.14977886 ], [ 114.93203256, 31.14963869 ], [ 114.93222246, 31.14956858 ], [ 114.93242226, 31.14949847 ], [ 114.9325821, 31.14945837 ], [ 114.93275184, 31.14942827 ], [ 114.93311148, 31.14936797 ], [ 114.93348102, 31.1493276 ], [ 114.93386046, 31.14927725 ], [ 114.93422982, 31.14923688 ], [ 114.93425988, 31.14923679 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32560", "Name": null, "pyname": null, "mapid": "465457", "id": "3752703", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881764", "enodeid": "2881755", "funcclass": "2", "length": "0.152", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93425988, 31.14923679 ], [ 114.9346089, 31.14918603 ], [ 114.93497772, 31.14912519 ], [ 114.93538668, 31.14906431 ], [ 114.93582534, 31.14900333 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32561", "Name": null, "pyname": null, "mapid": "465457", "id": "3752705", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881765", "enodeid": "2881753", "funcclass": "2", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9309936, 31.15039905 ], [ 114.9312033, 31.15021901 ], [ 114.93132318, 31.15012896 ], [ 114.93147312, 31.15002888 ], [ 114.93168282, 31.14990878 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32562", "Name": null, "pyname": null, "mapid": "465457", "id": "3752706", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881753", "enodeid": "2881766", "funcclass": "2", "length": "0.086", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93168282, 31.14990878 ], [ 114.93151308, 31.15006884 ], [ 114.93146304, 31.15011884 ], [ 114.93143316, 31.15017882 ], [ 114.93138312, 31.15024884 ], [ 114.93133326, 31.15034879 ], [ 114.9313032, 31.15040877 ], [ 114.93128322, 31.15046876 ], [ 114.93127314, 31.15052874 ], [ 114.93127314, 31.15054872 ], [ 114.93127314, 31.15057869 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32563", "Name": null, "pyname": null, "mapid": "465457", "id": "3752709", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881757", "enodeid": "2881768", "funcclass": "2", "length": "0.812", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93588528, 31.1491031 ], [ 114.93629406, 31.1490522 ], [ 114.93670284, 31.14900126 ], [ 114.93715158, 31.14895028 ], [ 114.93760032, 31.14888926 ], [ 114.93806904, 31.14881825 ], [ 114.9382386, 31.14878787 ], [ 114.93839808, 31.14876749 ], [ 114.93852768, 31.14874719 ], [ 114.9389865, 31.14868617 ], [ 114.93922572, 31.14864567 ], [ 114.93939528, 31.14860531 ], [ 114.93953496, 31.148555 ], [ 114.9396246, 31.14850482 ], [ 114.93975438, 31.14843458 ], [ 114.93983412, 31.14837441 ], [ 114.9398739, 31.14833436 ], [ 114.9399738, 31.14819419 ], [ 114.94003356, 31.1481041 ], [ 114.94006344, 31.14804407 ], [ 114.94007352, 31.14800406 ], [ 114.94012338, 31.14790403 ], [ 114.94014336, 31.14772407 ], [ 114.94012338, 31.14752427 ], [ 114.9400935, 31.14741438 ], [ 114.94004364, 31.14732456 ], [ 114.9399738, 31.1472248 ], [ 114.93989406, 31.14712503 ], [ 114.93968472, 31.14692564 ], [ 114.9394554, 31.1467163 ], [ 114.93922608, 31.14652694 ], [ 114.9390567, 31.14633744 ], [ 114.9389469, 31.14620775 ], [ 114.93887724, 31.14608801 ], [ 114.93882738, 31.14595818 ], [ 114.9387975, 31.14584834 ], [ 114.93871776, 31.14551871 ], [ 114.93859806, 31.14503928 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32564", "Name": null, "pyname": null, "mapid": "465457", "id": "3752710", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881768", "enodeid": "2881747", "funcclass": "2", "length": "0.100", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93859806, 31.14503928 ], [ 114.93841878, 31.14428018 ], [ 114.9383988, 31.14423023 ], [ 114.93835902, 31.14417038 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32565", "Name": null, "pyname": null, "mapid": "465457", "id": "3752728", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74017920", "enodeid": "2881782", "funcclass": "2", "length": "0.101", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93392994, 31.15337504 ], [ 114.93387018, 31.15336514 ], [ 114.93381024, 31.15333526 ], [ 114.9332409, 31.15303596 ], [ 114.9331212, 31.15298606 ], [ 114.9330312, 31.15295618 ], [ 114.93300132, 31.15294619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32566", "Name": null, "pyname": null, "mapid": "465457", "id": "3752729", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881782", "enodeid": "2881752", "funcclass": "2", "length": "0.650", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93300132, 31.15294619 ], [ 114.93291132, 31.15292625 ], [ 114.93281142, 31.15289637 ], [ 114.93266166, 31.15287648 ], [ 114.93246186, 31.15285664 ], [ 114.93231192, 31.15284678 ], [ 114.93217206, 31.15285691 ], [ 114.93211212, 31.15285695 ], [ 114.93199224, 31.15287702 ], [ 114.93183258, 31.15289714 ], [ 114.93158274, 31.15294731 ], [ 114.93135306, 31.15297751 ], [ 114.93110322, 31.15299767 ], [ 114.93097344, 31.15298781 ], [ 114.9309135, 31.15298786 ], [ 114.93084348, 31.15297791 ], [ 114.93077364, 31.15295798 ], [ 114.9307236, 31.15294803 ], [ 114.9306138, 31.15290812 ], [ 114.93054396, 31.15288818 ], [ 114.93048402, 31.15285826 ], [ 114.93043398, 31.15282829 ], [ 114.93038412, 31.15279836 ], [ 114.93033408, 31.15276839 ], [ 114.93028422, 31.15272848 ], [ 114.93024426, 31.15268852 ], [ 114.93016434, 31.15258862 ], [ 114.93014436, 31.15254866 ], [ 114.9301044, 31.15249871 ], [ 114.93009432, 31.15247873 ], [ 114.93004446, 31.15241879 ], [ 114.9300045, 31.15232883 ], [ 114.92998452, 31.15227888 ], [ 114.92996454, 31.15219892 ], [ 114.92994456, 31.15210896 ], [ 114.92994456, 31.15205901 ], [ 114.92994456, 31.15189908 ], [ 114.92995446, 31.15182906 ], [ 114.92997444, 31.15171913 ], [ 114.9300144, 31.15158912 ], [ 114.93004428, 31.15151915 ], [ 114.93017424, 31.15123916 ], [ 114.9302241, 31.15114916 ], [ 114.93026424, 31.15107918 ], [ 114.93029412, 31.1510192 ], [ 114.93052398, 31.15070924 ], [ 114.93064386, 31.1505692 ], [ 114.9306939, 31.15050921 ], [ 114.93083376, 31.15037916 ], [ 114.9311034, 31.15014912 ], [ 114.93121338, 31.15005908 ], [ 114.93137322, 31.14994901 ], [ 114.93153306, 31.14985896 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32571", "Name": null, "pyname": null, "mapid": "465457", "id": "3754275", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881755", "enodeid": "2881748", "funcclass": "2", "length": "0.672", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93582534, 31.14900333 ], [ 114.93626418, 31.14895235 ], [ 114.93667296, 31.14890141 ], [ 114.93671292, 31.14889133 ], [ 114.9371217, 31.14884043 ], [ 114.93757044, 31.14877941 ], [ 114.93803916, 31.14870836 ], [ 114.93825858, 31.14867789 ], [ 114.93840816, 31.14865755 ], [ 114.9384978, 31.14864734 ], [ 114.93894654, 31.14858636 ], [ 114.93918594, 31.14854582 ], [ 114.93929556, 31.14850559 ], [ 114.93951498, 31.14841514 ], [ 114.9396246, 31.14835493 ], [ 114.93971442, 31.14828473 ], [ 114.93979416, 31.14820463 ], [ 114.939864, 31.14811449 ], [ 114.93989388, 31.14806445 ], [ 114.93991386, 31.14801446 ], [ 114.93993384, 31.14790448 ], [ 114.93992394, 31.14786452 ], [ 114.93992394, 31.14780453 ], [ 114.93990396, 31.14775463 ], [ 114.93988398, 31.14770472 ], [ 114.93986418, 31.14766476 ], [ 114.93982422, 31.1476149 ], [ 114.93975438, 31.14753512 ], [ 114.9397146, 31.14750519 ], [ 114.93966474, 31.14747536 ], [ 114.93961488, 31.14745547 ], [ 114.93954504, 31.14742563 ], [ 114.93942534, 31.14740592 ], [ 114.93936558, 31.14739607 ], [ 114.93930582, 31.14739625 ], [ 114.93923598, 31.14740637 ], [ 114.93918612, 31.1474165 ], [ 114.93911628, 31.14743666 ], [ 114.93907632, 31.14745673 ], [ 114.93900666, 31.14748688 ], [ 114.9389568, 31.14752697 ], [ 114.93887688, 31.14759708 ], [ 114.93880704, 31.14768722 ], [ 114.93874728, 31.14777731 ], [ 114.93869742, 31.14787734 ], [ 114.93861768, 31.14805743 ], [ 114.93843804, 31.14841761 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32572", "Name": null, "pyname": null, "mapid": "465457", "id": "3754276", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881755", "enodeid": "2881756", "funcclass": "2", "length": "0.453", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93582534, 31.14900333 ], [ 114.93606474, 31.14891279 ], [ 114.9362442, 31.14885245 ], [ 114.93643374, 31.14877203 ], [ 114.93663318, 31.14867164 ], [ 114.93669294, 31.14865152 ], [ 114.93694224, 31.14850104 ], [ 114.93721152, 31.14831051 ], [ 114.9374808, 31.14808002 ], [ 114.93769032, 31.1478597 ], [ 114.93789966, 31.14756936 ], [ 114.9380892, 31.14724914 ], [ 114.9382089, 31.14692906 ], [ 114.93828882, 31.146669 ], [ 114.93833868, 31.14637907 ], [ 114.93850824, 31.14591894 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32671", "Name": null, "pyname": null, "mapid": "465563", "id": "3772484", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913194", "enodeid": "2913193", "funcclass": "3", "length": "0.663", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38013842, 31.21356222 ], [ 115.3801683, 31.21373214 ], [ 115.38019818, 31.21388199 ], [ 115.38020826, 31.2141119 ], [ 115.38021816, 31.21443171 ], [ 115.38016812, 31.21470162 ], [ 115.38005814, 31.21504151 ], [ 115.37988822, 31.21544147 ], [ 115.37973846, 31.21578144 ], [ 115.3796985, 31.21589142 ], [ 115.37959842, 31.21615139 ], [ 115.37944866, 31.21652133 ], [ 115.3793286, 31.21683129 ], [ 115.37930862, 31.21691126 ], [ 115.37929872, 31.21703123 ], [ 115.37928864, 31.21710116 ], [ 115.37929854, 31.2172011 ], [ 115.3793385, 31.21734101 ], [ 115.37936856, 31.21740095 ], [ 115.37941842, 31.21747083 ], [ 115.37946828, 31.21752078 ], [ 115.3795383, 31.2175607 ], [ 115.37959824, 31.21758063 ], [ 115.37969814, 31.21761051 ], [ 115.37982792, 31.21763036 ], [ 115.37988786, 31.21763031 ], [ 115.38002772, 31.21761015 ], [ 115.38006768, 31.21760016 ], [ 115.38016758, 31.21756007 ], [ 115.38028746, 31.21746998 ], [ 115.38040734, 31.21727999 ], [ 115.38042732, 31.21722999 ], [ 115.3804473, 31.21715003 ], [ 115.3804374, 31.21707006 ], [ 115.3804374, 31.21701008 ], [ 115.38037746, 31.21684025 ], [ 115.3802277, 31.21666047 ], [ 115.38008784, 31.2165207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32672", "Name": null, "pyname": null, "mapid": "465563", "id": "3772485", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913194", "enodeid": "2913195", "funcclass": "3", "length": "0.430", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.38013842, 31.21356222 ], [ 115.38025812, 31.21390193 ], [ 115.38032796, 31.21440161 ], [ 115.3802979, 31.2150213 ], [ 115.38028782, 31.21532114 ], [ 115.3803078, 31.21557098 ], [ 115.38034776, 31.21585079 ], [ 115.38043758, 31.2160806 ], [ 115.38059724, 31.21637027 ], [ 115.38081702, 31.21662992 ], [ 115.38117648, 31.21693938 ], [ 115.38137628, 31.21710912 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32673", "Name": null, "pyname": null, "mapid": "465563", "id": "3772486", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913197", "enodeid": "2913192", "funcclass": "3", "length": "0.734", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.3800783, 31.21386215 ], [ 115.38012834, 31.21411194 ], [ 115.38012816, 31.21442181 ], [ 115.3800783, 31.21468169 ], [ 115.37997822, 31.21501163 ], [ 115.3798083, 31.21542158 ], [ 115.37965854, 31.21576155 ], [ 115.37961858, 31.21584152 ], [ 115.3795185, 31.21609149 ], [ 115.3795086, 31.21614149 ], [ 115.37936874, 31.21650144 ], [ 115.37924868, 31.21679138 ], [ 115.3792188, 31.21689137 ], [ 115.37920872, 31.21702128 ], [ 115.37920872, 31.21711124 ], [ 115.37921862, 31.21722117 ], [ 115.37924868, 31.2173411 ], [ 115.37930862, 31.21745099 ], [ 115.37934858, 31.21751088 ], [ 115.37941842, 31.21757078 ], [ 115.37949834, 31.21762068 ], [ 115.37956818, 31.21765061 ], [ 115.37969814, 31.21769048 ], [ 115.37979804, 31.21770033 ], [ 115.37991774, 31.21770024 ], [ 115.38002772, 31.21769012 ], [ 115.3801476, 31.21764003 ], [ 115.38036738, 31.21755989 ], [ 115.38053712, 31.2175197 ], [ 115.38069696, 31.2174896 ], [ 115.38079686, 31.21746948 ], [ 115.38098676, 31.2174693 ], [ 115.38111654, 31.21746917 ], [ 115.38124632, 31.21747902 ], [ 115.3814661, 31.2175188 ], [ 115.38157608, 31.21754868 ], [ 115.38225522, 31.21782786 ], [ 115.38231516, 31.2178478 ], [ 115.38241506, 31.21786769 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32674", "Name": null, "pyname": null, "mapid": "465563", "id": "3772494", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913204", "enodeid": "2913206", "funcclass": "3", "length": "0.213", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37774154, 31.21074612 ], [ 115.37780148, 31.21088598 ], [ 115.37792136, 31.21108578 ], [ 115.3779912, 31.21116566 ], [ 115.37825094, 31.21146522 ], [ 115.37849052, 31.21169486 ], [ 115.37867034, 31.21189461 ], [ 115.37888004, 31.21210427 ], [ 115.37904978, 31.212284 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32675", "Name": null, "pyname": null, "mapid": "465563", "id": "3772495", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913206", "enodeid": "2913197", "funcclass": "3", "length": "0.204", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37904978, 31.212284 ], [ 115.37914968, 31.21239384 ], [ 115.37925948, 31.21251368 ], [ 115.37950932, 31.21276329 ], [ 115.37961912, 31.21288313 ], [ 115.37975898, 31.21307289 ], [ 115.37987868, 31.21325267 ], [ 115.37998848, 31.21349243 ], [ 115.3800783, 31.21386215 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.32676", "Name": null, "pyname": null, "mapid": "465563", "id": "3772497", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913207", "enodeid": "2913194", "funcclass": "3", "length": "0.178", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37910972, 31.21223396 ], [ 115.3793295, 31.21247363 ], [ 115.37951922, 31.21266335 ], [ 115.37970894, 31.21287305 ], [ 115.37982882, 31.21304283 ], [ 115.37996868, 31.21324259 ], [ 115.3800684, 31.21342241 ], [ 115.38013842, 31.21356222 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33716", "Name": null, "pyname": null, "mapid": "465447", "id": "4240809", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289629", "enodeid": "3289633", "funcclass": "3", "length": "0.043", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92264916, 31.02025316 ], [ 114.92248932, 31.02061302 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33717", "Name": null, "pyname": null, "mapid": "465447", "id": "4240812", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289630", "enodeid": "3289635", "funcclass": "3", "length": "0.041", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92276904, 31.02030306 ], [ 114.92261928, 31.02062297 ], [ 114.9226092, 31.02064295 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33718", "Name": null, "pyname": null, "mapid": "465447", "id": "4240816", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289638", "enodeid": "3289632", "funcclass": "3", "length": "0.811", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91978158, 31.025732 ], [ 114.91953174, 31.02584207 ], [ 114.91918218, 31.02596222 ], [ 114.91862256, 31.0261824 ], [ 114.91824294, 31.02633257 ], [ 114.91802316, 31.02641262 ], [ 114.91792326, 31.02645267 ], [ 114.9178833, 31.02646271 ], [ 114.91754346, 31.0265928 ], [ 114.91738362, 31.02665288 ], [ 114.91713378, 31.02675296 ], [ 114.91694406, 31.02683306 ], [ 114.91686414, 31.02688305 ], [ 114.9168042, 31.02692306 ], [ 114.9167043, 31.02700307 ], [ 114.91665426, 31.02707309 ], [ 114.91659432, 31.0271531 ], [ 114.91655436, 31.02722307 ], [ 114.9165243, 31.02727307 ], [ 114.9165144, 31.02733301 ], [ 114.91649442, 31.02741302 ], [ 114.91649442, 31.02749298 ], [ 114.91650432, 31.0275729 ], [ 114.91653438, 31.02766286 ], [ 114.91656426, 31.02774278 ], [ 114.91659432, 31.02779277 ], [ 114.91663428, 31.02783269 ], [ 114.9167043, 31.02792264 ], [ 114.91675416, 31.02796256 ], [ 114.91682418, 31.02801251 ], [ 114.91692408, 31.02806241 ], [ 114.91723368, 31.0281822 ], [ 114.9173037, 31.02821213 ], [ 114.91743366, 31.028292 ], [ 114.9175935, 31.02840189 ], [ 114.91773336, 31.02853172 ], [ 114.91784316, 31.0286516 ], [ 114.91791318, 31.02873152 ], [ 114.91804296, 31.02894135 ], [ 114.91812306, 31.02912122 ], [ 114.91816302, 31.02922112 ], [ 114.91839234, 31.03050996 ], [ 114.91841232, 31.03059987 ], [ 114.91842222, 31.03062984 ], [ 114.91845228, 31.0306698 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33719", "Name": null, "pyname": null, "mapid": "465447", "id": "4240820", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289633", "enodeid": "3289645", "funcclass": "3", "length": "0.361", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92248932, 31.02061302 ], [ 114.92243928, 31.020773 ], [ 114.92235936, 31.02098292 ], [ 114.92229942, 31.02118286 ], [ 114.9222195, 31.02139278 ], [ 114.92214966, 31.02162273 ], [ 114.92206974, 31.02185264 ], [ 114.92189982, 31.02231249 ], [ 114.92179992, 31.02256242 ], [ 114.92170992, 31.02281235 ], [ 114.9216201, 31.02307227 ], [ 114.9215202, 31.02335222 ], [ 114.9214302, 31.02361214 ], [ 114.92140014, 31.02372207 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33720", "Name": null, "pyname": null, "mapid": "465447", "id": "4240821", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289645", "enodeid": "3289638", "funcclass": "3", "length": "0.281", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92140014, 31.02372207 ], [ 114.92135028, 31.02387201 ], [ 114.92131032, 31.02399198 ], [ 114.92129034, 31.02406196 ], [ 114.92125038, 31.02415196 ], [ 114.92117046, 31.02433191 ], [ 114.92111052, 31.02447186 ], [ 114.92108046, 31.02453185 ], [ 114.92097066, 31.02472184 ], [ 114.9209406, 31.02477179 ], [ 114.92088066, 31.02486179 ], [ 114.9208407, 31.02490179 ], [ 114.92070084, 31.02508179 ], [ 114.92053092, 31.0252518 ], [ 114.920451, 31.02532182 ], [ 114.92038116, 31.02538181 ], [ 114.92019126, 31.02552185 ], [ 114.92011134, 31.02557189 ], [ 114.92001144, 31.02562193 ], [ 114.91987158, 31.02570194 ], [ 114.91978158, 31.025732 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33721", "Name": null, "pyname": null, "mapid": "465447", "id": "4240822", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289635", "enodeid": "3289646", "funcclass": "3", "length": "0.361", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9226092, 31.02064295 ], [ 114.92255916, 31.02079289 ], [ 114.92248932, 31.02100281 ], [ 114.9224193, 31.02120279 ], [ 114.92234946, 31.02141272 ], [ 114.92226954, 31.02164262 ], [ 114.92218962, 31.02188256 ], [ 114.9220197, 31.02233243 ], [ 114.9219297, 31.02258236 ], [ 114.9218298, 31.02283229 ], [ 114.92173998, 31.02309221 ], [ 114.92164008, 31.02337211 ], [ 114.92156016, 31.02362204 ], [ 114.92152002, 31.023752 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33722", "Name": null, "pyname": null, "mapid": "465447", "id": "4240823", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289646", "enodeid": "3289639", "funcclass": "3", "length": "0.285", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.92152002, 31.023752 ], [ 114.92148006, 31.02389195 ], [ 114.9214302, 31.02401192 ], [ 114.92141022, 31.02408189 ], [ 114.92137026, 31.02417185 ], [ 114.92129034, 31.02436184 ], [ 114.9212304, 31.02450179 ], [ 114.92120034, 31.02456177 ], [ 114.92109054, 31.02475172 ], [ 114.92106048, 31.02480171 ], [ 114.92100054, 31.0249017 ], [ 114.92096058, 31.02494171 ], [ 114.92082072, 31.0251317 ], [ 114.9206409, 31.02530171 ], [ 114.92056098, 31.02538172 ], [ 114.92049096, 31.0254417 ], [ 114.92030106, 31.02559178 ], [ 114.92021124, 31.02564177 ], [ 114.92010126, 31.0257018 ], [ 114.9199515, 31.02578186 ], [ 114.91989156, 31.02581187 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33723", "Name": null, "pyname": null, "mapid": "465447", "id": "4240824", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289639", "enodeid": "3289647", "funcclass": "3", "length": "0.087", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91989156, 31.02581187 ], [ 114.91961166, 31.02592199 ], [ 114.9192621, 31.02606212 ], [ 114.91906212, 31.02613218 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33724", "Name": null, "pyname": null, "mapid": "465447", "id": "4240825", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289647", "enodeid": "3289631", "funcclass": "3", "length": "0.515", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91906212, 31.02613218 ], [ 114.91870248, 31.02627231 ], [ 114.91831278, 31.02642248 ], [ 114.91804314, 31.02652256 ], [ 114.91800318, 31.02654258 ], [ 114.9178932, 31.02658263 ], [ 114.91761348, 31.02668271 ], [ 114.91745364, 31.02674279 ], [ 114.91722378, 31.02684287 ], [ 114.91704396, 31.02692292 ], [ 114.91696404, 31.02695298 ], [ 114.916914, 31.02699299 ], [ 114.9168141, 31.02706301 ], [ 114.91676424, 31.027113 ], [ 114.9167142, 31.02719297 ], [ 114.91667424, 31.027253 ], [ 114.91665426, 31.02729296 ], [ 114.91663428, 31.02734295 ], [ 114.9166242, 31.02741293 ], [ 114.9166242, 31.02749289 ], [ 114.91663428, 31.02756287 ], [ 114.91665426, 31.02764279 ], [ 114.91668432, 31.02771276 ], [ 114.9167142, 31.02774269 ], [ 114.91674426, 31.02779268 ], [ 114.91682418, 31.02786257 ], [ 114.91686414, 31.02789254 ], [ 114.91692408, 31.0279325 ], [ 114.917004, 31.02796242 ], [ 114.91707384, 31.02799239 ], [ 114.91709382, 31.02800238 ], [ 114.91712388, 31.02801233 ], [ 114.91715376, 31.02801233 ], [ 114.9172038, 31.02802227 ], [ 114.91728372, 31.02803222 ], [ 114.91734366, 31.02803222 ], [ 114.91737372, 31.02802218 ], [ 114.91741368, 31.02801219 ], [ 114.91746354, 31.02800216 ], [ 114.91752348, 31.02797214 ], [ 114.91762338, 31.02791211 ], [ 114.9176934, 31.02785208 ], [ 114.91772328, 31.02782211 ], [ 114.91778322, 31.0277421 ], [ 114.91784316, 31.02763212 ], [ 114.9178932, 31.02747219 ], [ 114.9179832, 31.02716228 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33725", "Name": null, "pyname": null, "mapid": "465447", "id": "4240826", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289639", "enodeid": "3289648", "funcclass": "3", "length": "0.094", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91989156, 31.02581187 ], [ 114.91987158, 31.02582186 ], [ 114.91963164, 31.02596195 ], [ 114.91948188, 31.02607197 ], [ 114.91942194, 31.02612197 ], [ 114.91932204, 31.02621201 ], [ 114.9192621, 31.026272 ], [ 114.9191622, 31.02637199 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33726", "Name": null, "pyname": null, "mapid": "465447", "id": "4240827", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289648", "enodeid": "3289640", "funcclass": "3", "length": "0.265", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9191622, 31.02637199 ], [ 114.91911216, 31.02642203 ], [ 114.91883244, 31.02675201 ], [ 114.91876242, 31.02686199 ], [ 114.91866252, 31.02705194 ], [ 114.91852266, 31.02736185 ], [ 114.91847262, 31.02753182 ], [ 114.91844274, 31.02766178 ], [ 114.91841268, 31.02782171 ], [ 114.9183828, 31.02809157 ], [ 114.91834284, 31.02848141 ], [ 114.91833276, 31.0285314 ], [ 114.91832286, 31.02859134 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33727", "Name": null, "pyname": null, "mapid": "465447", "id": "4240830", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289637", "enodeid": "3289650", "funcclass": "3", "length": "0.107", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9173037, 31.02340455 ], [ 114.91735374, 31.02346449 ], [ 114.9173937, 31.02352448 ], [ 114.91742358, 31.02356444 ], [ 114.91743366, 31.02359441 ], [ 114.91761348, 31.02426396 ], [ 114.91763346, 31.02431391 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.33728", "Name": null, "pyname": null, "mapid": "465447", "id": "4240831", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "3289650", "enodeid": "3289638", "funcclass": "3", "length": "0.296", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.91763346, 31.02431391 ], [ 114.91781328, 31.02482354 ], [ 114.91786332, 31.02494346 ], [ 114.91791318, 31.02503342 ], [ 114.91806312, 31.02523322 ], [ 114.91814304, 31.02533312 ], [ 114.918183, 31.02537308 ], [ 114.91825284, 31.02543302 ], [ 114.91837272, 31.02552288 ], [ 114.91855272, 31.02562274 ], [ 114.91865262, 31.02566265 ], [ 114.9187725, 31.02571256 ], [ 114.91885242, 31.02573249 ], [ 114.91895232, 31.02575243 ], [ 114.91904214, 31.02576237 ], [ 114.91919208, 31.02578231 ], [ 114.91939188, 31.02579216 ], [ 114.9194619, 31.02579212 ], [ 114.91953174, 31.02577209 ], [ 114.9196617, 31.02575202 ], [ 114.91978158, 31.025732 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34227", "Name": null, "pyname": null, "mapid": "465563", "id": "49704292", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2913196", "enodeid": "47412593", "funcclass": "3", "length": "0.073", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37633268, 31.21298631 ], [ 115.37636274, 31.21300629 ], [ 115.37660232, 31.21324592 ], [ 115.3767222, 31.21336571 ], [ 115.37684208, 31.21347555 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34447", "Name": null, "pyname": null, "mapid": "465563", "id": "85552373", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "47412593", "enodeid": "74636333", "funcclass": "3", "length": "0.056", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37684208, 31.21347555 ], [ 115.37698194, 31.21361532 ], [ 115.37722152, 31.21386498 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34448", "Name": null, "pyname": null, "mapid": "465563", "id": "85552374", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74636333", "enodeid": "2913197", "funcclass": "3", "length": "0.414", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37722152, 31.21386498 ], [ 115.377651, 31.21424433 ], [ 115.3780605, 31.21456374 ], [ 115.37835012, 31.21476336 ], [ 115.37865972, 31.21493297 ], [ 115.37875962, 31.21497284 ], [ 115.3789893, 31.21504259 ], [ 115.3791792, 31.21506239 ], [ 115.379379, 31.21504218 ], [ 115.37956872, 31.21499205 ], [ 115.37969868, 31.21491195 ], [ 115.3797885, 31.21484189 ], [ 115.37991846, 31.21469186 ], [ 115.3799784, 31.21456185 ], [ 115.38003834, 31.21436192 ], [ 115.38005832, 31.214142 ], [ 115.3800684, 31.21396209 ], [ 115.3800783, 31.21386215 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34490", "Name": null, "pyname": null, "mapid": "465563", "id": "87571354", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74099640", "enodeid": "2913207", "funcclass": "3", "length": "0.203", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "600", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37785152, 31.210776 ], [ 115.3778814, 31.2108759 ], [ 115.3779813, 31.21101576 ], [ 115.37822088, 31.21131533 ], [ 115.37828082, 31.21138526 ], [ 115.37849052, 31.21158492 ], [ 115.37867034, 31.21177464 ], [ 115.37889012, 31.21200432 ], [ 115.37902998, 31.21215408 ], [ 115.37910972, 31.21223396 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34491", "Name": null, "pyname": null, "mapid": "465563", "id": "87571359", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74099643", "enodeid": "2913204", "funcclass": "3", "length": "0.014", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "5", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "600", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 115.37771166, 31.21062624 ], [ 115.37772156, 31.21068618 ], [ 115.37774154, 31.21074612 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34503", "Name": null, "pyname": null, "mapid": "465457", "id": "87728783", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "2881766", "enodeid": "74185788", "funcclass": "2", "length": "0.051", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93127314, 31.15057869 ], [ 114.93126324, 31.15063868 ], [ 114.93126324, 31.1507186 ], [ 114.93127314, 31.15081854 ], [ 114.93133308, 31.15102838 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34504", "Name": null, "pyname": null, "mapid": "465457", "id": "87728784", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "2", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74185788", "enodeid": "2881780", "funcclass": "2", "length": "0.121", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": "1", "lanenume2s": null, "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": "300", "spdlmte2s": null, "spdsrcs2e": "1", "spdsrce2s": null, "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93133308, 31.15102838 ], [ 114.93140292, 31.15116819 ], [ 114.93144288, 31.15122813 ], [ 114.93158274, 31.15139796 ], [ 114.93178254, 31.15160771 ], [ 114.93204228, 31.15184738 ], [ 114.93210222, 31.15188734 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34505", "Name": null, "pyname": null, "mapid": "465457", "id": "87728789", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74017917", "enodeid": "74185791", "funcclass": "2", "length": "0.519", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.93009432, 31.15097937 ], [ 114.93013428, 31.15106928 ], [ 114.9302241, 31.15114916 ], [ 114.930324, 31.15121904 ] ], [ [ 114.930324, 31.15121904 ], [ 114.93050382, 31.15132884 ], [ 114.93069372, 31.15148864 ], [ 114.93087354, 31.15165842 ], [ 114.9310134, 31.15179824 ], [ 114.9311133, 31.15191812 ], [ 114.93116316, 31.15199804 ], [ 114.93119322, 31.15208799 ], [ 114.93120312, 31.15217795 ], [ 114.93119322, 31.15225791 ], [ 114.93117324, 31.15233788 ], [ 114.9311133, 31.15242792 ], [ 114.93104328, 31.15250793 ], [ 114.93097344, 31.15255797 ], [ 114.9309135, 31.15258799 ], [ 114.93086346, 31.15260806 ], [ 114.9308235, 31.15261805 ], [ 114.93075366, 31.15263812 ], [ 114.93064368, 31.15263821 ], [ 114.93058374, 31.15263825 ], [ 114.93054378, 31.15262831 ], [ 114.93047394, 31.15260837 ], [ 114.930414, 31.15258839 ], [ 114.93036414, 31.15256846 ], [ 114.93032418, 31.15253849 ], [ 114.93027414, 31.15249857 ], [ 114.93022428, 31.15245861 ], [ 114.93017424, 31.15238868 ], [ 114.93012438, 31.15230876 ], [ 114.9301143, 31.15225877 ], [ 114.93009432, 31.15217885 ], [ 114.93007434, 31.15210887 ], [ 114.93007434, 31.15205888 ], [ 114.93007434, 31.15190894 ], [ 114.93007434, 31.15183896 ], [ 114.93009432, 31.15172903 ], [ 114.93013428, 31.15160901 ], [ 114.93016416, 31.15153904 ], [ 114.930324, 31.15121904 ] ], [ [ 114.930324, 31.15121904 ], [ 114.93036396, 31.15114907 ], [ 114.93040392, 31.15108908 ], [ 114.9307038, 31.15067909 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "layer_highway_guide_pl.34506", "Name": null, "pyname": null, "mapid": "465457", "id": "87728790", "kind_num": "2", "kind": "0005|000b", "width": "30", "direction": "3", "toll": "2", "const_st": "1", "undconcrid": null, "snodeid": "74185791", "enodeid": "2881765", "funcclass": "2", "length": "0.042", "detailcity": "0", "through": "1", "unthrucrid": null, "ownership": "0", "road_cond": "1", "special": "0", "admincodel": "421181", "admincoder": "421181", "uflag": "0", "onewaycrid": null, "accesscrid": null, "speedclass": "7", "lanenums2e": null, "lanenume2s": "1", "lanenum": "1", "vehcl_type": "11110001110000000000000000000000", "elevated": "0", "structure": "0", "usefeecrid": null, "usefeetype": null, "spdlmts2e": null, "spdlmte2s": "300", "spdsrcs2e": null, "spdsrce2s": "1", "dc_type": "0", "nopasscrid": null }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 114.9307038, 31.15067909 ], [ 114.93095364, 31.15042907 ], [ 114.9309936, 31.15039905 ] ] ] } } +] +} diff --git a/public/mapbox/mapbox-gl-2.css b/public/mapbox/mapbox-gl-2.css new file mode 100644 index 0000000..b922f91 --- /dev/null +++ b/public/mapbox/mapbox-gl-2.css @@ -0,0 +1 @@ +.mapboxgl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mapboxgl-canvas{position:absolute;left:0;top:0}.mapboxgl-map:-webkit-full-screen{width:100%;height:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.mapboxgl-ctrl-top-left{top:0;left:0}.mapboxgl-ctrl-top-right{top:0;right:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{right:0;bottom:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{margin:10px 0 0 10px;float:left}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{margin:10px 10px 0 0;float:right}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{margin:0 0 10px 10px;float:left}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{margin:0 10px 10px 0;float:right}.mapboxgl-ctrl-group{border-radius:4px;background:#fff}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-attrib-button:focus,.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s infinite linear;-o-animation:mapboxgl-spin 2s infinite linear;-ms-animation:mapboxgl-spin 2s infinite linear;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg opacity='.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg opacity='.9' fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{min-height:20px;padding:2px 24px 2px 0;margin:10px;position:relative;background-color:#fff;border-radius:12px}.mapboxgl-ctrl-attrib.mapboxgl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact-show{padding:2px 8px 2px 28px;border-radius:12px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px;outline:none;top:0;right:0;border:0}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,.mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button{left:0}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner,.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;right:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;left:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;border:2px solid #333;border-top:#333;padding:0 5px;color:#333;box-sizing:border-box}.mapboxgl-popup{position:absolute;top:0;left:0;display:-webkit-flex;display:flex;will-change:transform;pointer-events:none}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-top:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-right:none;border-left-color:#fff}.mapboxgl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{position:absolute;top:0;left:0;will-change:transform;opacity:1;transition:opacity .2s}.mapboxgl-marker-occluded{opacity:.2}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.mapboxgl-user-location-dot:before{content:"";position:absolute;-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite}.mapboxgl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{-webkit-transform:scale(1);opacity:1}70%{-webkit-transform:scale(3);opacity:0}to{-webkit-transform:scale(1);opacity:0}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{-ms-transform:scale(1);opacity:1}70%{-ms-transform:scale(3);opacity:0}to{-ms-transform:scale(1);opacity:0}}@keyframes mapboxgl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);width:1px;height:1px;border-radius:100%}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}@media print{.mapbox-improve-map{display:none}} \ No newline at end of file diff --git a/public/mapbox/mapbox-gl-2.js b/public/mapbox/mapbox-gl-2.js new file mode 100644 index 0000000..7e4929e --- /dev/null +++ b/public/mapbox/mapbox-gl-2.js @@ -0,0 +1,42 @@ +/* Mapbox GL JS is Copyright © 2020 Mapbox and subject to the Mapbox Terms of Service ((https://www.mapbox.com/legal/tos/). */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : +typeof define === 'function' && define.amd ? define(factory) : +(global = global || self, global.mapboxgl = factory()); +}(this, (function () { 'use strict'; + +/* eslint-disable */ + +var shared, worker, mapboxgl; +// define gets called three times: one for each chunk. we rely on the order +// they're imported to know which is which +function define(_, chunk) { +if (!shared) { + shared = chunk; +} else if (!worker) { + worker = chunk; +} else { + var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' + + var sharedChunk = {}; + shared(sharedChunk); + mapboxgl = chunk(sharedChunk); + if (typeof window !== 'undefined') { + mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); + } +} +} + + +define(["exports"],(function(t){"use strict";function e(t,e){return t(e={exports:{}},e.exports),e.exports}var r=i;function i(t,e,r,i){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(i-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=i,this.p2x=r,this.p2y=i;}i.prototype.sampleCurveX=function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},i.prototype.sampleCurveY=function(t){return ((this.ay*t+this.by)*t+this.cy)*t},i.prototype.sampleCurveDerivativeX=function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},i.prototype.solveCurveX=function(t,e){var r,i,n,s,a;for(void 0===e&&(e=1e-6),n=t,a=0;a<8;a++){if(s=this.sampleCurveX(n)-t,Math.abs(s)(i=1))return i;for(;rs?r=n:i=n,n=.5*(i-r)+r;}return n},i.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var n=s;function s(t,e){this.x=t,this.y=e;}s.prototype={clone:function(){return new s(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},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(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[2]*this.x+t[3]*this.y;return this.x=t[0]*this.x+t[1]*this.y,this.y=e,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),i=r*this.x+e*this.y;return this.x=e*this.x-r*this.y,this.y=i,this},_rotateAround:function(t,e){var r=Math.cos(t),i=Math.sin(t),n=e.y+i*(this.x-e.x)+r*(this.y-e.y);return this.x=e.x+r*(this.x-e.x)-i*(this.y-e.y),this.y=n,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},s.convert=function(t){return t instanceof s?t:Array.isArray(t)?new s(t[0],t[1]):t};var a="undefined"!=typeof self?self:{};function o(t,e){if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return !1;for(let r=0;r=1)return 1;const e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function d(t,e,i,n){const s=new r(t,e,i,n);return function(t){return s.solve(t)}}const f=d(.25,.1,.25,1);function y(t,e,r){return Math.min(r,Math.max(e,t))}function m(t,e,r){const i=r-e,n=((t-e)%i+i)%i+e;return n===e?r:n}function g(t){const e=[];for(const r in t)e.push(t[r]);return e}function x(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}let v=1;function b(){return v++}function w(){return function t(e){return e?(e^16*Math.random()>>e/4).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function _(t){return !!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function A(t,e){t.forEach(t=>{e[t]&&(e[t]=e[t].bind(e));});}function k(t,e){return -1!==t.indexOf(e,t.length-e.length)}function S(t,e,r){const i={};for(const n in t)i[n]=e.call(r||this,t[n],n,t);return i}function I(t,e,r){const i={};for(const n in t)e.call(r||this,t[n],n,t)&&(i[n]=t[n]);return i}function T(t){return Array.isArray(t)?t.map(T):"object"==typeof t&&t?S(t,T):t}const z={};function E(t){z[t]||("undefined"!=typeof console&&console.warn(t),z[t]=!0);}function C(t,e,r){return (r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function M(t){let e=0;for(let r,i,n=0,s=t.length,a=s-1;n@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,(t,r,i,n)=>{const s=i||n;return e[r]=!s||s.toLowerCase(),""}),e["max-age"]){const t=parseInt(e["max-age"],10);isNaN(t)?delete e["max-age"]:e["max-age"]=t;}return e}let P=null;function V(t){if(null==P){const e=t.navigator?t.navigator.userAgent:null;P=!!t.safari||!(!e||!(/\b(iPad|iPhone|iPod)\b/.test(e)||e.match("Safari")&&!e.match("Chrome")));}return P}function F(t){try{const e=a[t];return e.setItem("_mapbox_test_",1),e.removeItem("_mapbox_test_"),!0}catch(t){return !1}}const R=a.performance&&a.performance.now?a.performance.now.bind(a.performance):Date.now.bind(Date),L=a.requestAnimationFrame||a.mozRequestAnimationFrame||a.webkitRequestAnimationFrame||a.msRequestAnimationFrame,U=a.cancelAnimationFrame||a.mozCancelAnimationFrame||a.webkitCancelAnimationFrame||a.msCancelAnimationFrame;let O,$,q=!1;const N={now:R,setErrorState(){q=!0;},setNow(t){N.now=()=>t;},restoreNow(){N.now=R;},frame(t){if(q)return {cancel:()=>{}};const e=L(t);return {cancel:()=>U(e)}},getImageData(t,e=0){const r=a.document.createElement("canvas"),i=r.getContext("2d");if(!i)throw new Error("failed to create canvas 2d context");return r.width=t.width,r.height=t.height,i.drawImage(t,0,0,t.width,t.height),i.getImageData(-e,-e,t.width+2*e,t.height+2*e)},resolveURL:t=>(O||(O=a.document.createElement("a")),O.href=t,O.href),get devicePixelRatio(){return a.devicePixelRatio},get prefersReducedMotion(){return !!a.matchMedia&&(null==$&&($=a.matchMedia("(prefers-reduced-motion: reduce)")),$.matches)}},j={API_URL:"https://api.mapbox.com",get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf("https://api.mapbox.cn")?"https://events.mapbox.cn/events/v2":0===this.API_URL.indexOf("https://api.mapbox.com")?"https://events.mapbox.com/events/v2":null:null},SESSION_PATH:"/map-sessions/v1",FEEDBACK_URL:"https://apps.mapbox.com/feedback",TILE_URL_VERSION:"v4",RASTER_URL_PREFIX:"raster/v1",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},K={supported:!1,testSupport:function(t){!G&&X&&(H?J(t):Z=t);}};let Z,X,G=!1,H=!1;function J(t){const e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,X),t.isContextLost())return;K.supported=!0;}catch(t){}t.deleteTexture(e),G=!0;}a.document&&(X=a.document.createElement("img"),X.onload=function(){Z&&J(Z),Z=null,H=!0;},X.onerror=function(){G=!0,Z=null;},X.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=");const Y="01";function W(t){return 0===t.indexOf("mapbox:")}const Q=/^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i;function tt(t){return Q.test(t)}const et=/^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/;function rt(t){const e=t.match(et);if(!e)throw new Error("Unable to parse URL object");return {protocol:e[1],authority:e[2],path:e[3]||"/",params:e[4]?e[4].split("&"):[]}}function it(t){const e=t.params.length?`?${t.params.join("&")}`:"";return `${t.protocol}://${t.authority}${t.path}${e}`}function nt(t){if(!t)return null;const e=t.split(".");if(!e||3!==e.length)return null;try{return JSON.parse(decodeURIComponent(a.atob(e[1]).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join("")))}catch(t){return null}}class st{constructor(t){this.type=t,this.anonId=null,this.eventData={},this.queue=[],this.pendingRequest=null;}getStorageKey(t){const e=nt(j.ACCESS_TOKEN);let r="";return r=e&&e.u?a.btoa(encodeURIComponent(e.u).replace(/%([0-9A-F]{2})/g,(t,e)=>String.fromCharCode(Number("0x"+e)))):j.ACCESS_TOKEN||"",t?`mapbox.eventData.${t}:${r}`:`mapbox.eventData:${r}`}fetchEventData(){const t=F("localStorage"),e=this.getStorageKey(),r=this.getStorageKey("uuid");if(t)try{const t=a.localStorage.getItem(e);t&&(this.eventData=JSON.parse(t));const i=a.localStorage.getItem(r);i&&(this.anonId=i);}catch(t){E("Unable to read from LocalStorage");}}saveEventData(){const t=F("localStorage"),e=this.getStorageKey(),r=this.getStorageKey("uuid");if(t)try{a.localStorage.setItem(r,this.anonId),Object.keys(this.eventData).length>=1&&a.localStorage.setItem(e,JSON.stringify(this.eventData));}catch(t){E("Unable to write to LocalStorage");}}processRequests(t){}postEvent(t,e,r,i){if(!j.EVENTS_URL)return;const n=rt(j.EVENTS_URL);n.params.push(`access_token=${i||j.ACCESS_TOKEN||""}`);const s={event:this.type,created:new Date(t).toISOString(),sdkIdentifier:"mapbox-gl-js",sdkVersion:"2.0.0-dev",skuId:Y,userId:this.anonId},a=e?x(s,e):s,o={url:it(n),headers:{"Content-Type":"text/plain"},body:JSON.stringify([a])};this.pendingRequest=It(o,t=>{this.pendingRequest=null,r(t),this.saveEventData(),this.processRequests(i);});}queueRequest(t,e){this.queue.push(t),this.processRequests(e);}}const at=new class extends st{constructor(t){super("appUserTurnstile"),this._customAccessToken=t;}postTurnstileEvent(t,e){j.EVENTS_URL&&j.ACCESS_TOKEN&&Array.isArray(t)&&t.some(t=>W(t)||tt(t))&&this.queueRequest(Date.now(),e);}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();const e=nt(j.ACCESS_TOKEN),r=e?e.u:j.ACCESS_TOKEN;let i=r!==this.eventData.tokenU;_(this.anonId)||(this.anonId=w(),i=!0);const n=this.queue.shift();if(this.eventData.lastSuccess){const t=new Date(this.eventData.lastSuccess),e=new Date(n),r=(n-this.eventData.lastSuccess)/864e5;i=i||r>=1||r<-1||t.getDate()!==e.getDate();}else i=!0;if(!i)return this.processRequests();this.postEvent(n,{"enabled.telemetry":!1},t=>{t||(this.eventData.lastSuccess=n,this.eventData.tokenU=r);},t);}},ot=at.postTurnstileEvent.bind(at),lt=new class extends st{constructor(){super("map.load"),this.success={},this.skuToken="";}postMapLoadEvent(t,e,r,i){this.skuToken=e,this.errorCb=i,j.EVENTS_URL&&(r||j.ACCESS_TOKEN?this.queueRequest({id:t,timestamp:Date.now()},r):this.errorCb(new Error("A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/")));}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;const{id:e,timestamp:r}=this.queue.shift();e&&this.success[e]||(this.anonId||this.fetchEventData(),_(this.anonId)||(this.anonId=w()),this.postEvent(r,{skuToken:this.skuToken},t=>{t?this.errorCb(t):e&&(this.success[e]=!0);},t));}},ut=lt.postMapLoadEvent.bind(lt),ct=new class extends st{constructor(){super("map.auth"),this.success={},this.skuToken="";}getSession(t,e,r,i){if(!j.API_URL||!j.SESSION_PATH)return;const n=rt(j.API_URL+j.SESSION_PATH);n.params.push(`sku=${e||""}`),n.params.push(`access_token=${i||j.ACCESS_TOKEN||""}`);const s={url:it(n),headers:{"Content-Type":"text/plain"}};this.pendingRequest=Tt(s,t=>{this.pendingRequest=null,r(t),this.saveEventData(),this.processRequests(i);});}getSessionAPI(t,e,r,i){this.skuToken=e,this.errorCb=i,j.SESSION_PATH&&j.API_URL&&(r||j.ACCESS_TOKEN?this.queueRequest({id:t,timestamp:Date.now()},r):this.errorCb(new Error("NO_ACCESS_TOKEN")));}processRequests(t){if(this.pendingRequest||0===this.queue.length)return;const{id:e,timestamp:r}=this.queue.shift();e&&this.success[e]||this.getSession(r,this.skuToken,t=>{t?this.errorCb(t):e&&(this.success[e]=!0);},t);}},ht=ct.getSessionAPI.bind(ct);let pt,dt,ft=500,yt=50;function mt(){a.caches&&!pt&&(pt=a.caches.open("mapbox-tiles"));}function gt(t){const e=t.indexOf("?");return e<0?t:t.slice(0,e)}let xt,vt=1/0;function bt(){return null==xt&&(xt=a.OffscreenCanvas&&new a.OffscreenCanvas(1,1).getContext("2d")&&"function"==typeof a.createImageBitmap),xt}const wt={Unknown:"Unknown",Style:"Style",Source:"Source",Tile:"Tile",Glyphs:"Glyphs",SpriteImage:"SpriteImage",SpriteJSON:"SpriteJSON",Image:"Image"};"function"==typeof Object.freeze&&Object.freeze(wt);class _t extends Error{constructor(t,e,r){401===e&&tt(r)&&(t+=": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes"),super(t),this.status=e,this.url=r;}toString(){return `${this.name}: ${this.message} (${this.status}): ${this.url}`}}const At=B()?()=>self.worker&&self.worker.referrer:()=>("blob:"===a.location.protocol?a.parent:a).location.href;const kt=function(t,e){if(!(/^file:/.test(r=t.url)||/^file:/.test(At())&&!/^\w+:/.test(r))){if(a.fetch&&a.Request&&a.AbortController&&a.Request.prototype.hasOwnProperty("signal"))return function(t,e){const r=new a.AbortController,i=new a.Request(t.url,{method:t.method||"GET",body:t.body,credentials:t.credentials,headers:t.headers,referrer:At(),signal:r.signal});let n=!1,s=!1;const o=(l=i.url).indexOf("sku=")>0&&tt(l);var l;"json"===t.type&&i.headers.set("Accept","application/json");const u=(r,n,l)=>{if(s)return;if(r&&"SecurityError"!==r.message&&E(r),n&&l)return c(n);const u=Date.now();a.fetch(i).then(r=>{if(r.ok){const t=o?r.clone():null;return c(r,t,u)}return e(new _t(r.statusText,r.status,t.url))}).catch(t=>{20!==t.code&&e(new Error(t.message));});},c=(r,o,l)=>{("arrayBuffer"===t.type?r.arrayBuffer():"json"===t.type?r.json():r.text()).then(t=>{s||(o&&l&&function(t,e,r){if(mt(),!pt)return;const i={status:e.status,statusText:e.statusText,headers:new a.Headers};e.headers.forEach((t,e)=>i.headers.set(e,t));const n=D(e.headers.get("Cache-Control")||"");n["no-store"]||(n["max-age"]&&i.headers.set("Expires",new Date(r+1e3*n["max-age"]).toUTCString()),new Date(i.headers.get("Expires")).getTime()-r<42e4||function(t,e){if(void 0===dt)try{new Response(new ReadableStream),dt=!0;}catch(t){dt=!1;}dt?e(t.body):t.blob().then(e);}(e,e=>{const r=new a.Response(e,i);mt(),pt&&pt.then(e=>e.put(gt(t.url),r)).catch(t=>E(t.message));}));}(i,o,l),n=!0,e(null,t,r.headers.get("Cache-Control"),r.headers.get("Expires")));}).catch(t=>{s||e(new Error(t.message));});};return o?function(t,e){if(mt(),!pt)return e(null);const r=gt(t.url);pt.then(t=>{t.match(r).then(i=>{const n=function(t){if(!t)return !1;const e=new Date(t.headers.get("Expires")||0),r=D(t.headers.get("Cache-Control")||"");return e>Date.now()&&!r["no-cache"]}(i);t.delete(r),n&&t.put(r,i.clone()),e(null,i,n);}).catch(e);}).catch(e);}(i,u):u(null,null),{cancel:()=>{s=!0,n||r.abort();}}}(t,e);if(B()&&self.worker&&self.worker.actor)return self.worker.actor.send("getResource",t,e,void 0,!0)}var r;return function(t,e){const r=new a.XMLHttpRequest;r.open(t.method||"GET",t.url,!0),"arrayBuffer"===t.type&&(r.responseType="arraybuffer");for(const e in t.headers)r.setRequestHeader(e,t.headers[e]);return "json"===t.type&&(r.responseType="text",r.setRequestHeader("Accept","application/json")),r.withCredentials="include"===t.credentials,r.onerror=()=>{e(new Error(r.statusText));},r.onload=()=>{if((r.status>=200&&r.status<300||0===r.status)&&null!==r.response){let i=r.response;if("json"===t.type)try{i=JSON.parse(r.response);}catch(t){return e(t)}e(null,i,r.getResponseHeader("Cache-Control"),r.getResponseHeader("Expires"));}else e(new _t(r.statusText,r.status,t.url));},r.send(t.body),{cancel:()=>r.abort()}}(t,e)},St=function(t,e){return kt(x(t,{type:"arrayBuffer"}),e)},It=function(t,e){return kt(x(t,{method:"POST"}),e)},Tt=function(t,e){return kt(x(t,{method:"GET"}),e)};function zt(t){const e=a.document.createElement("a");return e.href=t,e.protocol===a.document.location.protocol&&e.host===a.document.location.host}const Et="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";let Ct,Mt;Ct=[],Mt=0;const Bt=function(t,e){if(K.supported&&(t.headers||(t.headers={}),t.headers.accept="image/webp,*/*"),Mt>=j.MAX_PARALLEL_IMAGE_REQUESTS){const r={requestParameters:t,callback:e,cancelled:!1,cancel(){this.cancelled=!0;}};return Ct.push(r),r}Mt++;let r=!1;const i=()=>{if(!r)for(r=!0,Mt--;Ct.length&&Mt{i(),t?e(t):r&&(bt()?function(t,e){const r=new a.Blob([new Uint8Array(t)],{type:"image/png"});a.createImageBitmap(r).then(t=>{e(null,t);}).catch(t=>{e(new Error(`Could not load image because of ${t.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`));});}(r,e):function(t,e,r,i){const n=new a.Image,s=a.URL;n.onload=()=>{e(null,n),s.revokeObjectURL(n.src),n.onload=null,n.src=Et;},n.onerror=()=>e(new Error("Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));const o=new a.Blob([new Uint8Array(t)],{type:"image/png"});n.cacheControl=r,n.expires=i,n.src=t.byteLength?s.createObjectURL(o):Et;}(r,e,n,s));});return {cancel:()=>{n.cancel(),i();}}};function Dt(t,e,r){r[t]&&-1!==r[t].indexOf(e)||(r[t]=r[t]||[],r[t].push(e));}function Pt(t,e,r){if(r&&r[t]){const i=r[t].indexOf(e);-1!==i&&r[t].splice(i,1);}}class Vt{constructor(t,e={}){x(this,e),this.type=t;}}class Ft extends Vt{constructor(t,e={}){super("error",x({error:t},e));}}class Rt{on(t,e){return this._listeners=this._listeners||{},Dt(t,e,this._listeners),this}off(t,e){return Pt(t,e,this._listeners),Pt(t,e,this._oneTimeListeners),this}once(t,e){return this._oneTimeListeners=this._oneTimeListeners||{},Dt(t,e,this._oneTimeListeners),this}fire(t,e){"string"==typeof t&&(t=new Vt(t,e||{}));const r=t.type;if(this.listens(r)){t.target=this;const e=this._listeners&&this._listeners[r]?this._listeners[r].slice():[];for(const r of e)r.call(this,t);const i=this._oneTimeListeners&&this._oneTimeListeners[r]?this._oneTimeListeners[r].slice():[];for(const e of i)Pt(r,e,this._oneTimeListeners),e.call(this,t);const n=this._eventedParent;n&&(x(t,"function"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData),n.fire(t));}else t instanceof Ft&&console.error(t.error);return this}listens(t){return this._listeners&&this._listeners[t]&&this._listeners[t].length>0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)}setEventedParent(t,e){return this._eventedParent=t,this._eventedParentData=e,this}}var Lt={$version:8,$root:{version:{required:!0,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number",default:0,period:360,units:"degrees"},pitch:{type:"number",default:0,units:"degrees"},light:{type:"light"},terrain:{type:"terrain"},sources:{required:!0,type:"sources"},sprite:{type:"string"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:!0,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image"],source_vector:{type:{required:!0,type:"enum",values:{vector:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},attribution:{type:"string"},promoteId:{type:"promoteId"},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_raster:{type:{required:!0,type:"enum",values:{raster:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},attribution:{type:"string"},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},attribution:{type:"string"},encoding:{type:"enum",values:{terrarium:{},mapbox:{}},default:"mapbox"},volatile:{type:"boolean",default:!1},"*":{type:"*"}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{}}},data:{type:"*"},maxzoom:{type:"number",default:18},attribution:{type:"string"},buffer:{type:"number",default:128,maximum:512,minimum:0},filter:{type:"*"},tolerance:{type:"number",default:.375},cluster:{type:"boolean",default:!1},clusterRadius:{type:"number",default:50,minimum:0},clusterMaxZoom:{type:"number"},clusterMinPoints:{type:"number"},clusterProperties:{type:"*"},lineMetrics:{type:"boolean",default:!1},generateId:{type:"boolean",default:!1},promoteId:{type:"promoteId"}},source_video:{type:{required:!0,type:"enum",values:{video:{}}},urls:{required:!0,type:"array",value:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:!0,type:"enum",values:{image:{}}},url:{required:!0,type:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:!0},type:{type:"enum",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},"fill-extrusion":{},raster:{},hillshade:{},background:{},sky:{}},required:!0},metadata:{type:"*"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:24},maxzoom:{type:"number",minimum:0,maximum:24},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background","layout_sky"],layout_background:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_sky:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{},round:{},square:{}},default:"butt",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-join":{type:"enum",values:{bevel:{},round:{},miter:{}},default:"miter",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,requires:[{"line-join":"miter"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,requires:[{"line-join":"round"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{},line:{},"line-center":{}},default:"point",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",requires:[{"symbol-placement":"line"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{},"viewport-y":{},source:{}},default:"auto",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{},width:{},height:{},both:{}},default:"none",requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"resolvedImage",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{type:"boolean",default:!1,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-letter-spacing":{type:"number",default:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{},left:{},center:{},right:{}},default:"center",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["text-field",{"!":"text-variable-anchor"}],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",requires:["text-field",{"symbol-placement":["line","line-center"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{},vertical:{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{},uppercase:{},lowercase:{}},default:"none",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,requires:["text-field","icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},in:{},"!in":{},all:{},any:{},none:{},has:{},"!has":{},within:{}}},geometry_type:{type:"enum",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:"expression"},stops:{type:"array",value:"function_stop"},base:{type:"number",default:1,minimum:0},property:{type:"string",default:"$zoom"},type:{type:"enum",values:{identity:{},exponential:{},interval:{},categorical:{}},default:"exponential"},colorSpace:{type:"enum",values:{rgb:{},lab:{},hcl:{}},default:"rgb"},default:{type:"*",required:!1}},function_stop:{type:"array",minimum:0,maximum:24,value:["number","color"],length:2},expression:{type:"array",value:"*",minimum:1},light:{anchor:{type:"enum",default:"viewport",values:{map:{},viewport:{}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},terrain:{source:{type:"string",required:!0},exaggeration:{type:"number","property-type":"data-constant",default:1,minimum:0,maximum:1e3,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background","paint_sky"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-extrusion-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",transition:!0,requires:["fill-extrusion-height"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["line-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"line-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["circle-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{},viewport:{}},default:"map",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],transition:!1,expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["icon-image","icon-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["text-field","text-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",values:{linear:{},nearest:{}},default:"linear",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"background-pattern"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_sky:{"sky-type":{type:"enum",values:{gradient:{},atmosphere:{}},default:"atmosphere",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun":{type:"array",value:"number",length:2,transition:!1,requires:[{"sky-type":"atmosphere"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun-intensity":{type:"number",requires:[{"sky-type":"atmosphere"}],default:10,minimum:0,maximum:100,transition:!1,"property-type":"data-constant"},"sky-gradient-center":{type:"array",requires:[{"sky-type":"gradient"}],value:"number",default:[0,0],length:2,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient-radius":{type:"number",requires:[{"sky-type":"gradient"}],default:90,minimum:0,maximum:180,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"sky-gradient":{type:"color",default:["interpolate",["linear"],["sky-radial-progress"],.8,"#87ceeb",1,"white"],transition:!1,requires:[{"sky-type":"gradient"}],expression:{interpolated:!0,parameters:["sky-radial-progress"]},"property-type":"color-ramp"},"sky-atmosphere-halo-color":{type:"color",default:"white",transition:!1,requires:[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-atmosphere-color":{type:"color",default:"white",transition:!1,requires:[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds"},delay:{type:"number",default:0,minimum:0,units:"milliseconds"}},"property-type":{"data-driven":{type:"property-type"},"cross-faded":{type:"property-type"},"cross-faded-data-driven":{type:"property-type"},"color-ramp":{type:"property-type"},"data-constant":{type:"property-type"},constant:{type:"property-type"}},promoteId:{"*":{type:"string"}}};class Ut{constructor(t,e,r,i){this.message=(t?`${t}: `:"")+r,i&&(this.identifier=i),null!=e&&e.__line__&&(this.line=e.__line__);}}function Ot(t){const e=t.value;return e?[new Ut(t.key,e,"constants have been deprecated as of v8")]:[]}function $t(t,...e){for(const r of e)for(const e in r)t[e]=r[e];return t}function qt(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}function Nt(t){if(Array.isArray(t))return t.map(Nt);if(t instanceof Object&&!(t instanceof Number||t instanceof String||t instanceof Boolean)){const e={};for(const r in t)e[r]=Nt(t[r]);return e}return qt(t)}class jt extends Error{constructor(t,e){super(e),this.message=e,this.key=t;}}class Kt{constructor(t,e=[]){this.parent=t,this.bindings={};for(const[t,r]of e)this.bindings[t]=r;}concat(t){return new Kt(this,t)}get(t){if(this.bindings[t])return this.bindings[t];if(this.parent)return this.parent.get(t);throw new Error(`${t} not found in scope.`)}has(t){return !!this.bindings[t]||!!this.parent&&this.parent.has(t)}}const Zt={kind:"null"},Xt={kind:"number"},Gt={kind:"string"},Ht={kind:"boolean"},Jt={kind:"color"},Yt={kind:"object"},Wt={kind:"value"},Qt={kind:"collator"},te={kind:"formatted"},ee={kind:"resolvedImage"};function re(t,e){return {kind:"array",itemType:t,N:e}}function ie(t){if("array"===t.kind){const e=ie(t.itemType);return "number"==typeof t.N?`array<${e}, ${t.N}>`:"value"===t.itemType.kind?"array":`array<${e}>`}return t.kind}const ne=[Zt,Xt,Gt,Ht,Jt,te,Yt,re(Wt),ee];function se(t,e){if("error"===e.kind)return null;if("array"===t.kind){if("array"===e.kind&&(0===e.N&&"value"===e.itemType.kind||!se(t.itemType,e.itemType))&&("number"!=typeof t.N||t.N===e.N))return null}else {if(t.kind===e.kind)return null;if("value"===t.kind)for(const t of ne)if(!se(t,e))return null}return `Expected ${ie(t)} but found ${ie(e)} instead.`}function ae(t,e){return e.some(e=>e.kind===t.kind)}function oe(t,e){return e.some(e=>"null"===e?null===t:"array"===e?Array.isArray(t):"object"===e?t&&!Array.isArray(t)&&"object"==typeof t:e===typeof t)}var le=e((function(t,e){var r={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function i(t){return (t=Math.round(t))<0?0:t>255?255:t}function n(t){return i("%"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function s(t){return (e="%"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))<0?0:e>1?1:e;var e;}function a(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,o=t.replace(/ /g,"").toLowerCase();if(o in r)return r[o].slice();if("#"===o[0])return 4===o.length?(e=parseInt(o.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===o.length&&(e=parseInt(o.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var l=o.indexOf("("),u=o.indexOf(")");if(-1!==l&&u+1===o.length){var c=o.substr(0,l),h=o.substr(l+1,u-(l+1)).split(","),p=1;switch(c){case"rgba":if(4!==h.length)return null;p=s(h.pop());case"rgb":return 3!==h.length?null:[n(h[0]),n(h[1]),n(h[2]),p];case"hsla":if(4!==h.length)return null;p=s(h.pop());case"hsl":if(3!==h.length)return null;var d=(parseFloat(h[0])%360+360)%360/360,f=s(h[1]),y=s(h[2]),m=y<=.5?y*(f+1):y+f-y*f,g=2*y-m;return [i(255*a(g,m,d+1/3)),i(255*a(g,m,d)),i(255*a(g,m,d-1/3)),p];default:return null}}return null};}catch(t){}})).parseCSSColor;class ue{constructor(t,e,r,i=1){this.r=t,this.g=e,this.b=r,this.a=i;}static parse(t){if(!t)return;if(t instanceof ue)return t;if("string"!=typeof t)return;const e=le(t);return e?new ue(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3]):void 0}toString(){const[t,e,r,i]=this.toArray();return `rgba(${Math.round(t)},${Math.round(e)},${Math.round(r)},${i})`}toArray(){const{r:t,g:e,b:r,a:i}=this;return 0===i?[0,0,0,0]:[255*t/i,255*e/i,255*r/i,i]}}ue.black=new ue(0,0,0,1),ue.white=new ue(1,1,1,1),ue.transparent=new ue(0,0,0,0),ue.red=new ue(1,0,0,1),ue.blue=new ue(0,0,1,1);class ce{constructor(t,e,r){this.sensitivity=t?e?"variant":"case":e?"accent":"base",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"});}compare(t,e){return this.collator.compare(t,e)}resolvedLocale(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale}}class he{constructor(t,e,r,i,n){this.text=t,this.image=e,this.scale=r,this.fontStack=i,this.textColor=n;}}class pe{constructor(t){this.sections=t;}static fromString(t){return new pe([new he(t,null,null,null,null)])}isEmpty(){return 0===this.sections.length||!this.sections.some(t=>0!==t.text.length||t.image&&0!==t.image.name.length)}static factory(t){return t instanceof pe?t:pe.fromString(t)}toString(){return 0===this.sections.length?"":this.sections.map(t=>t.text).join("")}serialize(){const t=["format"];for(const e of this.sections){if(e.image){t.push(["image",e.image.name]);continue}t.push(e.text);const r={};e.fontStack&&(r["text-font"]=["literal",e.fontStack.split(",")]),e.scale&&(r["font-scale"]=e.scale),e.textColor&&(r["text-color"]=["rgba"].concat(e.textColor.toArray())),t.push(r);}return t}}class de{constructor(t){this.name=t.name,this.available=t.available;}toString(){return this.name}static fromString(t){return t?new de({name:t,available:!1}):null}serialize(){return ["image",this.name]}}function fe(t,e,r,i){return "number"==typeof t&&t>=0&&t<=255&&"number"==typeof e&&e>=0&&e<=255&&"number"==typeof r&&r>=0&&r<=255?void 0===i||"number"==typeof i&&i>=0&&i<=1?null:`Invalid rgba value [${[t,e,r,i].join(", ")}]: 'a' must be between 0 and 1.`:`Invalid rgba value [${("number"==typeof i?[t,e,r,i]:[t,e,r]).join(", ")}]: 'r', 'g', and 'b' must be between 0 and 255.`}function ye(t){if(null===t)return !0;if("string"==typeof t)return !0;if("boolean"==typeof t)return !0;if("number"==typeof t)return !0;if(t instanceof ue)return !0;if(t instanceof ce)return !0;if(t instanceof pe)return !0;if(t instanceof de)return !0;if(Array.isArray(t)){for(const e of t)if(!ye(e))return !1;return !0}if("object"==typeof t){for(const e in t)if(!ye(t[e]))return !1;return !0}return !1}function me(t){if(null===t)return Zt;if("string"==typeof t)return Gt;if("boolean"==typeof t)return Ht;if("number"==typeof t)return Xt;if(t instanceof ue)return Jt;if(t instanceof ce)return Qt;if(t instanceof pe)return te;if(t instanceof de)return ee;if(Array.isArray(t)){const e=t.length;let r;for(const e of t){const t=me(e);if(r){if(r===t)continue;r=Wt;break}r=t;}return re(r||Wt,e)}return Yt}function ge(t){const e=typeof t;return null===t?"":"string"===e||"number"===e||"boolean"===e?String(t):t instanceof ue||t instanceof pe||t instanceof de?t.toString():JSON.stringify(t)}class xe{constructor(t,e){this.type=t,this.value=e;}static parse(t,e){if(2!==t.length)return e.error(`'literal' expression requires exactly one argument, but found ${t.length-1} instead.`);if(!ye(t[1]))return e.error("invalid value");const r=t[1];let i=me(r);const n=e.expectedType;return "array"!==i.kind||0!==i.N||!n||"array"!==n.kind||"number"==typeof n.N&&0!==n.N||(i=n),new xe(i,r)}evaluate(){return this.value}eachChild(){}outputDefined(){return !0}serialize(){return "array"===this.type.kind||"object"===this.type.kind?["literal",this.value]:this.value instanceof ue?["rgba"].concat(this.value.toArray()):this.value instanceof pe?this.value.serialize():this.value}}class ve{constructor(t){this.name="ExpressionEvaluationError",this.message=t;}toJSON(){return this.message}}const be={string:Gt,number:Xt,boolean:Ht,object:Yt};class we{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");let r,i=1;const n=t[0];if("array"===n){let n,s;if(t.length>2){const r=t[1];if("string"!=typeof r||!(r in be)||"object"===r)return e.error('The item type argument of "array" must be one of string, number, boolean',1);n=be[r],i++;}else n=Wt;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to "array" must be a positive integer literal',2);s=t[2],i++;}r=re(n,s);}else r=be[n];const s=[];for(;it.outputDefined())}serialize(){const t=this.type,e=[t.kind];if("array"===t.kind){const r=t.itemType;if("string"===r.kind||"number"===r.kind||"boolean"===r.kind){e.push(r.kind);const i=t.N;("number"==typeof i||this.args.length>1)&&e.push(i);}}return e.concat(this.args.map(t=>t.serialize()))}}class _e{constructor(t){this.type=te,this.sections=t;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");const r=t[1];if(!Array.isArray(r)&&"object"==typeof r)return e.error("First argument must be an image or text section.");const i=[];let n=!1;for(let r=1;r<=t.length-1;++r){const s=t[r];if(n&&"object"==typeof s&&!Array.isArray(s)){n=!1;let t=null;if(s["font-scale"]&&(t=e.parse(s["font-scale"],1,Xt),!t))return null;let r=null;if(s["text-font"]&&(r=e.parse(s["text-font"],1,re(Gt)),!r))return null;let a=null;if(s["text-color"]&&(a=e.parse(s["text-color"],1,Jt),!a))return null;const o=i[i.length-1];o.scale=t,o.font=r,o.textColor=a;}else {const s=e.parse(t[r],1,Wt);if(!s)return null;const a=s.type.kind;if("string"!==a&&"value"!==a&&"null"!==a&&"resolvedImage"!==a)return e.error("Formatted text type must be 'string', 'value', 'image' or 'null'.");n=!0,i.push({content:s,scale:null,font:null,textColor:null});}}return new _e(i)}evaluate(t){return new pe(this.sections.map(e=>{const r=e.content.evaluate(t);return me(r)===ee?new he("",r,null,null,null):new he(ge(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(","):null,e.textColor?e.textColor.evaluate(t):null)}))}eachChild(t){for(const e of this.sections)t(e.content),e.scale&&t(e.scale),e.font&&t(e.font),e.textColor&&t(e.textColor);}outputDefined(){return !1}serialize(){const t=["format"];for(const e of this.sections){t.push(e.content.serialize());const r={};e.scale&&(r["font-scale"]=e.scale.serialize()),e.font&&(r["text-font"]=e.font.serialize()),e.textColor&&(r["text-color"]=e.textColor.serialize()),t.push(r);}return t}}class Ae{constructor(t){this.type=ee,this.input=t;}static parse(t,e){if(2!==t.length)return e.error("Expected two arguments.");const r=e.parse(t[1],1,Gt);return r?new Ae(r):e.error("No image name provided.")}evaluate(t){const e=this.input.evaluate(t),r=de.fromString(e);return r&&t.availableImages&&(r.available=t.availableImages.indexOf(e)>-1),r}eachChild(t){t(this.input);}outputDefined(){return !1}serialize(){return ["image",this.input.serialize()]}}const ke={"to-boolean":Ht,"to-color":Jt,"to-number":Xt,"to-string":Gt};class Se{constructor(t,e){this.type=t,this.args=e;}static parse(t,e){if(t.length<2)return e.error("Expected at least one argument.");const r=t[0];if(("to-boolean"===r||"to-string"===r)&&2!==t.length)return e.error("Expected one argument.");const i=ke[r],n=[];for(let r=1;r4?`Invalid rbga value ${JSON.stringify(e)}: expected an array containing either three or four numeric values.`:fe(e[0],e[1],e[2],e[3]),!r))return new ue(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new ve(r||`Could not parse color from value '${"string"==typeof e?e:String(JSON.stringify(e))}'`)}if("number"===this.type.kind){let e=null;for(const r of this.args){if(e=r.evaluate(t),null===e)return 0;const i=Number(e);if(!isNaN(i))return i}throw new ve(`Could not convert ${JSON.stringify(e)} to number.`)}return "formatted"===this.type.kind?pe.fromString(ge(this.args[0].evaluate(t))):"resolvedImage"===this.type.kind?de.fromString(ge(this.args[0].evaluate(t))):ge(this.args[0].evaluate(t))}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every(t=>t.outputDefined())}serialize(){if("formatted"===this.type.kind)return new _e([{content:this.args[0],scale:null,font:null,textColor:null}]).serialize();if("resolvedImage"===this.type.kind)return new Ae(this.args[0]).serialize();const t=[`to-${this.type.kind}`];return this.eachChild(e=>{t.push(e.serialize());}),t}}const Ie=["Unknown","Point","LineString","Polygon"];class Te{constructor(){this.globals=null,this.feature=null,this.featureState=null,this.formattedSection=null,this._parseColorCache={},this.availableImages=null,this.canonical=null;}id(){return this.feature&&"id"in this.feature?this.feature.id:null}geometryType(){return this.feature?"number"==typeof this.feature.type?Ie[this.feature.type]:this.feature.type:null}geometry(){return this.feature&&"geometry"in this.feature?this.feature.geometry:null}canonicalID(){return this.canonical}properties(){return this.feature&&this.feature.properties||{}}parseColor(t){let e=this._parseColorCache[t];return e||(e=this._parseColorCache[t]=ue.parse(t)),e}}class ze{constructor(t,e,r,i){this.name=t,this.type=e,this._evaluate=r,this.args=i;}evaluate(t){return this._evaluate(t,this.args)}eachChild(t){this.args.forEach(t);}outputDefined(){return !1}serialize(){return [this.name].concat(this.args.map(t=>t.serialize()))}static parse(t,e){const r=t[0],i=ze.definitions[r];if(!i)return e.error(`Unknown expression "${r}". If you wanted a literal array, use ["literal", [...]].`,0);const n=Array.isArray(i)?i[0]:i.type,s=Array.isArray(i)?[[i[1],i[2]]]:i.overloads,a=s.filter(([e])=>!Array.isArray(e)||e.length===t.length-1);let o=null;for(const[i,s]of a){o=new Je(e.registry,e.path,null,e.scope);const a=[];let l=!1;for(let e=1;e{return e=t,Array.isArray(e)?`(${e.map(ie).join(", ")})`:`(${ie(e.type)}...)`;var e;}).join(" | "),i=[];for(let r=1;r=e[2]||t[1]<=e[1]||t[3]>=e[3])}function Be(t,e){const r=(180+t[0])/360,i=(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t[1]*Math.PI/360)))/360,n=Math.pow(2,e.z);return [Math.round(r*n*8192),Math.round(i*n*8192)]}function De(t,e,r){const i=t[0]-e[0],n=t[1]-e[1],s=t[0]-r[0],a=t[1]-r[1];return i*a-s*n==0&&i*s<=0&&n*a<=0}function Pe(t,e){let r=!1;for(let a=0,o=e.length;a(i=t)[1]!=(s=o[e+1])[1]>i[1]&&i[0]<(s[0]-n[0])*(i[1]-n[1])/(s[1]-n[1])+n[0]&&(r=!r);}}var i,n,s;return r}function Ve(t,e){for(let r=0;r0&&o<0||a<0&&o>0}function Re(t,e,r){for(const u of r)for(let r=0;rr[2]){const e=.5*i;let n=t[0]-r[0]>e?-i:r[0]-t[0]>e?i:0;0===n&&(n=t[0]-r[2]>e?-i:r[2]-t[0]>e?i:0),t[0]+=n;}Ce(e,t);}function Ne(t,e,r,i){const n=8192*Math.pow(2,i.z),s=[8192*i.x,8192*i.y],a=[];for(const i of t)for(const t of i){const i=[t.x+s[0],t.y+s[1]];qe(i,e,r,n),a.push(i);}return a}function je(t,e,r,i){const n=8192*Math.pow(2,i.z),s=[8192*i.x,8192*i.y],a=[];for(const r of t){const t=[];for(const i of r){const r=[i.x+s[0],i.y+s[1]];Ce(e,r),t.push(r);}a.push(t);}if(e[2]-e[0]<=n/2){(o=e)[0]=o[1]=1/0,o[2]=o[3]=-1/0;for(const t of a)for(const i of t)qe(i,e,r,n);}var o;return a}class Ke{constructor(t,e){this.type=Ht,this.geojson=t,this.geometries=e;}static parse(t,e){if(2!==t.length)return e.error(`'within' expression requires exactly one argument, but found ${t.length-1} instead.`);if(ye(t[1])){const e=t[1];if("FeatureCollection"===e.type)for(let t=0;t{e&&!Ze(t)&&(e=!1);}),e}function Xe(t){if(t instanceof ze&&"feature-state"===t.name)return !1;let e=!0;return t.eachChild(t=>{e&&!Xe(t)&&(e=!1);}),e}function Ge(t,e){if(t instanceof ze&&e.indexOf(t.name)>=0)return !1;let r=!0;return t.eachChild(t=>{r&&!Ge(t,e)&&(r=!1);}),r}class He{constructor(t,e){this.type=e.type,this.name=t,this.boundExpression=e;}static parse(t,e){if(2!==t.length||"string"!=typeof t[1])return e.error("'var' expression requires exactly one string literal argument.");const r=t[1];return e.scope.has(r)?new He(r,e.scope.get(r)):e.error(`Unknown variable "${r}". Make sure "${r}" has been bound in an enclosing "let" expression before using it.`,1)}evaluate(t){return this.boundExpression.evaluate(t)}eachChild(){}outputDefined(){return !1}serialize(){return ["var",this.name]}}class Je{constructor(t,e=[],r,i=new Kt,n=[]){this.registry=t,this.path=e,this.key=e.map(t=>`[${t}]`).join(""),this.scope=i,this.errors=n,this.expectedType=r;}parse(t,e,r,i,n={}){return e?this.concat(e,r,i)._parse(t,n):this._parse(t,n)}_parse(t,e){function r(t,e,r){return "assert"===r?new we(e,[t]):"coerce"===r?new Se(e,[t]):t}if(null!==t&&"string"!=typeof t&&"boolean"!=typeof t&&"number"!=typeof t||(t=["literal",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');const i=t[0];if("string"!=typeof i)return this.error(`Expression name must be a string, but found ${typeof i} instead. If you wanted a literal array, use ["literal", [...]].`,0),null;const n=this.registry[i];if(n){let i=n.parse(t,this);if(!i)return null;if(this.expectedType){const t=this.expectedType,n=i.type;if("string"!==t.kind&&"number"!==t.kind&&"boolean"!==t.kind&&"object"!==t.kind&&"array"!==t.kind||"value"!==n.kind)if("color"!==t.kind&&"formatted"!==t.kind&&"resolvedImage"!==t.kind||"value"!==n.kind&&"string"!==n.kind){if(this.checkSubtype(t,n))return null}else i=r(i,t,e.typeAnnotation||"coerce");else i=r(i,t,e.typeAnnotation||"assert");}if(!(i instanceof xe)&&"resolvedImage"!==i.type.kind&&function t(e){if(e instanceof He)return t(e.boundExpression);if(e instanceof ze&&"error"===e.name)return !1;if(e instanceof Ee)return !1;if(e instanceof Ke)return !1;const r=e instanceof Se||e instanceof we;let i=!0;return e.eachChild(e=>{i=r?i&&t(e):i&&e instanceof xe;}),!!i&&Ze(e)&&Ge(e,["zoom","heatmap-density","line-progress","sky-radial-progress","accumulated","is-supported-script"])}(i)){const t=new Te;try{i=new xe(i.type,i.evaluate(t));}catch(t){return this.error(t.message),null}}return i}return this.error(`Unknown expression "${i}". If you wanted a literal array, use ["literal", [...]].`,0)}return this.error(void 0===t?"'undefined' value invalid. Use null instead.":"object"==typeof t?'Bare objects invalid. Use ["literal", {...}] instead.':`Expected an array, but found ${typeof t} instead.`)}concat(t,e,r){const i="number"==typeof t?this.path.concat(t):this.path,n=r?this.scope.concat(r):this.scope;return new Je(this.registry,i,e||null,n,this.errors)}error(t,...e){const r=`${this.key}${e.map(t=>`[${t}]`).join("")}`;this.errors.push(new jt(r,t));}checkSubtype(t,e){const r=se(t,e);return r&&this.error(r),r}}function Ye(t,e){const r=t.length-1;let i,n,s=0,a=r,o=0;for(;s<=a;)if(o=Math.floor((s+a)/2),i=t[o],n=t[o+1],i<=e){if(o===r||ee))throw new ve("Input is not a number.");a=o-1;}return 0}class We{constructor(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(const[t,e]of r)this.labels.push(t),this.outputs.push(e);}static parse(t,e){if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");const r=e.parse(t[1],1,Xt);if(!r)return null;const i=[];let n=null;e.expectedType&&"value"!==e.expectedType.kind&&(n=e.expectedType);for(let r=1;r=s)return e.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',o);const u=e.parse(a,l,n);if(!u)return null;n=n||u.type,i.push([s,u]);}return new We(n,r,i)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const i=this.input.evaluate(t);if(i<=e[0])return r[0].evaluate(t);const n=e.length;return i>=e[n-1]?r[n-1].evaluate(t):r[Ye(e,i)].evaluate(t)}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every(t=>t.outputDefined())}serialize(){const t=["step",this.input.serialize()];for(let e=0;e0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t}}function Qe(t,e,r){return t*(1-r)+e*r}var tr=Object.freeze({__proto__:null,number:Qe,color:function(t,e,r){return new ue(Qe(t.r,e.r,r),Qe(t.g,e.g,r),Qe(t.b,e.b,r),Qe(t.a,e.a,r))},array:function(t,e,r){return t.map((t,i)=>Qe(t,e[i],r))}});const er=6/29*3*(6/29),rr=Math.PI/180,ir=180/Math.PI;function nr(t){return t>.008856451679035631?Math.pow(t,1/3):t/er+4/29}function sr(t){return t>6/29?t*t*t:er*(t-4/29)}function ar(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function or(t){return (t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function lr(t){const e=or(t.r),r=or(t.g),i=or(t.b),n=nr((.4124564*e+.3575761*r+.1804375*i)/.95047),s=nr((.2126729*e+.7151522*r+.072175*i)/1);return {l:116*s-16,a:500*(n-s),b:200*(s-nr((.0193339*e+.119192*r+.9503041*i)/1.08883)),alpha:t.a}}function ur(t){let e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,i=isNaN(t.b)?e:e-t.b/200;return e=1*sr(e),r=.95047*sr(r),i=1.08883*sr(i),new ue(ar(3.2404542*r-1.5371385*e-.4985314*i),ar(-.969266*r+1.8760108*e+.041556*i),ar(.0556434*r-.2040259*e+1.0572252*i),t.alpha)}function cr(t,e,r){const i=e-t;return t+r*(i>180||i<-180?i-360*Math.round(i/360):i)}const hr={forward:lr,reverse:ur,interpolate:function(t,e,r){return {l:Qe(t.l,e.l,r),a:Qe(t.a,e.a,r),b:Qe(t.b,e.b,r),alpha:Qe(t.alpha,e.alpha,r)}}},pr={forward:function(t){const{l:e,a:r,b:i}=lr(t),n=Math.atan2(i,r)*ir;return {h:n<0?n+360:n,c:Math.sqrt(r*r+i*i),l:e,alpha:t.a}},reverse:function(t){const e=t.h*rr,r=t.c;return ur({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return {h:cr(t.h,e.h,r),c:Qe(t.c,e.c,r),l:Qe(t.l,e.l,r),alpha:Qe(t.alpha,e.alpha,r)}}};var dr=Object.freeze({__proto__:null,lab:hr,hcl:pr});class fr{constructor(t,e,r,i,n){this.type=t,this.operator=e,this.interpolation=r,this.input=i,this.labels=[],this.outputs=[];for(const[t,e]of n)this.labels.push(t),this.outputs.push(e);}static interpolationFactor(t,e,i,n){let s=0;if("exponential"===t.name)s=yr(e,t.base,i,n);else if("linear"===t.name)s=yr(e,1,i,n);else if("cubic-bezier"===t.name){const a=t.controlPoints;s=new r(a[0],a[1],a[2],a[3]).solve(yr(e,1,i,n));}return s}static parse(t,e){let[r,i,n,...s]=t;if(!Array.isArray(i)||0===i.length)return e.error("Expected an interpolation type expression.",1);if("linear"===i[0])i={name:"linear"};else if("exponential"===i[0]){const t=i[1];if("number"!=typeof t)return e.error("Exponential interpolation requires a numeric base.",1,1);i={name:"exponential",base:t};}else {if("cubic-bezier"!==i[0])return e.error(`Unknown interpolation type ${String(i[0])}`,1,0);{const t=i.slice(1);if(4!==t.length||t.some(t=>"number"!=typeof t||t<0||t>1))return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);i={name:"cubic-bezier",controlPoints:t};}}if(t.length-1<4)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(n=e.parse(n,2,Xt),!n)return null;const a=[];let o=null;"interpolate-hcl"===r||"interpolate-lab"===r?o=Jt:e.expectedType&&"value"!==e.expectedType.kind&&(o=e.expectedType);for(let t=0;t=r)return e.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',n);const u=e.parse(i,l,o);if(!u)return null;o=o||u.type,a.push([r,u]);}return "number"===o.kind||"color"===o.kind||"array"===o.kind&&"number"===o.itemType.kind&&"number"==typeof o.N?new fr(o,r,i,n,a):e.error(`Type ${ie(o)} is not interpolatable.`)}evaluate(t){const e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);const i=this.input.evaluate(t);if(i<=e[0])return r[0].evaluate(t);const n=e.length;if(i>=e[n-1])return r[n-1].evaluate(t);const s=Ye(e,i),a=fr.interpolationFactor(this.interpolation,i,e[s],e[s+1]),o=r[s].evaluate(t),l=r[s+1].evaluate(t);return "interpolate"===this.operator?tr[this.type.kind.toLowerCase()](o,l,a):"interpolate-hcl"===this.operator?pr.reverse(pr.interpolate(pr.forward(o),pr.forward(l),a)):hr.reverse(hr.interpolate(hr.forward(o),hr.forward(l),a))}eachChild(t){t(this.input);for(const e of this.outputs)t(e);}outputDefined(){return this.outputs.every(t=>t.outputDefined())}serialize(){let t;t="linear"===this.interpolation.name?["linear"]:"exponential"===this.interpolation.name?1===this.interpolation.base?["linear"]:["exponential",this.interpolation.base]:["cubic-bezier"].concat(this.interpolation.controlPoints);const e=[this.operator,t,this.input.serialize()];for(let t=0;tse(i,t.type));return new mr(s?Wt:r,n)}evaluate(t){let e,r=null,i=0;for(const n of this.args)if(i++,r=n.evaluate(t),r&&r instanceof de&&!r.available&&(e||(e=r.name),r=null,i===this.args.length&&(r=e)),null!==r)break;return r}eachChild(t){this.args.forEach(t);}outputDefined(){return this.args.every(t=>t.outputDefined())}serialize(){const t=["coalesce"];return this.eachChild(e=>{t.push(e.serialize());}),t}}class gr{constructor(t,e){this.type=e.type,this.bindings=[].concat(t),this.result=e;}evaluate(t){return this.result.evaluate(t)}eachChild(t){for(const e of this.bindings)t(e[1]);t(this.result);}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found ${t.length-1} instead.`);const r=[];for(let i=1;i=r.length)throw new ve(`Array index out of bounds: ${e} > ${r.length-1}.`);if(e!==Math.floor(e))throw new ve(`Array index must be an integer, but found ${e} instead.`);return r[e]}eachChild(t){t(this.index),t(this.input);}outputDefined(){return !1}serialize(){return ["at",this.index.serialize(),this.input.serialize()]}}class vr{constructor(t,e){this.type=Ht,this.needle=t,this.haystack=e;}static parse(t,e){if(3!==t.length)return e.error(`Expected 2 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,Wt),i=e.parse(t[2],2,Wt);return r&&i?ae(r.type,[Ht,Gt,Xt,Zt,Wt])?new vr(r,i):e.error(`Expected first argument to be of type boolean, string, number or null, but found ${ie(r.type)} instead`):null}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return !1;if(!oe(e,["boolean","string","number","null"]))throw new ve(`Expected first argument to be of type boolean, string, number or null, but found ${ie(me(e))} instead.`);if(!oe(r,["string","array"]))throw new ve(`Expected second argument to be of type array or string, but found ${ie(me(r))} instead.`);return r.indexOf(e)>=0}eachChild(t){t(this.needle),t(this.haystack);}outputDefined(){return !0}serialize(){return ["in",this.needle.serialize(),this.haystack.serialize()]}}class br{constructor(t,e,r){this.type=Xt,this.needle=t,this.haystack=e,this.fromIndex=r;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,Wt),i=e.parse(t[2],2,Wt);if(!r||!i)return null;if(!ae(r.type,[Ht,Gt,Xt,Zt,Wt]))return e.error(`Expected first argument to be of type boolean, string, number or null, but found ${ie(r.type)} instead`);if(4===t.length){const n=e.parse(t[3],3,Xt);return n?new br(r,i,n):null}return new br(r,i)}evaluate(t){const e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!oe(e,["boolean","string","number","null"]))throw new ve(`Expected first argument to be of type boolean, string, number or null, but found ${ie(me(e))} instead.`);if(!oe(r,["string","array"]))throw new ve(`Expected second argument to be of type array or string, but found ${ie(me(r))} instead.`);if(this.fromIndex){const i=this.fromIndex.evaluate(t);return r.indexOf(e,i)}return r.indexOf(e)}eachChild(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex);}outputDefined(){return !1}serialize(){if(null!=this.fromIndex&&void 0!==this.fromIndex){const t=this.fromIndex.serialize();return ["index-of",this.needle.serialize(),this.haystack.serialize(),t]}return ["index-of",this.needle.serialize(),this.haystack.serialize()]}}class wr{constructor(t,e,r,i,n,s){this.inputType=t,this.type=e,this.input=r,this.cases=i,this.outputs=n,this.otherwise=s;}static parse(t,e){if(t.length<5)return e.error(`Expected at least 4 arguments, but found only ${t.length-1}.`);if(t.length%2!=1)return e.error("Expected an even number of arguments.");let r,i;e.expectedType&&"value"!==e.expectedType.kind&&(i=e.expectedType);const n={},s=[];for(let a=2;aNumber.MAX_SAFE_INTEGER)return u.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);if("number"==typeof t&&Math.floor(t)!==t)return u.error("Numeric branch labels must be integer values.");if(r){if(u.checkSubtype(r,me(t)))return null}else r=me(t);if(void 0!==n[String(t)])return u.error("Branch labels must be unique.");n[String(t)]=s.length;}const c=e.parse(l,a,i);if(!c)return null;i=i||c.type,s.push(c);}const a=e.parse(t[1],1,Wt);if(!a)return null;const o=e.parse(t[t.length-1],t.length-1,i);return o?"value"!==a.type.kind&&e.concat(1).checkSubtype(r,a.type)?null:new wr(r,i,a,n,s,o):null}evaluate(t){const e=this.input.evaluate(t);return (me(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)}eachChild(t){t(this.input),this.outputs.forEach(t),t(this.otherwise);}outputDefined(){return this.outputs.every(t=>t.outputDefined())&&this.otherwise.outputDefined()}serialize(){const t=["match",this.input.serialize()],e=Object.keys(this.cases).sort(),r=[],i={};for(const t of e){const e=i[this.cases[t]];void 0===e?(i[this.cases[t]]=r.length,r.push([this.cases[t],[t]])):r[e][1].push(t);}const n=t=>"number"===this.inputType.kind?Number(t):t;for(const[e,i]of r)t.push(1===i.length?n(i[0]):i.map(n)),t.push(this.outputs[e].serialize());return t.push(this.otherwise.serialize()),t}}class _r{constructor(t,e,r){this.type=t,this.branches=e,this.otherwise=r;}static parse(t,e){if(t.length<4)return e.error(`Expected at least 3 arguments, but found only ${t.length-1}.`);if(t.length%2!=0)return e.error("Expected an odd number of arguments.");let r;e.expectedType&&"value"!==e.expectedType.kind&&(r=e.expectedType);const i=[];for(let n=1;ne.outputDefined())&&this.otherwise.outputDefined()}serialize(){const t=["case"];return this.eachChild(e=>{t.push(e.serialize());}),t}}class Ar{constructor(t,e,r,i){this.type=t,this.input=e,this.beginIndex=r,this.endIndex=i;}static parse(t,e){if(t.length<=2||t.length>=5)return e.error(`Expected 3 or 4 arguments, but found ${t.length-1} instead.`);const r=e.parse(t[1],1,Wt),i=e.parse(t[2],2,Xt);if(!r||!i)return null;if(!ae(r.type,[re(Wt),Gt,Wt]))return e.error(`Expected first argument to be of type array or string, but found ${ie(r.type)} instead`);if(4===t.length){const n=e.parse(t[3],3,Xt);return n?new Ar(r.type,r,i,n):null}return new Ar(r.type,r,i)}evaluate(t){const e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!oe(e,["string","array"]))throw new ve(`Expected first argument to be of type array or string, but found ${ie(me(e))} instead.`);if(this.endIndex){const i=this.endIndex.evaluate(t);return e.slice(r,i)}return e.slice(r)}eachChild(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex);}outputDefined(){return !1}serialize(){if(null!=this.endIndex&&void 0!==this.endIndex){const t=this.endIndex.serialize();return ["slice",this.input.serialize(),this.beginIndex.serialize(),t]}return ["slice",this.input.serialize(),this.beginIndex.serialize()]}}function kr(t,e){return "=="===t||"!="===t?"boolean"===e.kind||"string"===e.kind||"number"===e.kind||"null"===e.kind||"value"===e.kind:"string"===e.kind||"number"===e.kind||"value"===e.kind}function Sr(t,e,r,i){return 0===i.compare(e,r)}function Ir(t,e,r){const i="=="!==t&&"!="!==t;return class n{constructor(t,e,r){this.type=Ht,this.lhs=t,this.rhs=e,this.collator=r,this.hasUntypedArgument="value"===t.type.kind||"value"===e.type.kind;}static parse(t,e){if(3!==t.length&&4!==t.length)return e.error("Expected two or three arguments.");const r=t[0];let s=e.parse(t[1],1,Wt);if(!s)return null;if(!kr(r,s.type))return e.concat(1).error(`"${r}" comparisons are not supported for type '${ie(s.type)}'.`);let a=e.parse(t[2],2,Wt);if(!a)return null;if(!kr(r,a.type))return e.concat(2).error(`"${r}" comparisons are not supported for type '${ie(a.type)}'.`);if(s.type.kind!==a.type.kind&&"value"!==s.type.kind&&"value"!==a.type.kind)return e.error(`Cannot compare types '${ie(s.type)}' and '${ie(a.type)}'.`);i&&("value"===s.type.kind&&"value"!==a.type.kind?s=new we(a.type,[s]):"value"!==s.type.kind&&"value"===a.type.kind&&(a=new we(s.type,[a])));let o=null;if(4===t.length){if("string"!==s.type.kind&&"string"!==a.type.kind&&"value"!==s.type.kind&&"value"!==a.type.kind)return e.error("Cannot use collator to compare non-string types.");if(o=e.parse(t[3],3,Qt),!o)return null}return new n(s,a,o)}evaluate(n){const s=this.lhs.evaluate(n),a=this.rhs.evaluate(n);if(i&&this.hasUntypedArgument){const e=me(s),r=me(a);if(e.kind!==r.kind||"string"!==e.kind&&"number"!==e.kind)throw new ve(`Expected arguments for "${t}" to be (string, string) or (number, number), but found (${e.kind}, ${r.kind}) instead.`)}if(this.collator&&!i&&this.hasUntypedArgument){const t=me(s),r=me(a);if("string"!==t.kind||"string"!==r.kind)return e(n,s,a)}return this.collator?r(n,s,a,this.collator.evaluate(n)):e(n,s,a)}eachChild(t){t(this.lhs),t(this.rhs),this.collator&&t(this.collator);}outputDefined(){return !0}serialize(){const e=[t];return this.eachChild(t=>{e.push(t.serialize());}),e}}}const Tr=Ir("==",(function(t,e,r){return e===r}),Sr),zr=Ir("!=",(function(t,e,r){return e!==r}),(function(t,e,r,i){return !Sr(0,e,r,i)})),Er=Ir("<",(function(t,e,r){return e",(function(t,e,r){return e>r}),(function(t,e,r,i){return i.compare(e,r)>0})),Mr=Ir("<=",(function(t,e,r){return e<=r}),(function(t,e,r,i){return i.compare(e,r)<=0}));class Br{constructor(t,e,r,i,n){this.type=Gt,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=i,this.maxFractionDigits=n;}static parse(t,e){if(3!==t.length)return e.error("Expected two arguments.");const r=e.parse(t[1],1,Xt);if(!r)return null;const i=t[2];if("object"!=typeof i||Array.isArray(i))return e.error("NumberFormat options argument must be an object.");let n=null;if(i.locale&&(n=e.parse(i.locale,1,Gt),!n))return null;let s=null;if(i.currency&&(s=e.parse(i.currency,1,Gt),!s))return null;let a=null;if(i["min-fraction-digits"]&&(a=e.parse(i["min-fraction-digits"],1,Xt),!a))return null;let o=null;return i["max-fraction-digits"]&&(o=e.parse(i["max-fraction-digits"],1,Xt),!o)?null:new Br(r,n,s,a,o)}evaluate(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))}eachChild(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits);}outputDefined(){return !1}serialize(){const t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.minFractionDigits&&(t["min-fraction-digits"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t["max-fraction-digits"]=this.maxFractionDigits.serialize()),["number-format",this.number.serialize(),t]}}class Dr{constructor(t){this.type=Xt,this.input=t;}static parse(t,e){if(2!==t.length)return e.error(`Expected 1 argument, but found ${t.length-1} instead.`);const r=e.parse(t[1],1);return r?"array"!==r.type.kind&&"string"!==r.type.kind&&"value"!==r.type.kind?e.error(`Expected argument of type string or array, but found ${ie(r.type)} instead.`):new Dr(r):null}evaluate(t){const e=this.input.evaluate(t);if("string"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new ve(`Expected value to be of type string or array, but found ${ie(me(e))} instead.`)}eachChild(t){t(this.input);}outputDefined(){return !1}serialize(){const t=["length"];return this.eachChild(e=>{t.push(e.serialize());}),t}}const Pr={"==":Tr,"!=":zr,">":Cr,"<":Er,">=":Ir(">=",(function(t,e,r){return e>=r}),(function(t,e,r,i){return i.compare(e,r)>=0})),"<=":Mr,array:we,at:xr,boolean:we,case:_r,coalesce:mr,collator:Ee,format:_e,image:Ae,in:vr,"index-of":br,interpolate:fr,"interpolate-hcl":fr,"interpolate-lab":fr,length:Dr,let:gr,literal:xe,match:wr,number:we,"number-format":Br,object:we,slice:Ar,step:We,string:we,"to-boolean":Se,"to-color":Se,"to-number":Se,"to-string":Se,var:He,within:Ke};function Vr(t,[e,r,i,n]){e=e.evaluate(t),r=r.evaluate(t),i=i.evaluate(t);const s=n?n.evaluate(t):1,a=fe(e,r,i,s);if(a)throw new ve(a);return new ue(e/255*s,r/255*s,i/255*s,s)}function Fr(t,e){return t in e}function Rr(t,e){const r=e[t];return void 0===r?null:r}function Lr(t){return {type:t}}function Ur(t){return {result:"success",value:t}}function Or(t){return {result:"error",value:t}}function $r(t){return "data-driven"===t["property-type"]||"cross-faded-data-driven"===t["property-type"]}function qr(t){return !!t.expression&&t.expression.parameters.indexOf("zoom")>-1}function Nr(t){return !!t.expression&&t.expression.interpolated}function jr(t){return t instanceof Number?"number":t instanceof String?"string":t instanceof Boolean?"boolean":Array.isArray(t)?"array":null===t?"null":typeof t}function Kr(t){return "object"==typeof t&&null!==t&&!Array.isArray(t)}function Zr(t){return t}function Xr(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function Gr(t,e,r,i,n){return Xr(typeof r===n?i[r]:void 0,t.default,e.default)}function Hr(t,e,r){if("number"!==jr(r))return Xr(t.default,e.default);const i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];const n=Ye(t.stops.map(t=>t[0]),r);return t.stops[n][1]}function Jr(t,e,r){const i=void 0!==t.base?t.base:1;if("number"!==jr(r))return Xr(t.default,e.default);const n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];const s=Ye(t.stops.map(t=>t[0]),r),a=function(t,e,r,i){const n=i-r,s=t-r;return 0===n?0:1===e?s/n:(Math.pow(e,s)-1)/(Math.pow(e,n)-1)}(r,i,t.stops[s][0],t.stops[s+1][0]),o=t.stops[s][1],l=t.stops[s+1][1];let u=tr[e.type]||Zr;if(t.colorSpace&&"rgb"!==t.colorSpace){const e=dr[t.colorSpace];u=(t,r)=>e.reverse(e.interpolate(e.forward(t),e.forward(r),a));}return "function"==typeof o.evaluate?{evaluate(...t){const e=o.evaluate.apply(void 0,t),r=l.evaluate.apply(void 0,t);if(void 0!==e&&void 0!==r)return u(e,r,a)}}:u(o,l,a)}function Yr(t,e,r){return "color"===e.type?r=ue.parse(r):"formatted"===e.type?r=pe.fromString(r.toString()):"resolvedImage"===e.type?r=de.fromString(r.toString()):jr(r)===e.type||"enum"===e.type&&e.values[r]||(r=void 0),Xr(r,t.default,e.default)}ze.register(Pr,{error:[{kind:"error"},[Gt],(t,[e])=>{throw new ve(e.evaluate(t))}],typeof:[Gt,[Wt],(t,[e])=>ie(me(e.evaluate(t)))],"to-rgba":[re(Xt,4),[Jt],(t,[e])=>e.evaluate(t).toArray()],rgb:[Jt,[Xt,Xt,Xt],Vr],rgba:[Jt,[Xt,Xt,Xt,Xt],Vr],has:{type:Ht,overloads:[[[Gt],(t,[e])=>Fr(e.evaluate(t),t.properties())],[[Gt,Yt],(t,[e,r])=>Fr(e.evaluate(t),r.evaluate(t))]]},get:{type:Wt,overloads:[[[Gt],(t,[e])=>Rr(e.evaluate(t),t.properties())],[[Gt,Yt],(t,[e,r])=>Rr(e.evaluate(t),r.evaluate(t))]]},"feature-state":[Wt,[Gt],(t,[e])=>Rr(e.evaluate(t),t.featureState||{})],properties:[Yt,[],t=>t.properties()],"geometry-type":[Gt,[],t=>t.geometryType()],id:[Wt,[],t=>t.id()],zoom:[Xt,[],t=>t.globals.zoom],"heatmap-density":[Xt,[],t=>t.globals.heatmapDensity||0],"line-progress":[Xt,[],t=>t.globals.lineProgress||0],"sky-radial-progress":[Xt,[],t=>t.globals.skyRadialProgress||0],accumulated:[Wt,[],t=>void 0===t.globals.accumulated?null:t.globals.accumulated],"+":[Xt,Lr(Xt),(t,e)=>{let r=0;for(const i of e)r+=i.evaluate(t);return r}],"*":[Xt,Lr(Xt),(t,e)=>{let r=1;for(const i of e)r*=i.evaluate(t);return r}],"-":{type:Xt,overloads:[[[Xt,Xt],(t,[e,r])=>e.evaluate(t)-r.evaluate(t)],[[Xt],(t,[e])=>-e.evaluate(t)]]},"/":[Xt,[Xt,Xt],(t,[e,r])=>e.evaluate(t)/r.evaluate(t)],"%":[Xt,[Xt,Xt],(t,[e,r])=>e.evaluate(t)%r.evaluate(t)],ln2:[Xt,[],()=>Math.LN2],pi:[Xt,[],()=>Math.PI],e:[Xt,[],()=>Math.E],"^":[Xt,[Xt,Xt],(t,[e,r])=>Math.pow(e.evaluate(t),r.evaluate(t))],sqrt:[Xt,[Xt],(t,[e])=>Math.sqrt(e.evaluate(t))],log10:[Xt,[Xt],(t,[e])=>Math.log(e.evaluate(t))/Math.LN10],ln:[Xt,[Xt],(t,[e])=>Math.log(e.evaluate(t))],log2:[Xt,[Xt],(t,[e])=>Math.log(e.evaluate(t))/Math.LN2],sin:[Xt,[Xt],(t,[e])=>Math.sin(e.evaluate(t))],cos:[Xt,[Xt],(t,[e])=>Math.cos(e.evaluate(t))],tan:[Xt,[Xt],(t,[e])=>Math.tan(e.evaluate(t))],asin:[Xt,[Xt],(t,[e])=>Math.asin(e.evaluate(t))],acos:[Xt,[Xt],(t,[e])=>Math.acos(e.evaluate(t))],atan:[Xt,[Xt],(t,[e])=>Math.atan(e.evaluate(t))],min:[Xt,Lr(Xt),(t,e)=>Math.min(...e.map(e=>e.evaluate(t)))],max:[Xt,Lr(Xt),(t,e)=>Math.max(...e.map(e=>e.evaluate(t)))],abs:[Xt,[Xt],(t,[e])=>Math.abs(e.evaluate(t))],round:[Xt,[Xt],(t,[e])=>{const r=e.evaluate(t);return r<0?-Math.round(-r):Math.round(r)}],floor:[Xt,[Xt],(t,[e])=>Math.floor(e.evaluate(t))],ceil:[Xt,[Xt],(t,[e])=>Math.ceil(e.evaluate(t))],"filter-==":[Ht,[Gt,Wt],(t,[e,r])=>t.properties()[e.value]===r.value],"filter-id-==":[Ht,[Wt],(t,[e])=>t.id()===e.value],"filter-type-==":[Ht,[Gt],(t,[e])=>t.geometryType()===e.value],"filter-<":[Ht,[Gt,Wt],(t,[e,r])=>{const i=t.properties()[e.value],n=r.value;return typeof i==typeof n&&i{const r=t.id(),i=e.value;return typeof r==typeof i&&r":[Ht,[Gt,Wt],(t,[e,r])=>{const i=t.properties()[e.value],n=r.value;return typeof i==typeof n&&i>n}],"filter-id->":[Ht,[Wt],(t,[e])=>{const r=t.id(),i=e.value;return typeof r==typeof i&&r>i}],"filter-<=":[Ht,[Gt,Wt],(t,[e,r])=>{const i=t.properties()[e.value],n=r.value;return typeof i==typeof n&&i<=n}],"filter-id-<=":[Ht,[Wt],(t,[e])=>{const r=t.id(),i=e.value;return typeof r==typeof i&&r<=i}],"filter->=":[Ht,[Gt,Wt],(t,[e,r])=>{const i=t.properties()[e.value],n=r.value;return typeof i==typeof n&&i>=n}],"filter-id->=":[Ht,[Wt],(t,[e])=>{const r=t.id(),i=e.value;return typeof r==typeof i&&r>=i}],"filter-has":[Ht,[Wt],(t,[e])=>e.value in t.properties()],"filter-has-id":[Ht,[],t=>null!==t.id()&&void 0!==t.id()],"filter-type-in":[Ht,[re(Gt)],(t,[e])=>e.value.indexOf(t.geometryType())>=0],"filter-id-in":[Ht,[re(Wt)],(t,[e])=>e.value.indexOf(t.id())>=0],"filter-in-small":[Ht,[Gt,re(Wt)],(t,[e,r])=>r.value.indexOf(t.properties()[e.value])>=0],"filter-in-large":[Ht,[Gt,re(Wt)],(t,[e,r])=>function(t,e,r,i){for(;r<=i;){const n=r+i>>1;if(e[n]===t)return !0;e[n]>t?i=n-1:r=n+1;}return !1}(t.properties()[e.value],r.value,0,r.value.length-1)],all:{type:Ht,overloads:[[[Ht,Ht],(t,[e,r])=>e.evaluate(t)&&r.evaluate(t)],[Lr(Ht),(t,e)=>{for(const r of e)if(!r.evaluate(t))return !1;return !0}]]},any:{type:Ht,overloads:[[[Ht,Ht],(t,[e,r])=>e.evaluate(t)||r.evaluate(t)],[Lr(Ht),(t,e)=>{for(const r of e)if(r.evaluate(t))return !0;return !1}]]},"!":[Ht,[Ht],(t,[e])=>!e.evaluate(t)],"is-supported-script":[Ht,[Gt],(t,[e])=>{const r=t.globals&&t.globals.isSupportedScript;return !r||r(e.evaluate(t))}],upcase:[Gt,[Gt],(t,[e])=>e.evaluate(t).toUpperCase()],downcase:[Gt,[Gt],(t,[e])=>e.evaluate(t).toLowerCase()],concat:[Gt,Lr(Wt),(t,e)=>e.map(e=>ge(e.evaluate(t))).join("")],"resolved-locale":[Gt,[Qt],(t,[e])=>e.evaluate(t).resolvedLocale()]});class Wr{constructor(t,e){this.expression=t,this._warningHistory={},this._evaluator=new Te,this._defaultValue=e?function(t){return "color"===t.type&&Kr(t.default)?new ue(0,0,0,0):"color"===t.type?ue.parse(t.default)||null:void 0===t.default?null:t.default}(e):null,this._enumValues=e&&"enum"===e.type?e.values:null;}evaluateWithoutErrorHandling(t,e,r,i,n,s){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=i,this._evaluator.availableImages=n||null,this._evaluator.formattedSection=s,this.expression.evaluate(this._evaluator)}evaluate(t,e,r,i,n,s){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=i,this._evaluator.availableImages=n||null,this._evaluator.formattedSection=s||null;try{const t=this.expression.evaluate(this._evaluator);if(null==t||"number"==typeof t&&t!=t)return this._defaultValue;if(this._enumValues&&!(t in this._enumValues))throw new ve(`Expected value to be one of ${Object.keys(this._enumValues).map(t=>JSON.stringify(t)).join(", ")}, but found ${JSON.stringify(t)} instead.`);return t}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,"undefined"!=typeof console&&console.warn(t.message)),this._defaultValue}}}function Qr(t){return Array.isArray(t)&&t.length>0&&"string"==typeof t[0]&&t[0]in Pr}function ti(t,e){const r=new Je(Pr,[],e?function(t){const e={color:Jt,string:Gt,number:Xt,enum:Gt,boolean:Ht,formatted:te,resolvedImage:ee};return "array"===t.type?re(e[t.value]||Wt,t.length):e[t.type]}(e):void 0),i=r.parse(t,void 0,void 0,void 0,e&&"string"===e.type?{typeAnnotation:"coerce"}:void 0);return i?Ur(new Wr(i,e)):Or(r.errors)}class ei{constructor(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent="constant"!==t&&!Xe(e.expression);}evaluateWithoutErrorHandling(t,e,r,i,n,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,i,n,s)}evaluate(t,e,r,i,n,s){return this._styleExpression.evaluate(t,e,r,i,n,s)}}class ri{constructor(t,e,r,i){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent="camera"!==t&&!Xe(e.expression),this.interpolationType=i;}evaluateWithoutErrorHandling(t,e,r,i,n,s){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,i,n,s)}evaluate(t,e,r,i,n,s){return this._styleExpression.evaluate(t,e,r,i,n,s)}interpolationFactor(t,e,r){return this.interpolationType?fr.interpolationFactor(this.interpolationType,t,e,r):0}}function ii(t,e){if("error"===(t=ti(t,e)).result)return t;const r=t.value.expression,i=Ze(r);if(!i&&!$r(e))return Or([new jt("","data expressions not supported")]);const n=Ge(r,["zoom"]);if(!n&&!qr(e))return Or([new jt("","zoom expressions not supported")]);const s=function t(e){let r=null;if(e instanceof gr)r=t(e.result);else if(e instanceof mr){for(const i of e.args)if(r=t(i),r)break}else (e instanceof We||e instanceof fr)&&e.input instanceof ze&&"zoom"===e.input.name&&(r=e);return r instanceof jt||e.eachChild(e=>{const i=t(e);i instanceof jt?r=i:!r&&i?r=new jt("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'):r&&i&&r!==i&&(r=new jt("",'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'));}),r}(r);return s||n?s instanceof jt?Or([s]):s instanceof fr&&!Nr(e)?Or([new jt("",'"interpolate" expressions cannot be used with this property')]):Ur(s?new ri(i?"camera":"composite",t.value,s.labels,s instanceof fr?s.interpolation:void 0):new ei(i?"constant":"source",t.value)):Or([new jt("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')])}class ni{constructor(t,e){this._parameters=t,this._specification=e,$t(this,function t(e,r){const i="color"===r.type,n=e.stops&&"object"==typeof e.stops[0][0],s=n||!(n||void 0!==e.property),a=e.type||(Nr(r)?"exponential":"interval");if(i&&((e=$t({},e)).stops&&(e.stops=e.stops.map(t=>[t[0],ue.parse(t[1])])),e.default=ue.parse(e.default?e.default:r.default)),e.colorSpace&&"rgb"!==e.colorSpace&&!dr[e.colorSpace])throw new Error(`Unknown color space: ${e.colorSpace}`);let o,l,u;if("exponential"===a)o=Jr;else if("interval"===a)o=Hr;else if("categorical"===a){o=Gr,l=Object.create(null);for(const t of e.stops)l[t[0]]=t[1];u=typeof e.stops[0][0];}else {if("identity"!==a)throw new Error(`Unknown function type "${a}"`);o=Yr;}if(n){const i={},n=[];for(let t=0;tt[0]),evaluate:({zoom:t},i)=>Jr({stops:s,base:e.base},r,t).evaluate(t,i)}}if(s){const t="exponential"===a?{name:"exponential",base:void 0!==e.base?e.base:1}:null;return {kind:"camera",interpolationType:t,interpolationFactor:fr.interpolationFactor.bind(void 0,t),zoomStops:e.stops.map(t=>t[0]),evaluate:({zoom:t})=>o(e,r,t,l,u)}}return {kind:"source",evaluate(t,i){const n=i&&i.properties?i.properties[e.property]:void 0;return void 0===n?Xr(e.default,r.default):o(e,r,n,l,u)}}}(this._parameters,this._specification));}static deserialize(t){return new ni(t._parameters,t._specification)}static serialize(t){return {_parameters:t._parameters,_specification:t._specification}}}function si(t){const e=t.key,r=t.value,i=t.valueSpec||{},n=t.objectElementValidators||{},s=t.style,a=t.styleSpec;let o=[];const l=jr(r);if("object"!==l)return [new Ut(e,r,`object expected, ${l} found`)];for(const t in r){const l=t.split(".")[0],u=i[l]||i["*"];let c;if(n[l])c=n[l];else if(i[l])c=Mi;else if(n["*"])c=n["*"];else {if(!i["*"]){o.push(new Ut(e,r[t],`unknown property "${t}"`));continue}c=Mi;}o=o.concat(c({key:(e?`${e}.`:e)+t,value:r[t],valueSpec:u,style:s,styleSpec:a,object:r,objectKey:t},r));}for(const t in i)n[t]||i[t].required&&void 0===i[t].default&&void 0===r[t]&&o.push(new Ut(e,r,`missing required property "${t}"`));return o}function ai(t){const e=t.value,r=t.valueSpec,i=t.style,n=t.styleSpec,s=t.key,a=t.arrayElementValidator||Mi;if("array"!==jr(e))return [new Ut(s,e,`array expected, ${jr(e)} found`)];if(r.length&&e.length!==r.length)return [new Ut(s,e,`array length ${r.length} expected, length ${e.length} found`)];if(r["min-length"]&&e.lengthi.maximum?[new Ut(e,r,`${r} is greater than the maximum value ${i.maximum}`)]:[]}function li(t){const e=t.valueSpec,r=qt(t.value.type);let i,n,s,a={};const o="categorical"!==r&&void 0===t.value.property,l=!o,u="array"===jr(t.value.stops)&&"array"===jr(t.value.stops[0])&&"object"===jr(t.value.stops[0][0]),c=si({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if("identity"===r)return [new Ut(t.key,t.value,'identity function may not have a "stops" property')];let e=[];const i=t.value;return e=e.concat(ai({key:t.key,value:i,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),"array"===jr(i)&&0===i.length&&e.push(new Ut(t.key,i,"array must have at least one stop")),e},default:function(t){return Mi({key:t.key,value:t.value,valueSpec:e,style:t.style,styleSpec:t.styleSpec})}}});return "identity"===r&&o&&c.push(new Ut(t.key,t.value,'missing required property "property"')),"identity"===r||t.value.stops||c.push(new Ut(t.key,t.value,'missing required property "stops"')),"exponential"===r&&t.valueSpec.expression&&!Nr(t.valueSpec)&&c.push(new Ut(t.key,t.value,"exponential functions not supported")),t.styleSpec.$version>=8&&(l&&!$r(t.valueSpec)?c.push(new Ut(t.key,t.value,"property functions not supported")):o&&!qr(t.valueSpec)&&c.push(new Ut(t.key,t.value,"zoom functions not supported"))),"categorical"!==r&&!u||void 0!==t.value.property||c.push(new Ut(t.key,t.value,'"property" property is required')),c;function h(t){let r=[];const i=t.value,o=t.key;if("array"!==jr(i))return [new Ut(o,i,`array expected, ${jr(i)} found`)];if(2!==i.length)return [new Ut(o,i,`array length 2 expected, length ${i.length} found`)];if(u){if("object"!==jr(i[0]))return [new Ut(o,i,`object expected, ${jr(i[0])} found`)];if(void 0===i[0].zoom)return [new Ut(o,i,"object stop key must have zoom")];if(void 0===i[0].value)return [new Ut(o,i,"object stop key must have value")];if(s&&s>qt(i[0].zoom))return [new Ut(o,i[0].zoom,"stop zoom values must appear in ascending order")];qt(i[0].zoom)!==s&&(s=qt(i[0].zoom),n=void 0,a={}),r=r.concat(si({key:`${o}[0]`,value:i[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:oi,value:p}}));}else r=r.concat(p({key:`${o}[0]`,value:i[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},i));return Qr(Nt(i[1]))?r.concat([new Ut(`${o}[1]`,i[1],"expressions are not allowed in function stops.")]):r.concat(Mi({key:`${o}[1]`,value:i[1],valueSpec:e,style:t.style,styleSpec:t.styleSpec}))}function p(t,s){const o=jr(t.value),l=qt(t.value),u=null!==t.value?t.value:s;if(i){if(o!==i)return [new Ut(t.key,u,`${o} stop domain type must match previous stop domain type ${i}`)]}else i=o;if("number"!==o&&"string"!==o&&"boolean"!==o)return [new Ut(t.key,u,"stop domain value must be a number, string, or boolean")];if("number"!==o&&"categorical"!==r){let i=`number expected, ${o} found`;return $r(e)&&void 0===r&&(i+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new Ut(t.key,u,i)]}return "categorical"!==r||"number"!==o||isFinite(l)&&Math.floor(l)===l?"categorical"!==r&&"number"===o&&void 0!==n&&lnew Ut(`${t.key}${e.key}`,t.value,e.message));const r=e.value.expression||e.value._styleExpression.expression;if("property"===t.expressionContext&&"text-font"===t.propertyKey&&!r.outputDefined())return [new Ut(t.key,t.value,`Invalid data expression for "${t.propertyKey}". Output values must be contained as literals within the expression.`)];if("property"===t.expressionContext&&"layout"===t.propertyType&&!Xe(r))return [new Ut(t.key,t.value,'"feature-state" data expressions are not supported with layout properties.')];if("filter"===t.expressionContext&&!Xe(r))return [new Ut(t.key,t.value,'"feature-state" data expressions are not supported with filters.')];if(t.expressionContext&&0===t.expressionContext.indexOf("cluster")){if(!Ge(r,["zoom","feature-state"]))return [new Ut(t.key,t.value,'"zoom" and "feature-state" expressions are not supported with cluster properties.')];if("cluster-initial"===t.expressionContext&&!Ze(r))return [new Ut(t.key,t.value,"Feature data expressions are not supported with initial expression part of cluster properties.")]}return []}function ci(t){const e=t.key,r=t.value,i=t.valueSpec,n=[];return Array.isArray(i.values)?-1===i.values.indexOf(qt(r))&&n.push(new Ut(e,r,`expected one of [${i.values.join(", ")}], ${JSON.stringify(r)} found`)):-1===Object.keys(i.values).indexOf(qt(r))&&n.push(new Ut(e,r,`expected one of [${Object.keys(i.values).join(", ")}], ${JSON.stringify(r)} found`)),n}function hi(t){if(!0===t||!1===t)return !0;if(!Array.isArray(t)||0===t.length)return !1;switch(t[0]){case"has":return t.length>=2&&"$id"!==t[1]&&"$type"!==t[1];case"in":return t.length>=3&&("string"!=typeof t[1]||Array.isArray(t[2]));case"!in":case"!has":case"none":return !1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case"any":case"all":for(const e of t.slice(1))if(!hi(e)&&"boolean"!=typeof e)return !1;return !0;default:return !0}}const pi={type:"boolean",default:!1,transition:!1,"property-type":"data-driven",expression:{interpolated:!1,parameters:["zoom","feature"]}};function di(t){if(null==t)return {filter:()=>!0,needGeometry:!1};hi(t)||(t=yi(t));const e=ti(t,pi);if("error"===e.result)throw new Error(e.value.map(t=>`${t.key}: ${t.message}`).join(", "));return {filter:(t,r,i)=>e.value.evaluate(t,r,{},i),needGeometry:function t(e){if(!Array.isArray(e))return !1;if("within"===e[0])return !0;for(let r=1;re?1:0}function yi(t){if(!t)return !0;const e=t[0];return t.length<=1?"any"!==e:"=="===e?mi(t[1],t[2],"=="):"!="===e?vi(mi(t[1],t[2],"==")):"<"===e||">"===e||"<="===e||">="===e?mi(t[1],t[2],e):"any"===e?(r=t.slice(1),["any"].concat(r.map(yi))):"all"===e?["all"].concat(t.slice(1).map(yi)):"none"===e?["all"].concat(t.slice(1).map(yi).map(vi)):"in"===e?gi(t[1],t.slice(2)):"!in"===e?vi(gi(t[1],t.slice(2))):"has"===e?xi(t[1]):"!has"===e?vi(xi(t[1])):"within"!==e||t;var r;}function mi(t,e,r){switch(t){case"$type":return [`filter-type-${r}`,e];case"$id":return [`filter-id-${r}`,e];default:return [`filter-${r}`,t,e]}}function gi(t,e){if(0===e.length)return !1;switch(t){case"$type":return ["filter-type-in",["literal",e]];case"$id":return ["filter-id-in",["literal",e]];default:return e.length>200&&!e.some(t=>typeof t!=typeof e[0])?["filter-in-large",t,["literal",e.sort(fi)]]:["filter-in-small",t,["literal",e]]}}function xi(t){switch(t){case"$type":return !0;case"$id":return ["filter-has-id"];default:return ["filter-has",t]}}function vi(t){return ["!",t]}function bi(t){return hi(Nt(t.value))?ui($t({},t,{expressionContext:"filter",valueSpec:{value:"boolean"}})):function t(e){const r=e.value,i=e.key;if("array"!==jr(r))return [new Ut(i,r,`array expected, ${jr(r)} found`)];const n=e.styleSpec;let s,a=[];if(r.length<1)return [new Ut(i,r,"filter array must have at least 1 element")];switch(a=a.concat(ci({key:`${i}[0]`,value:r[0],valueSpec:n.filter_operator,style:e.style,styleSpec:e.styleSpec})),qt(r[0])){case"<":case"<=":case">":case">=":r.length>=2&&"$type"===qt(r[1])&&a.push(new Ut(i,r,`"$type" cannot be use with operator "${r[0]}"`));case"==":case"!=":3!==r.length&&a.push(new Ut(i,r,`filter array for operator "${r[0]}" must have 3 elements`));case"in":case"!in":r.length>=2&&(s=jr(r[1]),"string"!==s&&a.push(new Ut(`${i}[1]`,r[1],`string expected, ${s} found`)));for(let t=2;t{t in r&&e.push(new Ut(i,r[t],`"${t}" is prohibited for ref layers`));}),n.layers.forEach(e=>{qt(e.id)===o&&(t=e);}),t?t.ref?e.push(new Ut(i,r.ref,"ref cannot reference another ref layer")):a=qt(t.type):e.push(new Ut(i,r.ref,`ref layer "${o}" not found`));}else if("background"!==a&&"sky"!==a)if(r.source){const t=n.sources&&n.sources[r.source],s=t&&qt(t.type);t?"vector"===s&&"raster"===a?e.push(new Ut(i,r.source,`layer "${r.id}" requires a raster source`)):"raster"===s&&"raster"!==a?e.push(new Ut(i,r.source,`layer "${r.id}" requires a vector source`)):"vector"!==s||r["source-layer"]?"raster-dem"===s&&"hillshade"!==a?e.push(new Ut(i,r.source,"raster-dem source can only be used with layer type 'hillshade'.")):"line"!==a||!r.paint||!r.paint["line-gradient"]||"geojson"===s&&t.lineMetrics||e.push(new Ut(i,r,`layer "${r.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`)):e.push(new Ut(i,r,`layer "${r.id}" must specify a "source-layer"`)):e.push(new Ut(i,r.source,`source "${r.source}" not found`));}else e.push(new Ut(i,r,'missing required property "source"'));return e=e.concat(si({key:i,value:r,valueSpec:s.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":()=>[],type:()=>Mi({key:`${i}.type`,value:r.type,valueSpec:s.layer.type,style:t.style,styleSpec:t.styleSpec,object:r,objectKey:"type"}),filter:bi,layout:t=>si({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":t=>Ai($t({layerType:a},t))}}),paint:t=>si({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":t=>_i($t({layerType:a},t))}})}})),e}function Si(t){const e=t.value,r=t.key,i=jr(e);return "string"!==i?[new Ut(r,e,`string expected, ${i} found`)]:[]}const Ii={promoteId:function({key:t,value:e}){if("string"===jr(e))return Si({key:t,value:e});{const r=[];for(const i in e)r.push(...Si({key:`${t}.${i}`,value:e[i]}));return r}}};function Ti(t){const e=t.value,r=t.key,i=t.styleSpec,n=t.style;if(!e.type)return [new Ut(r,e,'"type" is required')];const s=qt(e.type);let a;switch(s){case"vector":case"raster":case"raster-dem":return a=si({key:r,value:e,valueSpec:i[`source_${s.replace("-","_")}`],style:t.style,styleSpec:i,objectElementValidators:Ii}),a;case"geojson":if(a=si({key:r,value:e,valueSpec:i.source_geojson,style:n,styleSpec:i,objectElementValidators:Ii}),e.cluster)for(const t in e.clusterProperties){const[i,n]=e.clusterProperties[t],s="string"==typeof i?[i,["accumulated"],["get",t]]:i;a.push(...ui({key:`${r}.${t}.map`,value:n,expressionContext:"cluster-map"})),a.push(...ui({key:`${r}.${t}.reduce`,value:s,expressionContext:"cluster-reduce"}));}return a;case"video":return si({key:r,value:e,valueSpec:i.source_video,style:n,styleSpec:i});case"image":return si({key:r,value:e,valueSpec:i.source_image,style:n,styleSpec:i});case"canvas":return [new Ut(r,null,"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.","source.canvas")];default:return ci({key:`${r}.type`,value:e.type,valueSpec:{values:["vector","raster","raster-dem","geojson","video","image"]},style:n,styleSpec:i})}}function zi(t){const e=t.value,r=t.styleSpec,i=r.light,n=t.style;let s=[];const a=jr(e);if(void 0===e)return s;if("object"!==a)return s=s.concat([new Ut("light",e,`object expected, ${a} found`)]),s;for(const t in e){const a=t.match(/^(.*)-transition$/);s=s.concat(a&&i[a[1]]&&i[a[1]].transition?Mi({key:t,value:e[t],valueSpec:r.transition,style:n,styleSpec:r}):i[t]?Mi({key:t,value:e[t],valueSpec:i[t],style:n,styleSpec:r}):[new Ut(t,e[t],`unknown property "${t}"`)]);}return s}function Ei(t){const e=t.value,r=t.key,i=t.style,n=t.styleSpec,s=n.terrain;let a=[];const o=jr(e);if(void 0===e)return a;if("object"!==o)return a=a.concat([new Ut("terrain",e,`object expected, ${o} found`)]),a;for(const t in e){const r=t.match(/^(.*)-transition$/);a=a.concat(r&&s[r[1]]&&s[r[1]].transition?Mi({key:t,value:e[t],valueSpec:n.transition,style:i,styleSpec:n}):s[t]?Mi({key:t,value:e[t],valueSpec:s[t],style:i,styleSpec:n}):[new Ut(t,e[t],`unknown property "${t}"`)]);}if(e.source){const t=i.sources&&i.sources[e.source],n=t&&qt(t.type);t?"raster-dem"!==n&&a.push(new Ut(r,e.source,`terrain cannot be used with a source of type ${n}, it only be used with a "raster-dem" source type`)):a.push(new Ut(r,e.source,`source "${e.source}" not found`));}else a.push(new Ut(r,e,'terrain is missing required property "source"'));return a}const Ci={"*":()=>[],array:ai,boolean:function(t){const e=t.value,r=t.key,i=jr(e);return "boolean"!==i?[new Ut(r,e,`boolean expected, ${i} found`)]:[]},number:oi,color:function(t){const e=t.key,r=t.value,i=jr(r);return "string"!==i?[new Ut(e,r,`color expected, ${i} found`)]:null===le(r)?[new Ut(e,r,`color expected, "${r}" found`)]:[]},constants:Ot,enum:ci,filter:bi,function:li,layer:ki,object:si,source:Ti,light:zi,terrain:Ei,string:Si,formatted:function(t){return 0===Si(t).length?[]:ui(t)},resolvedImage:function(t){return 0===Si(t).length?[]:ui(t)}};function Mi(t){const e=t.value,r=t.valueSpec,i=t.styleSpec;return r.expression&&Kr(qt(e))?li(t):r.expression&&Qr(Nt(e))?ui(t):r.type&&Ci[r.type]?Ci[r.type](t):si($t({},t,{valueSpec:r.type?i[r.type]:r}))}function Bi(t){const e=t.value,r=t.key,i=Si(t);return i.length||(-1===e.indexOf("{fontstack}")&&i.push(new Ut(r,e,'"glyphs" url must include a "{fontstack}" token')),-1===e.indexOf("{range}")&&i.push(new Ut(r,e,'"glyphs" url must include a "{range}" token'))),i}function Di(t,e=Lt){let r=[];return r=r.concat(Mi({key:"",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:Bi,"*":()=>[]}})),t.constants&&(r=r.concat(Ot({key:"constants",value:t.constants,style:t,styleSpec:e}))),Pi(r)}function Pi(t){return [].concat(t).sort((t,e)=>t.line-e.line)}function Vi(t){return function(...e){return Pi(t.apply(this,e))}}Di.source=Vi(Ti),Di.light=Vi(zi),Di.terrain=Vi(Ei),Di.layer=Vi(ki),Di.filter=Vi(bi),Di.paintProperty=Vi(_i),Di.layoutProperty=Vi(Ai);const Fi=Di,Ri=Fi.light,Li=Fi.paintProperty,Ui=Fi.layoutProperty;function Oi(t,e){let r=!1;if(e&&e.length)for(const i of e)t.fire(new Ft(new Error(i.message))),r=!0;return r}var $i=qi;function qi(t,e,r){var i=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var n=new Int32Array(this.arrayBuffer);t=n[0],this.d=(e=n[1])+2*(r=n[2]);for(var s=0;s=c[d+0]&&i>=c[d+1])?(a[p]=!0,s.push(u[p])):a[p]=!1;}}},qi.prototype._forEachCell=function(t,e,r,i,n,s,a,o){for(var l=this._convertToCellCoord(t),u=this._convertToCellCoord(e),c=this._convertToCellCoord(r),h=this._convertToCellCoord(i),p=l;p<=c;p++)for(var d=u;d<=h;d++){var f=this.d*d+p;if((!o||o(this._convertFromCellCoord(p),this._convertFromCellCoord(d),this._convertFromCellCoord(p+1),this._convertFromCellCoord(d+1)))&&n.call(this,t,e,r,i,f,s,a,o))return}},qi.prototype._convertFromCellCoord=function(t){return (t-this.padding)/this.scale},qi.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},qi.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=3+this.cells.length+1+1,r=0,i=0;i=0)continue;const s=t[r];n[r]=Ki[i].shallow.indexOf(r)>=0?s:Hi(s,e);}t instanceof Error&&(n.message=t.message);}if(n.$name)throw new Error("$name property is reserved for worker serialization logic.");return "Object"!==i&&(n.$name=i),n}throw new Error(`can't serialize object of type ${typeof t}`)}function Ji(t){if(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||Xi(t)||Gi(t)||ArrayBuffer.isView(t)||t instanceof Ni)return t;if(Array.isArray(t))return t.map(Ji);if("object"==typeof t){const e=t.$name||"Object",{klass:r}=Ki[e];if(!r)throw new Error(`can't deserialize unregistered class ${e}`);if(r.deserialize)return r.deserialize(t);const i=Object.create(r.prototype);for(const r of Object.keys(t)){if("$name"===r)continue;const n=t[r];i[r]=Ki[e].shallow.indexOf(r)>=0?n:Ji(n);}return i}throw new Error(`can't deserialize object of type ${typeof t}`)}class Yi{constructor(){this.first=!0;}update(t,e){const r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoomt>=128&&t<=255,Arabic:t=>t>=1536&&t<=1791,"Arabic Supplement":t=>t>=1872&&t<=1919,"Arabic Extended-A":t=>t>=2208&&t<=2303,"Hangul Jamo":t=>t>=4352&&t<=4607,"Unified Canadian Aboriginal Syllabics":t=>t>=5120&&t<=5759,Khmer:t=>t>=6016&&t<=6143,"Unified Canadian Aboriginal Syllabics Extended":t=>t>=6320&&t<=6399,"General Punctuation":t=>t>=8192&&t<=8303,"Letterlike Symbols":t=>t>=8448&&t<=8527,"Number Forms":t=>t>=8528&&t<=8591,"Miscellaneous Technical":t=>t>=8960&&t<=9215,"Control Pictures":t=>t>=9216&&t<=9279,"Optical Character Recognition":t=>t>=9280&&t<=9311,"Enclosed Alphanumerics":t=>t>=9312&&t<=9471,"Geometric Shapes":t=>t>=9632&&t<=9727,"Miscellaneous Symbols":t=>t>=9728&&t<=9983,"Miscellaneous Symbols and Arrows":t=>t>=11008&&t<=11263,"CJK Radicals Supplement":t=>t>=11904&&t<=12031,"Kangxi Radicals":t=>t>=12032&&t<=12255,"Ideographic Description Characters":t=>t>=12272&&t<=12287,"CJK Symbols and Punctuation":t=>t>=12288&&t<=12351,Hiragana:t=>t>=12352&&t<=12447,Katakana:t=>t>=12448&&t<=12543,Bopomofo:t=>t>=12544&&t<=12591,"Hangul Compatibility Jamo":t=>t>=12592&&t<=12687,Kanbun:t=>t>=12688&&t<=12703,"Bopomofo Extended":t=>t>=12704&&t<=12735,"CJK Strokes":t=>t>=12736&&t<=12783,"Katakana Phonetic Extensions":t=>t>=12784&&t<=12799,"Enclosed CJK Letters and Months":t=>t>=12800&&t<=13055,"CJK Compatibility":t=>t>=13056&&t<=13311,"CJK Unified Ideographs Extension A":t=>t>=13312&&t<=19903,"Yijing Hexagram Symbols":t=>t>=19904&&t<=19967,"CJK Unified Ideographs":t=>t>=19968&&t<=40959,"Yi Syllables":t=>t>=40960&&t<=42127,"Yi Radicals":t=>t>=42128&&t<=42191,"Hangul Jamo Extended-A":t=>t>=43360&&t<=43391,"Hangul Syllables":t=>t>=44032&&t<=55215,"Hangul Jamo Extended-B":t=>t>=55216&&t<=55295,"Private Use Area":t=>t>=57344&&t<=63743,"CJK Compatibility Ideographs":t=>t>=63744&&t<=64255,"Arabic Presentation Forms-A":t=>t>=64336&&t<=65023,"Vertical Forms":t=>t>=65040&&t<=65055,"CJK Compatibility Forms":t=>t>=65072&&t<=65103,"Small Form Variants":t=>t>=65104&&t<=65135,"Arabic Presentation Forms-B":t=>t>=65136&&t<=65279,"Halfwidth and Fullwidth Forms":t=>t>=65280&&t<=65519};function Qi(t){for(const e of t)if(rn(e.charCodeAt(0)))return !0;return !1}function tn(t){for(const e of t)if(!en(e.charCodeAt(0)))return !1;return !0}function en(t){return !(Wi.Arabic(t)||Wi["Arabic Supplement"](t)||Wi["Arabic Extended-A"](t)||Wi["Arabic Presentation Forms-A"](t)||Wi["Arabic Presentation Forms-B"](t))}function rn(t){return !(746!==t&&747!==t&&(t<4352||!(Wi["Bopomofo Extended"](t)||Wi.Bopomofo(t)||Wi["CJK Compatibility Forms"](t)&&!(t>=65097&&t<=65103)||Wi["CJK Compatibility Ideographs"](t)||Wi["CJK Compatibility"](t)||Wi["CJK Radicals Supplement"](t)||Wi["CJK Strokes"](t)||!(!Wi["CJK Symbols and Punctuation"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||Wi["CJK Unified Ideographs Extension A"](t)||Wi["CJK Unified Ideographs"](t)||Wi["Enclosed CJK Letters and Months"](t)||Wi["Hangul Compatibility Jamo"](t)||Wi["Hangul Jamo Extended-A"](t)||Wi["Hangul Jamo Extended-B"](t)||Wi["Hangul Jamo"](t)||Wi["Hangul Syllables"](t)||Wi.Hiragana(t)||Wi["Ideographic Description Characters"](t)||Wi.Kanbun(t)||Wi["Kangxi Radicals"](t)||Wi["Katakana Phonetic Extensions"](t)||Wi.Katakana(t)&&12540!==t||!(!Wi["Halfwidth and Fullwidth Forms"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!Wi["Small Form Variants"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||Wi["Unified Canadian Aboriginal Syllabics"](t)||Wi["Unified Canadian Aboriginal Syllabics Extended"](t)||Wi["Vertical Forms"](t)||Wi["Yijing Hexagram Symbols"](t)||Wi["Yi Syllables"](t)||Wi["Yi Radicals"](t))))}function nn(t){return !(rn(t)||function(t){return !!(Wi["Latin-1 Supplement"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||Wi["General Punctuation"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||Wi["Letterlike Symbols"](t)||Wi["Number Forms"](t)||Wi["Miscellaneous Technical"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||Wi["Control Pictures"](t)&&9251!==t||Wi["Optical Character Recognition"](t)||Wi["Enclosed Alphanumerics"](t)||Wi["Geometric Shapes"](t)||Wi["Miscellaneous Symbols"](t)&&!(t>=9754&&t<=9759)||Wi["Miscellaneous Symbols and Arrows"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||Wi["CJK Symbols and Punctuation"](t)||Wi.Katakana(t)||Wi["Private Use Area"](t)||Wi["CJK Compatibility Forms"](t)||Wi["Small Form Variants"](t)||Wi["Halfwidth and Fullwidth Forms"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function sn(t){return t>=1424&&t<=2303||Wi["Arabic Presentation Forms-A"](t)||Wi["Arabic Presentation Forms-B"](t)}function an(t,e){return !(!e&&sn(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||Wi.Khmer(t))}function on(t){for(const e of t)if(sn(e.charCodeAt(0)))return !0;return !1}let ln=null,un="unavailable",cn=null;const hn=function(t){t&&"string"==typeof t&&t.indexOf("NetworkError")>-1&&(un="error"),ln&&ln(t);};function pn(){dn.fire(new Vt("pluginStateChange",{pluginStatus:un,pluginURL:cn}));}const dn=new Rt,fn=function(){return un},yn=function(){if("deferred"!==un||!cn)throw new Error("rtl-text-plugin cannot be downloaded unless a pluginURL is specified");un="loading",pn(),cn&&St({url:cn}, t=>{t?hn(t):(un="loaded",pn());});},mn={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:()=>"loaded"===un||null!=mn.applyArabicShaping,isLoading:()=>"loading"===un,setState(t){un=t.pluginStatus,cn=t.pluginURL;},isParsed:()=>null!=mn.applyArabicShaping&&null!=mn.processBidirectionalText&&null!=mn.processStyledBidirectionalText,getPluginURL:()=>cn};class gn{constructor(t, e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new Yi,this.transition={});}isSupportedScript(t){return function(t, e){for(const r of t)if(!an(r.charCodeAt(0),e))return !1;return !0}(t,mn.isLoaded())}crossFadingFactor(){return 0===this.fadeDuration?1:Math.min((this.now-this.zoomHistory.lastIntegerZoomTime)/this.fadeDuration,1)}getCrossfadeParameters(){const t=this.zoom,e=t-Math.floor(t),r=this.crossFadingFactor();return t>this.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}}}class xn{constructor(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(Kr(t))return new ni(t,e);if(Qr(t)){const r=ii(t,e);if("error"===r.result)throw new Error(r.value.map(t=>`${t.key}: ${t.message}`).join(", "));return r.value}{let r=t;return "string"==typeof t&&"color"===e.type&&(r=ue.parse(t)),{kind:"constant",evaluate:()=>r}}}(void 0===e?t.specification.default:e,t.specification);}isDataDriven(){return "source"===this.expression.kind||"composite"===this.expression.kind}possiblyEvaluate(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)}}class vn{constructor(t){this.property=t,this.value=new xn(t,void 0);}transitioned(t,e){return new wn(this.property,this.value,e,x({},t.transition,this.transition),t.now)}untransitioned(){return new wn(this.property,this.value,null,{},0)}}class bn{constructor(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues);}getValue(t){return T(this._values[t].value.value)}setValue(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new vn(this._values[t].property)),this._values[t].value=new xn(this._values[t].property,null===e?void 0:T(e));}getTransition(t){return T(this._values[t].transition)}setTransition(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new vn(this._values[t].property)),this._values[t].transition=T(e)||void 0;}serialize(){const t={};for(const e of Object.keys(this._values)){const r=this.getValue(e);void 0!==r&&(t[e]=r);const i=this.getTransition(e);void 0!==i&&(t[`${e}-transition`]=i);}return t}transitioned(t,e){const r=new _n(this._properties);for(const i of Object.keys(this._values))r._values[i]=this._values[i].transitioned(t,e._values[i]);return r}untransitioned(){const t=new _n(this._properties);for(const e of Object.keys(this._values))t._values[e]=this._values[e].untransitioned();return t}}class wn{constructor(t,e,r,i,n){this.property=t,this.value=e,this.begin=n+i.delay||0,this.end=this.begin+i.duration||0,t.specification.transition&&(i.delay||i.duration)&&(this.prior=r);}possiblyEvaluate(t,e,r){const i=t.now||0,n=this.value.possiblyEvaluate(t,e,r),s=this.prior;if(s){if(i>this.end)return this.prior=null,n;if(this.value.isDataDriven())return this.prior=null,n;if(ii.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class En{constructor(t){this.specification=t;}possiblyEvaluate(t,e,r,i){if(void 0!==t.value){if("constant"===t.expression.kind){const n=t.expression.evaluate(e,null,{},r,i);return this._calculate(n,n,n,e)}return this._calculate(t.expression.evaluate(new gn(Math.floor(e.zoom-1),e)),t.expression.evaluate(new gn(Math.floor(e.zoom),e)),t.expression.evaluate(new gn(Math.floor(e.zoom+1),e)),e)}}_calculate(t,e,r,i){return i.zoom>i.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}}interpolate(t){return t}}class Cn{constructor(t){this.specification=t;}possiblyEvaluate(t,e,r,i){return !!t.expression.evaluate(e,null,{},r,i)}interpolate(){return !1}}class Mn{constructor(t){this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[];for(const e in t){const r=t[e];r.specification.overridable&&this.overridableProperties.push(e);const i=this.defaultPropertyValues[e]=new xn(r,void 0),n=this.defaultTransitionablePropertyValues[e]=new vn(r);this.defaultTransitioningPropertyValues[e]=n.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=i.possiblyEvaluate({});}}}function Bn(t,e){return 256*(t=y(Math.floor(t),0,255))+y(Math.floor(e),0,255)}Zi("DataDrivenProperty",Tn),Zi("DataConstantProperty",In),Zi("CrossFadedDataDrivenProperty",zn),Zi("CrossFadedProperty",En),Zi("ColorRampProperty",Cn);const Dn={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array};class Pn{constructor(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8;}}class Vn{constructor(){this.isTransferred=!1,this.capacity=-1,this.resize(0);}static serialize(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}}static deserialize(t){const e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e}_trim(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews());}clear(){this.length=0;}resize(t){this.reserve(t),this.length=t;}reserve(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);const e=this.uint8;this._refreshViews(),e&&this.uint8.set(e);}}_refreshViews(){throw new Error("_refreshViews() must be implemented by each concrete StructArray layout")}}function Fn(t,e=1){let r=0,i=0;return {members:t.map(t=>{const n=Dn[t.type].BYTES_PER_ELEMENT,s=r=Rn(r,Math.max(e,n)),a=t.components||1;return i=Math.max(i,n),r+=n*a,{name:t.name,type:t.type,components:a,offset:s}}),size:Rn(r,Math.max(i,e)),alignment:e}}function Rn(t,e){return Math.ceil(t/e)*e}class Ln extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const i=2*t;return this.int16[i+0]=e,this.int16[i+1]=r,t}}Ln.prototype.bytesPerElement=4,Zi("StructArrayLayout2i4",Ln);class Un extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,i){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r,i)}emplace(t,e,r,i,n){const s=4*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=i,this.int16[s+3]=n,t}}Un.prototype.bytesPerElement=8,Zi("StructArrayLayout4i8",Un);class On extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a){const o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,i,n,s,a)}emplace(t,e,r,i,n,s,a,o){const l=6*t,u=12*t,c=3*t;return this.int16[l+0]=e,this.int16[l+1]=r,this.uint8[u+4]=i,this.uint8[u+5]=n,this.uint8[u+6]=s,this.uint8[u+7]=a,this.float32[c+2]=o,t}}On.prototype.bytesPerElement=12,Zi("StructArrayLayout2i4ub1f12",On);class $n extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const i=2*t;return this.float32[i+0]=e,this.float32[i+1]=r,t}}$n.prototype.bytesPerElement=8,Zi("StructArrayLayout2f8",$n);class qn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a,o,l,u){const c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,i,n,s,a,o,l,u)}emplace(t,e,r,i,n,s,a,o,l,u,c){const h=10*t;return this.uint16[h+0]=e,this.uint16[h+1]=r,this.uint16[h+2]=i,this.uint16[h+3]=n,this.uint16[h+4]=s,this.uint16[h+5]=a,this.uint16[h+6]=o,this.uint16[h+7]=l,this.uint16[h+8]=u,this.uint16[h+9]=c,t}}qn.prototype.bytesPerElement=20,Zi("StructArrayLayout10ui20",qn);class Nn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a,o,l,u,c,h){const p=this.length;return this.resize(p+1),this.emplace(p,t,e,r,i,n,s,a,o,l,u,c,h)}emplace(t,e,r,i,n,s,a,o,l,u,c,h,p){const d=12*t;return this.int16[d+0]=e,this.int16[d+1]=r,this.int16[d+2]=i,this.int16[d+3]=n,this.uint16[d+4]=s,this.uint16[d+5]=a,this.uint16[d+6]=o,this.uint16[d+7]=l,this.int16[d+8]=u,this.int16[d+9]=c,this.int16[d+10]=h,this.int16[d+11]=p,t}}Nn.prototype.bytesPerElement=24,Zi("StructArrayLayout4i4ui4i24",Nn);class jn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r)}emplace(t,e,r,i){const n=3*t;return this.float32[n+0]=e,this.float32[n+1]=r,this.float32[n+2]=i,t}}jn.prototype.bytesPerElement=12,Zi("StructArrayLayout3f12",jn);class Kn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint32[1*t+0]=e,t}}Kn.prototype.bytesPerElement=4,Zi("StructArrayLayout1ul4",Kn);class Zn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a,o,l,u){const c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,i,n,s,a,o,l,u)}emplace(t,e,r,i,n,s,a,o,l,u,c){const h=16*t,p=8*t;return this.int16[h+0]=e,this.int16[h+1]=r,this.float32[p+1]=i,this.float32[p+2]=n,this.float32[p+3]=s,this.float32[p+4]=a,this.int16[h+10]=o,this.uint32[p+6]=l,this.uint16[h+14]=u,this.uint16[h+15]=c,t}}Zn.prototype.bytesPerElement=32,Zi("StructArrayLayout2i4f1i1ul2ui32",Zn);class Xn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s){const a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,i,n,s)}emplace(t,e,r,i,n,s,a){const o=6*t;return this.int16[o+0]=e,this.int16[o+1]=r,this.int16[o+2]=i,this.int16[o+3]=n,this.int16[o+4]=s,this.int16[o+5]=a,t}}Xn.prototype.bytesPerElement=12,Zi("StructArrayLayout2i2i2i12",Xn);class Gn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n){const s=this.length;return this.resize(s+1),this.emplace(s,t,e,r,i,n)}emplace(t,e,r,i,n,s){const a=4*t,o=8*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=i,this.int16[o+6]=n,this.int16[o+7]=s,t}}Gn.prototype.bytesPerElement=16,Zi("StructArrayLayout2f1f2i16",Gn);class Hn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,i){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r,i)}emplace(t,e,r,i,n){const s=12*t,a=3*t;return this.uint8[s+0]=e,this.uint8[s+1]=r,this.float32[a+1]=i,this.float32[a+2]=n,t}}Hn.prototype.bytesPerElement=12,Zi("StructArrayLayout2ub2f12",Hn);class Jn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r)}emplace(t,e,r,i){const n=3*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,this.uint16[n+2]=i,t}}Jn.prototype.bytesPerElement=6,Zi("StructArrayLayout3ui6",Jn);class Yn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m){const g=this.length;return this.resize(g+1),this.emplace(g,t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m)}emplace(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m,g){const x=24*t,v=12*t,b=48*t;return this.int16[x+0]=e,this.int16[x+1]=r,this.uint16[x+2]=i,this.uint16[x+3]=n,this.uint32[v+2]=s,this.uint32[v+3]=a,this.uint32[v+4]=o,this.uint16[x+10]=l,this.uint16[x+11]=u,this.uint16[x+12]=c,this.float32[v+7]=h,this.float32[v+8]=p,this.uint8[b+36]=d,this.uint8[b+37]=f,this.uint8[b+38]=y,this.uint32[v+10]=m,this.int16[x+22]=g,t}}Yn.prototype.bytesPerElement=48,Zi("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48",Yn);class Wn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m,g,x,v,b,w,_,A,k,S,I,T){const z=this.length;return this.resize(z+1),this.emplace(z,t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m,g,x,v,b,w,_,A,k,S,I,T)}emplace(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m,g,x,v,b,w,_,A,k,S,I,T,z){const E=34*t,C=17*t;return this.int16[E+0]=e,this.int16[E+1]=r,this.int16[E+2]=i,this.int16[E+3]=n,this.int16[E+4]=s,this.int16[E+5]=a,this.int16[E+6]=o,this.int16[E+7]=l,this.uint16[E+8]=u,this.uint16[E+9]=c,this.uint16[E+10]=h,this.uint16[E+11]=p,this.uint16[E+12]=d,this.uint16[E+13]=f,this.uint16[E+14]=y,this.uint16[E+15]=m,this.uint16[E+16]=g,this.uint16[E+17]=x,this.uint16[E+18]=v,this.uint16[E+19]=b,this.uint16[E+20]=w,this.uint16[E+21]=_,this.uint16[E+22]=A,this.uint32[C+12]=k,this.float32[C+13]=S,this.float32[C+14]=I,this.float32[C+15]=T,this.float32[C+16]=z,t}}Wn.prototype.bytesPerElement=68,Zi("StructArrayLayout8i15ui1ul4f68",Wn);class Qn extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.float32[1*t+0]=e,t}}Qn.prototype.bytesPerElement=4,Zi("StructArrayLayout1f4",Qn);class ts extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);}emplaceBack(t,e,r){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r)}emplace(t,e,r,i){const n=3*t;return this.int16[n+0]=e,this.int16[n+1]=r,this.int16[n+2]=i,t}}ts.prototype.bytesPerElement=6,Zi("StructArrayLayout3i6",ts);class es extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e,r){const i=this.length;return this.resize(i+1),this.emplace(i,t,e,r)}emplace(t,e,r,i){const n=4*t;return this.uint32[2*t+0]=e,this.uint16[n+2]=r,this.uint16[n+3]=i,t}}es.prototype.bytesPerElement=8,Zi("StructArrayLayout1ul2ui8",es);class rs extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t,e){const r=this.length;return this.resize(r+1),this.emplace(r,t,e)}emplace(t,e,r){const i=2*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,t}}rs.prototype.bytesPerElement=4,Zi("StructArrayLayout2ui4",rs);class is extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);}emplaceBack(t){const e=this.length;return this.resize(e+1),this.emplace(e,t)}emplace(t,e){return this.uint16[1*t+0]=e,t}}is.prototype.bytesPerElement=2,Zi("StructArrayLayout1ui2",is);class ns extends Vn{_refreshViews(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);}emplaceBack(t,e,r,i){const n=this.length;return this.resize(n+1),this.emplace(n,t,e,r,i)}emplace(t,e,r,i,n){const s=4*t;return this.float32[s+0]=e,this.float32[s+1]=r,this.float32[s+2]=i,this.float32[s+3]=n,t}}ns.prototype.bytesPerElement=16,Zi("StructArrayLayout4f16",ns);class ss extends Pn{get anchorPointX(){return this._structArray.int16[this._pos2+0]}get anchorPointY(){return this._structArray.int16[this._pos2+1]}get x1(){return this._structArray.float32[this._pos4+1]}get y1(){return this._structArray.float32[this._pos4+2]}get x2(){return this._structArray.float32[this._pos4+3]}get y2(){return this._structArray.float32[this._pos4+4]}get padding(){return this._structArray.int16[this._pos2+10]}get featureIndex(){return this._structArray.uint32[this._pos4+6]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+14]}get bucketIndex(){return this._structArray.uint16[this._pos2+15]}get anchorPoint(){return new n(this.anchorPointX,this.anchorPointY)}}ss.prototype.size=32;class as extends Zn{get(t){return new ss(this,t)}}Zi("CollisionBoxArray",as);class os extends Pn{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get glyphStartIndex(){return this._structArray.uint16[this._pos2+2]}get numGlyphs(){return this._structArray.uint16[this._pos2+3]}get vertexStartIndex(){return this._structArray.uint32[this._pos4+2]}get lineStartIndex(){return this._structArray.uint32[this._pos4+3]}get lineLength(){return this._structArray.uint32[this._pos4+4]}get segment(){return this._structArray.uint16[this._pos2+10]}get lowerSize(){return this._structArray.uint16[this._pos2+11]}get upperSize(){return this._structArray.uint16[this._pos2+12]}get lineOffsetX(){return this._structArray.float32[this._pos4+7]}get lineOffsetY(){return this._structArray.float32[this._pos4+8]}get writingMode(){return this._structArray.uint8[this._pos1+36]}get placedOrientation(){return this._structArray.uint8[this._pos1+37]}set placedOrientation(t){this._structArray.uint8[this._pos1+37]=t;}get hidden(){return this._structArray.uint8[this._pos1+38]}set hidden(t){this._structArray.uint8[this._pos1+38]=t;}get crossTileID(){return this._structArray.uint32[this._pos4+10]}set crossTileID(t){this._structArray.uint32[this._pos4+10]=t;}get associatedIconIndex(){return this._structArray.int16[this._pos2+22]}}os.prototype.size=48;class ls extends Yn{get(t){return new os(this,t)}}Zi("PlacedSymbolArray",ls);class us extends Pn{get anchorX(){return this._structArray.int16[this._pos2+0]}get anchorY(){return this._structArray.int16[this._pos2+1]}get rightJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+2]}get centerJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+3]}get leftJustifiedTextSymbolIndex(){return this._structArray.int16[this._pos2+4]}get verticalPlacedTextSymbolIndex(){return this._structArray.int16[this._pos2+5]}get placedIconSymbolIndex(){return this._structArray.int16[this._pos2+6]}get verticalPlacedIconSymbolIndex(){return this._structArray.int16[this._pos2+7]}get key(){return this._structArray.uint16[this._pos2+8]}get textBoxStartIndex(){return this._structArray.uint16[this._pos2+9]}get textBoxEndIndex(){return this._structArray.uint16[this._pos2+10]}get verticalTextBoxStartIndex(){return this._structArray.uint16[this._pos2+11]}get verticalTextBoxEndIndex(){return this._structArray.uint16[this._pos2+12]}get iconBoxStartIndex(){return this._structArray.uint16[this._pos2+13]}get iconBoxEndIndex(){return this._structArray.uint16[this._pos2+14]}get verticalIconBoxStartIndex(){return this._structArray.uint16[this._pos2+15]}get verticalIconBoxEndIndex(){return this._structArray.uint16[this._pos2+16]}get featureIndex(){return this._structArray.uint16[this._pos2+17]}get numHorizontalGlyphVertices(){return this._structArray.uint16[this._pos2+18]}get numVerticalGlyphVertices(){return this._structArray.uint16[this._pos2+19]}get numIconVertices(){return this._structArray.uint16[this._pos2+20]}get numVerticalIconVertices(){return this._structArray.uint16[this._pos2+21]}get useRuntimeCollisionCircles(){return this._structArray.uint16[this._pos2+22]}get crossTileID(){return this._structArray.uint32[this._pos4+12]}set crossTileID(t){this._structArray.uint32[this._pos4+12]=t;}get textBoxScale(){return this._structArray.float32[this._pos4+13]}get textOffset0(){return this._structArray.float32[this._pos4+14]}get textOffset1(){return this._structArray.float32[this._pos4+15]}get collisionCircleDiameter(){return this._structArray.float32[this._pos4+16]}}us.prototype.size=68;class cs extends Wn{get(t){return new us(this,t)}}Zi("SymbolInstanceArray",cs);class hs extends Qn{getoffsetX(t){return this.float32[1*t+0]}}Zi("GlyphOffsetArray",hs);class ps extends ts{getx(t){return this.int16[3*t+0]}gety(t){return this.int16[3*t+1]}gettileUnitDistanceFromAnchor(t){return this.int16[3*t+2]}}Zi("SymbolLineVertexArray",ps);class ds extends Pn{get featureIndex(){return this._structArray.uint32[this._pos4+0]}get sourceLayerIndex(){return this._structArray.uint16[this._pos2+2]}get bucketIndex(){return this._structArray.uint16[this._pos2+3]}}ds.prototype.size=8;class fs extends es{get(t){return new ds(this,t)}}Zi("FeatureIndexArray",fs);const ys=Fn([{name:"a_pattern_from",components:4,type:"Uint16"},{name:"a_pattern_to",components:4,type:"Uint16"},{name:"a_pixel_ratio_from",components:1,type:"Uint16"},{name:"a_pixel_ratio_to",components:1,type:"Uint16"}]);var ms=e((function(t){t.exports=function(t,e){var r,i,n,s,a,o,l,u;for(i=t.length-(r=3&t.length),n=e,a=3432918353,o=461845907,u=0;u>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<13|n>>>19))+((5*(n>>>16)&65535)<<16)&4294967295))+((58964+(s>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(u+2))<<16;case 2:l^=(255&t.charCodeAt(u+1))<<8;case 1:n^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*o+(((l>>>16)*o&65535)<<16)&4294967295;}return n^=t.length,n=2246822507*(65535&(n^=n>>>16))+((2246822507*(n>>>16)&65535)<<16)&4294967295,n=3266489909*(65535&(n^=n>>>13))+((3266489909*(n>>>16)&65535)<<16)&4294967295,(n^=n>>>16)>>>0};})),gs=e((function(t){t.exports=function(t,e){for(var r,i=t.length,n=e^i,s=0;i>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(s)|(255&t.charCodeAt(++s))<<8|(255&t.charCodeAt(++s))<<16|(255&t.charCodeAt(++s))<<24))+((1540483477*(r>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),i-=4,++s;switch(i){case 3:n^=(255&t.charCodeAt(s+2))<<16;case 2:n^=(255&t.charCodeAt(s+1))<<8;case 1:n=1540483477*(65535&(n^=255&t.charCodeAt(s)))+((1540483477*(n>>>16)&65535)<<16);}return n=1540483477*(65535&(n^=n>>>13))+((1540483477*(n>>>16)&65535)<<16),(n^=n>>>15)>>>0};})),xs=ms,vs=gs;xs.murmur3=ms,xs.murmur2=vs;class bs{constructor(){this.ids=[],this.positions=[],this.indexed=!1;}add(t,e,r,i){this.ids.push(ws(t)),this.positions.push(e,r,i);}getPositions(t){const e=ws(t);let r=0,i=this.ids.length-1;for(;r>1;this.ids[t]>=e?i=t:r=t+1;}const n=[];for(;this.ids[r]===e;)n.push({index:this.positions[3*r],start:this.positions[3*r+1],end:this.positions[3*r+2]}),r++;return n}static serialize(t,e){const r=new Float64Array(t.ids),i=new Uint32Array(t.positions);return function t(e,r,i,n){for(;i>1];let a=i-1,o=n+1;for(;;){do{a++;}while(e[a]s);if(a>=o)break;_s(e,a,o),_s(r,3*a,3*o),_s(r,3*a+1,3*o+1),_s(r,3*a+2,3*o+2);}o-i`u_${t}`),this.type=r;}setUniform(t,e,r){t.set(r.constantOr(this.value));}getBinding(t,e,r){return "color"===this.type?new Is(t,e):new ks(t,e)}}class Ms{constructor(t,e){this.uniformNames=e.map(t=>`u_${t}`),this.patternFrom=null,this.patternTo=null,this.pixelRatioFrom=1,this.pixelRatioTo=1;}setConstantPatternPositions(t,e){this.pixelRatioFrom=e.pixelRatio,this.pixelRatioTo=t.pixelRatio,this.patternFrom=e.tlbr,this.patternTo=t.tlbr;}setUniform(t,e,r,i){const n="u_pattern_to"===i?this.patternTo:"u_pattern_from"===i?this.patternFrom:"u_pixel_ratio_to"===i?this.pixelRatioTo:"u_pixel_ratio_from"===i?this.pixelRatioFrom:null;n&&t.set(n);}getBinding(t,e,r){return "u_pattern"===r.substr(0,9)?new Ss(t,e):new ks(t,e)}}class Bs{constructor(t,e,r,i){this.expression=t,this.type=r,this.maxValue=0,this.paintVertexAttributes=e.map(t=>({name:`a_${t}`,type:"Float32",components:"color"===r?2:1,offset:0})),this.paintVertexArray=new i;}populatePaintArray(t,e,r,i,n){const s=this.paintVertexArray.length,a=this.expression.evaluate(new gn(0),e,{},i,[],n);this.paintVertexArray.resize(t),this._setPaintValue(s,t,a);}updatePaintArray(t,e,r,i){const n=this.expression.evaluate({zoom:0},r,i);this._setPaintValue(t,e,n);}_setPaintValue(t,e,r){if("color"===this.type){const i=Es(r);for(let r=t;r`u_${t}_t`),this.type=r,this.useIntegerZoom=i,this.zoom=n,this.maxValue=0,this.paintVertexAttributes=e.map(t=>({name:`a_${t}`,type:"Float32",components:"color"===r?4:2,offset:0})),this.paintVertexArray=new s;}populatePaintArray(t,e,r,i,n){const s=this.expression.evaluate(new gn(this.zoom),e,{},i,[],n),a=this.expression.evaluate(new gn(this.zoom+1),e,{},i,[],n),o=this.paintVertexArray.length;this.paintVertexArray.resize(t),this._setPaintValue(o,t,s,a);}updatePaintArray(t,e,r,i){const n=this.expression.evaluate({zoom:this.zoom},r,i),s=this.expression.evaluate({zoom:this.zoom+1},r,i);this._setPaintValue(t,e,n,s);}_setPaintValue(t,e,r,i){if("color"===this.type){const n=Es(r),s=Es(i);for(let r=t;r!0)){this.binders={},this._buffers=[];const i=[];for(const n in t.paint._values){if(!r(n))continue;const s=t.paint.get(n);if(!(s instanceof kn&&$r(s.property.specification)))continue;const a=Rs(n,t.type),o=s.value,l=s.property.specification.type,u=s.property.useIntegerZoom,c=s.property.specification["property-type"],h="cross-faded"===c||"cross-faded-data-driven"===c;if("constant"===o.kind)this.binders[n]=h?new Ms(o.value,a):new Cs(o.value,a,l),i.push(`/u_${n}`);else if("source"===o.kind||h){const r=Ls(n,l,"source");this.binders[n]=h?new Ps(o,l,u,e,r,t.id):new Bs(o,a,l,r),i.push(`/a_${n}`);}else {const t=Ls(n,l,"composite");this.binders[n]=new Ds(o,a,l,u,e,t),i.push(`/z_${n}`);}}this.cacheKey=i.sort().join("");}getMaxValue(t){const e=this.binders[t];return e instanceof Bs||e instanceof Ds?e.maxValue:0}populatePaintArrays(t,e,r,i,n){for(const s in this.binders){const a=this.binders[s];(a instanceof Bs||a instanceof Ds||a instanceof Ps)&&a.populatePaintArray(t,e,r,i,n);}}setConstantPatternPositions(t,e){for(const r in this.binders){const i=this.binders[r];i instanceof Ms&&i.setConstantPatternPositions(t,e);}}updatePaintArrays(t,e,r,i,n){let s=!1;for(const a in t){const o=e.getPositions(a);for(const e of o){const o=r.feature(e.index);for(const r in this.binders){const l=this.binders[r];if((l instanceof Bs||l instanceof Ds||l instanceof Ps)&&!0===l.expression.isStateDependent){const u=i.paint.get(r);l.expression=u.value,l.updatePaintArray(e.start,e.end,o,t[a],n),s=!0;}}}}return s}defines(){const t=[];for(const e in this.binders){const r=this.binders[e];(r instanceof Cs||r instanceof Ms)&&t.push(...r.uniformNames.map(t=>`#define HAS_UNIFORM_${t}`));}return t}getBinderAttributes(){const t=[];for(const e in this.binders){const r=this.binders[e];if(r instanceof Bs||r instanceof Ds)for(let e=0;e!0)){this.programConfigurations={};for(const i of t)this.programConfigurations[i.id]=new Vs(i,e,r);this.needsUpload=!1,this._featureMap=new bs,this._bufferOffset=0;}populatePaintArrays(t,e,r,i,n,s){for(const r in this.programConfigurations)this.programConfigurations[r].populatePaintArrays(t,e,i,n,s);void 0!==e.id&&this._featureMap.add(e.id,r,this._bufferOffset,t),this._bufferOffset=t,this.needsUpload=!0;}updatePaintArrays(t,e,r,i){for(const n of r)this.needsUpload=this.programConfigurations[n.id].updatePaintArrays(t,this._featureMap,e,n,i)||this.needsUpload;}get(t){return this.programConfigurations[t]}upload(t){if(this.needsUpload){for(const e in this.programConfigurations)this.programConfigurations[e].upload(t);this.needsUpload=!1;}}destroy(){for(const t in this.programConfigurations)this.programConfigurations[t].destroy();}}function Rs(t,e){return {"text-opacity":["opacity"],"icon-opacity":["opacity"],"text-color":["fill_color"],"icon-color":["fill_color"],"text-halo-color":["halo_color"],"icon-halo-color":["halo_color"],"text-halo-blur":["halo_blur"],"icon-halo-blur":["halo_blur"],"text-halo-width":["halo_width"],"icon-halo-width":["halo_width"],"line-gap-width":["gapwidth"],"line-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"],"fill-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"],"fill-extrusion-pattern":["pattern_to","pattern_from","pixel_ratio_to","pixel_ratio_from"]}[t]||[t.replace(`${e}-`,"").replace(/-/g,"_")]}function Ls(t,e,r){const i={color:{source:$n,composite:ns},number:{source:Qn,composite:$n}},n=function(t){return {"line-pattern":{source:qn,composite:qn},"fill-pattern":{source:qn,composite:qn},"fill-extrusion-pattern":{source:qn,composite:qn}}[t]}(t);return n&&n[r]||i[e][r]}Zi("ConstantBinder",Cs),Zi("CrossFadedConstantBinder",Ms),Zi("SourceExpressionBinder",Bs),Zi("CrossFadedCompositeBinder",Ps),Zi("CompositeExpressionBinder",Ds),Zi("ProgramConfiguration",Vs,{omit:["_buffers"]}),Zi("ProgramConfigurationSet",Fs);class Us extends Rt{constructor(t,e){if(super(),this.id=t.id,this.type=t.type,this._featureFilter={filter:()=>!0,needGeometry:!1},"custom"!==t.type&&(this.metadata=(t=t).metadata,this.minzoom=t.minzoom,this.maxzoom=t.maxzoom,"background"!==t.type&&"sky"!==t.type&&(this.source=t.source,this.sourceLayer=t["source-layer"],this.filter=t.filter),e.layout&&(this._unevaluatedLayout=new An(e.layout)),e.paint)){this._transitionablePaint=new bn(e.paint);for(const e in t.paint)this.setPaintProperty(e,t.paint[e],{validate:!1});for(const e in t.layout)this.setLayoutProperty(e,t.layout[e],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Sn(e.paint);}}getCrossfadeParameters(){return this._crossfadeParameters}getLayoutProperty(t){return "visibility"===t?this.visibility:this._unevaluatedLayout.getValue(t)}setLayoutProperty(t,e,r={}){null!=e&&this._validate(Ui,`layers.${this.id}.layout.${t}`,t,e,r)||("visibility"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e);}getPaintProperty(t){return k(t,"-transition")?this._transitionablePaint.getTransition(t.slice(0,-"-transition".length)):this._transitionablePaint.getValue(t)}setPaintProperty(t,e,r={}){if(null!=e&&this._validate(Li,`layers.${this.id}.paint.${t}`,t,e,r))return !1;if(k(t,"-transition"))return this._transitionablePaint.setTransition(t.slice(0,-"-transition".length),e||void 0),!1;{const r=this._transitionablePaint._values[t],i="cross-faded-data-driven"===r.property.specification["property-type"],n=r.value.isDataDriven(),s=r.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);const a=this._transitionablePaint._values[t].value;return a.isDataDriven()||n||i||this._handleOverridablePaintPropertyUpdate(t,s,a)}}_handleSpecialPaintPropertyUpdate(t){}getProgramIds(){return null}getProgramConfiguration(t){return null}_handleOverridablePaintPropertyUpdate(t,e,r){return !1}isHidden(t){return !!(this.minzoom&&t=this.maxzoom)||"none"===this.visibility}updateTransitions(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint);}hasTransition(){return this._transitioningPaint.hasTransition()}recalculate(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e);}serialize(){const t={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),I(t,(t,e)=>!(void 0===t||"layout"===e&&!Object.keys(t).length||"paint"===e&&!Object.keys(t).length))}_validate(t,e,r,i,n={}){return (!n||!1!==n.validate)&&Oi(this,t.call(Fi,{key:e,layerType:this.type,objectKey:r,value:i,styleSpec:Lt,style:{glyphs:!0,sprite:!0}}))}is3D(){return !1}isSky(){return !1}isTileClipped(){return !1}hasOffscreenPass(){return !1}resize(){}isStateDependent(){for(const t in this.paint._values){const e=this.paint.get(t);if(e instanceof kn&&$r(e.property.specification)&&("source"===e.value.kind||"composite"===e.value.kind)&&e.value.isStateDependent)return !0}return !1}}const Os=Fn([{name:"a_pos",components:2,type:"Int16"}],4),{members:$s}=Os;class qs{constructor(t=[]){this.segments=t;}prepareSegment(t,e,r,i){let n=this.segments[this.segments.length-1];return t>qs.MAX_VERTEX_ARRAY_LENGTH&&E(`Max vertices per segment is ${qs.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${t}`),(!n||n.vertexLength+t>qs.MAX_VERTEX_ARRAY_LENGTH||n.sortKey!==i)&&(n={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==i&&(n.sortKey=i),this.segments.push(n)),n}get(){return this.segments}destroy(){for(const t of this.segments)for(const e in t.vaos)t.vaos[e].destroy();}static simpleSegment(t,e,r,i){return new qs([{vertexOffset:t,primitiveOffset:e,vertexLength:r,primitiveLength:i,vaos:{},sortKey:0}])}}qs.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,Zi("SegmentVector",qs);const Ns=Math.pow(2,14)-1,js=-Ns-1;function Ks(t){const e=8192/t.extent,r=t.loadGeometry();for(let t=0;tr.x+1||sr.y+1)&&E("Geometry exceeds allowed extent, reduce your vector tile buffer size");}}return r}function Zs(t,e){return {type:t.type,id:t.id,properties:t.properties,geometry:e?Ks(t):[]}}function Xs(t,e,r,i,n){t.emplaceBack(2*e+(i+1)/2,2*r+(n+1)/2);}class Gs{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(t=>t.id),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Ln,this.indexArray=new Jn,this.segments=new qs,this.programConfigurations=new Fs(t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter(t=>t.isStateDependent()).map(t=>t.id);}populate(t,e,r){const i=this.layers[0],n=[];let s=null;"circle"===i.type&&(s=i.layout.get("circle-sort-key"));for(const{feature:e,id:i,index:a,sourceLayerIndex:o}of t){const t=this.layers[0]._featureFilter.needGeometry,l=Zs(e,t);if(!this.layers[0]._featureFilter.filter(new gn(this.zoom),l,r))continue;const u=s?s.evaluate(l,{},r):void 0,c={id:i,properties:e.properties,type:e.type,sourceLayerIndex:o,index:a,geometry:t?l.geometry:Ks(e),patterns:{},sortKey:u};n.push(c);}s&&n.sort((t,e)=>t.sortKey-e.sortKey);for(const i of n){const{geometry:n,index:s,sourceLayerIndex:a}=i,o=t[s].feature;this.addFeature(i,n,s,r),e.featureIndex.insert(o,n,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,$s),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}addFeature(t,e,r,i){for(const r of e)for(const e of r){const r=e.x,i=e.y;if(r<0||r>=8192||i<0||i>=8192)continue;const n=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),s=n.vertexLength;Xs(this.layoutVertexArray,r,i,-1,-1),Xs(this.layoutVertexArray,r,i,1,-1),Xs(this.layoutVertexArray,r,i,1,1),Xs(this.layoutVertexArray,r,i,-1,1),this.indexArray.emplaceBack(s,s+1,s+2),this.indexArray.emplaceBack(s,s+3,s+2),n.vertexLength+=4,n.primitiveLength+=2;}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},i);}}function Hs(t,e){for(let r=0;r1){if(Qs(t,e))return !0;for(let i=0;i1?r:r.sub(e)._mult(n)._add(e))}function ia(t,e){let r,i,n,s=!1;for(let a=0;ae.y!=n.y>e.y&&e.x<(n.x-i.x)*(e.y-i.y)/(n.y-i.y)+i.x&&(s=!s);}return s}function na(t,e){let r=!1;for(let i=0,n=t.length-1;ie.y!=a.y>e.y&&e.x<(a.x-s.x)*(e.y-s.y)/(a.y-s.y)+s.x&&(r=!r);}return r}function sa(t,e,r,i,s){for(const n of t)if(e<=n.x&&r<=n.y&&i>=n.x&&s>=n.y)return !0;const a=[new n(e,r),new n(e,s),new n(i,s),new n(i,r)];if(t.length>2)for(const e of a)if(na(t,e))return !0;for(let e=0;en.x&&e.x>n.x||t.yn.y&&e.y>n.y)return !1;const s=C(t,e,r[0]);return s!==C(t,e,r[1])||s!==C(t,e,r[2])||s!==C(t,e,r[3])}function oa(t,e,r){const i=e.paint.get(t).value;return "constant"===i.kind?i.value:r.programConfigurations.get(e.id).getMaxValue(t)}function la(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function ua(t,e,r,i,s){if(!e[0]&&!e[1])return t;const a=n.convert(e)._mult(s);"viewport"===r&&a._rotate(-i);const o=[];for(let e=0;e0&&(s=1/Math.sqrt(s)),t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t}function Ta(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function za(t,e,r){var i=e[0],n=e[1],s=e[2],a=r[0],o=r[1],l=r[2];return t[0]=n*l-s*o,t[1]=s*a-i*l,t[2]=i*o-n*a,t}function Ea(t,e,r){var i=r[0],n=r[1],s=r[2],a=e[0],o=e[1],l=e[2],u=n*l-s*o,c=s*a-i*l,h=i*o-n*a,p=n*h-s*c,d=s*u-i*h,f=i*c-n*u,y=2*r[3];return c*=y,h*=y,d*=2,f*=2,t[0]=a+(u*=y)+(p*=2),t[1]=o+c+d,t[2]=l+h+f,t}var Ca,Ma=Aa,Ba=ba;function Da(t,e,r){var i=e[0],n=e[1],s=e[2],a=e[3];return t[0]=r[0]*i+r[4]*n+r[8]*s+r[12]*a,t[1]=r[1]*i+r[5]*n+r[9]*s+r[13]*a,t[2]=r[2]*i+r[6]*n+r[10]*s+r[14]*a,t[3]=r[3]*i+r[7]*n+r[11]*s+r[15]*a,t}function Pa(){var t=new da(4);return da!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function Va(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t}function Fa(t,e,r){r*=.5;var i=e[0],n=e[1],s=e[2],a=e[3],o=Math.sin(r),l=Math.cos(r);return t[0]=i*l+a*o,t[1]=n*l+s*o,t[2]=s*l-n*o,t[3]=a*l-i*o,t}xa(),Ca=new da(4),da!=Float32Array&&(Ca[0]=0,Ca[1]=0,Ca[2]=0,Ca[3]=0),xa(),wa(1,0,0),wa(0,1,0),Pa(),Pa(),fa();class Ra{constructor(t,e){this.points=t,this.planes=e;}static fromInvProjectionMatrix(t,e,r){const i=Math.pow(2,r),n=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map(r=>{const n=Da([],r,t),s=1/n[3]/e*i;return function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}(n,n,[s,s,1/n[3],s])}),s=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map(t=>{const e=Ia([],za([],Ma([],n[t[0]],n[t[1]]),Ma([],n[t[2]],n[t[1]]))),r=-Ta(e,n[t[1]]);return e.concat(r)});return new Ra(n,s)}}class La{constructor(t,e){this.min=t,this.max=e,this.center=ka([],_a([],this.min,this.max),.5);}quadrant(t){const e=[t%2==0,t<2],r=va(this.min),i=va(this.max);for(let t=0;t=0;if(0===o)return 0;o!==e.length&&(r=!1);}var i,n;if(r)return 2;for(let e=0;e<3;e++){let r=Number.MAX_VALUE,i=-Number.MAX_VALUE;for(let n=0;nthis.max[e]-this.min[e])return 0}return 1}}function Ua(t,e,r){const i=Da([],[t.x,t.y,e,1],r);return new n(i[0]/i[3],i[1]/i[3])}const Oa=wa(0,0,0),$a=wa(0,0,1);function qa(t,e){const r=xa();return Oa[2]=e,t.intersectsPlane(Oa,$a,r),new n(r[0],r[1])}class Na extends Gs{}function ja(t,{width:e,height:r},i,n){if(n){if(n instanceof Uint8ClampedArray)n=new Uint8Array(n.buffer);else if(n.length!==e*r*i)throw new RangeError("mismatched image size")}else n=new Uint8Array(e*r*i);return t.width=e,t.height=r,t.data=n,t}function Ka(t,{width:e,height:r},i){if(e===t.width&&r===t.height)return;const n=ja({},{width:e,height:r},i);Za(t,n,{x:0,y:0},{x:0,y:0},{width:Math.min(t.width,e),height:Math.min(t.height,r)},i),t.width=e,t.height=r,t.data=n.data;}function Za(t,e,r,i,n,s){if(0===n.width||0===n.height)return e;if(n.width>t.width||n.height>t.height||r.x>t.width-n.width||r.y>t.height-n.height)throw new RangeError("out of range source coordinates for image copy");if(n.width>e.width||n.height>e.height||i.x>e.width-n.width||i.y>e.height-n.height)throw new RangeError("out of range destination coordinates for image copy");const a=t.data,o=e.data;for(let l=0;l{e[t.evaluationKey]=s;const a=t.expression.evaluate(e);n.data[r+i+0]=Math.floor(255*a.r/a.a),n.data[r+i+1]=Math.floor(255*a.g/a.a),n.data[r+i+2]=Math.floor(255*a.b/a.a),n.data[r+i+3]=Math.floor(255*a.a);};if(t.clips)for(let e=0,n=0;e80*r){i=s=t[0],n=a=t[1];for(var f=r;fs&&(s=o),l>a&&(a=l);u=0!==(u=Math.max(s-i,a-n))?1/u:0;}return so(p,d,r,i,n,u),d}function io(t,e,r,i,n){var s,a;if(n===zo(t,e,r,i)>0)for(s=e;s=e;s-=i)a=So(s,t[s],t[s+1],a);return a&&vo(a,a.next)&&(Io(a),a=a.next),a}function no(t,e){if(!t)return t;e||(e=t);var r,i=t;do{if(r=!1,i.steiner||!vo(i,i.next)&&0!==xo(i.prev,i,i.next))i=i.next;else {if(Io(i),(i=e=i.prev)===i.next)break;r=!0;}}while(r||i!==e);return e}function so(t,e,r,i,n,s,a){if(t){!a&&s&&function(t,e,r,i){var n=t;do{null===n.z&&(n.z=fo(n.x,n.y,e,r,i)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next;}while(n!==t);n.prevZ.nextZ=null,n.prevZ=null,function(t){var e,r,i,n,s,a,o,l,u=1;do{for(r=t,t=null,s=null,a=0;r;){for(a++,i=r,o=0,e=0;e0||l>0&&i;)0!==o&&(0===l||!i||r.z<=i.z)?(n=r,r=r.nextZ,o--):(n=i,i=i.nextZ,l--),s?s.nextZ=n:t=n,n.prevZ=s,s=n;r=i;}s.nextZ=null,u*=2;}while(a>1)}(n);}(t,i,n,s);for(var o,l,u=t;t.prev!==t.next;)if(o=t.prev,l=t.next,s?oo(t,i,n,s):ao(t))e.push(o.i/r),e.push(t.i/r),e.push(l.i/r),Io(t),t=l.next,u=l.next;else if((t=l)===u){a?1===a?so(t=lo(no(t),e,r),e,r,i,n,s,2):2===a&&uo(t,e,r,i,n,s):so(no(t),e,r,i,n,s,1);break}}}function ao(t){var e=t.prev,r=t,i=t.next;if(xo(e,r,i)>=0)return !1;for(var n=t.next.next;n!==t.prev;){if(mo(e.x,e.y,r.x,r.y,i.x,i.y,n.x,n.y)&&xo(n.prev,n,n.next)>=0)return !1;n=n.next;}return !0}function oo(t,e,r,i){var n=t.prev,s=t,a=t.next;if(xo(n,s,a)>=0)return !1;for(var o=n.x>s.x?n.x>a.x?n.x:a.x:s.x>a.x?s.x:a.x,l=n.y>s.y?n.y>a.y?n.y:a.y:s.y>a.y?s.y:a.y,u=fo(n.x=u&&p&&p.z<=c;){if(h!==t.prev&&h!==t.next&&mo(n.x,n.y,s.x,s.y,a.x,a.y,h.x,h.y)&&xo(h.prev,h,h.next)>=0)return !1;if(h=h.prevZ,p!==t.prev&&p!==t.next&&mo(n.x,n.y,s.x,s.y,a.x,a.y,p.x,p.y)&&xo(p.prev,p,p.next)>=0)return !1;p=p.nextZ;}for(;h&&h.z>=u;){if(h!==t.prev&&h!==t.next&&mo(n.x,n.y,s.x,s.y,a.x,a.y,h.x,h.y)&&xo(h.prev,h,h.next)>=0)return !1;h=h.prevZ;}for(;p&&p.z<=c;){if(p!==t.prev&&p!==t.next&&mo(n.x,n.y,s.x,s.y,a.x,a.y,p.x,p.y)&&xo(p.prev,p,p.next)>=0)return !1;p=p.nextZ;}return !0}function lo(t,e,r){var i=t;do{var n=i.prev,s=i.next.next;!vo(n,s)&&bo(n,i,i.next,s)&&Ao(n,s)&&Ao(s,n)&&(e.push(n.i/r),e.push(i.i/r),e.push(s.i/r),Io(i),Io(i.next),i=t=s),i=i.next;}while(i!==t);return no(i)}function uo(t,e,r,i,n,s){var a=t;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&go(a,o)){var l=ko(a,o);return a=no(a,a.next),l=no(l,l.next),so(a,e,r,i,n,s),void so(l,e,r,i,n,s)}o=o.next;}a=a.next;}while(a!==t)}function co(t,e){return t.x-e.x}function ho(t,e){if(e=function(t,e){var r,i=e,n=t.x,s=t.y,a=-1/0;do{if(s<=i.y&&s>=i.next.y&&i.next.y!==i.y){var o=i.x+(s-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(o<=n&&o>a){if(a=o,o===n){if(s===i.y)return i;if(s===i.next.y)return i.next}r=i.x=i.x&&i.x>=c&&n!==i.x&&mo(sr.x||i.x===r.x&&po(r,i)))&&(r=i,p=l)),i=i.next;}while(i!==u);return r}(t,e)){var r=ko(e,t);no(e,e.next),no(r,r.next);}}function po(t,e){return xo(t.prev,t,e.prev)<0&&xo(e.next,t,t.next)<0}function fo(t,e,r,i,n){return (t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*n)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*n)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function yo(t){var e=t,r=t;do{(e.x=0&&(t-a)*(i-o)-(r-a)*(e-o)>=0&&(r-a)*(s-o)-(n-a)*(i-o)>=0}function go(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&bo(r,r.next,t,e))return !0;r=r.next;}while(r!==t);return !1}(t,e)&&(Ao(t,e)&&Ao(e,t)&&function(t,e){var r=t,i=!1,n=(t.x+e.x)/2,s=(t.y+e.y)/2;do{r.y>s!=r.next.y>s&&r.next.y!==r.y&&n<(r.next.x-r.x)*(s-r.y)/(r.next.y-r.y)+r.x&&(i=!i),r=r.next;}while(r!==t);return i}(t,e)&&(xo(t.prev,t,e.prev)||xo(t,e.prev,e))||vo(t,e)&&xo(t.prev,t,t.next)>0&&xo(e.prev,e,e.next)>0)}function xo(t,e,r){return (e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function vo(t,e){return t.x===e.x&&t.y===e.y}function bo(t,e,r,i){var n=_o(xo(t,e,r)),s=_o(xo(t,e,i)),a=_o(xo(r,i,t)),o=_o(xo(r,i,e));return n!==s&&a!==o||!(0!==n||!wo(t,r,e))||!(0!==s||!wo(t,i,e))||!(0!==a||!wo(r,t,i))||!(0!==o||!wo(r,e,i))}function wo(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function _o(t){return t>0?1:t<0?-1:0}function Ao(t,e){return xo(t.prev,t,t.next)<0?xo(t,e,t.next)>=0&&xo(t,t.prev,e)>=0:xo(t,e,t.prev)<0||xo(t,t.next,e)<0}function ko(t,e){var r=new To(t.i,t.x,t.y),i=new To(e.i,e.x,e.y),n=t.next,s=e.prev;return t.next=e,e.prev=t,r.next=n,n.prev=r,i.next=r,r.prev=i,s.next=i,i.prev=s,i}function So(t,e,r,i){var n=new To(t,e,r);return i?(n.next=i.next,n.prev=i,i.next.prev=n,i.next=n):(n.prev=n,n.next=n),n}function Io(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ);}function To(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1;}function zo(t,e,r,i){for(var n=0,s=e,a=r-i;si;){if(n-i>600){var a=n-i+1,o=r-i+1,l=Math.log(a),u=.5*Math.exp(2*l/3),c=.5*Math.sqrt(l*u*(a-u)/a)*(o-a/2<0?-1:1);t(e,r,Math.max(i,Math.floor(r-o*u/a+c)),Math.min(n,Math.floor(r+(a-o)*u/a+c)),s);}var h=e[r],p=i,d=n;for(Co(e,i,r),s(e[n],h)>0&&Co(e,i,n);p0;)d--;}0===s(e[i],h)?Co(e,i,d):Co(e,++d,n),d<=r&&(i=d+1),r<=d&&(n=d-1);}}(t,e,r||0,i||t.length-1,n||Mo);}function Co(t,e,r){var i=t[e];t[e]=t[r],t[r]=i;}function Mo(t,e){return te?1:0}function Bo(t,e){const r=t.length;if(r<=1)return [t];const i=[];let n,s;for(let e=0;e1)for(let t=0;t0&&r.holes.push(i+=t[n-1].length);}return r},to.default=eo;class Fo{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(t=>t.id),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new Ln,this.indexArray=new Jn,this.indexArray2=new rs,this.programConfigurations=new Fs(t.layers,t.zoom),this.segments=new qs,this.segments2=new qs,this.stateDependentLayerIds=this.layers.filter(t=>t.isStateDependent()).map(t=>t.id);}populate(t,e,r){this.hasPattern=Po("fill",this.layers,e);const i=this.layers[0].layout.get("fill-sort-key"),n=[];for(const{feature:s,id:a,index:o,sourceLayerIndex:l}of t){const t=this.layers[0]._featureFilter.needGeometry,u=Zs(s,t);if(!this.layers[0]._featureFilter.filter(new gn(this.zoom),u,r))continue;const c=i?i.evaluate(u,{},r,e.availableImages):void 0,h={id:a,properties:s.properties,type:s.type,sourceLayerIndex:l,index:o,geometry:t?u.geometry:Ks(s),patterns:{},sortKey:c};n.push(h);}i&&n.sort((t,e)=>t.sortKey-e.sortKey);for(const i of n){const{geometry:n,index:s,sourceLayerIndex:a}=i;if(this.hasPattern){const t=Vo("fill",this.layers,i,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(i,n,s,r,{});e.featureIndex.insert(t[s].feature,n,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Qa),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.indexBuffer2=t.createIndexBuffer(this.indexArray2)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.indexBuffer2.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.segments2.destroy());}addFeature(t,e,r,i,n){for(const t of Bo(e,500)){let e=0;for(const r of t)e+=r.length;const r=this.segments.prepareSegment(e,this.layoutVertexArray,this.indexArray),i=r.vertexLength,n=[],s=[];for(const e of t){if(0===e.length)continue;e!==t[0]&&s.push(n.length/2);const r=this.segments2.prepareSegment(e.length,this.layoutVertexArray,this.indexArray2),i=r.vertexLength;this.layoutVertexArray.emplaceBack(e[0].x,e[0].y),this.indexArray2.emplaceBack(i+e.length-1,i),n.push(e[0].x),n.push(e[0].y);for(let t=1;t>3;}if(s--,1===i||2===i)a+=t.readSVarint(),o+=t.readSVarint(),1===i&&(e&&l.push(e),e=[]),e.push(new n(a,o));else {if(7!==i)throw new Error("unknown command "+i);e&&e.push(e[0].clone());}}return e&&l.push(e),l},No.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,i=0,n=0,s=0,a=1/0,o=-1/0,l=1/0,u=-1/0;t.pos>3;}if(i--,1===r||2===r)(n+=t.readSVarint())o&&(o=n),(s+=t.readSVarint())u&&(u=s);else if(7!==r)throw new Error("unknown command "+r)}return [a,l,o,u]},No.prototype.toGeoJSON=function(t,e,r){var i,n,s=this.extent*Math.pow(2,r),a=this.extent*t,o=this.extent*e,l=this.loadGeometry(),u=No.types[this.type];function c(t){for(var e=0;e>3;e=1===i?t.readString():2===i?t.readFloat():3===i?t.readDouble():4===i?t.readVarint64():5===i?t.readVarint():6===i?t.readSVarint():7===i?t.readBoolean():null;}return e}(r));}function Ho(t,e,r){if(3===t){var i=new Zo(r,r.readVarint()+r.pos);i.length&&(e[i.name]=i);}}Xo.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new qo(this._pbf,e,this.extent,this._keys,this._values)};var Jo={VectorTile:function(t,e){this.layers=t.readFields(Ho,{},e);},VectorTileFeature:qo,VectorTileLayer:Zo};const Yo=Jo.VectorTileFeature.types,Wo=Math.pow(2,13);function Qo(t,e,r,i,n,s,a,o){t.emplaceBack((e<<1)+a,(r<<1)+s,(Math.floor(i*Wo)<<1)+n,Math.round(o));}class tl{constructor(){this.acc=new n(0,0),this.polyCount=[];}startRing(t){this.currentPolyCount={edges:0,top:0},this.polyCount.push(this.currentPolyCount),this.min||(this.min=new n(t.x,t.y),this.max=new n(t.x,t.y));}append(t,e){this.currentPolyCount.edges++,this.acc._add(t);let r=!!this.borders;const i=this.min,n=this.max;t.xn.x&&(n.x=t.x,r=!0),t.yn.y&&(n.y=t.y,r=!0),((0===t.x||8192===t.x)&&t.x===e.x)!=((0===t.y||8192===t.y)&&t.y===e.y)&&this.processBorderOverlap(t,e),r&&this.checkBorderIntersection(t,e);}checkBorderIntersection(t,e){e.x<0!=t.x<0&&this.addBorderIntersection(0,Qe(e.y,t.y,(0-e.x)/(t.x-e.x))),e.x>8192!=t.x>8192&&this.addBorderIntersection(1,Qe(e.y,t.y,(8192-e.x)/(t.x-e.x))),e.y<0!=t.y<0&&this.addBorderIntersection(2,Qe(e.x,t.x,(0-e.y)/(t.y-e.y))),e.y>8192!=t.y>8192&&this.addBorderIntersection(3,Qe(e.x,t.x,(8192-e.y)/(t.y-e.y)));}addBorderIntersection(t,e){this.borders||(this.borders=[[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE],[Number.MAX_VALUE,-Number.MAX_VALUE]]);const r=this.borders[t];er[1]&&(r[1]=e);}processBorderOverlap(t,e){if(t.x===e.x){if(t.y===e.y)return;const r=0===t.x?0:1;this.addBorderIntersection(r,e.y),this.addBorderIntersection(r,t.y);}else {const r=0===t.y?2:3;this.addBorderIntersection(r,e.x),this.addBorderIntersection(r,t.x);}}centroid(){const t=this.polyCount.reduce((t,e)=>t+e.edges,0);return 0!==t?this.acc.div(t)._round():new n(0,0)}span(){return new n(this.max.x-this.min.x,this.max.y-this.min.y)}intersectsCount(){return this.borders.reduce((t,e)=>t+ +(e[0]!==Number.MAX_VALUE),0)}}class el{constructor(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(t=>t.id),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Un,this.centroidVertexArray=new rs,this.indexArray=new Jn,this.programConfigurations=new Fs(t.layers,t.zoom),this.segments=new qs,this.stateDependentLayerIds=this.layers.filter(t=>t.isStateDependent()).map(t=>t.id),this.enableTerrain=t.enableTerrain;}populate(t,e,r){this.features=[],this.hasPattern=Po("fill-extrusion",this.layers,e),this.featuresOnBorder=[],this.borders=[[],[],[],[]],this.borderDone=[!1,!1,!1,!1],this.tileToMeter=function(t){const e=Math.exp(Math.PI*(1-t.y/(1<t.x<=0)||a.every(t=>t.x>=8192)||a.every(t=>t.y<=0)||a.every(t=>t.y>=8192))continue;for(let t=0;t=1){const r=n[t-1];if(!rl(e,r)){s&&s.append(e,r),i.vertexLength+4>qs.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));const t=e.sub(r)._perp(),n=t.x/(Math.abs(t.x)+Math.abs(t.y)),o=t.y>0?1:0,l=r.dist(e);a+l>32768&&(a=0),Qo(this.layoutVertexArray,e.x,e.y,n,o,0,0,a),Qo(this.layoutVertexArray,e.x,e.y,n,o,0,1,a),a+=l,Qo(this.layoutVertexArray,r.x,r.y,n,o,0,0,a),Qo(this.layoutVertexArray,r.x,r.y,n,o,0,1,a);const u=i.vertexLength;this.indexArray.emplaceBack(u,u+2,u+1),this.indexArray.emplaceBack(u+1,u+2,u+3),i.vertexLength+=4,i.primitiveLength+=2;}}}}if(i.vertexLength+e>qs.MAX_VERTEX_ARRAY_LENGTH&&(i=this.segments.prepareSegment(e,this.layoutVertexArray,this.indexArray)),"Polygon"!==Yo[t.type])continue;const n=[],o=[],l=i.vertexLength;for(let t=0;t0){if(s.borders){s.vertexArrayOffset=this.centroidVertexArray.length;const t=s.borders,e=this.featuresOnBorder.push(s)-1;for(let r=0;r<4;r++)t[r][0]!==Number.MAX_VALUE&&this.borders[r].push(e);}this.encodeCentroid(s.borders?void 0:s.centroid(),s);}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,n,i);}sortBorders(){for(let t=0;t<4;t++)this.borders[t].sort((e,r)=>this.featuresOnBorder[e].borders[t][0]-this.featuresOnBorder[r].borders[t][0]);}encodeCentroid(t,e,r=!0){let i,n;if(t)if(0!==t.y){const r=e.span()._mult(this.tileToMeter);i=(Math.max(t.x,1)<<3)+Math.min(7,Math.round(r.x/10)),n=(Math.max(t.y,1)<<3)+Math.min(7,Math.round(r.y/10));}else i=Math.ceil(7.3*t.x),n=0;else i=0,n=+r;let s=r?this.centroidVertexArray.length:e.vertexArrayOffset;for(const t of e.polyCount){r&&this.centroidVertexArray.resize(this.centroidVertexArray.length+4*t.edges+t.top);for(let e=0;e<2*t.edges;e++)this.centroidVertexArray.emplace(s++,0,n),this.centroidVertexArray.emplace(s++,i,n);for(let e=0;e8192)||t.y===e.y&&(t.y<0||t.y>8192)}Zi("FillExtrusionBucket",el,{omit:["layers","features"]}),Zi("PartMetadata",tl);var il={paint:new Mn({"fill-extrusion-opacity":new In(Lt["paint_fill-extrusion"]["fill-extrusion-opacity"]),"fill-extrusion-color":new Tn(Lt["paint_fill-extrusion"]["fill-extrusion-color"]),"fill-extrusion-translate":new In(Lt["paint_fill-extrusion"]["fill-extrusion-translate"]),"fill-extrusion-translate-anchor":new In(Lt["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),"fill-extrusion-pattern":new zn(Lt["paint_fill-extrusion"]["fill-extrusion-pattern"]),"fill-extrusion-height":new Tn(Lt["paint_fill-extrusion"]["fill-extrusion-height"]),"fill-extrusion-base":new Tn(Lt["paint_fill-extrusion"]["fill-extrusion-base"]),"fill-extrusion-vertical-gradient":new In(Lt["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"])})};function nl(t,e){return t.x*e.x+t.y*e.y}function sl(t,e){if(1===t.length){let r=0;const i=e[r++];let n;for(;!n||i.equals(n);)if(n=e[r++],!n)return 1/0;for(;rt.id),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.lineClipsArray=[],this.gradients={},this.layers.forEach(t=>{this.gradients[t.id]={};}),this.layoutVertexArray=new On,this.layoutVertexArray2=new $n,this.indexArray=new Jn,this.programConfigurations=new Fs(t.layers,t.zoom),this.segments=new qs,this.maxLineLength=0,this.stateDependentLayerIds=this.layers.filter(t=>t.isStateDependent()).map(t=>t.id);}populate(t,e,r){this.hasPattern=Po("line",this.layers,e);const i=this.layers[0].layout.get("line-sort-key"),n=[];for(const{feature:e,id:s,index:a,sourceLayerIndex:o}of t){const t=this.layers[0]._featureFilter.needGeometry,l=Zs(e,t);if(!this.layers[0]._featureFilter.filter(new gn(this.zoom),l,r))continue;const u=i?i.evaluate(l,{},r):void 0,c={id:s,properties:e.properties,type:e.type,sourceLayerIndex:o,index:a,geometry:t?l.geometry:Ks(e),patterns:{},sortKey:u};n.push(c);}i&&n.sort((t,e)=>t.sortKey-e.sortKey);for(const i of n){const{geometry:n,index:s,sourceLayerIndex:a}=i;if(this.hasPattern){const t=Vo("line",this.layers,i,this.zoom,e);this.patternFeatures.push(t);}else this.addFeature(i,n,s,r,{});e.featureIndex.insert(t[s].feature,n,s,a,this.index);}}update(t,e,r){this.stateDependentLayers.length&&this.programConfigurations.updatePaintArrays(t,e,this.stateDependentLayers,r);}addFeatures(t,e,r){for(const t of this.patternFeatures)this.addFeature(t,t.geometry,t.index,e,r);}isEmpty(){return 0===this.layoutVertexArray.length}uploadPending(){return !this.uploaded||this.programConfigurations.needsUpload}upload(t){this.uploaded||(0!==this.layoutVertexArray2.length&&(this.layoutVertexBuffer2=t.createVertexBuffer(this.layoutVertexArray2,ul)),this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,ol),this.indexBuffer=t.createIndexBuffer(this.indexArray)),this.programConfigurations.upload(t),this.uploaded=!0;}destroy(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy());}lineFeatureClips(t){if(t.properties&&t.properties.hasOwnProperty("mapbox_clip_start")&&t.properties.hasOwnProperty("mapbox_clip_end"))return {start:+t.properties.mapbox_clip_start,end:+t.properties.mapbox_clip_end}}addFeature(t,e,r,i,n){const s=this.layers[0].layout,a=s.get("line-join").evaluate(t,{}),o=s.get("line-cap"),l=s.get("line-miter-limit"),u=s.get("line-round-limit");this.lineClips=this.lineFeatureClips(t);for(const r of e)this.addLine(r,t,a,o,l,u);this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,n,i);}addLine(t,e,r,i,n,s){if(this.distance=0,this.scaledDistance=0,this.totalDistance=0,this.lineSoFar=0,this.lineClips){this.lineClipsArray.push(this.lineClips);for(let e=0;e=2&&t[o-1].equals(t[o-2]);)o--;let l=0;for(;l0;if(w&&e>l){const t=h.dist(p);if(t>2*u){const e=h.sub(h.sub(p)._mult(u/t)._round());this.updateDistance(p,e),this.addCurrentVertex(e,f,0,0,c),p=e;}}const A=p&&d;let k=A?r:a?"butt":i;if(A&&"round"===k&&(vn&&(k="bevel"),"bevel"===k&&(v>2&&(k="flipbevel"),v100)m=y.mult(-1);else {const t=v*f.add(y).mag()/f.sub(y).mag();m._perp()._mult(t*(_?-1:1));}this.addCurrentVertex(h,m,0,0,c),this.addCurrentVertex(h,m.mult(-1),0,0,c);}else if("bevel"===k||"fakeround"===k){const t=-Math.sqrt(v*v-1),e=_?t:0,r=_?0:t;if(p&&this.addCurrentVertex(h,f,e,r,c),"fakeround"===k){const t=Math.round(180*b/Math.PI/20);for(let e=1;e2*u){const e=h.add(d.sub(h)._mult(u/t)._round());this.updateDistance(h,e),this.addCurrentVertex(e,y,0,0,c),h=e;}}}}addCurrentVertex(t,e,r,i,n,s=!1){const a=e.y*i-e.x,o=-e.y-e.x*i;this.addHalfVertex(t,e.x+e.y*r,e.y-e.x*r,s,!1,r,n),this.addHalfVertex(t,a,o,s,!0,-i,n);}addHalfVertex({x:t,y:e},r,i,n,s,a,o){this.layoutVertexArray.emplaceBack((t<<1)+(n?1:0),(e<<1)+(s?1:0),Math.round(63*r)+128,Math.round(63*i)+128,1+(0===a?0:a<0?-1:1),0,this.lineSoFar),this.lineClips&&this.layoutVertexArray2.emplaceBack(this.scaledDistance,this.lineClipsArray.length);const l=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,l),o.primitiveLength++),s?this.e2=l:this.e1=l;}updateScaledDistance(){if(this.lineClips){const t=this.totalDistance/(this.lineClips.end-this.lineClips.start);this.scaledDistance=this.distance/this.totalDistance,this.lineSoFar=t*this.lineClips.start+this.distance;}else this.lineSoFar=this.distance;}updateDistance(t,e){this.distance+=t.dist(e),this.updateScaledDistance();}}Zi("LineBucket",pl,{omit:["layers","patternFeatures"]});const dl=new Mn({"line-cap":new In(Lt.layout_line["line-cap"]),"line-join":new Tn(Lt.layout_line["line-join"]),"line-miter-limit":new In(Lt.layout_line["line-miter-limit"]),"line-round-limit":new In(Lt.layout_line["line-round-limit"]),"line-sort-key":new Tn(Lt.layout_line["line-sort-key"])});var fl={paint:new Mn({"line-opacity":new Tn(Lt.paint_line["line-opacity"]),"line-color":new Tn(Lt.paint_line["line-color"]),"line-translate":new In(Lt.paint_line["line-translate"]),"line-translate-anchor":new In(Lt.paint_line["line-translate-anchor"]),"line-width":new Tn(Lt.paint_line["line-width"]),"line-gap-width":new Tn(Lt.paint_line["line-gap-width"]),"line-offset":new Tn(Lt.paint_line["line-offset"]),"line-blur":new Tn(Lt.paint_line["line-blur"]),"line-dasharray":new En(Lt.paint_line["line-dasharray"]),"line-pattern":new zn(Lt.paint_line["line-pattern"]),"line-gradient":new Cn(Lt.paint_line["line-gradient"])}),layout:dl};const yl=new class extends Tn{possiblyEvaluate(t,e){return e=new gn(Math.floor(e.zoom),{now:e.now,fadeDuration:e.fadeDuration,zoomHistory:e.zoomHistory,transition:e.transition}),super.possiblyEvaluate(t,e)}evaluate(t,e,r,i){return e=x({},e,{zoom:Math.floor(e.zoom)}),super.evaluate(t,e,r,i)}}(fl.paint.properties["line-width"].specification);function ml(t,e){return e>0?e+2*t:t}yl.useIntegerZoom=!0;const gl=Fn([{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"},{name:"a_pixeloffset",components:4,type:"Int16"}],4),xl=Fn([{name:"a_projected_pos",components:3,type:"Float32"}],4),vl=(Fn([{name:"a_fade_opacity",components:1,type:"Uint32"}],4),Fn([{name:"a_placed",components:2,type:"Uint8"},{name:"a_shift",components:2,type:"Float32"}])),bl=Fn([{name:"a_size_scale",components:1,type:"Float32"},{name:"a_padding",components:2,type:"Float32"}]),wl=(Fn([{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Float32",name:"x1"},{type:"Float32",name:"y1"},{type:"Float32",name:"x2"},{type:"Float32",name:"y2"},{type:"Int16",name:"padding"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"}]),Fn([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4)),_l=Fn([{name:"a_pos_2f",components:2,type:"Float32"},{name:"a_radius",components:1,type:"Float32"},{name:"a_flags",components:2,type:"Int16"}],4);function Al(t,e){const{expression:r}=e;if("constant"===r.kind)return {kind:"constant",layoutSize:r.evaluate(new gn(t+1))};if("source"===r.kind)return {kind:"source"};{const{zoomStops:e,interpolationType:i}=r;let n=0;for(;n{t.text=function(t,e,r){const i=e.layout.get("text-transform").evaluate(r,{});return "uppercase"===i?t=t.toLocaleUpperCase():"lowercase"===i&&(t=t.toLocaleLowerCase()),mn.applyArabicShaping&&(t=mn.applyArabicShaping(t)),t}(t.text,e,r);}),t}const zl={"!":"︕","#":"#",$:"$","%":"%","&":"&","(":"︵",")":"︶","*":"*","+":"+",",":"︐","-":"︲",".":"・","/":"/",":":"︓",";":"︔","<":"︿","=":"=",">":"﹀","?":"︖","@":"@","[":"﹇","\\":"\","]":"﹈","^":"^",_:"︳","`":"`","{":"︷","|":"―","}":"︸","~":"~","¢":"¢","£":"£","¥":"¥","¦":"¦","¬":"¬","¯":" ̄","–":"︲","—":"︱","‘":"﹃","’":"﹄","“":"﹁","”":"﹂","…":"︙","‧":"・","₩":"₩","、":"︑","。":"︒","〈":"︿","〉":"﹀","《":"︽","》":"︾","「":"﹁","」":"﹂","『":"﹃","』":"﹄","【":"︻","】":"︼","〔":"︹","〕":"︺","〖":"︗","〗":"︘","!":"︕","(":"︵",")":"︶",",":"︐","-":"︲",".":"・",":":"︓",";":"︔","<":"︿",">":"﹀","?":"︖","[":"﹇","]":"﹈","_":"︳","{":"︷","|":"―","}":"︸","⦅":"︵","⦆":"︶","。":"︒","「":"﹁","」":"﹂"};var El=function(t,e,r,i,n){var s,a,o=8*n-i-1,l=(1<>1,c=-7,h=r?n-1:0,p=r?-1:1,d=t[e+h];for(h+=p,s=d&(1<<-c)-1,d>>=-c,c+=o;c>0;s=256*s+t[e+h],h+=p,c-=8);for(a=s&(1<<-c)-1,s>>=-c,c+=i;c>0;a=256*a+t[e+h],h+=p,c-=8);if(0===s)s=1-u;else {if(s===l)return a?NaN:1/0*(d?-1:1);a+=Math.pow(2,i),s-=u;}return (d?-1:1)*a*Math.pow(2,s-i)},Cl=function(t,e,r,i,n,s){var a,o,l,u=8*s-n-1,c=(1<>1,p=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,d=i?0:s-1,f=i?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-a))<1&&(a--,l*=2),(e+=a+h>=1?p/l:p*Math.pow(2,1-h))*l>=2&&(a++,l/=2),a+h>=c?(o=0,a=c):a+h>=1?(o=(e*l-1)*Math.pow(2,n),a+=h):(o=e*Math.pow(2,h-1)*Math.pow(2,n),a=0));n>=8;t[r+d]=255&o,d+=f,o/=256,n-=8);for(a=a<0;t[r+d]=255&a,d+=f,a/=256,u-=8);t[r+d-f]|=128*y;},Ml=Bl;function Bl(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length;}Bl.Varint=0,Bl.Fixed64=1,Bl.Bytes=2,Bl.Fixed32=5;var Dl="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function Pl(t){return t.type===Bl.Bytes?t.readVarint()+t.pos:t.pos+1}function Vl(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Fl(t,e,r){var i=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(i);for(var n=r.pos-1;n>=t;n--)r.buf[n+i]=r.buf[n];}function Rl(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24;}function Gl(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}function Hl(t,e,r){1===t&&r.readMessage(Jl,e);}function Jl(t,e,r){if(3===t){const{id:t,bitmap:i,width:n,height:s,left:a,top:o,advance:l}=r.readMessage(Yl,{});e.push({id:t,bitmap:new Xa({width:n+6,height:s+6},i),metrics:{width:n,height:s,left:a,top:o,advance:l}});}}function Yl(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint());}function Wl(t){let e=0,r=0;for(const i of t)e+=i.w*i.h,r=Math.max(r,i.w);t.sort((t,e)=>e.h-t.h);const i=[{x:0,y:0,w:Math.max(Math.ceil(Math.sqrt(e/.95)),r),h:1/0}];let n=0,s=0;for(const e of t)for(let t=i.length-1;t>=0;t--){const r=i[t];if(!(e.w>r.w||e.h>r.h)){if(e.x=r.x,e.y=r.y,s=Math.max(s,e.y+e.h),n=Math.max(n,e.x+e.w),e.w===r.w&&e.h===r.h){const e=i.pop();t>3,s=this.pos;this.type=7&i,t(n,e,this),this.pos===s&&this.skip(i);}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Zl(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Gl(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Zl(this.buf,this.pos)+4294967296*Zl(this.buf,this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=Zl(this.buf,this.pos)+4294967296*Gl(this.buf,this.pos+4);return this.pos+=8,t},readFloat:function(){var t=El(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=El(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,i=this.buf;return e=127&(r=i[this.pos++]),r<128?e:(e|=(127&(r=i[this.pos++]))<<7,r<128?e:(e|=(127&(r=i[this.pos++]))<<14,r<128?e:(e|=(127&(r=i[this.pos++]))<<21,r<128?e:function(t,e,r){var i,n,s=r.buf;if(i=(112&(n=s[r.pos++]))>>4,n<128)return Vl(t,i,e);if(i|=(127&(n=s[r.pos++]))<<3,n<128)return Vl(t,i,e);if(i|=(127&(n=s[r.pos++]))<<10,n<128)return Vl(t,i,e);if(i|=(127&(n=s[r.pos++]))<<17,n<128)return Vl(t,i,e);if(i|=(127&(n=s[r.pos++]))<<24,n<128)return Vl(t,i,e);if(i|=(1&(n=s[r.pos++]))<<31,n<128)return Vl(t,i,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(r=i[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Dl?function(t,e,r){return Dl.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var i="",n=e;n239?4:l>223?3:l>191?2:1;if(n+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(s=t[n+1]))&&(u=(31&l)<<6|63&s)<=127&&(u=null):3===c?(a=t[n+2],128==(192&(s=t[n+1]))&&128==(192&a)&&((u=(15&l)<<12|(63&s)<<6|63&a)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(a=t[n+2],o=t[n+3],128==(192&(s=t[n+1]))&&128==(192&a)&&128==(192&o)&&((u=(15&l)<<18|(63&s)<<12|(63&a)<<6|63&o)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,i+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),i+=String.fromCharCode(u),n+=c;}return i}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==Bl.Bytes)return t.push(this.readVarint(e));var r=Pl(this);for(t=t||[];this.pos127;);else if(e===Bl.Bytes)this.pos=this.readVarint()+this.pos;else if(e===Bl.Fixed32)this.pos+=4;else {if(e!==Bl.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8;}},writeTag:function(t,e){this.writeVarint(t<<3|e);},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,i;if(t>=0?(r=t%4294967296|0,i=t/4294967296|0):(i=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,i=i+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,r.buf[r.pos]=127&(t>>>=7);}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))));}(i,e);}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))));},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t);},writeBoolean:function(t){this.writeVarint(Boolean(t));},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var i,n,s=0;s55295&&i<57344){if(!n){i>56319||s+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):n=i;continue}if(i<56320){t[r++]=239,t[r++]=191,t[r++]=189,n=i;continue}i=n-55296<<10|i-56320|65536,n=null;}else n&&(t[r++]=239,t[r++]=191,t[r++]=189,n=null);i<128?t[r++]=i:(i<2048?t[r++]=i>>6|192:(i<65536?t[r++]=i>>12|224:(t[r++]=i>>18|240,t[r++]=i>>12&63|128),t[r++]=i>>6&63|128),t[r++]=63&i|128);}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&Fl(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r;},writeFloat:function(t){this.realloc(4),Cl(this.buf,t,this.pos,!0,23,4),this.pos+=4;},writeDouble:function(t){this.realloc(8),Cl(this.buf,t,this.pos,!0,52,8),this.pos+=8;},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&Fl(r,i,this),this.pos=r-1,this.writeVarint(i),this.pos+=i;},writeMessage:function(t,e,r){this.writeTag(t,Bl.Bytes),this.writeRawMessage(e,r);},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,Rl,e);},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,Ll,e);},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,$l,e);},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,Ul,e);},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,Ol,e);},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,ql,e);},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Nl,e);},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,jl,e);},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Kl,e);},writeBytesField:function(t,e){this.writeTag(t,Bl.Bytes),this.writeBytes(e);},writeFixed32Field:function(t,e){this.writeTag(t,Bl.Fixed32),this.writeFixed32(e);},writeSFixed32Field:function(t,e){this.writeTag(t,Bl.Fixed32),this.writeSFixed32(e);},writeFixed64Field:function(t,e){this.writeTag(t,Bl.Fixed64),this.writeFixed64(e);},writeSFixed64Field:function(t,e){this.writeTag(t,Bl.Fixed64),this.writeSFixed64(e);},writeVarintField:function(t,e){this.writeTag(t,Bl.Varint),this.writeVarint(e);},writeSVarintField:function(t,e){this.writeTag(t,Bl.Varint),this.writeSVarint(e);},writeStringField:function(t,e){this.writeTag(t,Bl.Bytes),this.writeString(e);},writeFloatField:function(t,e){this.writeTag(t,Bl.Fixed32),this.writeFloat(e);},writeDoubleField:function(t,e){this.writeTag(t,Bl.Fixed64),this.writeDouble(e);},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e));}};class Ql{constructor(t,{pixelRatio:e,version:r,stretchX:i,stretchY:n,content:s}){this.paddedRect=t,this.pixelRatio=e,this.stretchX=i,this.stretchY=n,this.content=s,this.version=r;}get tl(){return [this.paddedRect.x+1,this.paddedRect.y+1]}get br(){return [this.paddedRect.x+this.paddedRect.w-1,this.paddedRect.y+this.paddedRect.h-1]}get tlbr(){return this.tl.concat(this.br)}get displaySize(){return [(this.paddedRect.w-2)/this.pixelRatio,(this.paddedRect.h-2)/this.pixelRatio]}}class tu{constructor(t,e){const r={},i={};this.haveRenderCallbacks=[];const n=[];this.addImages(t,r,n),this.addImages(e,i,n);const{w:s,h:a}=Wl(n),o=new Ga({width:s||1,height:a||1});for(const e in t){const i=t[e],n=r[e].paddedRect;Ga.copy(i.data,o,{x:0,y:0},{x:n.x+1,y:n.y+1},i.data);}for(const t in e){const r=e[t],n=i[t].paddedRect,s=n.x+1,a=n.y+1,l=r.data.width,u=r.data.height;Ga.copy(r.data,o,{x:0,y:0},{x:s,y:a},r.data),Ga.copy(r.data,o,{x:0,y:u-1},{x:s,y:a-1},{width:l,height:1}),Ga.copy(r.data,o,{x:0,y:0},{x:s,y:a+u},{width:l,height:1}),Ga.copy(r.data,o,{x:l-1,y:0},{x:s-1,y:a},{width:1,height:u}),Ga.copy(r.data,o,{x:0,y:0},{x:s+l,y:a},{width:1,height:u});}this.image=o,this.iconPositions=r,this.patternPositions=i;}addImages(t,e,r){for(const i in t){const n=t[i],s={x:0,y:0,w:n.data.width+2,h:n.data.height+2};r.push(s),e[i]=new Ql(s,n),n.hasRenderCallback&&this.haveRenderCallbacks.push(i);}}patchUpdatedImages(t,e){t.dispatchRenderCallbacks(this.haveRenderCallbacks);for(const r in t.updatedImages)this.patchUpdatedImage(this.iconPositions[r],t.getImage(r),e),this.patchUpdatedImage(this.patternPositions[r],t.getImage(r),e);}patchUpdatedImage(t,e,r){if(!t||!e)return;if(t.version===e.version)return;t.version=e.version;const[i,n]=t.tl;r.update(e.data,void 0,{x:i,y:n});}}Zi("ImagePosition",Ql),Zi("ImageAtlas",tu);const eu={horizontal:1,vertical:2,horizontalOnly:3};class ru{constructor(){this.scale=1,this.fontStack="",this.imageName=null;}static forText(t,e){const r=new ru;return r.scale=t||1,r.fontStack=e,r}static forImage(t){const e=new ru;return e.imageName=t,e}}class iu{constructor(){this.text="",this.sectionIndex=[],this.sections=[],this.imageSectionID=null;}static fromFeature(t,e){const r=new iu;for(let i=0;i=0&&r>=t&&su[this.text.charCodeAt(r)];r--)e--;this.text=this.text.substring(t,e),this.sectionIndex=this.sectionIndex.slice(t,e);}substring(t,e){const r=new iu;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r}toString(){return this.text}getMaxScale(){return this.sectionIndex.reduce((t,e)=>Math.max(t,this.sections[e].scale),0)}addTextSection(t,e){this.text+=t.text,this.sections.push(ru.forText(t.scale,t.fontStack||e));const r=this.sections.length-1;for(let e=0;e=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)}}function nu(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y){const m=iu.fromFeature(t,n);let g;h===eu.vertical&&m.verticalizePunctuation();const{processBidirectionalText:x,processStyledBidirectionalText:v}=mn;if(x&&1===m.sections.length){g=[];const t=x(m.toString(),hu(m,u,s,e,i,d,f));for(const e of t){const t=new iu;t.text=e,t.sections=m.sections;for(let r=0;r0&&s>w&&(w=s);}else {const t=r[f.fontStack],i=t&&t[m];if(i&&i.rect)_=i.rect,v=i.metrics;else {const t=e[f.fontStack],r=t&&t[m];if(!r)continue;v=r.metrics;}g=24*(n-f.scale);}S?(t.verticalizable=!0,b.push({glyph:m,imageName:A,x:p,y:d+g,vertical:S,scale:f.scale,fontStack:f.fontStack,sectionIndex:y,metrics:v,rect:_}),p+=k*f.scale+u):(b.push({glyph:m,imageName:A,x:p,y:d+g,vertical:S,scale:f.scale,fontStack:f.fontStack,sectionIndex:y,metrics:v,rect:_}),p+=v.advance*f.scale+u);}0!==b.length&&(f=Math.max(p-u,f),du(b,0,b.length-1,m,w)),p=0;const _=s*n+w;v.lineOffset=Math.max(w,o),d+=_,y=Math.max(_,y),++g;}var x;const v=d- -17,{horizontalAlign:b,verticalAlign:w}=pu(a);(function(t,e,r,i,n,s,a,o,l){const u=(e-r)*n;let c=0;c=s!==a?-o*i- -17:(-i*l+.5)*a;for(const e of t)for(const t of e.positionedGlyphs)t.x+=u,t.y+=c;})(t.positionedLines,m,b,w,f,y,s,v,n.length),t.top+=-w*v,t.bottom=t.top+v,t.left+=-b*f,t.right=t.left+f;}(w,e,r,i,g,a,o,l,h,u,p,y),!function(t){for(const e of t)if(0!==e.positionedGlyphs.length)return !1;return !0}(b)&&w}const su={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},au={10:!0,32:!0,38:!0,40:!0,41:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0,8231:!0};function ou(t,e,r,i,n,s){if(e.imageName){const t=i[e.imageName];return t?t.displaySize[0]*e.scale*24/s+n:0}{const i=r[e.fontStack],s=i&&i[t];return s?s.metrics.advance*e.scale+n:0}}function lu(t,e,r,i){const n=Math.pow(t-e,2);return i?t=0;let c=0;for(let r=0;r-r/2;){if(a--,a<0)return !1;o-=t[a].dist(s),s=t[a];}o+=t[a].dist(t[a+1]),a++;const l=[];let u=0;for(;oi;)u-=l.shift().angleDelta;if(u>n)return !1;a++,o+=e.dist(r);}return !0}function xu(t){let e=0;for(let r=0;ru){const c=(u-l)/s,h=Qe(i.x,n.x,c),p=Qe(i.y,n.y,c),d=new mu(h,p,n.angleTo(i),r);return d._round(),!a||gu(t,d,o,a,e)?d:void 0}l+=s;}}function _u(t,e,r,i,n,s,a,o,l){const u=vu(i,s,a),c=bu(i,n),h=c*a,p=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-h=0&&g=0&&x=0&&d+c<=h){const r=new mu(g,x,y,t);r._round(),n&&!gu(e,r,a,n,s)||f.push(r);}}p+=l;}return l||f.length||o||(f=t(e,p/2,i,n,s,a,o,!0,u)),f}(t,p?e/2*o%e:(c/2+2*s)*a*o%e,e,u,r,h,p,!1,l)}function Au(t,e,r,i,s){const a=[];for(let o=0;o=i&&c.x>=i||(o.x>=i?o=new n(i,o.y+(i-o.x)/(c.x-o.x)*(c.y-o.y))._round():c.x>=i&&(c=new n(i,o.y+(i-o.x)/(c.x-o.x)*(c.y-o.y))._round()),o.y>=s&&c.y>=s||(o.y>=s?o=new n(o.x+(s-o.y)/(c.y-o.y)*(c.x-o.x),s)._round():c.y>=s&&(c=new n(o.x+(s-o.y)/(c.y-o.y)*(c.x-o.x),s)._round()),u&&o.equals(u[u.length-1])||(u=[o],a.push(u)),u.push(c)))));}}return a}function ku(t,e,r,i){const s=[],a=t.image,o=a.pixelRatio,l=a.paddedRect.w-2,u=a.paddedRect.h-2,c=t.right-t.left,h=t.bottom-t.top,p=a.stretchX||[[0,l]],d=a.stretchY||[[0,u]],f=(t,e)=>t+e[1]-e[0],y=p.reduce(f,0),m=d.reduce(f,0),g=l-y,x=u-m;let v=0,b=y,w=0,_=m,A=0,k=g,S=0,I=x;if(a.content&&i){const t=a.content;v=Su(p,0,t[0]),w=Su(d,0,t[1]),b=Su(p,t[0],t[2]),_=Su(d,t[1],t[3]),A=t[0]-v,S=t[1]-w,k=t[2]-t[0]-b,I=t[3]-t[1]-_;}const T=(i,s,l,u)=>{const p=Tu(i.stretch-v,b,c,t.left),d=zu(i.fixed-A,k,i.stretch,y),f=Tu(s.stretch-w,_,h,t.top),g=zu(s.fixed-S,I,s.stretch,m),x=Tu(l.stretch-v,b,c,t.left),T=zu(l.fixed-A,k,l.stretch,y),z=Tu(u.stretch-w,_,h,t.top),E=zu(u.fixed-S,I,u.stretch,m),C=new n(p,f),M=new n(x,f),B=new n(x,z),D=new n(p,z),P=new n(d/o,g/o),V=new n(T/o,E/o),F=e*Math.PI/180;if(F){const t=Math.sin(F),e=Math.cos(F),r=[e,-t,t,e];C._matMult(r),M._matMult(r),D._matMult(r),B._matMult(r);}const R=i.stretch+i.fixed,L=s.stretch+s.fixed;return {tl:C,tr:M,bl:D,br:B,tex:{x:a.paddedRect.x+1+R,y:a.paddedRect.y+1+L,w:l.stretch+l.fixed-R,h:u.stretch+u.fixed-L},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:P,pixelOffsetBR:V,minFontScaleX:k/o/c,minFontScaleY:I/o/h,isSDF:r}};if(i&&(a.stretchX||a.stretchY)){const t=Iu(p,g,y),e=Iu(d,x,m);for(let r=0;r0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t);}push(t){this.data.push(t),this.length++,this._up(this.length-1);}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,i=e[t];for(;t>0;){const n=t-1>>1,s=e[n];if(r(i,s)>=0)break;e[t]=s,t=n;}e[t]=i;}_down(t){const{data:e,compare:r}=this,i=this.length>>1,n=e[t];for(;t=0)break;e[t]=s,t=i;}e[t]=n;}}function Cu(t,e){return te?1:0}function Mu(t,e=1,r=!1){let i=1/0,s=1/0,a=-1/0,o=-1/0;const l=t[0];for(let t=0;ta)&&(a=e.x),(!t||e.y>o)&&(o=e.y);}const u=Math.min(a-i,o-s);let c=u/2;const h=new Eu([],Bu);if(0===u)return new n(i,s);for(let e=i;ep.d||!p.d)&&(p=i,r&&console.log("found best %d after %d probes",Math.round(1e4*i.d)/1e4,d)),i.max-p.d<=e||(c=i.h/2,h.push(new Du(i.p.x-c,i.p.y-c,c,t)),h.push(new Du(i.p.x+c,i.p.y-c,c,t)),h.push(new Du(i.p.x-c,i.p.y+c,c,t)),h.push(new Du(i.p.x+c,i.p.y+c,c,t)),d+=4);}return r&&(console.log(`num probes: ${d}`),console.log(`best distance: ${p.d}`)),p.p}function Bu(t,e){return e.max-t.max}function Du(t,e,r,i){this.p=new n(t,e),this.h=r,this.d=function(t,e){let r=!1,i=1/0;for(let n=0;nt.y!=o.y>t.y&&t.x<(o.x-n.x)*(t.y-n.y)/(o.y-n.y)+n.x&&(r=!r),i=Math.min(i,ra(t,n,o));}}return (r?1:-1)*Math.sqrt(i)}(this.p,i),this.max=this.d+this.h*Math.SQRT2;}const Pu=Number.POSITIVE_INFINITY;function Vu(t,e){return e[1]!==Pu?function(t,e,r){let i=0,n=0;switch(e=Math.abs(e),r=Math.abs(r),t){case"top-right":case"top-left":case"top":n=r-7;break;case"bottom-right":case"bottom-left":case"bottom":n=7-r;}switch(t){case"top-right":case"bottom-right":case"right":i=-e;break;case"top-left":case"bottom-left":case"left":i=e;}return [i,n]}(t,e[0],e[1]):function(t,e){let r=0,i=0;e<0&&(e=0);const n=e/Math.sqrt(2);switch(t){case"top-right":case"top-left":i=n-7;break;case"bottom-right":case"bottom-left":i=7-n;break;case"bottom":i=7-e;break;case"top":i=e-7;}switch(t){case"top-right":case"bottom-right":r=-n;break;case"top-left":case"bottom-left":r=n;break;case"left":r=e;break;case"right":r=-e;}return [r,i]}(t,e[0])}function Fu(t,e,r,i,n,s,a,o){t.createArrays(),t.tilePixelRatio=8192/(512*t.overscaling),t.compareText={},t.iconsNeedLinear=!1;const l=t.layers[0].layout,u=t.layers[0]._unevaluatedLayout._values,c={};if("composite"===t.textSizeData.kind){const{minZoom:e,maxZoom:r}=t.textSizeData;c.compositeTextSizes=[u["text-size"].possiblyEvaluate(new gn(e),a),u["text-size"].possiblyEvaluate(new gn(r),a)];}if("composite"===t.iconSizeData.kind){const{minZoom:e,maxZoom:r}=t.iconSizeData;c.compositeIconSizes=[u["icon-size"].possiblyEvaluate(new gn(e),a),u["icon-size"].possiblyEvaluate(new gn(r),a)];}c.layoutTextSize=u["text-size"].possiblyEvaluate(new gn(o+1),a),c.layoutIconSize=u["icon-size"].possiblyEvaluate(new gn(o+1),a),c.textMaxSize=u["text-size"].possiblyEvaluate(new gn(18),a);const h=24*l.get("text-line-height"),p="map"===l.get("text-rotation-alignment")&&"point"!==l.get("symbol-placement"),d=l.get("text-keep-upright"),f=l.get("text-size");for(const s of t.features){const o=l.get("text-font").evaluate(s,{},a).join(","),u=f.evaluate(s,{},a),y=c.layoutTextSize.evaluate(s,{},a),m=(c.layoutIconSize.evaluate(s,{},a),{horizontal:{},vertical:void 0}),g=s.text;let x,v=[0,0];if(g){const i=g.toString(),c=24*l.get("text-letter-spacing").evaluate(s,{},a),f=tn(i)?c:0,x=l.get("text-anchor").evaluate(s,{},a),b=l.get("text-variable-anchor");if(!b){const t=l.get("text-radial-offset").evaluate(s,{},a);v=t?Vu(x,[24*t,Pu]):l.get("text-offset").evaluate(s,{},a).map(t=>24*t);}let w=p?"center":l.get("text-justify").evaluate(s,{},a);const _=l.get("symbol-placement"),A="point"===_?24*l.get("text-max-width").evaluate(s,{},a):0,k=()=>{t.allowVerticalPlacement&&Qi(i)&&(m.vertical=nu(g,e,r,n,o,A,h,x,"left",f,v,eu.vertical,!0,_,y,u));};if(!p&&b){const t="auto"===w?b.map(t=>Ru(t)):[w];let i=!1;for(let s=0;s{h.x<0||h.x>=8192||h.y<0||h.y>=8192||function(t,e,r,i,n,s,a,o,l,u,c,h,p,d,f,y,m,g,x,v,b,w,_,A,k){const S=t.addToLineVertexArray(e,r);let I,T,z,C,M,B,D,P=0,V=0,F=0,R=0,L=-1,U=-1;const O={};let $=xs(""),q=0,N=0;if(void 0===o._unevaluatedLayout.getValue("text-radial-offset")?[q,N]=o.layout.get("text-offset").evaluate(b,{},A).map(t=>24*t):(q=24*o.layout.get("text-radial-offset").evaluate(b,{},A),N=Pu),t.allowVerticalPlacement&&i.vertical){const t=i.vertical;if(f)B=qu(t),a&&(D=qu(a));else {const r=o.layout.get("text-rotate").evaluate(b,{},A)+90;z=$u(l,e,u,c,h,t,0,d,r),a&&(C=$u(l,e,u,c,h,a,0,g,r));}}if(n){const r=o.layout.get("icon-rotate").evaluate(b,{},A),i="none"!==o.layout.get("icon-text-fit"),s=ku(n,r,_,i),p=a?ku(a,r,_,i):void 0;T=$u(l,e,u,c,h,n,0,g,r),P=4*s.length;const d=t.iconSizeData;let f=null;"source"===d.kind?(f=[128*o.layout.get("icon-size").evaluate(b,{},A)],f[0]>32640&&E(`${t.layerIds[0]}: Value for "icon-size" is >= 255. Reduce your "icon-size".`)):"composite"===d.kind&&(f=[128*w.compositeIconSizes[0].evaluate(b,{},A),128*w.compositeIconSizes[1].evaluate(b,{},A)],(f[0]>32640||f[1]>32640)&&E(`${t.layerIds[0]}: Value for "icon-size" is >= 255. Reduce your "icon-size".`)),t.addSymbols(t.icon,s,f,v,x,b,!1,e,S.lineStartIndex,S.lineLength,-1,A),L=t.icon.placedSymbolArray.length-1,p&&(V=4*p.length,t.addSymbols(t.icon,p,f,v,x,b,eu.vertical,e,S.lineStartIndex,S.lineLength,-1,A),U=t.icon.placedSymbolArray.length-1);}for(const r in i.horizontal){const n=i.horizontal[r];I||($=xs(n.text),f?M=qu(n):I=$u(l,e,u,c,h,n,0,d,o.layout.get("text-rotate").evaluate(b,{},A)));const a=1===n.positionedLines.length;if(F+=Uu(t,e,n,s,o,f,b,y,S,i.vertical?eu.horizontal:eu.horizontalOnly,a?Object.keys(i.horizontal):[r],O,L,w,A),a)break}i.vertical&&(R+=Uu(t,e,i.vertical,s,o,f,b,y,S,eu.vertical,["vertical"],O,U,w,A));let j=-1;const K=(t,e)=>t?Math.max(t,e):e;j=K(M,j),j=K(B,j),j=K(D,j);const Z=j>-1?1:0;Z&&(j*=k/24),t.glyphOffsetArray.length>=Yu.MAX_GLYPHS&&E("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),void 0!==b.sortKey&&t.addToSortKeyRanges(t.symbolInstances.length,b.sortKey),t.symbolInstances.emplaceBack(e.x,e.y,O.right>=0?O.right:-1,O.center>=0?O.center:-1,O.left>=0?O.left:-1,O.vertical||-1,L,U,$,void 0!==I?I:t.collisionBoxArray.length,void 0!==I?I+1:t.collisionBoxArray.length,void 0!==z?z:t.collisionBoxArray.length,void 0!==z?z+1:t.collisionBoxArray.length,void 0!==T?T:t.collisionBoxArray.length,void 0!==T?T+1:t.collisionBoxArray.length,C||t.collisionBoxArray.length,C?C+1:t.collisionBoxArray.length,u,F,R,P,V,Z,0,p,q,N,j);}(t,h,o,r,i,n,z,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,g,b,A,l,0,w,k,f,e,s,u,c,a);};if("line"===S)for(const n of Au(e.geometry,0,0,8192,8192)){const e=_u(n,v,_,r.vertical||y,i,24,x,t.overscaling,8192);for(const r of e){const e=y;e&&Nu(t,e.text,I,r)||C(n,r);}}else if("line-center"===S){for(const t of e.geometry)if(t.length>1){const e=wu(t,_,r.vertical||y,i,24,x);e&&C(t,e);}}else if("Polygon"===e.type)for(const t of Bo(e.geometry,0)){const e=Mu(t,16);C(t[0],new mu(e.x,e.y,0));}else if("LineString"===e.type)for(const t of e.geometry)C(t,new mu(t[0].x,t[0].y,0));else if("Point"===e.type)for(const t of e.geometry)for(const e of t)C([e],new mu(e.x,e.y,0));}function Uu(t,e,r,i,s,a,o,l,u,c,h,p,d,f,y){const m=function(t,e,r,i,s,a,o,l){const u=i.layout.get("text-rotate").evaluate(a,{})*Math.PI/180,c=[];for(const t of e.positionedLines)for(const i of t.positionedGlyphs){if(!i.rect)continue;const a=i.rect||{};let h=4,p=!0,d=1,f=0;const y=(s||l)&&i.vertical,m=i.metrics.advance*i.scale/2;if(l&&e.verticalizable){const e=24*(i.scale-1),r=(24-i.metrics.width*i.scale)/2;f=t.lineOffset/2-(i.imageName?-r:e);}if(i.imageName){const t=o[i.imageName];p=t.sdf,d=t.pixelRatio,h=1/d;}const g=s?[i.x+m,i.y]:[0,0];let x=s?[0,0]:[i.x+m+r[0],i.y+r[1]-f],v=[0,0];y&&(v=x,x=[0,0]);const b=(i.metrics.left-h)*i.scale-m+x[0],w=(-i.metrics.top-h)*i.scale+x[1],_=b+a.w*i.scale/d,A=w+a.h*i.scale/d,k=new n(b,w),S=new n(_,w),I=new n(b,A),T=new n(_,A);if(y){const t=new n(-m,m- -17),e=-Math.PI/2,r=12-m,s=new n(22-r,-(i.imageName?r:0)),a=new n(...v);k._rotateAround(e,t)._add(s)._add(a),S._rotateAround(e,t)._add(s)._add(a),I._rotateAround(e,t)._add(s)._add(a),T._rotateAround(e,t)._add(s)._add(a);}if(u){const t=Math.sin(u),e=Math.cos(u),r=[e,-t,t,e];k._matMult(r),S._matMult(r),I._matMult(r),T._matMult(r);}const z=new n(0,0),E=new n(0,0);c.push({tl:k,tr:S,bl:I,br:T,tex:a,writingMode:e.writingMode,glyphOffset:g,sectionIndex:i.sectionIndex,isSDF:p,pixelOffsetTL:z,pixelOffsetBR:E,minFontScaleX:0,minFontScaleY:0});}return c}(0,r,l,s,a,o,i,t.allowVerticalPlacement),g=t.textSizeData;let x=null;"source"===g.kind?(x=[128*s.layout.get("text-size").evaluate(o,{},y)],x[0]>32640&&E(`${t.layerIds[0]}: Value for "text-size" is >= 255. Reduce your "text-size".`)):"composite"===g.kind&&(x=[128*f.compositeTextSizes[0].evaluate(o,{},y),128*f.compositeTextSizes[1].evaluate(o,{},y)],(x[0]>32640||x[1]>32640)&&E(`${t.layerIds[0]}: Value for "text-size" is >= 255. Reduce your "text-size".`)),t.addSymbols(t.text,m,x,l,a,o,c,e,u.lineStartIndex,u.lineLength,d,y);for(const e of h)p[e]=t.text.placedSymbolArray.length-1;return 4*m.length}function Ou(t){for(const e in t)return t[e];return null}function $u(t,e,r,i,s,a,o,l,u){let c=a.top,p=a.bottom,d=a.left,f=a.right;const y=a.collisionPadding;if(y&&(d-=y[0],c-=y[1],f+=y[2],p+=y[3]),u){const t=new n(d,c),e=new n(f,c),r=new n(d,p),i=new n(f,p),s=h(u);t._rotate(s),e._rotate(s),r._rotate(s),i._rotate(s),d=Math.min(t.x,e.x,r.x,i.x),f=Math.max(t.x,e.x,r.x,i.x),c=Math.min(t.y,e.y,r.y,i.y),p=Math.max(t.y,e.y,r.y,i.y);}return t.emplaceBack(e.x,e.y,d,c,f,p,l,r,i,s),t.length-1}function qu(t){t.collisionPadding&&(t.top-=t.collisionPadding[1],t.bottom+=t.collisionPadding[3]);const e=t.bottom-t.top;return e>0?Math.max(10,e):null}function Nu(t,e,r,i){const n=t.compareText;if(e in n){const t=n[e];for(let e=t.length-1;e>=0;e--)if(i.dist(t[e])t.id),this.index=t.index,this.pixelRatio=t.pixelRatio,this.sourceLayerIndex=t.sourceLayerIndex,this.hasPattern=!1,this.hasRTLText=!1,this.sortKeyRanges=[],this.collisionCircleArray=[],this.placementInvProjMatrix=ya([]),this.placementViewportMatrix=ya([]);const e=this.layers[0]._unevaluatedLayout._values;this.textSizeData=Al(this.zoom,e["text-size"]),this.iconSizeData=Al(this.zoom,e["icon-size"]);const r=this.layers[0].layout,i=r.get("symbol-sort-key"),n=r.get("symbol-z-order");this.canOverlap=r.get("text-allow-overlap")||r.get("icon-allow-overlap")||r.get("text-ignore-placement")||r.get("icon-ignore-placement"),this.sortFeaturesByKey="viewport-y"!==n&&void 0!==i.constantOr(1),this.sortFeaturesByY=("viewport-y"===n||"auto"===n&&!this.sortFeaturesByKey)&&this.canOverlap,"point"===r.get("symbol-placement")&&(this.writingModes=r.get("text-writing-mode").map(t=>eu[t])),this.stateDependentLayerIds=this.layers.filter(t=>t.isStateDependent()).map(t=>t.id),this.sourceID=t.sourceID;}createArrays(){this.text=new Hu(new Fs(this.layers,this.zoom,t=>/^text/.test(t))),this.icon=new Hu(new Fs(this.layers,this.zoom,t=>/^icon/.test(t))),this.glyphOffsetArray=new hs,this.lineVertexArray=new ps,this.symbolInstances=new cs;}calculateGlyphDependencies(t,e,r,i,n){for(let s=0;s0)&&("constant"!==s.value.kind||s.value.value.length>0),u="constant"!==o.value.kind||!!o.value.value||Object.keys(o.parameters).length>0,c=n.get("symbol-sort-key");if(this.features=[],!l&&!u)return;const h=e.iconDependencies,p=e.glyphDependencies,d=e.availableImages,f=new gn(this.zoom);for(const{feature:e,id:a,index:o,sourceLayerIndex:y}of t){const t=i._featureFilter.needGeometry,m=Zs(e,t);if(!i._featureFilter.filter(f,m,r))continue;let g,x;if(t||(m.geometry=Ks(e)),l){const t=i.getValueAndResolveTokens("text-field",m,r,d),e=pe.factory(t);Gu(e)&&(this.hasRTLText=!0),(!this.hasRTLText||"unavailable"===fn()||this.hasRTLText&&mn.isParsed())&&(g=Tl(e,i,m));}if(u){const t=i.getValueAndResolveTokens("icon-image",m,r,d);x=t instanceof de?t:de.fromString(t);}if(!g&&!x)continue;const v=this.sortFeaturesByKey?c.evaluate(m,{},r):void 0;if(this.features.push({id:a,text:g,icon:x,index:o,sourceLayerIndex:y,geometry:m.geometry,properties:e.properties,type:ju[e.type],sortKey:v}),x&&(h[x.name]=!0),g){const t=s.evaluate(m,{},r).join(","),e="map"===n.get("text-rotation-alignment")&&"point"!==n.get("symbol-placement");this.allowVerticalPlacement=this.writingModes&&this.writingModes.indexOf(eu.vertical)>=0;for(const r of g.sections)if(r.image)h[r.image.name]=!0;else {const i=Qi(g.toString()),n=r.fontStack||t,s=p[n]=p[n]||{};this.calculateGlyphDependencies(r.text,s,e,this.allowVerticalPlacement,i);}}}"line"===n.get("symbol-placement")&&(this.features=function(t){const e={},r={},i=[];let n=0;function s(e){i.push(t[e]),n++;}function a(t,e,n){const s=r[t];return delete r[t],r[e]=s,i[s].geometry[0].pop(),i[s].geometry[0]=i[s].geometry[0].concat(n[0]),s}function o(t,r,n){const s=e[r];return delete e[r],e[t]=s,i[s].geometry[0].shift(),i[s].geometry[0]=n[0].concat(i[s].geometry[0]),s}function l(t,e,r){const i=r?e[0][e[0].length-1]:e[0][0];return `${t}:${i.x}:${i.y}`}for(let u=0;ut.geometry)}(this.features)),this.sortFeaturesByKey&&this.features.sort((t,e)=>t.sortKey-e.sortKey);}update(t,e,r){this.stateDependentLayers.length&&(this.text.programConfigurations.updatePaintArrays(t,e,this.layers,r),this.icon.programConfigurations.updatePaintArrays(t,e,this.layers,r));}isEmpty(){return 0===this.symbolInstances.length&&!this.hasRTLText}uploadPending(){return !this.uploaded||this.text.programConfigurations.needsUpload||this.icon.programConfigurations.needsUpload}upload(t){!this.uploaded&&this.hasDebugData()&&(this.textCollisionBox.upload(t),this.iconCollisionBox.upload(t)),this.text.upload(t,this.sortFeaturesByY,!this.uploaded,this.text.programConfigurations.needsUpload),this.icon.upload(t,this.sortFeaturesByY,!this.uploaded,this.icon.programConfigurations.needsUpload),this.uploaded=!0;}destroyDebugData(){this.textCollisionBox.destroy(),this.iconCollisionBox.destroy();}destroy(){this.text.destroy(),this.icon.destroy(),this.hasDebugData()&&this.destroyDebugData();}addToLineVertexArray(t,e){const r=this.lineVertexArray.length;if(void 0!==t.segment){let r=t.dist(e[t.segment+1]),i=t.dist(e[t.segment]);const n={};for(let i=t.segment+1;i=0;r--)n[r]={x:e[r].x,y:e[r].y,tileUnitDistanceFromAnchor:i},r>0&&(i+=e[r-1].dist(e[r]));for(let t=0;t=0?e.rightJustifiedTextSymbolIndex:e.centerJustifiedTextSymbolIndex>=0?e.centerJustifiedTextSymbolIndex:e.leftJustifiedTextSymbolIndex>=0?e.leftJustifiedTextSymbolIndex:e.verticalPlacedTextSymbolIndex>=0?e.verticalPlacedTextSymbolIndex:i),s=kl(this.textSizeData,t,n)/24;return this.tilePixelRatio*s}getSymbolInstanceIconSize(t,e,r){const i=this.icon.placedSymbolArray.get(r),n=kl(this.iconSizeData,t,i);return this.tilePixelRatio*n}_commitDebugCollisionVertexUpdate(t,e,r){t.emplaceBack(e,-r,-r),t.emplaceBack(e,r,-r),t.emplaceBack(e,r,r),t.emplaceBack(e,-r,r);}_updateTextDebugCollisionBoxes(t,e,r,i,n,s){for(let a=i;a0}hasIconData(){return this.icon.segments.get().length>0}hasDebugData(){return this.textCollisionBox&&this.iconCollisionBox}hasTextCollisionBoxData(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0}hasIconCollisionBoxData(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0}addIndicesForPlacedSymbol(t,e){const r=t.placedSymbolArray.get(e),i=r.vertexStartIndex+4*r.numGlyphs;for(let e=r.vertexStartIndex;ei[t]-i[e]||n[e]-n[t]),s}addToSortKeyRanges(t,e){const r=this.sortKeyRanges[this.sortKeyRanges.length-1];r&&r.sortKey===e?r.symbolInstanceEnd=t+1:this.sortKeyRanges.push({sortKey:e,symbolInstanceStart:t,symbolInstanceEnd:t+1});}sortFeatures(t){if(this.sortFeaturesByY&&this.sortedAngle!==t&&!(this.text.segments.get().length>1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(const t of this.symbolInstanceIndexes){const e=this.symbolInstances.get(t);this.featureSortOrder.push(e.featureIndex),[e.rightJustifiedTextSymbolIndex,e.centerJustifiedTextSymbolIndex,e.leftJustifiedTextSymbolIndex].forEach((t,e,r)=>{t>=0&&r.indexOf(t)===e&&this.addIndicesForPlacedSymbol(this.text,t);}),e.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,e.verticalPlacedTextSymbolIndex),e.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.placedIconSymbolIndex),e.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,e.verticalPlacedIconSymbolIndex);}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray);}}}Zi("SymbolBucket",Yu,{omit:["layers","collisionBoxArray","features","compareText"]}),Yu.MAX_GLYPHS=65535,Yu.addDynamicAttributes=Xu;const Wu=new Mn({"symbol-placement":new In(Lt.layout_symbol["symbol-placement"]),"symbol-spacing":new In(Lt.layout_symbol["symbol-spacing"]),"symbol-avoid-edges":new In(Lt.layout_symbol["symbol-avoid-edges"]),"symbol-sort-key":new Tn(Lt.layout_symbol["symbol-sort-key"]),"symbol-z-order":new In(Lt.layout_symbol["symbol-z-order"]),"icon-allow-overlap":new In(Lt.layout_symbol["icon-allow-overlap"]),"icon-ignore-placement":new In(Lt.layout_symbol["icon-ignore-placement"]),"icon-optional":new In(Lt.layout_symbol["icon-optional"]),"icon-rotation-alignment":new In(Lt.layout_symbol["icon-rotation-alignment"]),"icon-size":new Tn(Lt.layout_symbol["icon-size"]),"icon-text-fit":new In(Lt.layout_symbol["icon-text-fit"]),"icon-text-fit-padding":new In(Lt.layout_symbol["icon-text-fit-padding"]),"icon-image":new Tn(Lt.layout_symbol["icon-image"]),"icon-rotate":new Tn(Lt.layout_symbol["icon-rotate"]),"icon-padding":new In(Lt.layout_symbol["icon-padding"]),"icon-keep-upright":new In(Lt.layout_symbol["icon-keep-upright"]),"icon-offset":new Tn(Lt.layout_symbol["icon-offset"]),"icon-anchor":new Tn(Lt.layout_symbol["icon-anchor"]),"icon-pitch-alignment":new In(Lt.layout_symbol["icon-pitch-alignment"]),"text-pitch-alignment":new In(Lt.layout_symbol["text-pitch-alignment"]),"text-rotation-alignment":new In(Lt.layout_symbol["text-rotation-alignment"]),"text-field":new Tn(Lt.layout_symbol["text-field"]),"text-font":new Tn(Lt.layout_symbol["text-font"]),"text-size":new Tn(Lt.layout_symbol["text-size"]),"text-max-width":new Tn(Lt.layout_symbol["text-max-width"]),"text-line-height":new In(Lt.layout_symbol["text-line-height"]),"text-letter-spacing":new Tn(Lt.layout_symbol["text-letter-spacing"]),"text-justify":new Tn(Lt.layout_symbol["text-justify"]),"text-radial-offset":new Tn(Lt.layout_symbol["text-radial-offset"]),"text-variable-anchor":new In(Lt.layout_symbol["text-variable-anchor"]),"text-anchor":new Tn(Lt.layout_symbol["text-anchor"]),"text-max-angle":new In(Lt.layout_symbol["text-max-angle"]),"text-writing-mode":new In(Lt.layout_symbol["text-writing-mode"]),"text-rotate":new Tn(Lt.layout_symbol["text-rotate"]),"text-padding":new In(Lt.layout_symbol["text-padding"]),"text-keep-upright":new In(Lt.layout_symbol["text-keep-upright"]),"text-transform":new Tn(Lt.layout_symbol["text-transform"]),"text-offset":new Tn(Lt.layout_symbol["text-offset"]),"text-allow-overlap":new In(Lt.layout_symbol["text-allow-overlap"]),"text-ignore-placement":new In(Lt.layout_symbol["text-ignore-placement"]),"text-optional":new In(Lt.layout_symbol["text-optional"])});var Qu={paint:new Mn({"icon-opacity":new Tn(Lt.paint_symbol["icon-opacity"]),"icon-color":new Tn(Lt.paint_symbol["icon-color"]),"icon-halo-color":new Tn(Lt.paint_symbol["icon-halo-color"]),"icon-halo-width":new Tn(Lt.paint_symbol["icon-halo-width"]),"icon-halo-blur":new Tn(Lt.paint_symbol["icon-halo-blur"]),"icon-translate":new In(Lt.paint_symbol["icon-translate"]),"icon-translate-anchor":new In(Lt.paint_symbol["icon-translate-anchor"]),"text-opacity":new Tn(Lt.paint_symbol["text-opacity"]),"text-color":new Tn(Lt.paint_symbol["text-color"],{runtimeType:Jt,getOverride:t=>t.textColor,hasOverride:t=>!!t.textColor}),"text-halo-color":new Tn(Lt.paint_symbol["text-halo-color"]),"text-halo-width":new Tn(Lt.paint_symbol["text-halo-width"]),"text-halo-blur":new Tn(Lt.paint_symbol["text-halo-blur"]),"text-translate":new In(Lt.paint_symbol["text-translate"]),"text-translate-anchor":new In(Lt.paint_symbol["text-translate-anchor"])}),layout:Wu};class tc{constructor(t){this.type=t.property.overrides?t.property.overrides.runtimeType:Zt,this.defaultValue=t;}evaluate(t){if(t.formattedSection){const e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default}eachChild(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression);}outputDefined(){return !1}serialize(){return null}}Zi("FormatSectionOverride",tc,{omit:["defaultValue"]});class ec extends Us{constructor(t){super(t,Qu);}recalculate(t,e){if(super.recalculate(t,e),"auto"===this.layout.get("icon-rotation-alignment")&&(this.layout._values["icon-rotation-alignment"]="point"!==this.layout.get("symbol-placement")?"map":"viewport"),"auto"===this.layout.get("text-rotation-alignment")&&(this.layout._values["text-rotation-alignment"]="point"!==this.layout.get("symbol-placement")?"map":"viewport"),"auto"===this.layout.get("text-pitch-alignment")&&(this.layout._values["text-pitch-alignment"]=this.layout.get("text-rotation-alignment")),"auto"===this.layout.get("icon-pitch-alignment")&&(this.layout._values["icon-pitch-alignment"]=this.layout.get("icon-rotation-alignment")),"point"===this.layout.get("symbol-placement")){const t=this.layout.get("text-writing-mode");if(t){const e=[];for(const r of t)e.indexOf(r)<0&&e.push(r);this.layout._values["text-writing-mode"]=e;}else this.layout._values["text-writing-mode"]=["horizontal"];}this._setPaintOverrides();}getValueAndResolveTokens(t,e,r,i){const n=this.layout.get(t).evaluate(e,{},r,i),s=this._unevaluatedLayout._values[t];return s.isDataDriven()||Qr(s.value)||!n?n:function(t,e){return e.replace(/{([^{}]+)}/g,(e,r)=>r in t?String(t[r]):"")}(e.properties,n)}createBucket(t){return new Yu(t)}queryRadius(){return 0}queryIntersectsFeature(){return !1}_setPaintOverrides(){for(const t of Qu.paint.overridableProperties){if(!ec.hasPaintOverride(this.layout,t))continue;const e=this.paint.get(t),r=new tc(e),i=new Wr(r,e.property.specification);let n=null;n="constant"===e.value.kind||"source"===e.value.kind?new ei("source",i):new ri("composite",i,e.value.zoomStops,e.value._interpolationType),this.paint._values[t]=new kn(e.property,n,e.parameters);}}_handleOverridablePaintPropertyUpdate(t,e,r){return !(!this.layout||e.isDataDriven()||r.isDataDriven())&&ec.hasPaintOverride(this.layout,t)}static hasPaintOverride(t,e){const r=t.get("text-field"),i=Qu.paint.properties[e];let n=!1;const s=t=>{for(const e of t)if(i.overrides&&i.overrides.hasOverride(e))return void(n=!0)};if("constant"===r.value.kind&&r.value.value instanceof pe)s(r.value.value.sections);else if("source"===r.value.kind){const t=e=>{n||(e instanceof xe&&me(e.value)===te?s(e.value.sections):e instanceof _e?s(e.sections):e.eachChild(t));},e=r.value;e._styleExpression&&t(e._styleExpression.expression);}return n}getProgramConfiguration(t){return new Vs(this,t)}}var rc={paint:new Mn({"background-color":new In(Lt.paint_background["background-color"]),"background-pattern":new En(Lt.paint_background["background-pattern"]),"background-opacity":new In(Lt.paint_background["background-opacity"])})},ic={paint:new Mn({"raster-opacity":new In(Lt.paint_raster["raster-opacity"]),"raster-hue-rotate":new In(Lt.paint_raster["raster-hue-rotate"]),"raster-brightness-min":new In(Lt.paint_raster["raster-brightness-min"]),"raster-brightness-max":new In(Lt.paint_raster["raster-brightness-max"]),"raster-saturation":new In(Lt.paint_raster["raster-saturation"]),"raster-contrast":new In(Lt.paint_raster["raster-contrast"]),"raster-resampling":new In(Lt.paint_raster["raster-resampling"]),"raster-fade-duration":new In(Lt.paint_raster["raster-fade-duration"])})};class nc extends Us{constructor(t){super(t,{}),this.implementation=t;}is3D(){return "3d"===this.implementation.renderingMode}hasOffscreenPass(){return void 0!==this.implementation.prerender}recalculate(){}updateTransitions(){}hasTransition(){}serialize(){}onAdd(t){this.implementation.onAdd&&this.implementation.onAdd(t,t.painter.context.gl);}onRemove(t){this.implementation.onRemove&&this.implementation.onRemove(t,t.painter.context.gl);}}var sc={paint:new Mn({"sky-type":new In(Lt.paint_sky["sky-type"]),"sky-atmosphere-sun":new In(Lt.paint_sky["sky-atmosphere-sun"]),"sky-atmosphere-sun-intensity":new In(Lt.paint_sky["sky-atmosphere-sun-intensity"]),"sky-gradient-center":new In(Lt.paint_sky["sky-gradient-center"]),"sky-gradient-radius":new In(Lt.paint_sky["sky-gradient-radius"]),"sky-gradient":new Cn(Lt.paint_sky["sky-gradient"]),"sky-atmosphere-halo-color":new In(Lt.paint_sky["sky-atmosphere-halo-color"]),"sky-atmosphere-color":new In(Lt.paint_sky["sky-atmosphere-color"]),"sky-opacity":new In(Lt.paint_sky["sky-opacity"])})};function ac(t,e,r){const i=wa(0,0,1),n=Va(Pa());return function(t,e,r){r*=.5;var i=e[0],n=e[1],s=e[2],a=e[3],o=Math.sin(r),l=Math.cos(r);t[0]=i*l-s*o,t[1]=n*l+a*o,t[2]=s*l+i*o,t[3]=a*l-n*o;}(n,n,r?-h(t)+Math.PI:h(t)),Fa(n,n,-h(e)),Ea(i,i,n),Ia(i,i)}const oc={circle:class extends Us{constructor(t){super(t,pa);}createBucket(t){return new Gs(t)}queryRadius(t){const e=t;return oa("circle-radius",this,e)+oa("circle-stroke-width",this,e)+la(this.paint.get("circle-translate"))}queryIntersectsFeature(t,e,r,i,n,s,a,o){const l="map"===this.paint.get("circle-pitch-alignment");if(l&&t.queryGeometry.isAboveHorizon)return !1;const u=ca(this.paint.get("circle-translate"),this.paint.get("circle-translate-anchor"),s.angle,t.pixelToTileUnitsFactor),c=this.paint.get("circle-radius").evaluate(e,r)+this.paint.get("circle-stroke-width").evaluate(e,r),h=l?c*t.pixelToTileUnitsFactor:c;for(const e of i)for(const r of e){const e=r.add(u),i=o&&s.elevation?s.elevation.exaggeration()*o.getElevationAt(e.x,e.y,!0):0,n=l?e:Ua(e,i,a),c=l?t.tilespaceRays.map(t=>qa(t,i)):t.queryGeometry.screenGeometry;let p=h;const d=Da([],[r.x,r.y,i,1],a);if("viewport"===this.paint.get("circle-pitch-scale")&&"map"===this.paint.get("circle-pitch-alignment")?p*=d[3]/s.cameraToCenterDistance:"map"===this.paint.get("circle-pitch-scale")&&"viewport"===this.paint.get("circle-pitch-alignment")&&(p*=s.cameraToCenterDistance/d[3]),Js(c,n,p))return !0}return !1}getProgramIds(){return ["circle"]}getProgramConfiguration(t){return new Vs(this,t)}},heatmap:class extends Us{createBucket(t){return new Na(t)}constructor(t){super(t,Ha),this._updateColorRamp();}_handleSpecialPaintPropertyUpdate(t){"heatmap-color"===t&&this._updateColorRamp();}_updateColorRamp(){this.colorRamp=Ja({expression:this._transitionablePaint._values["heatmap-color"].value.expression,evaluationKey:"heatmapDensity",image:this.colorRamp}),this.colorRampTexture=null;}resize(){this.heatmapFbo&&(this.heatmapFbo.destroy(),this.heatmapFbo=null);}queryRadius(){return 0}queryIntersectsFeature(){return !1}hasOffscreenPass(){return 0!==this.paint.get("heatmap-opacity")&&"none"!==this.visibility}getProgramIds(){return ["heatmap","heatmapTexture"]}getProgramConfiguration(t){return new Vs(this,t)}},hillshade:class extends Us{constructor(t){super(t,Ya);}hasOffscreenPass(){return 0!==this.paint.get("hillshade-exaggeration")&&"none"!==this.visibility}getProgramIds(){return ["hillshade","hillshadePrepare"]}getProgramConfiguration(t){return new Vs(this,t)}},fill:class extends Us{constructor(t){super(t,Lo);}getProgramIds(){const t=this.paint.get("fill-pattern"),e=t&&t.constantOr(1),r=[e?"fillPattern":"fill"];return this.paint.get("fill-antialias")&&r.push(e&&!this.getPaintProperty("fill-outline-color")?"fillOutlinePattern":"fillOutline"),r}getProgramConfiguration(t){return new Vs(this,t)}recalculate(t,e){super.recalculate(t,e);const r=this.paint._values["fill-outline-color"];"constant"===r.value.kind&&void 0===r.value.value&&(this.paint._values["fill-outline-color"]=this.paint._values["fill-color"]);}createBucket(t){return new Fo(t)}queryRadius(){return la(this.paint.get("fill-translate"))}queryIntersectsFeature(t,e,r,i,n,s){return !t.queryGeometry.isAboveHorizon&&Ys(ua(t.tilespaceGeometry,this.paint.get("fill-translate"),this.paint.get("fill-translate-anchor"),s.angle,t.pixelToTileUnitsFactor),i)}isTileClipped(){return !0}},"fill-extrusion":class extends Us{constructor(t){super(t,il);}createBucket(t){return new el(t)}queryRadius(){return la(this.paint.get("fill-extrusion-translate"))}is3D(){return !0}getProgramIds(){return [this.paint.get("fill-extrusion-pattern").constantOr(1)?"fillExtrusionPattern":"fillExtrusion"]}getProgramConfiguration(t){return new Vs(this,t)}queryIntersectsFeature(t,e,r,i,s,a,o){const l=ca(this.paint.get("fill-extrusion-translate"),this.paint.get("fill-extrusion-translate-anchor"),a.angle,t.pixelToTileUnitsFactor),u=this.paint.get("fill-extrusion-height").evaluate(e,r),c=this.paint.get("fill-extrusion-base").evaluate(e,r),h=t.queryGeometry.screenGeometry,p=function(t,e,r,i,s){const a=[],o=[],l=s[8]*e,u=s[9]*e,c=s[10]*e,h=s[11]*e,p=s[8]*r,d=s[9]*r,f=s[10]*r,y=s[11]*r;for(const e of t){const t=[],r=[];for(const a of e){const e=a.x+i.x,o=a.y+i.y,m=s[0]*e+s[4]*o+s[12],g=s[1]*e+s[5]*o+s[13],x=s[2]*e+s[6]*o+s[14],v=s[3]*e+s[7]*o+s[15],b=x+c,w=v+h,_=m+p,A=g+d,k=x+f,S=v+y,I=new n((m+l)/w,(g+u)/w);I.z=b/w,t.push(I);const T=new n(_/S,A/S);T.z=k/S,r.push(T);}a.push(t),o.push(r);}return [a,o]}(i,c,u,l,o);return function(t,e,r){let i=1/0;Ys(r,e)&&(i=sl(r,e[0]));for(let n=0;n=3)for(let e=0;e{this._triggered=!1,this._callback();});}trigger(){this._triggered||(this._triggered=!0,this._channel?this._channel.port1.postMessage(!0):setTimeout(()=>{this._triggered=!1,this._callback();},0));}remove(){delete this._channel,this._callback=()=>{};}}const yc=a.performance;class mc{constructor(t){this._marks={start:[t.url,"start"].join("#"),end:[t.url,"end"].join("#"),measure:t.url.toString()},yc.mark(this._marks.start);}finish(){yc.mark(this._marks.end);let t=yc.getEntriesByName(this._marks.measure);return 0===t.length&&(yc.measure(this._marks.measure,this._marks.start,this._marks.end),t=yc.getEntriesByName(this._marks.measure),yc.clearMarks(this._marks.start),yc.clearMarks(this._marks.end),yc.clearMeasures(this._marks.measure)),t}}class gc{constructor(){this.tasks={},this.taskQueue=[],A(["process"],this),this.invoker=new fc(this.process),this.nextId=0;}add(t,e){const r=this.nextId++;return this.tasks[r]={fn:t,metadata:e,priority:xc(e),id:r},this.taskQueue.push(r),this.invoker.trigger(),{cancel:()=>{delete this.tasks[r];}}}process(){B();try{if(this.taskQueue=this.taskQueue.filter(t=>!!this.tasks[t]),!this.taskQueue.length)return;const t=this.pick();if(null===t)return;const e=this.tasks[t];if(delete this.tasks[t],this.taskQueue.length&&this.invoker.trigger(),!e)return;e.fn();}finally{}}pick(){let t=null,e=1/0;for(let r=0;rthis._ne.lng&&(i=this._sw.lng>=e&&e>=this._ne.lng),this._sw.lat<=r&&r<=this._ne.lat&&i}static convert(t){return !t||t instanceof vc?t:new vc(t)}}class bc{constructor(t,e){if(isNaN(t)||isNaN(e))throw new Error(`Invalid LngLat object: (${t}, ${e})`);if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")}wrap(){return new bc(m(this.lng,-180,180),this.lat)}toArray(){return [this.lng,this.lat]}toString(){return `LngLat(${this.lng}, ${this.lat})`}distanceTo(t){const e=Math.PI/180,r=this.lat*e,i=t.lat*e,n=Math.sin(r)*Math.sin(i)+Math.cos(r)*Math.cos(i)*Math.cos((t.lng-this.lng)*e);return 6371008.8*Math.acos(Math.min(n,1))}toBounds(t=0){const e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new vc(new bc(this.lng-r,this.lat-e),new bc(this.lng+r,this.lat+e))}static convert(t){if(t instanceof bc)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new bc(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new bc(Number("lng"in t?t.lng:t.lon),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]")}}const wc=2*Math.PI*6371008.8;function _c(t){return wc*Math.cos(t*Math.PI/180)}function Ac(t){return (180+t)/360}function kc(t){return (180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Sc(t,e){return t/_c(e)}function Ic(t){return 360/Math.PI*Math.atan(Math.exp((180-360*t)*Math.PI/180))-90}function Tc(t,e){return t*_c(Ic(e))}class zc{constructor(t,e,r=0){this.x=+t,this.y=+e,this.z=+r;}static fromLngLat(t,e=0){const r=bc.convert(t);return new zc(Ac(r.lng),kc(r.lat),Sc(e,r.lat))}toLngLat(){return new bc(360*this.x-180,Ic(this.y))}toAltitude(){return Tc(this.z,this.y)}meterInMercatorCoordinateUnits(){return 1/wc*(t=Ic(this.y),1/Math.cos(t*Math.PI/180));var t;}}function Ec(t,e,r){var i=2*Math.PI*6378137/256/Math.pow(2,r);return [t*i-2*Math.PI*6378137/2,e*i-2*Math.PI*6378137/2]}class Cc{constructor(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Dc(0,t,t,e,r);}equals(t){return this.z===t.z&&this.x===t.x&&this.y===t.y}url(t,e){const r=(n=this.y,s=this.z,a=Ec(256*(i=this.x),256*(n=Math.pow(2,s)-n-1),s),o=Ec(256*(i+1),256*(n+1),s),a[0]+","+a[1]+","+o[0]+","+o[1]);var i,n,s,a,o;const l=function(t,e,r){let i,n="";for(let s=t;s>0;s--)i=1<this.canonical.z?new Bc(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Bc(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)}calculateScaledKey(t,e=!0){if(this.overscaledZ===t&&e)return this.key;if(t>this.canonical.z)return Dc(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y);{const r=this.canonical.z-t;return Dc(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)}}isChildOf(t){if(t.wrap!==this.wrap)return !1;const e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e}children(t){if(this.overscaledZ>=t)return [new Bc(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];const e=this.canonical.z+1,r=2*this.canonical.x,i=2*this.canonical.y;return [new Bc(e,this.wrap,e,r,i),new Bc(e,this.wrap,e,r+1,i),new Bc(e,this.wrap,e,r,i+1),new Bc(e,this.wrap,e,r+1,i+1)]}isLessThan(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.ye.getLayer(t)).filter(Boolean);if(0!==t.length){i.layers=t,i.stateDependentLayerIds&&(i.stateDependentLayers=i.stateDependentLayerIds.map(e=>t.filter(t=>t.id===e)[0]));for(const e of t)r[e.id]=i;}}return r}(t.buckets,e.style),this.hasSymbolBuckets=!1;for(const t in this.buckets){const e=this.buckets[t];if(e instanceof Yu){if(this.hasSymbolBuckets=!0,!r)break;e.justReloaded=!0;}}if(this.hasRTLText=!1,this.hasSymbolBuckets)for(const t in this.buckets){const e=this.buckets[t];if(e instanceof Yu&&e.hasRTLText){this.hasRTLText=!0,mn.isLoading()||mn.isLoaded()||"deferred"!==fn()||yn();break}}this.queryPadding=0;for(const t in this.buckets){const r=this.buckets[t];this.queryPadding=Math.max(this.queryPadding,e.style.getLayer(t).queryRadius(r));}t.imageAtlas&&(this.imageAtlas=t.imageAtlas),t.glyphAtlasImage&&(this.glyphAtlasImage=t.glyphAtlasImage);}else this.collisionBoxArray=new as;}unloadVectorData(){for(const t in this.buckets)this.buckets[t].destroy();this.buckets={},this.imageAtlasTexture&&this.imageAtlasTexture.destroy(),this.imageAtlas&&(this.imageAtlas=null),this.glyphAtlasTexture&&this.glyphAtlasTexture.destroy(),this.latestFeatureIndex=null,this.state="unloaded";}getBucket(t){return this.buckets[t.id]}upload(t){for(const e in this.buckets){const r=this.buckets[e];r.uploadPending()&&r.upload(t);}const e=t.gl;this.imageAtlas&&!this.imageAtlas.uploaded&&(this.imageAtlasTexture=new dc(t,this.imageAtlas.image,e.RGBA),this.imageAtlas.uploaded=!0),this.glyphAtlasImage&&(this.glyphAtlasTexture=new dc(t,this.glyphAtlasImage,e.ALPHA),this.glyphAtlasImage=null);}prepare(t){this.imageAtlas&&this.imageAtlas.patchUpdatedImages(t,this.imageAtlasTexture);}queryRenderedFeatures(t,e,r,i,n,s,a,o){return this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData?this.latestFeatureIndex.query({tileResult:i,pixelPosMatrix:a,transform:s,params:n},t,e,r):{}}querySourceFeatures(t,e){const r=this.latestFeatureIndex;if(!r||!r.rawTileData)return;const i=r.loadVTLayers(),n=e?e.sourceLayer:"",s=i._geojsonTileLayer||i[n];if(!s)return;const a=di(e&&e.filter),{z:o,x:l,y:u}=this.tileID.canonical,c={z:o,x:l,y:u};for(let e=0;et)r=!1;else if(e)if(this.expirationTimee[a])return null}else {const o=1/i[a];let l=(t[a]-r[a])*o,u=(e[a]-r[a])*o;if(l>u){const t=l;l=u,u=t;}if(l>n&&(n=l),us)return null}return n}function $c(t,e,r,i,n,s,a,o,l,u,c){const h=i-t,p=n-e,d=s-r,f=a-t,y=o-e,m=l-r,g=c[1]*m-c[2]*y,x=c[2]*f-c[0]*m,v=c[0]*y-c[1]*f,b=h*g+p*x+d*v;if(Math.abs(b)<1e-15)return null;const w=1/b,_=u[0]-t,A=u[1]-e,k=u[2]-r,S=(_*g+A*x+k*v)*w;if(S<0||S>1)return null;const I=A*d-k*p,T=k*h-_*d,z=_*p-A*h,E=(c[0]*I+c[1]*T+c[2]*z)*w;return E<0||S+E>1?null:(f*I+y*T+m*z)*w}function qc(t,e,r){return (t-e)/(r-e)}function Nc(t,e,r,i,n,s,a,o,l){const u=1<{const s=i?1:0,a=(t+1)*r-s,o=e*r,l=(e+1)*r-s;n[0]=t*r,n[1]=o,n[2]=a,n[3]=l;};let a=new Uc(i);const o=[];for(let e=0;e=1;i/=2){const t=r[r.length-1];a=new Uc(i);for(let e=0;e0;){const{idx:o,t:d,nodex:f,nodey:y,depth:m}=p.pop();if(this.leaves[o]){Nc(f,y,m,t,e,r,i,c,h);const o=1<=t[2])return d}continue}let g=0;for(let p=0;p=l[u[r]]&&(u.splice(r,0,p),e=!0);e||(u[g]=p),g++;}}for(let t=0;t=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError("out of range source coordinates for DEM data");return (e+1)*this.stride+(t+1)}_unpackMapbox(t,e,r){return (256*t*256+256*e+r)/10-1e4}_unpackTerrarium(t,e,r){return 256*t+e+r/256-32768}static pack(t,e){const r=[0,0,0,0],i=Gc.getUnpackVector(e);let n=Math.floor((t+i[3])/i[2]);return r[2]=n%256,n=Math.floor(n/256),r[1]=n%256,n=Math.floor(n/256),r[0]=n,r}getPixels(){return new Ga({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))}backfillBorder(t,e,r){if(this.dim!==t.dim)throw new Error("dem dimension mismatch");let i=e*this.dim,n=e*this.dim+this.dim,s=r*this.dim,a=r*this.dim+this.dim;switch(e){case-1:i=n-1;break;case 1:n=i+1;}switch(r){case-1:s=a-1;break;case 1:a=s+1;}const o=-e*this.dim,l=-r*this.dim;for(let e=s;e{this.remove(t,n);},r)),this.data[i].push(n),this.order.push(i),this.order.length>this.max){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}has(t){return t.wrapped().key in this.data}getAndRemove(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null}_getAndRemoveByKey(t){const e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value}getByKey(t){const e=this.data[t];return e?e[0].value:null}get(t){return this.has(t)?this.data[t.wrapped().key][0].value:null}remove(t,e){if(!this.has(t))return this;const r=t.wrapped().key,i=void 0===e?0:this.data[r].indexOf(e),n=this.data[r][i];return this.data[r].splice(i,1),n.timeout&&clearTimeout(n.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(n.value),this.order.splice(this.order.indexOf(r),1),this}setMaxSize(t){for(this.max=t;this.order.length>this.max;){const t=this._getAndRemoveByKey(this.order[0]);t&&this.onRemove(t);}return this}filter(t){const e=[];for(const r in this.data)for(const i of this.data[r])t(i.value)||e.push(i);for(const t of e)this.remove(t.value.tileID,t);}}class Jc{constructor(t,e,r){this.context=t;const i=t.gl;this.buffer=i.createBuffer(),this.dynamicDraw=Boolean(r),this.context.unbindVAO(),t.bindElementBuffer.set(this.buffer),i.bufferData(i.ELEMENT_ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?i.DYNAMIC_DRAW:i.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;}bind(){this.context.bindElementBuffer.set(this.buffer);}updateData(t){const e=this.context.gl;this.context.unbindVAO(),this.bind(),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,t.arrayBuffer);}destroy(){this.buffer&&(this.context.gl.deleteBuffer(this.buffer),delete this.buffer);}}const Yc={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT",Int32:"INT",Uint32:"UNSIGNED_INT",Float32:"FLOAT"};class Wc{constructor(t,e,r,i){this.length=e.length,this.attributes=r,this.itemSize=e.bytesPerElement,this.dynamicDraw=i,this.context=t;const n=t.gl;this.buffer=n.createBuffer(),t.bindVertexBuffer.set(this.buffer),n.bufferData(n.ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?n.DYNAMIC_DRAW:n.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;}bind(){this.context.bindVertexBuffer.set(this.buffer);}updateData(t){const e=this.context.gl;this.bind(),e.bufferSubData(e.ARRAY_BUFFER,0,t.arrayBuffer);}enableAttributes(t,e){for(let r=0;r{"source"===t.dataType&&"metadata"===t.sourceDataType&&(this._sourceLoaded=!0),this._sourceLoaded&&!this._paused&&"source"===t.dataType&&"content"===t.sourceDataType&&(this.reload(),this.transform&&this.update(this.transform));}),e.on("error",()=>{this._sourceErrored=!0;}),this._source=e,this._tiles={},this._cache=new Hc(0,this._unloadTile.bind(this)),this._timers={},this._cacheTimers={},this._maxTileCacheSize=null,this._loadedParentTiles={},this._coveredTiles={},this._state=new Lc;}onAdd(t){this.map=t,this._maxTileCacheSize=t?t._maxTileCacheSize:null;}loaded(){if(this._sourceErrored)return !0;if(!this._sourceLoaded)return !1;if(!this._source.loaded())return !1;for(const t in this._tiles){const e=this._tiles[t];if("loaded"!==e.state&&"errored"!==e.state)return !1}return !0}getSource(){return this._source}pause(){this._paused=!0;}resume(){if(!this._paused)return;const t=this._shouldReloadOnResume;this._paused=!1,this._shouldReloadOnResume=!1,t&&this.reload(),this.transform&&this.update(this.transform);}_loadTile(t,e){return t.isSymbolTile=this._onlySymbols,this._source.loadTile(t,e)}_unloadTile(t){if(this._source.unloadTile)return this._source.unloadTile(t,()=>{})}_abortTile(t){if(this._source.abortTile)return this._source.abortTile(t,()=>{})}serialize(){return this._source.serialize()}prepare(t){this._source.prepare&&this._source.prepare(),this._state.coalesceChanges(this._tiles,this.map?this.map.painter:null);for(const e in this._tiles){const r=this._tiles[e];r.upload(t),r.prepare(this.map.style.imageManager);}}getIds(){return g(this._tiles).map(t=>t.tileID).sort(Oh).map(t=>t.key)}getRenderableIds(t){const e=[];for(const r in this._tiles)this._isIdRenderable(+r,t)&&e.push(this._tiles[r]);return t?e.sort((t,e)=>{const r=t.tileID,i=e.tileID,s=new n(r.canonical.x,r.canonical.y)._rotate(this.transform.angle),a=new n(i.canonical.x,i.canonical.y)._rotate(this.transform.angle);return r.overscaledZ-i.overscaledZ||a.y-s.y||a.x-s.x}).map(t=>t.tileID.key):e.map(t=>t.tileID).sort(Oh).map(t=>t.key)}hasRenderableParent(t){const e=this.findLoadedParent(t,0);return !!e&&this._isIdRenderable(e.tileID.key)}_isIdRenderable(t, e){return this._tiles[t]&&this._tiles[t].hasData()&&!this._coveredTiles[t]&&(e||!this._tiles[t].holdingForFade())}reload(){if(this._paused)this._shouldReloadOnResume=!0;else {this._cache.reset();for(const t in this._tiles)"errored"!==this._tiles[t].state&&this._reloadTile(+t,"reloading");}}_reloadTile(t, e){const r=this._tiles[t];r&&("loading"!==r.state&&(r.state=e),this._loadTile(r,this._tileLoaded.bind(this,r,t,e)));}_tileLoaded(t, e, r, i){if(i)return t.state="errored",void(404!==i.status?this._source.fire(new Ft(i,{tile:t})):this.update(this.transform));t.timeAdded=N.now(),"expired"===r&&(t.refreshedUponExpiration=!0),this._setTileReloadTimer(e,t),"raster-dem"===this.getSource().type&&t.dem&&this._backfillDEM(t),this._state.initializeTileState(t,this.map?this.map.painter:null),this._source.fire(new Vt("data",{dataType:"source",tile:t,coord:t.tileID,sourceCacheId:this.id}));}_backfillDEM(t){const e=this.getRenderableIds();for(let i=0;i1||(Math.abs(r)>1&&(1===Math.abs(r+n)?r+=n:1===Math.abs(r-n)&&(r-=n)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,i),t.neighboringTiles&&t.neighboringTiles[s]&&(t.neighboringTiles[s].backfilled=!0)));}}getTile(t){return this.getTileByID(t.key)}getTileByID(t){return this._tiles[t]}_retainLoadedChildren(t,e,r,i){for(const n in this._tiles){let s=this._tiles[n];if(i[n]||!s.hasData()||s.tileID.overscaledZ<=e||s.tileID.overscaledZ>r)continue;let a=s.tileID;for(;s&&s.tileID.overscaledZ>e+1;){const t=s.tileID.scaledTo(s.tileID.overscaledZ-1);s=this._tiles[t.key],s&&s.hasData()&&(a=t);}let o=a;for(;o.overscaledZ>e;)if(o=o.scaledTo(o.overscaledZ-1),t[o.key]){i[a.key]=a;break}}}findLoadedParent(t,e){if(t.key in this._loadedParentTiles){const r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(let r=t.overscaledZ-1;r>=e;r--){const e=t.scaledTo(r),i=this._getLoadedTile(e);if(i)return i}}_getLoadedTile(t){const e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(this._source.reparseOverscaled?t.wrapped().key:t.canonical.key)}updateCacheSize(t,e){e=e||this._source.tileSize;const r=Math.ceil(t.width/e)+1,i=Math.ceil(t.height/e)+1,n=Math.floor(r*i*5),s="number"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,n):n;this._cache.setMaxSize(s);}handleWrapJump(t){const e=Math.round((t-(void 0===this._prevLng?t:this._prevLng))/360);if(this._prevLng=t,e){const t={};for(const r in this._tiles){const i=this._tiles[r];i.tileID=i.tileID.unwrapTo(i.tileID.wrap+e),t[i.tileID.key]=i;}this._tiles=t;for(const t in this._timers)clearTimeout(this._timers[t]),delete this._timers[t];for(const t in this._tiles)this._setTileReloadTimer(+t,this._tiles[t]);}}update(t,e,r){if(this.transform=t,!this._sourceLoaded||this._paused||this.transform.freezeTileCoverage)return;if(this.usedForTerrain&&!r)return;let i;this.updateCacheSize(t,e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used||this.usedForTerrain?this._source.tileID?i=t.getVisibleUnwrappedCoordinates(this._source.tileID).map(t=>new Bc(t.canonical.z,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y)):(i=t.coveringTiles({tileSize:e||this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom&&!r,reparseOverscaled:this._source.reparseOverscaled,useElevationData:!!this.transform.elevation&&!this.usedForTerrain}),this._source.hasTile&&(i=i.filter(t=>this._source.hasTile(t)))):i=[];const n=this._updateRetainedTiles(i);if($h(this._source.type)&&0!==i.length){const t={},e={},r=Object.keys(n);for(const i of r){const r=n[i],s=this._tiles[i];if(!s||s.fadeEndTime&&s.fadeEndTime<=N.now())continue;const a=this.findLoadedParent(r,Math.max(r.overscaledZ-Uh.maxOverzooming,this._source.minzoom));a&&(this._addTile(a.tileID),t[a.tileID.key]=a.tileID),e[i]=r;}const s=i[i.length-1].overscaledZ;for(const t in this._tiles){const r=this._tiles[t];if(n[t]||!r.hasData())continue;let i=r.tileID;for(;i.overscaledZ>s;){i=i.scaledTo(i.overscaledZ-1);const s=this._tiles[i.key];if(s&&s.hasData()&&e[i.key]){n[t]=r.tileID;break}}}for(const e in t)n[e]||(this._coveredTiles[e]=!0,n[e]=t[e]);}for(const t in n)this._tiles[t].clearFadeHold();const s=function(t,e){const r=[];for(const i in t)i in e||r.push(i);return r}(this._tiles,n);for(const t of s){const e=this._tiles[t];e.hasSymbolBuckets&&!e.holdingForFade()?e.setHoldDuration(this.map._fadeDuration):e.hasSymbolBuckets&&!e.symbolFadeFinished()||this._removeTile(+t);}this._updateLoadedParentTileCache(),this._onlySymbols&&this._source.afterUpdate&&this._source.afterUpdate();}releaseSymbolFadeTiles(){for(const t in this._tiles)this._tiles[t].holdingForFade()&&this._removeTile(+t);}_updateRetainedTiles(t){const e={};if(0===t.length)return e;const r={},i=t[t.length-1].overscaledZ,n=t[0].overscaledZ,s=Math.max(n-Uh.maxOverzooming,this._source.minzoom),a=Math.max(n+Uh.maxUnderzooming,this._source.minzoom),o={};for(const r of t){const t=this._addTile(r);e[r.key]=r,t.hasData()||i=this._source.maxzoom){const t=i.children(this._source.maxzoom)[0],r=this.getTile(t);if(r&&r.hasData()){e[t.key]=t;continue}}else {const t=i.children(this._source.maxzoom);if(e[t[0].key]&&e[t[1].key]&&e[t[2].key]&&e[t[3].key])continue}let n=t.wasRequested();for(let a=i.overscaledZ-1;a>=s;--a){const s=i.scaledTo(a);if(r[s.key])break;if(r[s.key]=!0,t=this.getTile(s),!t&&n&&(t=this._addTile(s)),t&&(e[s.key]=s,n=t.wasRequested(),t.hasData()))break}}return e}_updateLoadedParentTileCache(){this._loadedParentTiles={};for(const t in this._tiles){const e=[];let r,i=this._tiles[t].tileID;for(;i.overscaledZ>0;){if(i.key in this._loadedParentTiles){r=this._loadedParentTiles[i.key];break}e.push(i.key);const t=i.scaledTo(i.overscaledZ-1);if(r=this._getLoadedTile(t),r)break;i=t;}for(const t of e)this._loadedParentTiles[t]=r;}}_addTile(t){let e=this._tiles[t.key];if(e)return e;e=this._cache.getAndRemove(t),e&&(this._setTileReloadTimer(t.key,e),e.tileID=t,this._state.initializeTileState(e,this.map?this.map.painter:null),this._cacheTimers[t.key]&&(clearTimeout(this._cacheTimers[t.key]),delete this._cacheTimers[t.key],this._setTileReloadTimer(t.key,e)));const r=Boolean(e);return r||(e=new Rc(t,this._source.tileSize*t.overscaleFactor(),this.transform.tileZoom),this._loadTile(e,this._tileLoaded.bind(this,e,t.key,e.state))),e?(e.uses++,this._tiles[t.key]=e,r||this._source.fire(new Vt("dataloading",{tile:e,coord:e.tileID,dataType:"source"})),e):null}_setTileReloadTimer(t,e){t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);const r=e.getExpiryTimeout();r&&(this._timers[t]=setTimeout(()=>{this._reloadTile(t,"expired"),delete this._timers[t];},r));}_removeTile(t){const e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()&&"reloading"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))));}clearTiles(){this._shouldReloadOnResume=!1,this._paused=!1;for(const t in this._tiles)this._removeTile(+t);this._cache.reset();}tilesIn(t,e,r){const i=[],n=this.transform;if(!n)return i;for(const s in this._tiles){const a=this._tiles[s];if(r&&a.clearQueryDebugViz(),a.holdingForFade())continue;const o=t.containsTile(a,n,e);o&&i.push(o);}return i}getVisibleCoordinates(t){const e=this.getRenderableIds(t).map(t=>this._tiles[t].tileID);for(const t of e)t.posMatrix=this.transform.calculatePosMatrix(t.toUnwrapped());return e}hasTransition(){if(this._source.hasTransition())return !0;if($h(this._source.type))for(const t in this._tiles){const e=this._tiles[t];if(void 0!==e.fadeEndTime&&e.fadeEndTime>=N.now())return !0}return !1}setFeatureState(t,e,r){this._state.updateState(t=t||"_geojsonTileLayer",e,r);}removeFeatureState(t,e,r){this._state.removeFeatureState(t=t||"_geojsonTileLayer",e,r);}getFeatureState(t,e){return this._state.getState(t=t||"_geojsonTileLayer",e)}setDependencies(t,e,r){const i=this._tiles[t];i&&i.setDependencies(e,r);}reloadTilesForDependencies(t,e){for(const r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(+r,"reloading");this._cache.filter(r=>!r.hasDependency(t,e));}}function Oh(t,e){const r=Math.abs(2*t.wrap)-+(t.wrap<0),i=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||i-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function $h(t){return "raster"===t||"image"===t||"video"===t}Uh.maxOverzooming=10,Uh.maxUnderzooming=3;class qh{constructor(t,e,r){this._dem=t,this._scale=e,this._offset=r;}static create(t,e,r){const i=r||t.findDEMTileFor(e);if(!i||!i.dem)return;const n=i.dem,s=i.tileID,a=1<=0&&i[3]>=0&&a.insert(s,i[0],i[1],i[2],i[3]);}}loadVTLayers(){return this.vtLayers||(this.vtLayers=new Jo.VectorTile(new Ml(this.rawTileData)).layers,this.sourceLayerCoder=new Pc(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"])),this.vtLayers}query(t,e,r,i){this.loadVTLayers();const n=t.params||{},s=di(n.filter),a=t.tileResult,o=t.transform,l=a.bufferedTilespaceBounds,u=this.grid.query(l.min.x,l.min.y,l.max.x,l.max.y,(t,e,r,i)=>sa(a.bufferedTilespaceGeometry,t,e,r,i));u.sort(Kh);let c=null;o.elevation&&u.length>0&&(c=qh.create(o.elevation,this.tileID));const h={};let p;for(let o=0;o(f||(f=Ks(e)),r.queryIntersectsFeature(a,e,i,f,this.z,t.transform,t.pixelPosMatrix,c)));}return h}loadMatchingFeature(t,e,r,i,n,s,a,o,l,u,c){const h=this.bucketLayerIDs[e];if(s&&!function(t,e){for(let r=0;r=0)return !0;return !1}(s,h))return;const p=this.sourceLayerCoder.decode(r),d=this.vtLayers[p].feature(i);if(n.needGeometry){const t=Zs(d,!0);if(!n.filter(new gn(this.tileID.overscaledZ),t,this.tileID.canonical))return}else if(!n.filter(new gn(this.tileID.overscaledZ),d))return;const f=this.getId(d,p);for(let e=0;e{const a=e instanceof Sn?e.get(s):null;return a&&a.evaluate?a.evaluate(r,i,n):a})}function Kh(t,e){return e-t}Zi("FeatureIndex",Nh,{omit:["rawTileData","sourceLayerCoder"]});class Zh{constructor(t){const e={},r=[];for(const i in t){const n=t[i],s=e[i]={};for(const t in n){const e=n[+t];if(!e||0===e.bitmap.width||0===e.bitmap.height)continue;const i={x:0,y:0,w:e.bitmap.width+2,h:e.bitmap.height+2};r.push(i),s[t]={rect:i,metrics:e.metrics};}}const{w:i,h:n}=Wl(r),s=new Xa({width:i||1,height:n||1});for(const r in t){const i=t[r];for(const t in i){const n=i[+t];if(!n||0===n.bitmap.width||0===n.bitmap.height)continue;const a=e[r][t].rect;Xa.copy(n.bitmap,s,{x:0,y:0},{x:a.x+1,y:a.y+1},n.bitmap);}}this.image=s,this.positions=e;}}Zi("GlyphAtlas",Zh);class Xh{constructor(t){this.tileID=new Bc(t.tileID.overscaledZ,t.tileID.wrap,t.tileID.canonical.z,t.tileID.canonical.x,t.tileID.canonical.y),this.tileZoom=t.tileZoom,this.uid=t.uid,this.zoom=t.zoom,this.pixelRatio=t.pixelRatio,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=this.tileID.overscaleFactor(),this.showCollisionBoxes=t.showCollisionBoxes,this.collectResourceTiming=!!t.collectResourceTiming,this.returnDependencies=!!t.returnDependencies,this.promoteId=t.promoteId,this.enableTerrain=!!t.enableTerrain,this.isSymbolTile=t.isSymbolTile;}parse(t,e,r,i,n){this.status="parsing",this.data=t,this.collisionBoxArray=new as;const s=new Pc(Object.keys(t.layers).sort()),a=new Nh(this.tileID,this.promoteId);a.bucketLayerIDs=[];const o={},l={featureIndex:a,iconDependencies:{},patternDependencies:{},glyphDependencies:{},availableImages:r},u=e.familiesBySource[this.source];for(const e in u){const i=t.layers[e];if(!i)continue;let n=!1,c=!1;for(const t of u[e])"symbol"===t[0].type?n=!0:c=!0;if(!0===this.isSymbolTile&&!n)continue;if(!1===this.isSymbolTile&&!c)continue;1===i.version&&E(`Vector tile source "${this.source}" layer "${e}" `+"does not use vector tile spec v2 and therefore may have some rendering errors.");const h=s.encode(e),p=[];for(let t=0;t=e.maxzoom||"none"!==e.visibility&&(Gh(t,this.zoom,r),(o[e.id]=e.createBucket({index:a.bucketLayerIDs.length,layers:t,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:h,sourceID:this.source,enableTerrain:this.enableTerrain})).populate(p,l,this.tileID.canonical),a.bucketLayerIDs.push(t.map(t=>t.id)));}}let c,h,p,d;const f={type:"maybePrepare",isSymbolTile:this.isSymbolTile,zoom:this.zoom},y=S(l.glyphDependencies,t=>Object.keys(t).map(Number));Object.keys(y).length?i.send("getGlyphs",{uid:this.uid,stacks:y},(t,e)=>{c||(c=t,h=e,v.call(this));},void 0,void 0,f):h={};const m=Object.keys(l.iconDependencies);m.length?i.send("getImages",{icons:m,source:this.source,tileID:this.tileID,type:"icons"},(t,e)=>{c||(c=t,p=e,v.call(this));},void 0,void 0,f):p={};const x=Object.keys(l.patternDependencies);function v(){if(c)return n(c);if(h&&p&&d){const t=new Zh(h),e=new tu(p,d);for(const i in o){const n=o[i];n instanceof Yu?(Gh(n.layers,this.zoom,r),Fu(n,h,t.positions,p,e.iconPositions,this.showCollisionBoxes,this.tileID.canonical,this.tileZoom)):n.hasPattern&&(n instanceof pl||n instanceof Fo||n instanceof el)&&(Gh(n.layers,this.zoom,r),n.addFeatures(l,this.tileID.canonical,e.patternPositions));}this.status="done",n(null,{buckets:g(o).filter(t=>!t.isEmpty()),featureIndex:a,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:t.image,imageAtlas:e,glyphMap:this.returnDependencies?h:null,iconMap:this.returnDependencies?p:null,glyphPositions:this.returnDependencies?t.positions:null});}}x.length?i.send("getImages",{icons:x,source:this.source,tileID:this.tileID,type:"patterns"},(t,e)=>{c||(c=t,d=e,v.call(this));},void 0,void 0,f):d={},v.call(this);}}function Gh(t,e,r){const i=new gn(e);for(const e of t)e.recalculate(i,r);}class Hh{constructor(t){this.entries={},this.scheduler=t;}request(t,e,r,i){const n=this.entries[t]=this.entries[t]||{callbacks:[]};if(n.result){const[t,r]=n.result;return this.scheduler?this.scheduler.add(()=>{i(t,r);},e):i(t,r),()=>{}}return n.callbacks.push(i),n.cancel||(n.cancel=r((r,i)=>{n.result=[r,i];for(const t of n.callbacks)this.scheduler?this.scheduler.add(()=>{t(r,i);},e):t(r,i);setTimeout(()=>delete this.entries[t],3e3);})),()=>{n.result||(n.callbacks=n.callbacks.filter(t=>t!==i),n.callbacks.length||(n.cancel(),delete this.entries[t]));}}}function Jh(t,e,r){const i=JSON.stringify(t.request);return t.data&&(this.deduped.entries[i]={result:[null,t.data]}),this.deduped.request(i,{type:"parseTile",isSymbolTile:t.isSymbolTile,zoom:t.tileZoom},e=>{const i=St(t.request,(t,i,n,s)=>{t?e(t):i&&e(null,{vectorTile:r?void 0:new Jo.VectorTile(new Ml(i)),rawData:i,cacheControl:n,expires:s});});return ()=>{i.cancel(),e();}},e)}t.AUTH_ERR_MSG="NO_ACCESS_TOKEN",t.Aabb=La,t.Actor=class{constructor(t,e,r){this.target=t,this.parent=e,this.mapId=r,this.callbacks={},this.cancelCallbacks={},A(["receive"],this),this.target.addEventListener("message",this.receive,!1),this.globalScope=B()?t:a,this.scheduler=new gc;}send(t,e,r,i,n=!1,s){const a=Math.round(1e18*Math.random()).toString(36).substring(0,10);r&&(r.metadata=s,this.callbacks[a]=r);const o=V(this.globalScope)?void 0:[];return this.target.postMessage({id:a,type:t,hasCallback:!!r,targetMapId:i,mustQueue:n,sourceMapId:this.mapId,data:Hi(e,o)},o),{cancel:()=>{r&&delete this.callbacks[a],this.target.postMessage({id:a,type:"",targetMapId:i,sourceMapId:this.mapId});}}}receive(t){const e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(""===e.type){const t=this.cancelCallbacks[r];delete this.cancelCallbacks[r],t&&t.cancel();}else if(B()||e.mustQueue){const t=this.callbacks[r];this.cancelCallbacks[r]=this.scheduler.add(()=>this.processTask(r,e),t&&t.metadata||{type:"message"});}else this.processTask(r,e);}processTask(t,e){if(""===e.type){const r=this.callbacks[t];delete this.callbacks[t],r&&(e.error?r(Ji(e.error)):r(null,Ji(e.data)));}else {const r=V(this.globalScope)?void 0:[],i=e.hasCallback?(e,i)=>{delete this.cancelCallbacks[t],this.target.postMessage({id:t,type:"",sourceMapId:this.mapId,error:e?Hi(e):null,data:Hi(i,r)},r);}:t=>{},n=Ji(e.data);if(this.parent[e.type])this.parent[e.type](e.sourceMapId,n,i);else if(this.parent.getWorkerSource){const t=e.type.split(".");this.parent.getWorkerSource(e.sourceMapId,t[0],n.source)[t[1]](n,i);}else i(new Error(`Could not find function ${e.type}`));}}remove(){this.scheduler.remove(),this.target.removeEventListener("message",this.receive,!1);}},t.AlphaImage=Xa,t.CanonicalTileID=Cc,t.Color=ue,t.ColorMode=Rh,t.Context=class{constructor(t){this.gl=t,this.extVertexArrayObject=this.gl.getExtension("OES_vertex_array_object"),this.clearColor=new th(this),this.clearDepth=new eh(this),this.clearStencil=new rh(this),this.colorMask=new ih(this),this.depthMask=new nh(this),this.stencilMask=new sh(this),this.stencilFunc=new ah(this),this.stencilOp=new oh(this),this.stencilTest=new lh(this),this.depthRange=new uh(this),this.depthTest=new ch(this),this.depthFunc=new hh(this),this.blend=new ph(this),this.blendFunc=new dh(this),this.blendColor=new fh(this),this.blendEquation=new yh(this),this.cullFace=new mh(this),this.cullFaceSide=new gh(this),this.frontFace=new xh(this),this.program=new vh(this),this.activeTexture=new bh(this),this.viewport=new wh(this),this.bindFramebuffer=new _h(this),this.bindRenderbuffer=new Ah(this),this.bindTexture=new kh(this),this.bindVertexBuffer=new Sh(this),this.bindElementBuffer=new Ih(this),this.bindVertexArrayOES=this.extVertexArrayObject&&new Th(this),this.pixelStoreUnpack=new zh(this),this.pixelStoreUnpackPremultiplyAlpha=new Eh(this),this.pixelStoreUnpackFlipY=new Ch(this),this.extTextureFilterAnisotropic=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic"),this.extTextureFilterAnisotropic&&(this.extTextureFilterAnisotropicMax=t.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)),this.extTextureFilterAnisotropicForceOff=!1,this.extTextureHalfFloat=t.getExtension("OES_texture_half_float"),this.extTextureHalfFloat&&(t.getExtension("OES_texture_half_float_linear"),this.extRenderToTextureHalfFloat=t.getExtension("EXT_color_buffer_half_float")),this.extTimerQuery=t.getExtension("EXT_disjoint_timer_query"),this.maxTextureSize=t.getParameter(t.MAX_TEXTURE_SIZE);}setDefault(){this.unbindVAO(),this.clearColor.setDefault(),this.clearDepth.setDefault(),this.clearStencil.setDefault(),this.colorMask.setDefault(),this.depthMask.setDefault(),this.stencilMask.setDefault(),this.stencilFunc.setDefault(),this.stencilOp.setDefault(),this.stencilTest.setDefault(),this.depthRange.setDefault(),this.depthTest.setDefault(),this.depthFunc.setDefault(),this.blend.setDefault(),this.blendFunc.setDefault(),this.blendColor.setDefault(),this.blendEquation.setDefault(),this.cullFace.setDefault(),this.cullFaceSide.setDefault(),this.frontFace.setDefault(),this.program.setDefault(),this.activeTexture.setDefault(),this.bindFramebuffer.setDefault(),this.pixelStoreUnpack.setDefault(),this.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.pixelStoreUnpackFlipY.setDefault();}setDirty(){this.clearColor.dirty=!0,this.clearDepth.dirty=!0,this.clearStencil.dirty=!0,this.colorMask.dirty=!0,this.depthMask.dirty=!0,this.stencilMask.dirty=!0,this.stencilFunc.dirty=!0,this.stencilOp.dirty=!0,this.stencilTest.dirty=!0,this.depthRange.dirty=!0,this.depthTest.dirty=!0,this.depthFunc.dirty=!0,this.blend.dirty=!0,this.blendFunc.dirty=!0,this.blendColor.dirty=!0,this.blendEquation.dirty=!0,this.cullFace.dirty=!0,this.cullFaceSide.dirty=!0,this.frontFace.dirty=!0,this.program.dirty=!0,this.activeTexture.dirty=!0,this.viewport.dirty=!0,this.bindFramebuffer.dirty=!0,this.bindRenderbuffer.dirty=!0,this.bindTexture.dirty=!0,this.bindVertexBuffer.dirty=!0,this.bindElementBuffer.dirty=!0,this.extVertexArrayObject&&(this.bindVertexArrayOES.dirty=!0),this.pixelStoreUnpack.dirty=!0,this.pixelStoreUnpackPremultiplyAlpha.dirty=!0,this.pixelStoreUnpackFlipY.dirty=!0;}createIndexBuffer(t,e){return new Jc(this,t,e)}createVertexBuffer(t,e,r){return new Wc(this,t,e,r)}createRenderbuffer(t,e,r){const i=this.gl,n=i.createRenderbuffer();return this.bindRenderbuffer.set(n),i.renderbufferStorage(i.RENDERBUFFER,t,e,r),this.bindRenderbuffer.set(null),n}createFramebuffer(t,e,r){return new Ph(this,t,e,r)}clear({color:t,depth:e,stencil:r}){const i=this.gl;let n=0;t&&(n|=i.COLOR_BUFFER_BIT,this.clearColor.set(t),this.colorMask.set([!0,!0,!0,!0])),void 0!==e&&(n|=i.DEPTH_BUFFER_BIT,this.depthRange.set([0,1]),this.clearDepth.set(e),this.depthMask.set(!0)),void 0!==r&&(n|=i.STENCIL_BUFFER_BIT,this.clearStencil.set(r),this.stencilMask.set(255)),i.clear(n);}setCullFace(t){!1===t.enable?this.cullFace.set(!1):(this.cullFace.set(!0),this.cullFaceSide.set(t.mode),this.frontFace.set(t.frontFace));}setDepthMode(t){t.func!==this.gl.ALWAYS||t.mask?(this.depthTest.set(!0),this.depthFunc.set(t.func),this.depthMask.set(t.mask),this.depthRange.set(t.range)):this.depthTest.set(!1);}setStencilMode(t){t.test.func!==this.gl.ALWAYS||t.mask?(this.stencilTest.set(!0),this.stencilMask.set(t.mask),this.stencilOp.set([t.fail,t.depthFail,t.pass]),this.stencilFunc.set({func:t.test.func,ref:t.ref,mask:t.test.mask})):this.stencilTest.set(!1);}setColorMode(t){o(t.blendFunction,Rh.Replace)?this.blend.set(!1):(this.blend.set(!0),this.blendFunc.set(t.blendFunction),this.blendColor.set(t.blendColor)),this.colorMask.set(t.mask);}unbindVAO(){this.extVertexArrayObject&&this.bindVertexArrayOES.set(null);}},t.CullFaceMode=Lh,t.DEMData=Gc,t.DataConstantProperty=In,t.DedupedRequest=Hh,t.DepthMode=Vh,t.DepthStencilAttachment=class extends Dh{attachment(){return this.gl.DEPTH_STENCIL_ATTACHMENT}},t.EXTENT=8192,t.Elevation=class{getAtPoint(t,e=0){const r=this._source();if(!r)return e;if(t.y<0||t.y>1)return e;const i=r.getSource().maxzoom,n=1<{t[2]=this.exaggeration()*n.getElevationAt(t[0],t[1],r);}),!0)}getMinMaxForTile(t){const e=this.findDEMTileFor(t);if(!e||!e.dem)return null;const r=e.dem.tree,i=e.tileID,n=1<this._skuTokenExpiresAt}transformRequest(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}}normalizeStyleURL(t,e){if(!W(t))return t;const r=rt(t);return r.path=`/styles/v1${r.path}`,this._makeAPIURL(r,this._customAccessToken||e)}normalizeGlyphsURL(t,e){if(!W(t))return t;const r=rt(t);return r.path=`/fonts/v1${r.path}`,this._makeAPIURL(r,this._customAccessToken||e)}normalizeSourceURL(t,e){if(!W(t))return t;const r=rt(t);return r.path=`/v4/${r.authority}.json`,r.params.push("secure"),this._makeAPIURL(r,this._customAccessToken||e)}normalizeSpriteURL(t,e,r,i){const n=rt(t);return W(t)?(n.path=`/styles/v1${n.path}/sprite${e}${r}`,this._makeAPIURL(n,this._customAccessToken||i)):(n.path+=`${e}${r}`,it(n))}normalizeTileURL(t,e,r){if(this._isSkuTokenExpired()&&this._createSkuToken(),t&&!W(t))return t;const i=rt(t);i.path=i.path.replace(/(\.(png|jpg)\d*)(?=$)/,`${e||r&&"raster"!==i.authority&&512===r?"@2x":""}${K.supported?".webp":"$1"}`),"raster"===i.authority?i.path=`/${j.RASTER_URL_PREFIX}${i.path}`:(i.path=i.path.replace(/^.+\/v4\//,"/"),i.path=`/${j.TILE_URL_VERSION}${i.path}`);const n=this._customAccessToken||function(t){for(const e of t){const t=e.match(/^access_token=(.*)$/);if(t)return t[1]}return null}(i.params)||j.ACCESS_TOKEN;return j.REQUIRE_ACCESS_TOKEN&&n&&this._skuToken&&i.params.push(`sku=${this._skuToken}`),this._makeAPIURL(i,n)}canonicalizeTileURL(t,e){const r=rt(t);if(!r.path.match(/^(\/v4\/|\/raster\/v1\/)/)||!r.path.match(/\.[\w]+$/))return t;let i="mapbox://";r.path.match(/^\/raster\/v1\//)?i+=`raster/${r.path.replace(`/${j.RASTER_URL_PREFIX}/`,"")}`:i+=`tiles/${r.path.replace(`/${j.TILE_URL_VERSION}/`,"")}`;let n=r.params;return e&&(n=n.filter(t=>!t.match(/^access_token=/))),n.length&&(i+=`?${n.join("&")}`),i}canonicalizeTileset(t,e){const r=!!e&&W(e),i=[];for(const e of t.tiles||[])tt(e)?i.push(this.canonicalizeTileURL(e,r)):i.push(e);return i}_makeAPIURL(t,e){const r="See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes",i=rt(j.API_URL);if(t.protocol=i.protocol,t.authority=i.authority,"http"===t.protocol){const e=t.params.indexOf("secure");e>=0&&t.params.splice(e,1);}if("/"!==i.path&&(t.path=`${i.path}${t.path}`),!j.REQUIRE_ACCESS_TOKEN)return it(t);if(!(e=e||j.ACCESS_TOKEN))throw new Error(`An API access token is required to use Mapbox GL. ${r}`);if("s"===e[0])throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${r}`);return t.params=t.params.filter(t=>-1===t.indexOf("access_token")),t.params.push(`access_token=${e}`),it(t)}},t.RequestPerformance=mc,t.ResourceType=wt,t.SegmentVector=qs,t.SourceCache=Uh,t.StencilMode=Fh,t.StructArrayLayout1ui2=is,t.StructArrayLayout2f1f2i16=Gn,t.StructArrayLayout2i4=Ln,t.StructArrayLayout3f12=jn,t.StructArrayLayout3ui6=Jn,t.StructArrayLayout4i8=Un,t.Texture=dc,t.Tile=Rc,t.Transitionable=bn,t.Uniform1f=ks,t.Uniform1i=class extends As{constructor(t,e){super(t,e),this.current=0;}set(t){this.current!==t&&(this.current=t,this.gl.uniform1i(this.location,t));}},t.Uniform2f=class extends As{constructor(t,e){super(t,e),this.current=[0,0];}set(t){t[0]===this.current[0]&&t[1]===this.current[1]||(this.current=t,this.gl.uniform2f(this.location,t[0],t[1]));}},t.Uniform3f=class extends As{constructor(t,e){super(t,e),this.current=[0,0,0];}set(t){t[0]===this.current[0]&&t[1]===this.current[1]&&t[2]===this.current[2]||(this.current=t,this.gl.uniform3f(this.location,t[0],t[1],t[2]));}},t.Uniform4f=Ss,t.UniformColor=Is,t.UniformMatrix3f=class extends As{constructor(t,e){super(t,e),this.current=zs;}set(t){for(let e=0;e<9;e++)if(t[e]!==this.current[e]){this.current=t,this.gl.uniformMatrix3fv(this.location,!1,t);break}}},t.UniformMatrix4f=class extends As{constructor(t,e){super(t,e),this.current=Ts;}set(t){if(t[12]!==this.current[12]||t[0]!==this.current[0])return this.current=t,void this.gl.uniformMatrix4fv(this.location,!1,t);for(let e=1;e<16;e++)if(t[e]!==this.current[e]){this.current=t,this.gl.uniformMatrix4fv(this.location,!1,t);break}}},t.UnwrappedTileID=Mc,t.ValidationError=Ut,t.VectorTileWorkerSource=class{constructor(t,e,r,i){this.actor=t,this.layerIndex=e,this.availableImages=r,this.loadVectorData=i||Jh,this.loading={},this.loaded={},this.deduped=new Hh(t.scheduler);}loadTile(t,e){const r=t.uid,i=!!(t&&t.request&&t.request.collectResourceTiming)&&new mc(t.request),n=this.loading[r]=new Xh(t);n.abort=this.loadVectorData(t,(t,s)=>{const a=!this.loading[r];if(delete this.loading[r],a||t||!s)return n.status="done",a||(this.loaded[r]=n),e(t);const o=s.rawData,l={};s.expires&&(l.expires=s.expires),s.cacheControl&&(l.cacheControl=s.cacheControl);const u={};if(i){const t=i.finish();t&&(u.resourceTiming=JSON.parse(JSON.stringify(t)));}n.vectorTile=s.vectorTile||new Jo.VectorTile(new Ml(o)),n.parse(n.vectorTile,this.layerIndex,this.availableImages,this.actor,(t,r)=>{if(t||!r)return e(t);e(null,x({rawTileData:o.slice(0)},r,l,u));}),this.loaded=this.loaded||{},this.loaded[r]=n;});}reloadTile(t,e){const r=this.loaded,i=t.uid,n=this;if(r&&r[i]){const s=r[i];s.showCollisionBoxes=t.showCollisionBoxes,s.enableTerrain=!!t.enableTerrain;const a=(t,r)=>{const i=s.reloadCallback;i&&(delete s.reloadCallback,s.parse(s.vectorTile,n.layerIndex,this.availableImages,n.actor,i)),e(t,r);};"parsing"===s.status?s.reloadCallback=a:"done"===s.status&&(s.vectorTile?s.parse(s.vectorTile,this.layerIndex,this.availableImages,this.actor,a):a());}}abortTile(t,e){const r=t.uid,i=this.loading[r];i&&(i.abort&&i.abort(),delete this.loading[r]),e();}removeTile(t,e){const r=this.loaded,i=t.uid;r&&r[i]&&delete r[i],e();}},t.WritingMode=eu,t.ZoomHistory=Yi,t.add=_a,t.addDynamicAttributes=Xu,t.altitudeFromMercatorZ=Tc,t.asyncAll=function(t,e,r){if(!t.length)return r(null,[]);let i=t.length;const n=new Array(t.length);let s=null;t.forEach((t,a)=>{e(t,(t,e)=>{t&&(s=t),n[a]=e,0==--i&&r(s,n);});});},t.bezier=d,t.bindAll=A,t.browser=N,t.bufferConvexPolygon=function(t,e){const r=[];for(let i=0;iyt&&(t.getActor().send("enforceCacheSizeLimit",ft),vt=0);},t.clamp=y,t.clearTileCache=function(t){const e=a.caches.delete("mapbox-tiles");t&&e.catch(t).then(()=>t());},t.clipLine=Au,t.clone=function(t){var e=new da(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=T,t.collisionCircleLayout=_l,t.config=j,t.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},t.create=function(){var t=new da(16);return da!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=fa,t.create$2=function(){var t=new da(4);return da!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},t.createCommonjsModule=e,t.createExpression=ti,t.createLayout=Fn,t.createStyleLayer=function(t){return "custom"===t.type?new nc(t):new oc[t.type](t)},t.cross=za,t.deepEqual=o,t.degToRad=h,t.div=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t},t.dot=Ta,t.ease=f,t.easeCubicInOut=p,t.emitValidationErrors=Oi,t.endsWith=k,t.enforceCacheSizeLimit=function(t){mt(),pt&&pt.then(e=>{e.keys().then(r=>{for(let i=0;i{}}},t.identity=ya,t.identity$1=Va,t.invert=function(t,e){var r=e[0],i=e[1],n=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],h=e[9],p=e[10],d=e[11],f=e[12],y=e[13],m=e[14],g=e[15],x=r*o-i*a,v=r*l-n*a,b=r*u-s*a,w=i*l-n*o,_=i*u-s*o,A=n*u-s*l,k=c*y-h*f,S=c*m-p*f,I=c*g-d*f,T=h*m-p*y,z=h*g-d*y,E=p*g-d*m,C=x*E-v*z+b*T+w*I-_*S+A*k;return C?(t[0]=(o*E-l*z+u*T)*(C=1/C),t[1]=(n*z-i*E-s*T)*C,t[2]=(y*A-m*_+g*w)*C,t[3]=(p*_-h*A-d*w)*C,t[4]=(l*I-a*E-u*S)*C,t[5]=(r*E-n*I+s*S)*C,t[6]=(m*b-f*A-g*v)*C,t[7]=(c*A-p*b+d*v)*C,t[8]=(a*z-o*I+u*k)*C,t[9]=(i*I-r*z-s*k)*C,t[10]=(f*_-y*b+g*x)*C,t[11]=(h*b-c*_-d*x)*C,t[12]=(o*S-a*T-l*k)*C,t[13]=(r*T-i*S+n*k)*C,t[14]=(y*v-f*w-m*x)*C,t[15]=(c*w-h*v+p*x)*C,t):null},t.isChar=Wi,t.isMapboxURL=W,t.latFromMercatorY=Ic,t.len=Ba,t.length=ba,t.length$1=function(t){return Math.hypot(t[0],t[1],t[2],t[3])},t.loadVectorTile=Jh,t.makeRequest=kt,t.mercatorXfromLng=Ac,t.mercatorYfromLat=kc,t.mercatorZfromAltitude=Sc,t.mul=ga,t.mul$1=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t},t.multiply=ma,t.mvt=Jo,t.nextPowerOfTwo=function(t){return t<=1?1:Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},t.normalize=Ia,t.normalize$1=function(t,e){var r=e[0],i=e[1],n=e[2],s=e[3],a=r*r+i*i+n*n+s*s;return a>0&&(a=1/Math.sqrt(a)),t[0]=r*a,t[1]=i*a,t[2]=n*a,t[3]=s*a,t},t.number=Qe,t.offscreenCanvasSupported=bt,t.ortho=function(t,e,r,i,n,s,a){var o=1/(e-r),l=1/(i-n),u=1/(s-a);return t[0]=-2*o,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*o,t[13]=(n+i)*l,t[14]=(a+s)*u,t[15]=1,t},t.parseGlyphPBF=function(t){return new Ml(t).readFields(Hl,[])},t.pbf=Ml,t.perspective=function(t,e,r,i,n){var s,a=1/Math.tan(e/2);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=n&&n!==1/0?(t[10]=(n+i)*(s=1/(i-n)),t[14]=2*n*i*s):(t[10]=-1,t[14]=-2*i),t},t.pick=function(t,e){const r={};for(let i=0;ithis._layers[e.id]),r=t[0];if("none"===r.visibility)continue;const n=r.source||"";let o=this.familiesBySource[n];o||(o=this.familiesBySource[n]={});const i=r.sourceLayer||"_geojsonTileLayer";let s=o[i];s||(s=o[i]=[]),s.push(t);}}}const{ImageBitmap:o}=e.window;class i{loadTile(t,r){const{uid:n,encoding:i,rawImageData:s,padding:a,buildQuadTree:l}=t,u=o&&s instanceof o?this.getImageData(s,a):s;r(null,new e.DEMData(n,u,i,a<1,l));}getImageData(t,r){this.offscreenCanvas&&this.offscreenCanvasContext||(this.offscreenCanvas=new OffscreenCanvas(t.width,t.height),this.offscreenCanvasContext=this.offscreenCanvas.getContext("2d")),this.offscreenCanvas.width=t.width,this.offscreenCanvas.height=t.height,this.offscreenCanvasContext.drawImage(t,0,0,t.width,t.height);const n=this.offscreenCanvasContext.getImageData(-r,-r,t.width+2*r,t.height+2*r);return this.offscreenCanvasContext.clearRect(0,0,this.offscreenCanvas.width,this.offscreenCanvas.height),new e.RGBAImage({width:n.width,height:n.height},n.data)}}function s(e,t){if(0!==e.length){a(e[0],t);for(var r=1;r=0!=!!t&&e.reverse();}const l=e.vectorTile.VectorTileFeature.prototype.toGeoJSON;class u{constructor(t){this._feature=t,this.extent=e.EXTENT,this.type=t.type,this.properties=t.tags,"id"in t&&!isNaN(t.id)&&(this.id=parseInt(t.id,10));}loadGeometry(){if(1===this._feature.type){const t=[];for(const r of this._feature.geometry)t.push([new e.Point$1(r[0],r[1])]);return t}{const t=[];for(const r of this._feature.geometry){const n=[];for(const t of r)n.push(new e.Point$1(t[0],t[1]));t.push(n);}return t}}toGeoJSON(e,t,r){return l.call(this,e,t,r)}}class h{constructor(t){this.layers={_geojsonTileLayer:this},this.name="_geojsonTileLayer",this.extent=e.EXTENT,this.length=t.length,this._features=t;}feature(e){return new u(this._features[e])}}var c=e.vectorTile.VectorTileFeature,f=p;function p(e,t){this.options=t||{},this.features=e,this.length=e.length;}function g(e,t){this.id="number"==typeof e.id?e.id:void 0,this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=t||4096;}p.prototype.feature=function(e){return new g(this.features[e],this.options.extent)},g.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var r=0;r>31}function _(e,t){for(var r=e.loadGeometry(),n=e.type,o=0,i=0,s=r.length,a=0;ae[0],C=e=>e[1];class L{constructor(e,t=T,r=C,n=64,o=Float64Array){this.nodeSize=n,this.points=e;const i=e.length<65536?Uint16Array:Uint32Array,s=this.ids=new i(e.length),a=this.coords=new o(2*e.length);for(let n=0;n>1;!function e(t,r,n,o,i,s){for(;i>o;){if(i-o>600){const a=i-o+1,l=n-o+1,u=Math.log(a),h=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*h*(a-h)/a)*(l-a/2<0?-1:1);e(t,r,n,Math.max(o,Math.floor(n-l*h/a+c)),Math.min(i,Math.floor(n+(a-l)*h/a+c)),s);}const a=r[2*n+s];let l=o,u=i;for(b(t,r,o,n),r[2*i+s]>a&&b(t,r,o,i);la;)u--;}r[2*o+s]===a?b(t,r,o,u):(u++,b(t,r,u,i)),u<=n&&(o=u+1),n<=u&&(i=u-1);}}(t,r,a,o,i,s%2),e(t,r,n,o,a-1,s+1),e(t,r,n,a+1,i,s+1);}(s,a,n,0,s.length-1,0);}range(e,t,r,n){return function(e,t,r,n,o,i,s){const a=[0,e.length-1,0],l=[];let u,h;for(;a.length;){const c=a.pop(),f=a.pop(),p=a.pop();if(f-p<=s){for(let s=p;s<=f;s++)u=t[2*s],h=t[2*s+1],u>=r&&u<=o&&h>=n&&h<=i&&l.push(e[s]);continue}const g=Math.floor((p+f)/2);u=t[2*g],h=t[2*g+1],u>=r&&u<=o&&h>=n&&h<=i&&l.push(e[g]);const d=(c+1)%2;(0===c?r<=u:n<=h)&&(a.push(p),a.push(g-1),a.push(d)),(0===c?o>=u:i>=h)&&(a.push(g+1),a.push(f),a.push(d));}return l}(this.ids,this.coords,e,t,r,n,this.nodeSize)}within(e,t,r){return function(e,t,r,n,o,i){const s=[0,e.length-1,0],a=[],l=o*o;for(;s.length;){const u=s.pop(),h=s.pop(),c=s.pop();if(h-c<=i){for(let o=c;o<=h;o++)I(t[2*o],t[2*o+1],r,n)<=l&&a.push(e[o]);continue}const f=Math.floor((c+h)/2),p=t[2*f],g=t[2*f+1];I(p,g,r,n)<=l&&a.push(e[f]);const d=(u+1)%2;(0===u?r-o<=p:n-o<=g)&&(s.push(c),s.push(f-1),s.push(d)),(0===u?r+o>=p:n+o>=g)&&(s.push(f+1),s.push(h),s.push(d));}return a}(this.ids,this.coords,e,t,r,this.nodeSize)}}const O={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:e=>e};class z{constructor(e){this.options=Y(Object.create(O),e),this.trees=new Array(this.options.maxZoom+1);}load(e){const{log:t,minZoom:r,maxZoom:n,nodeSize:o}=this.options;t&&console.time("total time");const i=`prepare ${e.length} points`;t&&console.time(i),this.points=e;let s=[];for(let t=0;t=r;e--){const r=+Date.now();s=this._cluster(s,e),this.trees[e]=new L(s,W,X,o,Float32Array),t&&console.log("z%d: %d clusters in %dms",e,s.length,+Date.now()-r);}return t&&console.timeEnd("total time"),this}getClusters(e,t){let r=((e[0]+180)%360+360)%360-180;const n=Math.max(-90,Math.min(90,e[1]));let o=180===e[2]?180:((e[2]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)r=-180,o=180;else if(r>o){const e=this.getClusters([r,n,180,i],t),s=this.getClusters([-180,n,o,i],t);return e.concat(s)}const s=this.trees[this._limitZoom(t)],a=s.range(J(r),D(i),J(o),D(n)),l=[];for(const e of a){const t=s.points[e];l.push(t.numPoints?F(t):this.points[t.index]);}return l}getChildren(e){const t=this._getOriginId(e),r=this._getOriginZoom(e),n="No cluster with the specified id.",o=this.trees[r];if(!o)throw new Error(n);const i=o.points[t];if(!i)throw new Error(n);const s=this.options.radius/(this.options.extent*Math.pow(2,r-1)),a=o.within(i.x,i.y,s),l=[];for(const t of a){const r=o.points[t];r.parentId===e&&l.push(r.numPoints?F(r):this.points[r.index]);}if(0===l.length)throw new Error(n);return l}getLeaves(e,t,r){const n=[];return this._appendLeaves(n,e,t=t||10,r=r||0,0),n}getTile(e,t,r){const n=this.trees[this._limitZoom(e)],o=Math.pow(2,e),{extent:i,radius:s}=this.options,a=s/i,l=(r-a)/o,u=(r+1+a)/o,h={features:[]};return this._addTileFeatures(n.range((t-a)/o,l,(t+1+a)/o,u),n.points,t,r,o,h),0===t&&this._addTileFeatures(n.range(1-a/o,l,1,u),n.points,o,r,o,h),t===o-1&&this._addTileFeatures(n.range(0,l,a/o,u),n.points,-1,r,o,h),h.features.length?h:null}getClusterExpansionZoom(e){let t=this._getOriginZoom(e)-1;for(;t<=this.options.maxZoom;){const r=this.getChildren(e);if(t++,1!==r.length)break;e=r[0].properties.cluster_id;}return t}_appendLeaves(e,t,r,n,o){const i=this.getChildren(t);for(const t of i){const i=t.properties;if(i&&i.cluster?o+i.point_count<=n?o+=i.point_count:o=this._appendLeaves(e,i.cluster_id,r,n,o):ot&&(c+=r.numPoints||1);}if(c>=s){let e=o.x*h,s=o.y*h,a=i&&h>1?this._map(o,!0):null;const f=(n<<5)+(t+1)+this.points.length;for(const r of u){const n=l.points[r];if(n.zoom<=t)continue;n.zoom=t;const u=n.numPoints||1;e+=n.x*u,s+=n.y*u,n.parentId=f,i&&(a||(a=this._map(o,!0)),i(a,this._map(n)));}o.parentId=f,r.push(E(e/c,s/c,f,c,a));}else if(r.push(o),c>1)for(const e of u){const n=l.points[e];n.zoom<=t||(n.zoom=t,r.push(n));}}return r}_getOriginId(e){return e-this.points.length>>5}_getOriginZoom(e){return (e-this.points.length)%32}_map(e,t){if(e.numPoints)return t?Y({},e.properties):e.properties;const r=this.points[e.index].properties,n=this.options.map(r);return t&&n===r?Y({},n):n}}function E(e,t,r,n,o){return {x:e,y:t,zoom:1/0,id:r,parentId:-1,numPoints:n,properties:o}}function N(e,t){const[r,n]=e.geometry.coordinates;return {x:J(r),y:D(n),zoom:1/0,index:t,parentId:-1}}function F(e){return {type:"Feature",id:e.id,properties:Z(e),geometry:{type:"Point",coordinates:[(t=e.x,360*(t-.5)),G(e.y)]}};var t;}function Z(e){const t=e.numPoints,r=t>=1e4?`${Math.round(t/1e3)}k`:t>=1e3?`${Math.round(t/100)/10}k`:t;return Y(Y({},e.properties),{cluster:!0,cluster_id:e.id,point_count:t,point_count_abbreviated:r})}function J(e){return e/360+.5}function D(e){const t=Math.sin(e*Math.PI/180),r=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return r<0?0:r>1?1:r}function G(e){const t=(180-360*e)*Math.PI/180;return 360*Math.atan(Math.exp(t))/Math.PI-90}function Y(e,t){for(const r in t)e[r]=t[r];return e}function W(e){return e.x}function X(e){return e.y}function V(e,t,r,n,o,i){var s=o-r,a=i-n;if(0!==s||0!==a){var l=((e-r)*s+(t-n)*a)/(s*s+a*a);l>1?(r=o,n=i):l>0&&(r+=s*l,n+=a*l);}return (s=e-r)*s+(a=t-n)*a}function $(e,t,r,n){var o={id:void 0===e?null:e,type:t,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(e){var t=e.geometry,r=e.type;if("Point"===r||"MultiPoint"===r||"LineString"===r)j(e,t);else if("Polygon"===r||"MultiLineString"===r)for(var n=0;n0&&(s+=n?(o*u-l*i)/2:Math.sqrt(Math.pow(l-o,2)+Math.pow(u-i,2))),o=l,i=u;}var h=t.length-3;t[2]=1,function e(t,r,n,o){for(var i,s=o,a=n-r>>1,l=n-r,u=t[r],h=t[r+1],c=t[n],f=t[n+1],p=r+3;ps)i=p,s=g;else if(g===s){var d=Math.abs(p-a);do&&(i-r>3&&e(t,r,i,o),t[i+2]=s,n-i>3&&e(t,i,n,o));}(t,0,h,r),t[h+2]=1,t.size=Math.abs(s),t.start=0,t.end=t.size;}function q(e,t,r,n){for(var o=0;o1?1:r}function H(e,t,r,n,o,i,s,a){if(n/=t,i>=(r/=t)&&s=n)return null;for(var l=[],u=0;u=r&&g=n)){var d=[];if("Point"===f||"MultiPoint"===f)K(c,d,r,n,o);else if("LineString"===f)ee(c,d,r,n,o,!1,a.lineMetrics);else if("MultiLineString"===f)re(c,d,r,n,o,!1);else if("Polygon"===f)re(c,d,r,n,o,!0);else if("MultiPolygon"===f)for(var m=0;m=r&&s<=n&&(t.push(e[i]),t.push(e[i+1]),t.push(e[i+2]));}}function ee(e,t,r,n,o,i,s){for(var a,l,u=te(e),h=0===o?oe:ie,c=e.start,f=0;fr&&(l=h(u,p,g,m,y,r),s&&(u.start=c+a*l)):v>n?x=r&&(l=h(u,p,g,m,y,r),w=!0),x>n&&v<=n&&(l=h(u,p,g,m,y,n),w=!0),!i&&w&&(s&&(u.end=c+a*l),t.push(u),u=te(e)),s&&(c+=a);}var S=e.length-3;p=e[S],g=e[S+1],d=e[S+2],(v=0===o?p:g)>=r&&v<=n&&ne(u,p,g,d),S=u.length-3,i&&S>=3&&(u[S]!==u[0]||u[S+1]!==u[1])&&ne(u,u[0],u[1],u[2]),u.length&&t.push(u);}function te(e){var t=[];return t.size=e.size,t.start=e.start,t.end=e.end,t}function re(e,t,r,n,o,i){for(var s=0;ss.maxX&&(s.maxX=h),c>s.maxY&&(s.maxY=c);}return s}function ce(e,t,r,n){var o=t.geometry,i=t.type,s=[];if("Point"===i||"MultiPoint"===i)for(var a=0;a0&&t.size<(o?s:n))r.numPoints+=t.length/3;else {for(var a=[],l=0;ls)&&(r.numSimplified++,a.push(t[l]),a.push(t[l+1])),r.numPoints++;o&&function(e,t){for(var r=0,n=0,o=e.length,i=o-2;n0===t)for(n=0,o=e.length;n24)throw new Error("maxZoom should be in the 0-24 range");if(t.promoteId&&t.generateId)throw new Error("promoteId and generateId cannot be used together.");var n=function(e,t){var r=[];if("FeatureCollection"===e.type)for(var n=0;n1&&console.time("creation"),f=this.tiles[c]=he(e,t,r,n,l),this.tileCoords.push({z:t,x:r,y:n}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,f.numFeatures,f.numPoints,f.numSimplified),console.timeEnd("creation"));var p="z"+t;this.stats[p]=(this.stats[p]||0)+1,this.total++;}if(f.source=e,o){if(t===l.maxZoom||t===o)continue;var g=1<1&&console.time("clipping");var d,m,y,v,x,w,S=.5*l.buffer/l.extent,M=.5-S,_=.5+S,P=1+S;d=m=y=v=null,x=H(e,h,r-S,r+_,0,f.minX,f.maxX,l),w=H(e,h,r+M,r+P,0,f.minX,f.maxX,l),e=null,x&&(d=H(x,h,n-S,n+_,1,f.minY,f.maxY,l),m=H(x,h,n+M,n+P,1,f.minY,f.maxY,l),x=null),w&&(y=H(w,h,n-S,n+_,1,f.minY,f.maxY,l),v=H(w,h,n+M,n+P,1,f.minY,f.maxY,l),w=null),u>1&&console.timeEnd("clipping"),a.push(d||[],t+1,2*r,2*n),a.push(m||[],t+1,2*r,2*n+1),a.push(y||[],t+1,2*r+1,2*n),a.push(v||[],t+1,2*r+1,2*n+1);}}},pe.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,i=n.debug;if(e<0||e>24)return null;var s=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var l,u=e,h=t,c=r;!l&&u>0;)u--,h=Math.floor(h/2),c=Math.floor(c/2),l=this.tiles[ge(u,h,c)];return l&&l.source?(i>1&&console.log("found parent tile z%d-%d-%d",u,h,c),i>1&&console.time("drilling down"),this.splitTile(l.source,u,h,c,e,t,r),i>1&&console.timeEnd("drilling down"),this.tiles[a]?le(this.tiles[a],o):null):null};class me extends e.VectorTileWorkerSource{constructor(e,t,r,n){super(e,t,r,de),n&&(this.loadGeoJSON=n);}loadData(e,t){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=t,this._pendingLoadDataParams=e,this._state&&"Idle"!==this._state?this._state="NeedsLoadData":(this._state="Coalescing",this._loadData());}_loadData(){if(!this._pendingCallback||!this._pendingLoadDataParams)return;const t=this._pendingCallback,r=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams;const n=!!(r&&r.request&&r.request.collectResourceTiming)&&new e.RequestPerformance(r.request);this.loadGeoJSON(r,(o,i)=>{if(o||!i)return t(o);if("object"!=typeof i)return t(new Error(`Input data given to '${r.source}' is not a valid GeoJSON object.`));{!function e(t,r){var n,o=t&&t.type;if("FeatureCollection"===o)for(n=0;n`${e.key}: ${e.message}`).join(", "));const n=i.features.filter(e=>t.value.evaluate({zoom:0},e));i={type:"FeatureCollection",features:n};}this._geoJSONIndex=r.cluster?new z(function({superclusterOptions:t,clusterProperties:r}){if(!r||!t)return t;const n={},o={},i={accumulated:null,zoom:0},s={properties:null},a=Object.keys(r);for(const t of a){const[i,s]=r[t],a=e.createExpression(s),l=e.createExpression("string"==typeof i?[i,["accumulated"],["get",t]]:i);n[t]=a.value,o[t]=l.value;}return t.map=e=>{s.properties=e;const t={};for(const e of a)t[e]=n[e].evaluate(i,s);return t},t.reduce=(e,t)=>{s.properties=t;for(const t of a)i.accumulated=e[t],e[t]=o[t].evaluate(i,s);},t}(r)).load(i.features):function(e,t){return new pe(e,t)}(i,r.geojsonVtOptions);}catch(o){return t(o)}this.loaded={};const a={};if(n){const e=n.finish();e&&(a.resourceTiming={},a.resourceTiming[r.source]=JSON.parse(JSON.stringify(e)));}t(null,a);}});}coalesce(){"Coalescing"===this._state?this._state="Idle":"NeedsLoadData"===this._state&&(this._state="Coalescing",this._loadData());}reloadTile(e,t){const r=this.loaded;return r&&r[e.uid]?super.reloadTile(e,t):this.loadTile(e,t)}loadGeoJSON(t,r){if(t.request)e.getJSON(t.request,r);else {if("string"!=typeof t.data)return r(new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`));try{return r(null,JSON.parse(t.data))}catch(e){return r(new Error(`Input data given to '${t.source}' is not a valid GeoJSON object.`))}}}removeSource(e,t){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),t();}getClusterExpansionZoom(e,t){try{t(null,this._geoJSONIndex.getClusterExpansionZoom(e.clusterId));}catch(e){t(e);}}getClusterChildren(e,t){try{t(null,this._geoJSONIndex.getChildren(e.clusterId));}catch(e){t(e);}}getClusterLeaves(e,t){try{t(null,this._geoJSONIndex.getLeaves(e.clusterId,e.limit,e.offset));}catch(e){t(e);}}}class ye{constructor(t){this.self=t,this.actor=new e.Actor(t,this),this.layerIndexes={},this.availableImages={},this.workerSourceTypes={vector:e.VectorTileWorkerSource,geojson:me},this.workerSources={},this.demWorkerSources={},this.self.registerWorkerSource=(e,t)=>{if(this.workerSourceTypes[e])throw new Error(`Worker source with name "${e}" already registered.`);this.workerSourceTypes[e]=t;},this.self.registerRTLTextPlugin=t=>{if(e.plugin.isParsed())throw new Error("RTL text plugin already registered.");e.plugin.applyArabicShaping=t.applyArabicShaping,e.plugin.processBidirectionalText=t.processBidirectionalText,e.plugin.processStyledBidirectionalText=t.processStyledBidirectionalText;};}checkIfReady(e,t,r){r();}setReferrer(e,t){this.referrer=t;}setImages(e,t,r){this.availableImages[e]=t;for(const r in this.workerSources[e]){const n=this.workerSources[e][r];for(const e in n)n[e].availableImages=t;}r();}enableTerrain(e,t,r){this.terrain=t,r();}setLayers(e,t,r){this.getLayerIndex(e).replace(t),r();}updateLayers(e,t,r){this.getLayerIndex(e).update(t.layers,t.removedIds),r();}loadTile(t,r,n){const o=this.enableTerrain?e.extend({enableTerrain:this.terrain},r):r;this.getWorkerSource(t,r.type,r.source).loadTile(o,n);}loadDEMTile(t,r,n){const o=this.enableTerrain?e.extend({buildQuadTree:this.terrain},r):r;this.getDEMWorkerSource(t,r.source).loadTile(o,n);}reloadTile(t,r,n){const o=this.enableTerrain?e.extend({enableTerrain:this.terrain},r):r;this.getWorkerSource(t,r.type,r.source).reloadTile(o,n);}abortTile(e,t,r){this.getWorkerSource(e,t.type,t.source).abortTile(t,r);}removeTile(e,t,r){this.getWorkerSource(e,t.type,t.source).removeTile(t,r);}removeSource(e,t,r){if(!this.workerSources[e]||!this.workerSources[e][t.type]||!this.workerSources[e][t.type][t.source])return;const n=this.workerSources[e][t.type][t.source];delete this.workerSources[e][t.type][t.source],void 0!==n.removeSource?n.removeSource(t,r):r();}loadWorkerSource(e,t,r){try{this.self.importScripts(t.url),r();}catch(e){r(e.toString());}}syncRTLPluginState(t,r,n){try{e.plugin.setState(r);const t=e.plugin.getPluginURL();if(e.plugin.isLoaded()&&!e.plugin.isParsed()&&null!=t){this.self.importScripts(t);const r=e.plugin.isParsed();n(r?void 0:new Error(`RTL Text Plugin failed to import scripts from ${t}`),r);}}catch(e){n(e.toString());}}getAvailableImages(e){let t=this.availableImages[e];return t||(t=[]),t}getLayerIndex(e){let t=this.layerIndexes[e];return t||(t=this.layerIndexes[e]=new n),t}getWorkerSource(e,t,r){return this.workerSources[e]||(this.workerSources[e]={}),this.workerSources[e][t]||(this.workerSources[e][t]={}),this.workerSources[e][t][r]||(this.workerSources[e][t][r]=new this.workerSourceTypes[t]({send:(t,r,n,o,i,s)=>{this.actor.send(t,r,n,e,o,s);},scheduler:this.actor.scheduler},this.getLayerIndex(e),this.getAvailableImages(e))),this.workerSources[e][t][r]}getDEMWorkerSource(e,t){return this.demWorkerSources[e]||(this.demWorkerSources[e]={}),this.demWorkerSources[e][t]||(this.demWorkerSources[e][t]=new i),this.demWorkerSources[e][t]}enforceCacheSizeLimit(t,r){e.enforceCacheSizeLimit(r);}getWorkerPerformanceMetrics(e,t,r){r(void 0,void 0);}}return "undefined"!=typeof WorkerGlobalScope&&"undefined"!=typeof self&&self instanceof WorkerGlobalScope&&(self.worker=new ye(self)),ye})); + +define(["./shared"],(function(e){"use strict";var t=e.createCommonjsModule((function(e){function t(e){return !i(e)}function i(e){return "undefined"==typeof window||"undefined"==typeof document?"not a browser":Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray?Function.prototype&&Function.prototype.bind?Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions?"JSON"in window&&"parse"in JSON&&"stringify"in JSON?function(){if(!("Worker"in window&&"Blob"in window&&"URL"in window))return !1;var e,t,i=new Blob([""],{type:"text/javascript"}),o=URL.createObjectURL(i);try{t=new Worker(o),e=!0;}catch(t){e=!1;}return t&&t.terminate(),URL.revokeObjectURL(o),e}()?"Uint8ClampedArray"in window?ArrayBuffer.isView?function(){const e=document.createElement("canvas");e.width=e.height=1;const t=e.getContext("2d");if(!t)return !1;const i=t.getImageData(0,0,1,1);return i&&i.width===e.width}()?(void 0===o[i=e&&e.failIfMajorPerformanceCaveat]&&(o[i]=function(e){const i=function(e){var i=document.createElement("canvas"),o=Object.create(t.webGLContextAttributes);return o.failIfMajorPerformanceCaveat=e,i.probablySupportsContext?i.probablySupportsContext("webgl",o)||i.probablySupportsContext("experimental-webgl",o):i.supportsContext?i.supportsContext("webgl",o)||i.supportsContext("experimental-webgl",o):i.getContext("webgl",o)||i.getContext("experimental-webgl",o)}(e);if(!i)return !1;const o=i.createShader(i.VERTEX_SHADER);return !(!o||i.isContextLost())&&(i.shaderSource(o,"void main() {}"),i.compileShader(o),!0===i.getShaderParameter(o,i.COMPILE_STATUS))}(i)),o[i]?void 0:"insufficient WebGL support"):"insufficient Canvas/getImageData support":"insufficient ArrayBuffer support":"insufficient Uint8ClampedArray support":"insufficient worker support":"insufficient JSON support":"insufficient Object support":"insufficient Function support":"insufficent Array support";var i;}e.exports?e.exports=t:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=t,window.mapboxgl.notSupportedReason=i);var o={};t.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0};}));const i={create:function(t,i,o){const a=e.window.document.createElement(t);return void 0!==i&&(a.className=i),o&&o.appendChild(a),a},createNS:function(t,i){return e.window.document.createElementNS(t,i)}},o=e.window.document&&e.window.document.documentElement.style;function a(e){if(!o)return e[0];for(let t=0;t{e.window.removeEventListener("click",c,!0);},0);},i.mousePos=function(t,i){const o=t.getBoundingClientRect();return new e.Point(i.clientX-o.left-t.clientLeft,i.clientY-o.top-t.clientTop)},i.touchPos=function(t,i){const o=t.getBoundingClientRect(),a=[];for(let r=0;r=0?0:t.button},i.remove=function(e){e.parentNode&&e.parentNode.removeChild(e);};class u extends e.Evented{constructor(){super(),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new e.RGBAImage({width:1,height:1}),this.dirty=!0;}isLoaded(){return this.loaded}setLoaded(e){if(this.loaded!==e&&(this.loaded=e,e)){for(const{ids:e,callback:t}of this.requestors)this._notify(e,t);this.requestors=[];}}getImage(e){return this.images[e]}addImage(e,t){this._validate(e,t)&&(this.images[e]=t);}_validate(t,i){let o=!0;return this._validateStretch(i.stretchX,i.data&&i.data.width)||(this.fire(new e.ErrorEvent(new Error(`Image "${t}" has invalid "stretchX" value`))),o=!1),this._validateStretch(i.stretchY,i.data&&i.data.height)||(this.fire(new e.ErrorEvent(new Error(`Image "${t}" has invalid "stretchY" value`))),o=!1),this._validateContent(i.content,i)||(this.fire(new e.ErrorEvent(new Error(`Image "${t}" has invalid "content" value`))),o=!1),o}_validateStretch(e,t){if(!e)return !0;let i=0;for(const o of e){if(o[0]=0?1.2:1));}function f(e,t,i,o,a,r,n){for(var s=0;s{let o=this.entries[e];o||(o=this.entries[e]={glyphs:{},requests:{},ranges:{}});let a=o.glyphs[t];if(void 0!==a)return void i(null,{stack:e,id:t,glyph:a});if(a=this._tinySDF(o,e,t),a)return o.glyphs[t]=a,void i(null,{stack:e,id:t,glyph:a});const r=Math.floor(t/256);if(256*r>65535)return void i(new Error("glyphs > 65535 not supported"));if(o.ranges[r])return void i(null,{stack:e,id:t,glyph:a});let n=o.requests[r];n||(n=o.requests[r]=[],v.loadGlyphRange(e,r,this.url,this.requestManager,(e,t)=>{if(t){for(const e in t)this._doesCharSupportLocalGlyph(+e)||(o.glyphs[+e]=t[+e]);o.ranges[r]=!0;}for(const i of n)i(e,t);delete o.requests[r];})),n.push((o,a)=>{o?i(o):a&&i(null,{stack:e,id:t,glyph:a[t]||null});});},(e,t)=>{if(e)i(e);else if(t){const e={};for(const{stack:i,id:o,glyph:a}of t)(e[i]||(e[i]={}))[o]=a&&{id:a.id,bitmap:a.bitmap.clone(),metrics:a.metrics};i(null,e);}});}_doesCharSupportLocalGlyph(t){return !!this.localIdeographFontFamily&&(e.isChar["CJK Unified Ideographs"](t)||e.isChar["Hangul Syllables"](t)||e.isChar.Hiragana(t)||e.isChar.Katakana(t))}_tinySDF(t,i,o){const a=this.localIdeographFontFamily;if(!a)return;if(!this._doesCharSupportLocalGlyph(o))return;let r=t.tinySDF;if(!r){let e="400";/bold/i.test(i)?e="900":/medium/i.test(i)?e="500":/light/i.test(i)&&(e="200"),r=t.tinySDF=new v.TinySDF(24,3,8,.25,a,e);}return {id:o,bitmap:new e.AlphaImage({width:30,height:30},r.draw(String.fromCharCode(o))),metrics:{width:24,height:24,left:0,top:-8,advance:24}}}}v.loadGlyphRange=function(t,i,o,a,r){const n=256*i,s=n+255,l=a.transformRequest(a.normalizeGlyphsURL(o).replace("{fontstack}",t).replace("{range}",`${n}-${s}`),e.ResourceType.Glyphs);e.getArrayBuffer(l,(t,i)=>{if(t)r(t);else if(i){const t={};for(const o of e.parseGlyphPBF(i))t[o.id]=o;r(null,t);}});},v.TinySDF=d;const x=new e.Properties({anchor:new e.DataConstantProperty(e.styleSpec.light.anchor),position:new class{constructor(){this.specification=e.styleSpec.light.position;}possiblyEvaluate(t,i){return function([t,i,o]){const a=e.degToRad(i+90),r=e.degToRad(o);return {x:t*Math.cos(a)*Math.sin(r),y:t*Math.sin(a)*Math.sin(r),z:t*Math.cos(r),azimuthal:i,polar:o}}(t.expression.evaluate(i))}interpolate(t,i,o){return {x:e.number(t.x,i.x,o),y:e.number(t.y,i.y,o),z:e.number(t.z,i.z,o),azimuthal:e.number(t.azimuthal,i.azimuthal,o),polar:e.number(t.polar,i.polar,o)}}},color:new e.DataConstantProperty(e.styleSpec.light.color),intensity:new e.DataConstantProperty(e.styleSpec.light.intensity)});class y extends e.Evented{constructor(t){super(),this._transitionable=new e.Transitionable(x),this.setLight(t),this._transitioning=this._transitionable.untransitioned();}getLight(){return this._transitionable.serialize()}setLight(t,i={}){if(!this._validate(e.validateLight,t,i))for(const i in t){const o=t[i];e.endsWith(i,"-transition")?this._transitionable.setTransition(i.slice(0,-"-transition".length),o):this._transitionable.setValue(i,o);}}updateTransitions(e){this._transitioning=this._transitionable.transitioned(e,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(e){this.properties=this._transitioning.possiblyEvaluate(e);}_validate(t,i,o){return (!o||!1!==o.validate)&&e.emitValidationErrors(this,t.call(e.validateStyle,e.extend({value:i,style:{glyphs:!0,sprite:!0},styleSpec:e.styleSpec})))}}const b=new e.Properties({source:new e.DataConstantProperty(e.styleSpec.terrain.source),exaggeration:new e.DataConstantProperty(e.styleSpec.terrain.exaggeration)});class w extends e.Evented{constructor(t){super(),this._transitionable=new e.Transitionable(b),this.set(t),this._transitioning=this._transitionable.untransitioned();}get(){return this._transitionable.serialize()}set(t){for(const i in t){const o=t[i];e.endsWith(i,"-transition")?this._transitionable.setTransition(i.slice(0,-"-transition".length),o):this._transitionable.setValue(i,o);}}updateTransitions(e){this._transitioning=this._transitionable.transitioned(e,this._transitioning);}hasTransition(){return this._transitioning.hasTransition()}recalculate(e){this.properties=this._transitioning.possiblyEvaluate(e);}}class T{constructor(e,t){this.width=e,this.height=t,this.nextRow=0,this.data=new Uint8Array(this.width*this.height),this.dashEntry={};}getDash(e,t){const i=e.join(",")+String(t);return this.dashEntry[i]||(this.dashEntry[i]=this.addDash(e,t)),this.dashEntry[i]}getDashRanges(e,t,i){const o=[];let a=e.length%2==1?-e[e.length-1]*i:0,r=e[0]*i,n=!0;o.push({left:a,right:r,isDash:n,zeroLength:0===e[0]});let s=e[0];for(let t=1;t1&&(n=e[++r]);const l=Math.abs(s-n.left),c=Math.abs(s-n.right),h=Math.min(l,c);let u;const d=t/i*(o+1);if(n.isDash){const e=o-Math.abs(d);u=Math.sqrt(h*h+e*e);}else u=o-Math.sqrt(h*h+d*d);this.data[a+s]=Math.max(0,Math.min(255,u+128));}}}addRegularDash(e){for(let t=e.length-1;t>=0;--t){const i=e[t],o=e[t+1];i.zeroLength?e.splice(t,1):o&&o.isDash===i.isDash&&(o.left=i.left,e.splice(t,1));}const t=e[0],i=e[e.length-1];t.isDash===i.isDash&&(t.left=i.left-this.width,i.right=t.right+this.width);const o=this.width*this.nextRow;let a=0,r=e[a];for(let t=0;t1&&(r=e[++a]);const i=Math.abs(t-r.left),n=Math.abs(t-r.right),s=Math.min(i,n);this.data[o+t]=Math.max(0,Math.min(255,(r.isDash?s:-s)+128));}}addDash(t,i){const o=i?7:0,a=2*o+1;if(this.nextRow+a>this.height)return e.warnOnce("LineAtlas out of space"),null;0===t.length&&t.push(1);let r=0;for(let i=0;i{this.ready=!0;});}broadcast(t,i,o){e.asyncAll(this.actors,(e,o)=>{e.send(t,i,o);},o=o||function(){});}getActor(){return this.currentActor=(this.currentActor+1)%this.actors.length,this.actors[this.currentActor]}remove(){this.actors.forEach(e=>{e.remove();}),this.actors=[],this.workerPool.release(this.id);}}function C(t,i,o){return i*(e.EXTENT/(t.tileSize*Math.pow(2,o-t.tileID.overscaledZ)))}E.Actor=e.Actor;class S{constructor(e,t,i,o){this.screenBounds=e,this.cameraPoint=t,this._screenRaycastCache={},this._cameraRaycastCache={},this.isAboveHorizon=i,this.screenGeometry=this.bufferedScreenGeometry(0),this.screenGeometryMercator=this.screenGeometry.map(e=>o.pointCoordinate3D(e)),this.cameraGeometry=this.bufferedCameraGeometry(0);}static createFromScreenPoints(t,i){let o,a;if(t instanceof e.Point||"number"==typeof t[0]){const r=e.Point.convert(t);o=[e.Point.convert(t)],a=i.isPointAboveHorizon(r);}else {const r=e.Point.convert(t[0]),n=e.Point.convert(t[1]);o=[r,n],a=e.polygonizeBounds(r,n).every(e=>i.isPointAboveHorizon(e));}return new S(o,i.getCameraPoint(),a,i)}bufferedScreenGeometry(t){return e.polygonizeBounds(this.screenBounds[0],1===this.screenBounds.length?this.screenBounds[0]:this.screenBounds[1],t)}bufferedCameraGeometry(t){const i=[this.screenBounds[0],1===this.screenBounds.length?this.screenBounds[0].add(new e.Point(1,0)):this.screenBounds[1],this.cameraPoint];return e.bufferConvexPolygon(i,t)}containsTile(t,i,o){const a=t.queryPadding+1,r=o?this._bufferedCameraMercator(a,i).map(e=>t.tileID.getTilePoint(e)):this._bufferedScreenMercator(a,i).map(e=>t.tileID.getTilePoint(e)),n=this.screenGeometryMercator.map(e=>t.tileID.getTileVec3(e)),s=n.map(t=>new e.Point(t[0],t[1])),l=i.getFreeCameraOptions().position||new e.MercatorCoordinate(0,0,0),c=t.tileID.getTileVec3(l),h=n.map(t=>{const i=e.sub(t,t,c);return e.normalize(i,i),new e.Ray(c,i)}),u=C(t,1,i.zoom);if(e.polygonIntersectsBox(r,0,0,e.EXTENT,e.EXTENT))return {queryGeometry:this,tilespaceGeometry:s,tilespaceRays:h,bufferedTilespaceGeometry:r,bufferedTilespaceBounds:(d=e.getBounds(r),d.min.x=e.clamp(d.min.x,0,e.EXTENT),d.min.y=e.clamp(d.min.y,0,e.EXTENT),d.max.x=e.clamp(d.max.x,0,e.EXTENT),d.max.y=e.clamp(d.max.y,0,e.EXTENT),d),tile:t,tileID:t.tileID,pixelToTileUnitsFactor:u};var d;}_bufferedScreenMercator(e,t){const i=I(e);if(this._screenRaycastCache[i])return this._screenRaycastCache[i];{const o=this.bufferedScreenGeometry(e).map(e=>t.pointCoordinate3D(e));return this._screenRaycastCache[i]=o,o}}_bufferedCameraMercator(e,t){const i=I(e);if(this._cameraRaycastCache[i])return this._cameraRaycastCache[i];{const o=this.bufferedCameraGeometry(e).map(e=>t.pointCoordinate3D(e));return this._cameraRaycastCache[i]=o,o}}}function I(e){return 100*e|0}function P(t,i,o){const a=function(a,r){if(a)return o(a);if(r){const a=e.pick(e.extend(r,t),["tiles","minzoom","maxzoom","attribution","mapbox_logo","bounds","scheme","tileSize","encoding"]);r.vector_layers&&(a.vectorLayers=r.vector_layers,a.vectorLayerIds=a.vectorLayers.map(e=>e.id)),a.tiles=i.canonicalizeTileset(a,t.url),o(null,a);}};return t.url?e.getJSON(i.transformRequest(i.normalizeSourceURL(t.url),e.ResourceType.Source),a):e.browser.frame(()=>a(null,t))}class M{constructor(t,i,o){this.bounds=e.LngLatBounds.convert(this.validateBounds(t)),this.minzoom=i||0,this.maxzoom=o||24;}validateBounds(e){return Array.isArray(e)&&4===e.length?[Math.max(-180,e[0]),Math.max(-90,e[1]),Math.min(180,e[2]),Math.min(90,e[3])]:[-180,-90,180,90]}contains(t){const i=Math.pow(2,t.z),o=Math.floor(e.mercatorXfromLng(this.bounds.getWest())*i),a=Math.floor(e.mercatorYfromLat(this.bounds.getNorth())*i),r=Math.ceil(e.mercatorXfromLng(this.bounds.getEast())*i),n=Math.ceil(e.mercatorYfromLat(this.bounds.getSouth())*i);return t.x>=o&&t.x=a&&t.y{this._tileJSONRequest=null,this._loaded=!0,t?this.fire(new e.ErrorEvent(t)):i&&(e.extend(this,i),i.bounds&&(this.tileBounds=new M(i.bounds,this.minzoom,this.maxzoom)),e.postTurnstileEvent(i.tiles),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"metadata"})),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"content"})));});}loaded(){return this._loaded}onAdd(e){this.map=e,this.load();}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.cancel(),this._tileJSONRequest=null);}serialize(){return e.extend({},this._options)}hasTile(e){return !this.tileBounds||this.tileBounds.contains(e.canonical)}loadTile(t,i){const o=e.browser.devicePixelRatio>=2,a=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme),o,this.tileSize);t.request=e.getImage(this.map._requestManager.transformRequest(a,e.ResourceType.Tile),(o,a)=>{if(delete t.request,t.aborted)t.state="unloaded",i(null);else if(o)t.state="errored",i(o);else if(a){this.map._refreshExpiredTiles&&t.setExpiryData(a),delete a.cacheControl,delete a.expires;const o=this.map.painter.context,r=o.gl;t.texture=this.map.painter.getTileTexture(a.width),t.texture?t.texture.update(a,{useMipmap:!0}):(t.texture=new e.Texture(o,a,r.RGBA,{useMipmap:!0}),t.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE,r.LINEAR_MIPMAP_NEAREST),o.extTextureFilterAnisotropic&&r.texParameterf(r.TEXTURE_2D,o.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,o.extTextureFilterAnisotropicMax)),t.state="loaded",e.cacheEntryPossiblyAdded(this.dispatcher),i(null);}});}abortTile(e,t){e.request&&(e.request.cancel(),delete e.request),t();}unloadTile(e,t){e.texture&&this.map.painter.saveTileTexture(e.texture),t();}hasTransition(){return !1}}var A=e.createLayout([{name:"a_pos",type:"Int16",components:2},{name:"a_texture_pos",type:"Int16",components:2}]);class D extends e.Evented{constructor(e,t,i,o){super(),this.id=e,this.dispatcher=i,this.coordinates=t.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(o),this.options=t;}load(t,i){this._loaded=!1,this.fire(new e.Event("dataloading",{dataType:"source"})),this.url=this.options.url,e.getImage(this.map._requestManager.transformRequest(this.url,e.ResourceType.Image),(o,a)=>{this._loaded=!0,o?this.fire(new e.ErrorEvent(o)):a&&(this.image=a,t&&(this.coordinates=t),i&&i(),this._finishLoading());});}loaded(){return this._loaded}updateImage(e){return this.image&&e.url?(this.options.url=e.url,this.load(e.coordinates,()=>{this.texture=null;}),this):this}_finishLoading(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"metadata"})));}onAdd(e){this.map=e,this.load();}setCoordinates(t){this.coordinates=t;const i=t.map(e.MercatorCoordinate.fromLngLat);this.tileID=function(t){let i=1/0,o=1/0,a=-1/0,r=-1/0;for(const e of t)i=Math.min(i,e.x),o=Math.min(o,e.y),a=Math.max(a,e.x),r=Math.max(r,e.y);const n=Math.max(a-i,r-o),s=Math.max(0,Math.floor(-Math.log(n)/Math.LN2)),l=Math.pow(2,s);return new e.CanonicalTileID(s,Math.floor((i+a)/2*l),Math.floor((o+r)/2*l))}(i),this.minzoom=this.maxzoom=this.tileID.z;const o=i.map(e=>this.tileID.getTilePoint(e)._round());return this._boundsArray=new e.StructArrayLayout4i8,this._boundsArray.emplaceBack(o[0].x,o[0].y,0,0),this._boundsArray.emplaceBack(o[1].x,o[1].y,e.EXTENT,0),this._boundsArray.emplaceBack(o[3].x,o[3].y,0,e.EXTENT),this._boundsArray.emplaceBack(o[2].x,o[2].y,e.EXTENT,e.EXTENT),this.boundsBuffer&&(this.boundsBuffer.destroy(),delete this.boundsBuffer),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"content"})),this}prepare(){if(0===Object.keys(this.tiles).length||!this.image)return;const t=this.map.painter.context,i=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,A.members)),this.boundsSegments||(this.boundsSegments=e.SegmentVector.simpleSegment(0,0,4,2)),this.texture||(this.texture=new e.Texture(t,this.image,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE));for(const e in this.tiles){const t=this.tiles[e];"loaded"!==t.state&&(t.state="loaded",t.texture=this.texture);}}loadTile(e,t){this.tileID&&this.tileID.equals(e.tileID.canonical)?(this.tiles[String(e.tileID.wrap)]=e,e.buckets={},t(null)):(e.state="errored",t(null));}serialize(){return {type:"image",url:this.options.url,coordinates:this.coordinates}}hasTransition(){return !1}}const L={vector:class extends e.Evented{constructor(t,i,o,a){if(super(),this.id=t,this.dispatcher=o,this.type="vector",this.minzoom=0,this.maxzoom=22,this.scheme="xyz",this.tileSize=512,this.reparseOverscaled=!0,this.isTileClipped=!0,this._loaded=!1,e.extend(this,e.pick(i,["url","scheme","tileSize","promoteId"])),this._options=e.extend({type:"vector"},i),this._collectResourceTiming=i.collectResourceTiming,512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");this.setEventedParent(a),this._tileWorkers={},this._deduped=new e.DedupedRequest;}load(){this._loaded=!1,this.fire(new e.Event("dataloading",{dataType:"source"})),this._tileJSONRequest=P(this._options,this.map._requestManager,(t,i)=>{this._tileJSONRequest=null,this._loaded=!0,t?this.fire(new e.ErrorEvent(t)):i&&(e.extend(this,i),i.bounds&&(this.tileBounds=new M(i.bounds,this.minzoom,this.maxzoom)),e.postTurnstileEvent(i.tiles,this.map._requestManager._customAccessToken),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"metadata"})),this.fire(new e.Event("data",{dataType:"source",sourceDataType:"content"})));});}loaded(){return this._loaded}hasTile(e){return !this.tileBounds||this.tileBounds.contains(e.canonical)}onAdd(e){this.map=e,this.load();}setSourceProperty(e){this._tileJSONRequest&&this._tileJSONRequest.cancel(),e();const t=this.map.style._getSourceCaches(this.id);for(const e of t)e.clearTiles();this.load();}setTiles(e){return this.setSourceProperty(()=>{this._options.tiles=e;}),this}setUrl(e){return this.setSourceProperty(()=>{this.url=e,this._options.url=e;}),this}onRemove(){this._tileJSONRequest&&(this._tileJSONRequest.cancel(),this._tileJSONRequest=null);}serialize(){return e.extend({},this._options)}loadTile(t,i){const o=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme)),a={request:this.map._requestManager.transformRequest(o,e.ResourceType.Tile),data:void 0,uid:t.uid,tileID:t.tileID,tileZoom:t.tileZoom,zoom:t.tileID.overscaledZ,tileSize:this.tileSize*t.tileID.overscaleFactor(),type:this.type,source:this.id,pixelRatio:e.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId,isSymbolTile:t.isSymbolTile};if(a.request.collectResourceTiming=this._collectResourceTiming,t.actor&&"expired"!==t.state)"loading"===t.state?t.reloadCallback=i:t.request=t.actor.send("reloadTile",a,r.bind(this));else if(t.actor=this._tileWorkers[o]=this._tileWorkers[o]||this.dispatcher.getActor(),this.dispatcher.ready)t.request=t.actor.send("loadTile",a,r.bind(this));else {const i=e.loadVectorTile.call({deduped:this._deduped},a,(e, i)=>{e||!i?r.call(this,e):(a.data={cacheControl:i.cacheControl,expires:i.expires,rawData:i.rawData.slice(0)},t.actor&&t.actor.send("loadTile",a,r.bind(this)));},!0);t.request={cancel:i};}function r(o,a){return delete t.request,t.aborted?i(null):o&&404!==o.status?i(o):(a&&a.resourceTiming&&(t.resourceTiming=a.resourceTiming),this.map._refreshExpiredTiles&&a&&t.setExpiryData(a),t.loadVectorData(a,this.map.painter),e.cacheEntryPossiblyAdded(this.dispatcher),i(null),void(t.reloadCallback&&(this.loadTile(t,t.reloadCallback),t.reloadCallback=null)))}}abortTile(e){e.request&&(e.request.cancel(),delete e.request),e.actor&&e.actor.send("abortTile",{uid:e.uid,type:this.type,source:this.id},void 0);}unloadTile(e){e.unloadVectorData(),e.actor&&e.actor.send("removeTile",{uid:e.uid,type:this.type,source:this.id},void 0);}hasTransition(){return !1}afterUpdate(){this._tileWorkers={};}},raster:z,"raster-dem":class extends z{constructor(t,i,o,a){super(t,i,o,a),this.type="raster-dem",this.maxzoom=22,this._options=e.extend({type:"raster-dem"},i),this.encoding=i.encoding||"mapbox";}serialize(){return {type:"raster-dem",url:this.url,tileSize:this.tileSize,tiles:this.tiles,bounds:this.bounds,encoding:this.encoding}}loadTile(t,i){const o=this.map._requestManager.normalizeTileURL(t.tileID.canonical.url(this.tiles,this.scheme),!1,this.tileSize);function a(e,o){e&&(t.state="errored",i(e)),o&&(t.dem=o,t.dem.onDeserialize(),t.needsHillshadePrepare=!0,t.needsDEMTextureUpload=!0,t.state="loaded",i(null));}t.request=e.getImage(this.map._requestManager.transformRequest(o,e.ResourceType.Tile),function(o,r){if(delete t.request,t.aborted)t.state="unloaded",i(null);else if(o)t.state="errored",i(o);else if(r){this.map._refreshExpiredTiles&&t.setExpiryData(r),delete r.cacheControl,delete r.expires;const i=e.window.ImageBitmap&&r instanceof e.window.ImageBitmap&&e.offscreenCanvasSupported(),o=1-(r.width-e.prevPowerOfTwo(r.width))/2;o<1||t.neighboringTiles||(t.neighboringTiles=this._getNeighboringTiles(t.tileID));const n=i?r:e.browser.getImageData(r,o),s={uid:t.uid,coord:t.tileID,source:this.id,rawImageData:n,encoding:this.encoding,padding:o};t.actor&&"expired"!==t.state||(t.actor=this.dispatcher.getActor(),t.actor.send("loadDEMTile",s,a.bind(this)));}}.bind(this));}_getNeighboringTiles(t){const i=t.canonical,o=Math.pow(2,i.z),a=(i.x-1+o)%o,r=0===i.x?t.wrap-1:t.wrap,n=(i.x+1+o)%o,s=i.x+1===o?t.wrap+1:t.wrap,l={};return l[new e.OverscaledTileID(t.overscaledZ,r,i.z,a,i.y).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,s,i.z,n,i.y).key]={backfilled:!1},i.y>0&&(l[new e.OverscaledTileID(t.overscaledZ,r,i.z,a,i.y-1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,t.wrap,i.z,i.x,i.y-1).key]={backfilled:!1},l[new e.OverscaledTileID(t.overscaledZ,s,i.z,n,i.y-1).key]={backfilled:!1}),i.y+1{if(t)return void this.fire(new e.ErrorEvent(t));const i={dataType:"source",sourceDataType:"metadata"};this._collectResourceTiming&&this._resourceTiming&&this._resourceTiming.length>0&&(i.resourceTiming=this._resourceTiming,this._resourceTiming=[]),this.fire(new e.Event("data",i));});}onAdd(e){this.map=e,this.load();}setData(t){return this._data=t,this.fire(new e.Event("dataloading",{dataType:"source"})),this._updateWorkerData(t=>{if(t)return void this.fire(new e.ErrorEvent(t));const i={dataType:"source",sourceDataType:"content"};this._collectResourceTiming&&this._resourceTiming&&this._resourceTiming.length>0&&(i.resourceTiming=this._resourceTiming,this._resourceTiming=[]),this.fire(new e.Event("data",i));}),this}getClusterExpansionZoom(e,t){return this.actor.send("geojson.getClusterExpansionZoom",{clusterId:e,source:this.id},t),this}getClusterChildren(e,t){return this.actor.send("geojson.getClusterChildren",{clusterId:e,source:this.id},t),this}getClusterLeaves(e,t,i,o){return this.actor.send("geojson.getClusterLeaves",{source:this.id,clusterId:e,limit:t,offset:i},o),this}_updateWorkerData(t){this._loaded=!1;const i=e.extend({},this.workerOptions),o=this._data;"string"==typeof o?(i.request=this.map._requestManager.transformRequest(e.browser.resolveURL(o),e.ResourceType.Source),i.request.collectResourceTiming=this._collectResourceTiming):i.data=JSON.stringify(o),this.actor.send(`${this.type}.loadData`,i,(e,o)=>{this._removed||o&&o.abandoned||(this._loaded=!0,o&&o.resourceTiming&&o.resourceTiming[this.id]&&(this._resourceTiming=o.resourceTiming[this.id].slice(0)),this.actor.send(`${this.type}.coalesce`,{source:i.source},null),t(e));});}loaded(){return this._loaded}loadTile(t,i){const o=t.actor?"reloadTile":"loadTile";t.actor=this.actor,t.request=this.actor.send(o,{type:this.type,uid:t.uid,tileID:t.tileID,tileZoom:t.tileZoom,zoom:t.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:e.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId},(e,a)=>(delete t.request,t.unloadVectorData(),t.aborted?i(null):e?i(e):(t.loadVectorData(a,this.map.painter,"reloadTile"===o),i(null))));}abortTile(e){e.request&&(e.request.cancel(),delete e.request),e.aborted=!0;}unloadTile(e){e.unloadVectorData(),this.actor.send("removeTile",{uid:e.uid,type:this.type,source:this.id});}onRemove(){this._removed=!0,this.actor.send("removeSource",{type:this.type,source:this.id});}serialize(){return e.extend({},this._options,{type:this.type,data:this._data})}hasTransition(){return !1}},video:class extends D{constructor(e,t,i,o){super(e,t,i,o),this.roundZoom=!0,this.type="video",this.options=t;}load(){this._loaded=!1;const t=this.options;this.urls=[];for(const i of t.urls)this.urls.push(this.map._requestManager.transformRequest(i,e.ResourceType.Source).url);e.getVideo(this.urls,(t,i)=>{this._loaded=!0,t?this.fire(new e.ErrorEvent(t)):i&&(this.video=i,this.video.loop=!0,this.video.addEventListener("playing",()=>{this.map.triggerRepaint();}),this.map&&this.video.play(),this._finishLoading());});}pause(){this.video&&this.video.pause();}play(){this.video&&this.video.play();}seek(t){if(this.video){const i=this.video.seekable;ti.end(0)?this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${this.id}`,null,`Playback for this video can be set only between the ${i.start(0)} and ${i.end(0)}-second mark.`))):this.video.currentTime=t;}}getVideo(){return this.video}onAdd(e){this.map||(this.map=e,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)));}prepare(){if(0===Object.keys(this.tiles).length||this.video.readyState<2)return;const t=this.map.painter.context,i=t.gl;this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,A.members)),this.boundsSegments||(this.boundsSegments=e.SegmentVector.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE),i.texSubImage2D(i.TEXTURE_2D,0,0,0,i.RGBA,i.UNSIGNED_BYTE,this.video)):(this.texture=new e.Texture(t,this.video,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE));for(const e in this.tiles){const t=this.tiles[e];"loaded"!==t.state&&(t.state="loaded",t.texture=this.texture);}}serialize(){return {type:"video",urls:this.urls,coordinates:this.coordinates}}hasTransition(){return this.video&&!this.video.paused}},image:D,canvas:class extends D{constructor(t,i,o,a){super(t,i,o,a),i.coordinates?Array.isArray(i.coordinates)&&4===i.coordinates.length&&!i.coordinates.some(e=>!Array.isArray(e)||2!==e.length||e.some(e=>"number"!=typeof e))||this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'"coordinates" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'missing required property "coordinates"'))),i.animate&&"boolean"!=typeof i.animate&&this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'optional "animate" property must be a boolean value'))),i.canvas?"string"==typeof i.canvas||i.canvas instanceof e.window.HTMLCanvasElement||this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new e.ErrorEvent(new e.ValidationError(`sources.${t}`,null,'missing required property "canvas"'))),this.options=i,this.animate=void 0===i.animate||i.animate;}load(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof e.window.HTMLCanvasElement?this.options.canvas:e.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new e.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))):(this.play=function(){this._playing=!0,this.map.triggerRepaint();},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1);},this._finishLoading());}getCanvas(){return this.canvas}onAdd(e){this.map=e,this.load(),this.canvas&&this.animate&&this.play();}onRemove(){this.pause();}prepare(){let t=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),this._hasInvalidDimensions())return;if(0===Object.keys(this.tiles).length)return;const i=this.map.painter.context,o=i.gl;this.boundsBuffer||(this.boundsBuffer=i.createVertexBuffer(this._boundsArray,A.members)),this.boundsSegments||(this.boundsSegments=e.SegmentVector.simpleSegment(0,0,4,2)),this.texture?(t||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new e.Texture(i,this.canvas,o.RGBA,{premultiply:!0});for(const e in this.tiles){const t=this.tiles[e];"loaded"!==t.state&&(t.state="loaded",t.texture=this.texture);}}serialize(){return {type:"canvas",coordinates:this.coordinates}}hasTransition(){return this._playing}_hasInvalidDimensions(){for(const e of [this.canvas.width,this.canvas.height])if(isNaN(e)||e<=0)return !0;return !1}}},R=function(t,i,o,a){const r=new L[i.type](t,i,o,a);if(r.id!==t)throw new Error(`Expected Source id to be ${t} instead of ${r.id}`);return e.bindAll(["load","abort","unload","serialize","prepare"],r),r};function k(t,i){const o=e.identity([]);return e.scale(o,o,[.5*t.width,.5*-t.height,1]),e.translate(o,o,[1,-1,0]),e.multiply(o,o,t.calculatePosMatrix(i.toUnwrapped()))}function B(e,t,i,o,a,r,n,s=!1){const l=e.tilesIn(o,n,s);l.sort(O);const c=[];for(const o of l)c.push({wrappedTileID:o.tile.tileID.wrapped().key,queryResults:o.tile.queryRenderedFeatures(t,i,e._state,o,a,r,k(e.transform,o.tile.tileID),s)});const h=function(e){const t={},i={};for(const o of e){const e=o.queryResults,a=o.wrappedTileID,r=i[a]=i[a]||{};for(const i in e){const o=e[i],a=r[i]=r[i]||{},n=t[i]=t[i]||[];for(const e of o)a[e.featureIndex]||(a[e.featureIndex]=!0,n.push(e));}}return t}(c);for(const t in h)h[t].forEach(t=>{const i=t.feature,o=e.getFeatureState(i.layer["source-layer"],i.id);i.source=i.layer.source,i.layer["source-layer"]&&(i.sourceLayer=i.layer["source-layer"]),i.state=o;});return h}function F(e,t){const i=e.getRenderableIds().map(t=>e.getTileByID(t)),o=[],a={};for(let e=0;e{e.terminate();}),this.workers=null);}isPreloaded(){return !!this.active[N]}numActive(){return Object.keys(this.active).length}}let G;function q(){return G||(G=new Z),G}function V(t,i){const o={};for(const e in t)"ref"!==e&&(o[e]=t[e]);return e.refProperties.forEach(e=>{e in i&&(o[e]=i[e]);}),o}function $(e){e=e.slice();const t=Object.create(null);for(let i=0;i0?(a-n)/s:0;return this.points[r].mult(1-l).add(this.points[i].mult(l))}}class te{constructor(e,t,i){const o=this.boxCells=[],a=this.circleCells=[];this.xCellCount=Math.ceil(e/i),this.yCellCount=Math.ceil(t/i);for(let e=0;ethis.width||o<0||t>this.height)return !a&&[];const n=[];if(e<=0&&t<=0&&this.width<=i&&this.height<=o){if(a)return !0;for(let e=0;e0:n}_queryCircle(e,t,i,o,a){const r=e-i,n=e+i,s=t-i,l=t+i;if(n<0||r>this.width||l<0||s>this.height)return !o&&[];const c=[];return this._forEachCell(r,s,n,l,this._queryCellCircle,c,{hitTest:o,circle:{x:e,y:t,radius:i},seenUids:{box:{},circle:{}}},a),o?c.length>0:c}query(e,t,i,o,a){return this._query(e,t,i,o,!1,a)}hitTest(e,t,i,o,a){return this._query(e,t,i,o,!0,a)}hitTestCircle(e,t,i,o){return this._queryCircle(e,t,i,!0,o)}_queryCell(e,t,i,o,a,r,n,s){const l=n.seenUids,c=this.boxCells[a];if(null!==c){const a=this.bboxes;for(const h of c)if(!l.box[h]){l.box[h]=!0;const c=4*h;if(e<=a[c+2]&&t<=a[c+3]&&i>=a[c+0]&&o>=a[c+1]&&(!s||s(this.boxKeys[h]))){if(n.hitTest)return r.push(!0),!0;r.push({key:this.boxKeys[h],x1:a[c],y1:a[c+1],x2:a[c+2],y2:a[c+3]});}}}const h=this.circleCells[a];if(null!==h){const a=this.circles;for(const c of h)if(!l.circle[c]){l.circle[c]=!0;const h=3*c;if(this._circleAndRectCollide(a[h],a[h+1],a[h+2],e,t,i,o)&&(!s||s(this.circleKeys[c]))){if(n.hitTest)return r.push(!0),!0;{const e=a[h],t=a[h+1],i=a[h+2];r.push({key:this.circleKeys[c],x1:e-i,y1:t-i,x2:e+i,y2:t+i});}}}}}_queryCellCircle(e,t,i,o,a,r,n,s){const l=n.circle,c=n.seenUids,h=this.boxCells[a];if(null!==h){const e=this.bboxes;for(const t of h)if(!c.box[t]){c.box[t]=!0;const i=4*t;if(this._circleAndRectCollide(l.x,l.y,l.radius,e[i+0],e[i+1],e[i+2],e[i+3])&&(!s||s(this.boxKeys[t])))return r.push(!0),!0}}const u=this.circleCells[a];if(null!==u){const e=this.circles;for(const t of u)if(!c.circle[t]){c.circle[t]=!0;const i=3*t;if(this._circlesCollide(e[i],e[i+1],e[i+2],l.x,l.y,l.radius)&&(!s||s(this.circleKeys[t])))return r.push(!0),!0}}}_forEachCell(e,t,i,o,a,r,n,s){const l=this._convertToXCellCoord(e),c=this._convertToYCellCoord(t),h=this._convertToXCellCoord(i),u=this._convertToYCellCoord(o);for(let d=l;d<=h;d++)for(let l=c;l<=u;l++)if(a.call(this,e,t,i,o,this.xCellCount*l+d,r,n,s))return}_convertToXCellCoord(e){return Math.max(0,Math.min(this.xCellCount-1,Math.floor(e*this.xScale)))}_convertToYCellCoord(e){return Math.max(0,Math.min(this.yCellCount-1,Math.floor(e*this.yScale)))}_circlesCollide(e,t,i,o,a,r){const n=o-e,s=a-t,l=i+r;return l*l>n*n+s*s}_circleAndRectCollide(e,t,i,o,a,r,n){const s=(r-o)/2,l=Math.abs(e-(o+s));if(l>s+i)return !1;const c=(n-a)/2,h=Math.abs(t-(a+c));if(h>c+i)return !1;if(l<=s||h<=c)return !0;const u=l-s,d=h-c;return u*u+d*d<=i*i}}function ie(t,i,o,a,r){const n=e.create();return i?(e.scale(n,n,[1/r,1/r,1]),o||e.rotateZ(n,n,a.angle)):e.multiply(n,a.labelPlaneMatrix,t),n}function oe(t,i,o,a,r){if(i){const i=e.clone(t);return e.scale(i,i,[r,r,1]),o||e.rotateZ(i,i,-a.angle),i}return a.glCoordMatrix}function ae(t,i,o=0){const a=[t.x,t.y,o,1];o?e.transformMat4(a,a,i):pe(a,a,i);const r=a[3];return {point:new e.Point(a[0]/r,a[1]/r),signedDistanceFromCamera:r}}function re(e,t){return Math.min(.5+e/t*.5,1.5)}function ne(e,t){const i=e[0]/e[3],o=e[1]/e[3];return i>=-t[0]&&i<=t[0]&&o>=-t[1]&&o<=t[1]}function se(t,i,o,a,r,n,s,l,c){const h=a?t.textSizeData:t.iconSizeData,u=e.evaluateSizeForZoom(h,o.transform.zoom),d=[256/o.width*2+1,256/o.height*2+1],_=a?t.text.dynamicLayoutVertexArray:t.icon.dynamicLayoutVertexArray;_.clear();const m=t.lineVertexArray,p=a?t.text.placedSymbolArray:t.icon.placedSymbolArray,f=o.transform.width/o.transform.height;let g=!1;for(let a=0;aMath.abs(o.x-i.x)*a?{useVertical:!0}:(t===e.WritingMode.vertical?i.yo.x)?{needsFlipping:!0}:null}function he(t,i,o,a,r,n,s,l,c,h,u,d,_,m,p){const f=i/24,g=t.lineOffsetX*f,v=t.lineOffsetY*f;let x;if(t.numGlyphs>1){const e=t.glyphStartIndex+t.numGlyphs,i=t.lineStartIndex,r=t.lineStartIndex+t.lineLength,h=le(f,l,g,v,o,u,d,t,c,n,_,p);if(!h)return {notEnoughRoom:!0};const y=ae(h.first.point,s).point,b=ae(h.last.point,s).point;if(a&&!o){const e=ce(t.writingMode,y,b,m);if(e)return e}x=[h.first];for(let a=t.glyphStartIndex+1;a0?n.point:ue(d,a,i,1,r),l=ce(t.writingMode,i,s,m);if(l)return l}const i=de(f*l.getoffsetX(t.glyphStartIndex),g,v,o,u,d,t.segment,t.lineStartIndex,t.lineStartIndex+t.lineLength,c,n,_,p);if(!i)return {notEnoughRoom:!0};x=[i];}for(const t of x)e.addDynamicAttributes(h,t.point,t.angle);return {}}function ue(e,t,i,o,a,r){const n=e.add(e.sub(t)._unit()),s=ae(n,a,r?r(n):0).point,l=i.sub(s);return i.add(l._mult(o/l.mag()))}function de(t,i,o,a,r,n,s,l,c,h,u,d,_,m,p){const f=a?t-i:t+i;let g=f>0?1:-1,v=0;a&&(g*=-1,v=Math.PI),g<0&&(v+=Math.PI);let x=g>0?l+s:l+s+1,y=r,b=r,w=0,T=0;const E=Math.abs(f),C=[],S=[];let I=n;const P=()=>{const t=x-g;return 0===w?n:new e.Point(h.getx(t),h.gety(t))},M=()=>ue(P(),I,b,E-w+1,u,_);for(;w+T<=E;){if(x+=g,x=c)return null;if(b=y,C.push(y),m&&S.push(I||P()),y=d[x],void 0===y){I=new e.Point(h.getx(x),h.gety(x));const t=ae(I,u,_?_(I):0);y=t.signedDistanceFromCamera>0?d[x]=t.point:M();}else I=null;w+=T,T=b.dist(y);}p&&_&&(I=I||new e.Point(h.getx(x),h.gety(x)),d[x]=y=void 0===d[x]?y:M(),T=b.dist(y));const z=(E-w)/T,A=y.sub(b),D=A.mult(z)._add(b);o&&D._add(A._unit()._perp()._mult(o*g));const L=v+Math.atan2(y.y-b.y,y.x-b.x);return C.push(D),m&&(I=I||new e.Point(h.getx(x),h.gety(x)),S.push(function(t,i,o){const a=1-o;return new e.Point(t.x*a+i.x*o,t.y*a+i.y*o)}(S.length>0?S[S.length-1]:I,I,z))),{point:D,angle:L,path:C,tilePath:S}}const _e=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function me(e,t){for(let i=0;if.getAtTileOffset(m,e.x,e.y):e=>0,v=new e.Point(i.anchorX,i.anchorY),x=g(v),y=ae(v,n,x),b=re(this.transform.cameraToCenterDistance,y.signedDistanceFromCamera),w=(h?r/b:r*b)/e.ONE_EM,T=ae(v,s,x).point,E=y.signedDistanceFromCamera>0?le(w,a,i.lineOffsetX*w,i.lineOffsetY*w,!1,T,v,i,o,s,{},f&&!h?g:null,h&&!!f):null;let C=!1,S=!1,I=!0;if(E){const i=.5*d*b+_,o=new e.Point(-100,-100),a=new e.Point(this.screenRightBoundary,this.screenBottomBoundary),r=new ee,n=E.first,s=E.last;let h=[];for(let e=n.path.length-1;e>=1;e--)h.push(n.path[e]);for(let e=1;e{const i=g(tae(e,l));h=e.some(e=>e.signedDistanceFromCamera<=0)?[]:e.map(e=>e.point);}let v=[];if(h.length>0){const t=h[0].clone(),i=h[0].clone();for(let e=1;e=o.x&&i.x<=a.x&&t.y>=o.y&&i.y<=a.y?[h]:i.xa.x||i.ya.y?[]:e.clipLine([h],o.x,o.y,a.x,a.y);}for(const e of v){r.reset(e,.25*i);let o=0;o=r.length<=.5*i?1:Math.ceil(r.paddedLength/m)+1;for(let e=0;e=this.screenRightBoundary||o<100||t>this.screenBottomBoundary}isInsideGrid(e,t,i,o){return i>=0&&e=0&&te.collisionGroupID===t};}return this.collisionGroups[e]}}function Te(t,i,o,a,r){const{horizontalAlign:n,verticalAlign:s}=e.getAnchorAlignment(t),l=-(n-.5)*i,c=-(s-.5)*o,h=e.evaluateVariableOffset(t,a);return new e.Point(l+h[0]*r,c+h[1]*r)}function Ee(t,i,o,a,r){const n=new e.Point(t,i);return o&&n._rotate(a?r:-r),n}class Ce{constructor(e,t,i,o){this.transform=e.clone(),this.collisionIndex=new fe(this.transform),this.placements={},this.opacities={},this.variableOffsets={},this.stale=!1,this.commitTime=0,this.fadeDuration=t,this.retainedQueryData={},this.collisionGroups=new we(i),this.collisionCircleArrays={},this.prevPlacement=o,o&&(o.prevPlacement=void 0),this.placedOrientations={};}getBucketParts(t,i,o,a){const r=o.getBucket(i),n=o.latestFeatureIndex;if(!r||!n||i.id!==r.layerIds[0])return;const s=o.collisionBoxArray,l=r.layers[0].layout,c=Math.pow(2,this.transform.zoom-o.tileID.overscaledZ),h=o.tileSize/e.EXTENT,u=this.transform.calculatePosMatrix(o.tileID.toUnwrapped()),d="map"===l.get("text-pitch-alignment"),_="map"===l.get("text-rotation-alignment"),m=C(o,1,this.transform.zoom),p=ie(u,d,_,this.transform,m);let f=null;if(d){const t=oe(u,d,_,this.transform,m);f=e.multiply([],this.transform.labelPlaneMatrix,t);}this.retainedQueryData[r.bucketInstanceId]=new be(r.bucketInstanceId,n,r.sourceLayerIndex,r.index,o.tileID);const g={bucket:r,layout:l,posMatrix:u,textLabelPlaneMatrix:p,labelToScreenMatrix:f,scale:c,textPixelRatio:h,holdingForFade:o.holdingForFade(),collisionBoxArray:s,partiallyEvaluatedTextSize:e.evaluateSizeForZoom(r.textSizeData,this.transform.zoom),partiallyEvaluatedIconSize:e.evaluateSizeForZoom(r.iconSizeData,this.transform.zoom),collisionGroup:this.collisionGroups.get(r.sourceID)};if(a)for(const e of r.sortKeyRanges){const{sortKey:i,symbolInstanceStart:o,symbolInstanceEnd:a}=e;t.push({sortKey:i,symbolInstanceStart:o,symbolInstanceEnd:a,parameters:g});}else t.push({symbolInstanceStart:0,symbolInstanceEnd:r.symbolInstances.length,parameters:g});}attemptAnchorPlacement(e,t,i,o,a,r,n,s,l,c,h,u,d,_,m,p,f,g){const v=[u.textOffset0,u.textOffset1],x=_.getSymbolInstanceTextSize(f,u,this.transform.zoom,d),y=Te(e,i,o,v,a),b=this.collisionIndex.placeCollisionBox(x,t,Ee(y.x,y.y,r,n,this.transform.angle),h,s,l,c.predicate);if((!p||0!==this.collisionIndex.placeCollisionBox(_.getSymbolInstanceIconSize(g,this.transform.zoom,d),p,Ee(y.x,y.y,r,n,this.transform.angle),h,s,l,c.predicate).box.length)&&b.box.length>0){let t;return this.prevPlacement&&this.prevPlacement.variableOffsets[u.crossTileID]&&this.prevPlacement.placements[u.crossTileID]&&this.prevPlacement.placements[u.crossTileID].text&&(t=this.prevPlacement.variableOffsets[u.crossTileID].anchor),this.variableOffsets[u.crossTileID]={textOffset:v,width:i,height:o,anchor:e,textBoxScale:a,prevAnchor:t},this.markUsedJustification(_,e,u,m),_.allowVerticalPlacement&&(this.markUsedOrientation(_,m,u),this.placedOrientations[u.crossTileID]=m),{shift:y,placedGlyphBoxes:b}}}placeLayerBucketPart(t,i,o){const{bucket:a,layout:r,posMatrix:n,textLabelPlaneMatrix:s,labelToScreenMatrix:l,textPixelRatio:c,holdingForFade:h,collisionBoxArray:u,partiallyEvaluatedTextSize:d,partiallyEvaluatedIconSize:_,collisionGroup:m}=t.parameters,p=r.get("text-optional"),f=r.get("icon-optional"),g=r.get("text-allow-overlap"),v=r.get("icon-allow-overlap"),x="map"===r.get("text-rotation-alignment"),y="map"===r.get("text-pitch-alignment"),b="none"!==r.get("icon-text-fit"),w="viewport-y"===r.get("symbol-z-order"),T=g&&(v||!a.hasIconData()||f),E=v&&(g||!a.hasTextData()||p);!a.collisionArrays&&u&&a.deserializeCollisionBoxes(u),o&&a.updateCollisionDebugBuffers(this.transform.zoom,u);const C=(t,u,w)=>{if(i[t.crossTileID])return;if(h)return void(this.placements[t.crossTileID]=new xe(!1,!1,!1));let C=!1,S=!1,I=!0,P=null,M={box:null,offscreen:null},z={box:null,offscreen:null},A=null,D=null,L=null,R=0,k=0,B=0;w.textFeatureIndex?R=w.textFeatureIndex:t.useRuntimeCollisionCircles&&(R=t.featureIndex),w.verticalTextFeatureIndex&&(k=w.verticalTextFeatureIndex);const F=e=>{(this.transform.elevation||e.elevation)&&(e.elevation=this.transform.elevation?this.transform.elevation.getAtTileOffset(this.retainedQueryData[a.bucketInstanceId].tileID,e.anchorPointX,e.anchorPointY):0);},O=w.textBox;if(O){F(O);const i=i=>{let o=e.WritingMode.horizontal;if(a.allowVerticalPlacement&&!i&&this.prevPlacement){const e=this.prevPlacement.placedOrientations[t.crossTileID];e&&(this.placedOrientations[t.crossTileID]=e,o=e,this.markUsedOrientation(a,o,t));}return o},o=(i,o)=>{if(a.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&w.verticalTextBox){for(const t of a.writingModes)if(t===e.WritingMode.vertical?(M=o(),z=M):M=i(),M&&M.box&&M.box.length)break}else M=i();};if(r.get("text-variable-anchor")){let s=r.get("text-variable-anchor");if(this.prevPlacement&&this.prevPlacement.variableOffsets[t.crossTileID]){const e=this.prevPlacement.variableOffsets[t.crossTileID];s.indexOf(e.anchor)>0&&(s=s.filter(t=>t!==e.anchor),s.unshift(e.anchor));}const l=(e,i,o)=>{const r=t.textBoxScale,l=(e.x2-e.x1)*r+2*e.padding,h=(e.y2-e.y1)*r+2*e.padding,p=b&&!v?i:null;p&&F(p);let f={box:[],offscreen:!1};const w=g?2*s.length:s.length;for(let i=0;i=s.length,t,u,a,o,p,d,_);if(g&&(f=g.placedGlyphBoxes,f&&f.box&&f.box.length)){C=!0,P=g.shift;break}}return f};o(()=>l(O,w.iconBox,e.WritingMode.horizontal),()=>{const i=w.verticalTextBox;return i&&F(i),a.allowVerticalPlacement&&!(M&&M.box&&M.box.length)&&t.numVerticalGlyphVertices>0&&i?l(i,w.verticalIconBox,e.WritingMode.vertical):{box:null,offscreen:null}}),M&&(C=M.box,I=M.offscreen);const h=i(M&&M.box);if(!C&&this.prevPlacement){const e=this.prevPlacement.variableOffsets[t.crossTileID];e&&(this.variableOffsets[t.crossTileID]=e,this.markUsedJustification(a,e.anchor,t,h));}}else {const r=(i,o)=>{const r=a.getSymbolInstanceTextSize(d,t,this.transform.zoom,u),s=this.collisionIndex.placeCollisionBox(r,i,new e.Point(0,0),g,c,n,m.predicate);return s&&s.box&&s.box.length&&(this.markUsedOrientation(a,o,t),this.placedOrientations[t.crossTileID]=o),s};o(()=>r(O,e.WritingMode.horizontal),()=>{const i=w.verticalTextBox;return a.allowVerticalPlacement&&t.numVerticalGlyphVertices>0&&i?(F(i),r(i,e.WritingMode.vertical)):{box:null,offscreen:null}}),i(M&&M.box&&M.box.length);}}if(A=M,C=A&&A.box&&A.box.length>0,I=A&&A.offscreen,t.useRuntimeCollisionCircles){const i=a.text.placedSymbolArray.get(t.centerJustifiedTextSymbolIndex),c=e.evaluateSizeForFeature(a.textSizeData,d,i),h=r.get("text-padding");D=this.collisionIndex.placeCollisionCircles(g,i,a.lineVertexArray,a.glyphOffsetArray,c,n,s,l,o,y,m.predicate,t.collisionCircleDiameter,h,this.retainedQueryData[a.bucketInstanceId].tileID),C=g||D.circles.length>0&&!D.collisionDetected,I=I&&D.offscreen;}if(w.iconFeatureIndex&&(B=w.iconFeatureIndex),w.iconBox){const t=t=>{F(t);const i=b&&P?Ee(P.x,P.y,x,y,this.transform.angle):new e.Point(0,0),o=a.getSymbolInstanceIconSize(_,this.transform.zoom,u);return this.collisionIndex.placeCollisionBox(o,t,i,v,c,n,m.predicate)};z&&z.box&&z.box.length&&w.verticalIconBox?(L=t(w.verticalIconBox),S=L.box.length>0):(L=t(w.iconBox),S=L.box.length>0),I=I&&L.offscreen;}const U=p||0===t.numHorizontalGlyphVertices&&0===t.numVerticalGlyphVertices,N=f||0===t.numIconVertices;if(U||N?N?U||(S=S&&C):C=S&&C:S=C=S&&C,C&&A&&A.box&&this.collisionIndex.insertCollisionBox(A.box,r.get("text-ignore-placement"),a.bucketInstanceId,z&&z.box&&k?k:R,m.ID),S&&L&&this.collisionIndex.insertCollisionBox(L.box,r.get("icon-ignore-placement"),a.bucketInstanceId,B,m.ID),D&&(C&&this.collisionIndex.insertCollisionCircles(D.circles,r.get("text-ignore-placement"),a.bucketInstanceId,R,m.ID),o)){const e=a.bucketInstanceId;let t=this.collisionCircleArrays[e];void 0===t&&(t=this.collisionCircleArrays[e]=new ye);for(let e=0;e=0;--t){const i=e[t];C(a.symbolInstances.get(i),i,a.collisionArrays[i]);}}else for(let e=t.symbolInstanceStart;e=0&&(t.text.placedSymbolArray.get(e).crossTileID=r>=0&&e!==r?0:o.crossTileID);}markUsedOrientation(t,i,o){const a=i===e.WritingMode.horizontal||i===e.WritingMode.horizontalOnly?i:0,r=i===e.WritingMode.vertical?i:0,n=[o.leftJustifiedTextSymbolIndex,o.centerJustifiedTextSymbolIndex,o.rightJustifiedTextSymbolIndex];for(const e of n)t.text.placedSymbolArray.get(e).placedOrientation=a;o.verticalPlacedTextSymbolIndex&&(t.text.placedSymbolArray.get(o.verticalPlacedTextSymbolIndex).placedOrientation=r);}commit(e){this.commitTime=e,this.zoomAtLastRecencyCheck=this.transform.zoom;const t=this.prevPlacement;let i=!1;this.prevZoomAdjustment=t?t.zoomAdjustment(this.transform.zoom):0;const o=t?t.symbolFadeChange(e):1,a=t?t.opacities:{},r=t?t.variableOffsets:{},n=t?t.placedOrientations:{};for(const e in this.placements){const t=this.placements[e],r=a[e];r?(this.opacities[e]=new ve(r,o,t.text,t.icon),i=i||t.text!==r.text.placed||t.icon!==r.icon.placed):(this.opacities[e]=new ve(null,o,t.text,t.icon,t.skipFade),i=i||t.text||t.icon);}for(const e in a){const t=a[e];if(!this.opacities[e]){const a=new ve(t,o,!1,!1);a.isHidden()||(this.opacities[e]=a,i=i||t.text.placed||t.icon.placed);}}for(const e in r)this.variableOffsets[e]||!this.opacities[e]||this.opacities[e].isHidden()||(this.variableOffsets[e]=r[e]);for(const e in n)this.placedOrientations[e]||!this.opacities[e]||this.opacities[e].isHidden()||(this.placedOrientations[e]=n[e]);i?this.lastPlacementChangeTime=e:"number"!=typeof this.lastPlacementChangeTime&&(this.lastPlacementChangeTime=t?t.lastPlacementChangeTime:e);}updateLayerOpacities(e,t){const i={};for(const o of t){const t=o.getBucket(e);t&&o.latestFeatureIndex&&e.id===t.layerIds[0]&&this.updateBucketOpacities(t,i,o.collisionBoxArray);}}updateBucketOpacities(t,i,o){t.hasTextData()&&t.text.opacityVertexArray.clear(),t.hasIconData()&&t.icon.opacityVertexArray.clear(),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexArray.clear(),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexArray.clear();const a=t.layers[0].layout,r=new ve(null,0,!1,!1,!0),n=a.get("text-allow-overlap"),s=a.get("icon-allow-overlap"),l=a.get("text-variable-anchor"),c="map"===a.get("text-rotation-alignment"),h="map"===a.get("text-pitch-alignment"),u="none"!==a.get("icon-text-fit"),d=new ve(null,0,n&&(s||!t.hasIconData()||a.get("icon-optional")),s&&(n||!t.hasTextData()||a.get("text-optional")),!0);!t.collisionArrays&&o&&(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData())&&t.deserializeCollisionBoxes(o);const _=(e,t,i)=>{for(let o=0;o0,g=this.placedOrientations[a.crossTileID],v=g===e.WritingMode.vertical,x=g===e.WritingMode.horizontal||g===e.WritingMode.horizontalOnly;if(n>0||s>0){const e=Re(p.text);_(t.text,n,v?ke:e),_(t.text,s,x?ke:e);const i=p.text.isHidden();[a.rightJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.leftJustifiedTextSymbolIndex].forEach(e=>{e>=0&&(t.text.placedSymbolArray.get(e).hidden=i||v?1:0);}),a.verticalPlacedTextSymbolIndex>=0&&(t.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden=i||x?1:0);const o=this.variableOffsets[a.crossTileID];o&&this.markUsedJustification(t,o.anchor,a,g);const r=this.placedOrientations[a.crossTileID];r&&(this.markUsedJustification(t,"left",a,r),this.markUsedOrientation(t,r,a));}if(f){const e=Re(p.icon),i=!(u&&a.verticalPlacedIconSymbolIndex&&v);a.placedIconSymbolIndex>=0&&(_(t.icon,a.numIconVertices,i?e:ke),t.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden=p.icon.isHidden()),a.verticalPlacedIconSymbolIndex>=0&&(_(t.icon,a.numVerticalIconVertices,i?ke:e),t.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden=p.icon.isHidden());}if(t.hasIconCollisionBoxData()||t.hasTextCollisionBoxData()){const i=t.collisionArrays[o];if(i){let o=new e.Point(0,0);if(i.textBox||i.verticalTextBox){let e=!0;if(l){const t=this.variableOffsets[m];t?(o=Te(t.anchor,t.width,t.height,t.textOffset,t.textBoxScale),c&&o._rotate(h?this.transform.angle:-this.transform.angle)):e=!1;}i.textBox&&Se(t.textCollisionBox.collisionVertexArray,p.text.placed,!e||v,o.x,o.y),i.verticalTextBox&&Se(t.textCollisionBox.collisionVertexArray,p.text.placed,!e||x,o.x,o.y);}const a=Boolean(!x&&i.verticalIconBox);i.iconBox&&Se(t.iconCollisionBox.collisionVertexArray,p.icon.placed,a,u?o.x:0,u?o.y:0),i.verticalIconBox&&Se(t.iconCollisionBox.collisionVertexArray,p.icon.placed,!a,u?o.x:0,u?o.y:0);}}}if(t.sortFeatures(this.transform.angle),this.retainedQueryData[t.bucketInstanceId]&&(this.retainedQueryData[t.bucketInstanceId].featureSortOrder=t.featureSortOrder),t.hasTextData()&&t.text.opacityVertexBuffer&&t.text.opacityVertexBuffer.updateData(t.text.opacityVertexArray),t.hasIconData()&&t.icon.opacityVertexBuffer&&t.icon.opacityVertexBuffer.updateData(t.icon.opacityVertexArray),t.hasIconCollisionBoxData()&&t.iconCollisionBox.collisionVertexBuffer&&t.iconCollisionBox.collisionVertexBuffer.updateData(t.iconCollisionBox.collisionVertexArray),t.hasTextCollisionBoxData()&&t.textCollisionBox.collisionVertexBuffer&&t.textCollisionBox.collisionVertexBuffer.updateData(t.textCollisionBox.collisionVertexArray),t.bucketInstanceId in this.collisionCircleArrays){const e=this.collisionCircleArrays[t.bucketInstanceId];t.placementInvProjMatrix=e.invProjMatrix,t.placementViewportMatrix=e.viewportMatrix,t.collisionCircleArray=e.circles,delete this.collisionCircleArrays[t.bucketInstanceId];}}symbolFadeChange(e){return 0===this.fadeDuration?1:(e-this.commitTime)/this.fadeDuration+this.prevZoomAdjustment}zoomAdjustment(e){return Math.max(0,(this.transform.zoom-e)/1.5)}hasTransitions(e){return this.stale||e-this.lastPlacementChangeTimee}setStale(){this.stale=!0;}}function Se(e,t,i,o,a){e.emplaceBack(t?1:0,i?1:0,o||0,a||0),e.emplaceBack(t?1:0,i?1:0,o||0,a||0),e.emplaceBack(t?1:0,i?1:0,o||0,a||0),e.emplaceBack(t?1:0,i?1:0,o||0,a||0);}const Ie=Math.pow(2,25),Pe=Math.pow(2,24),Me=Math.pow(2,17),ze=Math.pow(2,16),Ae=Math.pow(2,9),De=Math.pow(2,8),Le=Math.pow(2,1);function Re(e){if(0===e.opacity&&!e.placed)return 0;if(1===e.opacity&&e.placed)return 4294967295;const t=e.placed?1:0,i=Math.floor(127*e.opacity);return i*Ie+t*Pe+i*Me+t*ze+i*Ae+t*De+i*Le+t}const ke=0;class Be{constructor(e){this._sortAcrossTiles="viewport-y"!==e.layout.get("symbol-z-order")&&void 0!==e.layout.get("symbol-sort-key").constantOr(1),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[];}continuePlacement(e,t,i,o,a){const r=this._bucketParts;for(;this._currentTileIndexe.sortKey-t.sortKey));this._currentPartIndex{const t=e.browser.now()-a;return !this._forceFullPlacement&&t>2};for(;this._currentPlacementIndex>=0;){const e=i[t[this._currentPlacementIndex]],a=this.placement.collisionIndex.transform.zoom;if("symbol"===e.type&&(!e.minzoom||e.minzoom<=a)&&(!e.maxzoom||e.maxzoom>a)){if(this._inProgressLayer||(this._inProgressLayer=new Be(e)),this._inProgressLayer.continuePlacement(o[e.source],this.placement,this._showCollisionBoxes,e,r))return;delete this._inProgressLayer;}this._currentPlacementIndex--;}this._done=!0;}commit(e){return this.placement.commit(e),this.placement}}const Oe=512/e.EXTENT/2;class Ue{constructor(e,t,i){this.tileID=e,this.indexedSymbolInstances={},this.bucketInstanceId=i;for(let i=0;ie.overscaledZ)for(const i in a){const r=a[i];r.tileID.isChildOf(e)&&r.findMatches(t.symbolInstances,e,o);}else {const r=a[e.scaledTo(Number(i)).key];r&&r.findMatches(t.symbolInstances,e,o);}}for(let e=0;e{t[e]=!0;});for(const e in this.layerIndexes)t[e]||delete this.layerIndexes[e];}}const qe=(t,i)=>e.emitValidationErrors(t,i&&i.filter(e=>"source.canvas"!==e.identifier)),Ve=e.pick(j,["addLayer","removeLayer","setPaintProperty","setLayoutProperty","setFilter","addSource","removeSource","setLayerZoomRange","setLight","setTransition","setGeoJSONSourceData","setTerrain"]),$e=e.pick(j,["setCenter","setZoom","setBearing","setPitch"]),je=function(){const t={},i=e.styleSpec.$version;for(const o in e.styleSpec.$root){const a=e.styleSpec.$root[o];if(a.required){let e=null;e="version"===o?i:"array"===a.type?[]:{},null!=e&&(t[o]=e);}}return t}();class We extends e.Evented{constructor(t,i={}){super(),this.map=t,this.dispatcher=new E(q(),this),this.imageManager=new u,this.imageManager.setEventedParent(this),this.glyphManager=new v(t._requestManager,i.localIdeographFontFamily),this.lineAtlas=new T(256,512),this.crossTileSymbolIndex=new Ge,this._layers={},this._num3DLayers=0,this._serializedLayers={},this._order=[],this._sourceCaches={},this._otherSourceCaches={},this._symbolSourceCaches={},this.zoomHistory=new e.ZoomHistory,this._loaded=!1,this._availableImages=[],this._resetUpdates(),this.dispatcher.broadcast("setReferrer",e.getReferrer());const o=this;this._rtlTextPluginCallback=We.registerForPluginStateChange(t=>{o.dispatcher.broadcast("syncRTLPluginState",{pluginStatus:t.pluginStatus,pluginURL:t.pluginURL},(t,i)=>{if(e.triggerPluginCompletionEvent(t),i&&i.every(e=>e))for(const e in o._sourceCaches){const t=o._sourceCaches[e],i=t.getSource().type;"vector"!==i&&"geojson"!==i||t.reload();}});}),this.on("data",e=>{if("source"!==e.dataType||"metadata"!==e.sourceDataType)return;const t=this.getSource(e.sourceId);if(t&&t.vectorLayerIds)for(const e in this._layers){const i=this._layers[e];i.source===t.id&&this._validateLayer(i);}});}loadURL(t,i={}){this.fire(new e.Event("dataloading",{dataType:"style"}));const o="boolean"==typeof i.validate?i.validate:!e.isMapboxURL(t);t=this.map._requestManager.normalizeStyleURL(t,i.accessToken);const a=this.map._requestManager.transformRequest(t,e.ResourceType.Style);this._request=e.getJSON(a,(t,i)=>{this._request=null,t?this.fire(new e.ErrorEvent(t)):i&&this._load(i,o);});}loadJSON(t,i={}){this.fire(new e.Event("dataloading",{dataType:"style"})),this._request=e.browser.frame(()=>{this._request=null,this._load(t,!1!==i.validate);});}loadEmpty(){this.fire(new e.Event("dataloading",{dataType:"style"})),this._load(je,!1);}_load(t,i){if(i&&qe(this,e.validateStyle(t)))return;this._loaded=!0,this.stylesheet=t;for(const e in t.sources)this.addSource(e,t.sources[e],{validate:!1});this._changed=!1,t.sprite?this._loadSprite(t.sprite):this.imageManager.setLoaded(!0),this.glyphManager.setURL(t.glyphs);const o=$(this.stylesheet.layers);this._order=o.map(e=>e.id),this._layers={},this._serializedLayers={};for(let t of o)t=e.createStyleLayer(t),t.setEventedParent(this,{layer:{id:t.id}}),this._layers[t.id]=t,this._serializedLayers[t.id]=t.serialize(),t.is3D()&&this._num3DLayers++;this.dispatcher.broadcast("setLayers",this._serializeLayers(this._order)),this.light=new y(this.stylesheet.light),this.stylesheet.terrain&&this._createTerrain(this.stylesheet.terrain),this.fire(new e.Event("data",{dataType:"style"})),this.fire(new e.Event("style.load"));}_loadSprite(t){this._spriteRequest=function(t,i,o){let a,r,n;const s=e.browser.devicePixelRatio>1?"@2x":"";let l=e.getJSON(i.transformRequest(i.normalizeSpriteURL(t,s,".json"),e.ResourceType.SpriteJSON),(e,t)=>{l=null,n||(n=e,a=t,h());}),c=e.getImage(i.transformRequest(i.normalizeSpriteURL(t,s,".png"),e.ResourceType.SpriteImage),(e,t)=>{c=null,n||(n=e,r=t,h());});function h(){if(n)o(n);else if(a&&r){const t=e.browser.getImageData(r),i={};for(const o in a){const{width:r,height:n,x:s,y:l,sdf:c,pixelRatio:h,stretchX:u,stretchY:d,content:_}=a[o],m=new e.RGBAImage({width:r,height:n});e.RGBAImage.copy(t,m,{x:s,y:l},{x:0,y:0},{width:r,height:n}),i[o]={data:m,pixelRatio:h,sdf:c,stretchX:u,stretchY:d,content:_};}o(null,i);}}return {cancel(){l&&(l.cancel(),l=null),c&&(c.cancel(),c=null);}}}(t,this.map._requestManager,(t,i)=>{if(this._spriteRequest=null,t)this.fire(new e.ErrorEvent(t));else if(i)for(const e in i)this.imageManager.addImage(e,i[e]);this.imageManager.setLoaded(!0),this._availableImages=this.imageManager.listImages(),this.dispatcher.broadcast("setImages",this._availableImages),this.fire(new e.Event("data",{dataType:"style"}));});}_validateLayer(t){const i=this.getSource(t.source);if(!i)return;const o=t.sourceLayer;o&&("geojson"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(o))&&this.fire(new e.ErrorEvent(new Error(`Source layer "${o}" `+`does not exist on source "${i.id}" `+`as specified by style layer "${t.id}"`)));}loaded(){if(!this._loaded)return !1;if(Object.keys(this._updatedSources).length)return !1;for(const e in this._sourceCaches)if(!this._sourceCaches[e].loaded())return !1;return !!this.imageManager.isLoaded()}_serializeLayers(e){const t=[];for(const i of e){const e=this._layers[i];"custom"!==e.type&&t.push(e.serialize());}return t}hasTransitions(){if(this.light&&this.light.hasTransition())return !0;for(const e in this._sourceCaches)if(this._sourceCaches[e].hasTransition())return !0;for(const e in this._layers)if(this._layers[e].hasTransition())return !0;return !1}_checkLoaded(){if(!this._loaded)throw new Error("Style is not done loading")}update(t){if(!this._loaded)return;const i=this._changed;if(this._changed){const e=Object.keys(this._updatedLayers),i=Object.keys(this._removedLayers);(e.length||i.length)&&this._updateWorkerLayers(e,i);for(const e in this._updatedSources){const t=this._updatedSources[e];"reload"===t?this._reloadSource(e):"clear"===t&&this._clearSource(e);}this._updateTilesForChangedImages();for(const e in this._updatedPaintProps)this._layers[e].updateTransitions(t);this.light.updateTransitions(t),this._resetUpdates();}const o={};for(const e in this._sourceCaches){const t=this._sourceCaches[e];o[e]=t.used,t.used=!1;}for(const e of this._order){const i=this._layers[e];if(i.recalculate(t,this._availableImages),!i.isHidden(t.zoom)){const e=this._getLayerSourceCache(i);e&&(e.used=!0);}const o=this.map.painter;if(o){const e=i.getProgramIds();if(!e)continue;const a=i.getProgramConfiguration(t.zoom);for(const t of e)o.useProgram(t,a);}}for(const t in o){const i=this._sourceCaches[t];o[t]!==i.used&&i.getSource().fire(new e.Event("data",{sourceDataType:"visibility",dataType:"source",sourceId:i.getSource().id}));}this.light.recalculate(t),this.terrain&&this.terrain.recalculate(t),this.z=t.zoom,i&&this.fire(new e.Event("data",{dataType:"style"}));}_updateTilesForChangedImages(){const e=Object.keys(this._changedImages);if(e.length){for(const t in this._sourceCaches)this._sourceCaches[t].reloadTilesForDependencies(["icons","patterns"],e);this._changedImages={};}}_updateWorkerLayers(e,t){this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(e),removedIds:t});}_resetUpdates(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSources={},this._updatedPaintProps={},this._changedImages={};}setState(t){if(this._checkLoaded(),qe(this,e.validateStyle(t)))return !1;(t=e.clone$1(t)).layers=$(t.layers);const i=function(t,i){if(!t)return [{command:j.setStyle,args:[i]}];let o=[];try{if(!e.deepEqual(t.version,i.version))return [{command:j.setStyle,args:[i]}];e.deepEqual(t.center,i.center)||o.push({command:j.setCenter,args:[i.center]}),e.deepEqual(t.zoom,i.zoom)||o.push({command:j.setZoom,args:[i.zoom]}),e.deepEqual(t.bearing,i.bearing)||o.push({command:j.setBearing,args:[i.bearing]}),e.deepEqual(t.pitch,i.pitch)||o.push({command:j.setPitch,args:[i.pitch]}),e.deepEqual(t.sprite,i.sprite)||o.push({command:j.setSprite,args:[i.sprite]}),e.deepEqual(t.glyphs,i.glyphs)||o.push({command:j.setGlyphs,args:[i.glyphs]}),e.deepEqual(t.transition,i.transition)||o.push({command:j.setTransition,args:[i.transition]}),e.deepEqual(t.light,i.light)||o.push({command:j.setLight,args:[i.light]}),e.deepEqual(t.terrain,i.terrain)||o.push({command:j.setTerrain,args:[i.terrain]});const a={},r=[];!function(t,i,o,a){let r;for(r in i=i||{},t=t||{})t.hasOwnProperty(r)&&(i.hasOwnProperty(r)||X(r,o,a));for(r in i)i.hasOwnProperty(r)&&(t.hasOwnProperty(r)?e.deepEqual(t[r],i[r])||("geojson"===t[r].type&&"geojson"===i[r].type&&K(t,i,r)?o.push({command:j.setGeoJSONSourceData,args:[r,i[r].data]}):H(r,i,o,a)):W(r,i,o));}(t.sources,i.sources,r,a);const n=[];t.layers&&t.layers.forEach(e=>{a[e.source]?o.push({command:j.removeLayer,args:[e.id]}):n.push(e);}),o=o.concat(r),function(t,i,o){i=i||[];const a=(t=t||[]).map(J),r=i.map(J),n=t.reduce(Q,{}),s=i.reduce(Q,{}),l=a.slice(),c=Object.create(null);let h,u,d,_,m,p,f;for(h=0,u=0;h!(e.command in $e));if(0===i.length)return !1;const o=i.filter(e=>!(e.command in Ve));if(o.length>0)throw new Error(`Unimplemented: ${o.map(e=>e.command).join(", ")}.`);return i.forEach(e=>{"setTransition"!==e.command&&this[e.command].apply(this,e.args);}),this.stylesheet=t,!0}addImage(t,i){if(this.getImage(t))return this.fire(new e.ErrorEvent(new Error("An image with this name already exists.")));this.imageManager.addImage(t,i),this._afterImageUpdated(t);}updateImage(e,t){this.imageManager.updateImage(e,t);}getImage(e){return this.imageManager.getImage(e)}removeImage(t){if(!this.getImage(t))return this.fire(new e.ErrorEvent(new Error("No image with this name exists.")));this.imageManager.removeImage(t),this._afterImageUpdated(t);}_afterImageUpdated(t){this._availableImages=this.imageManager.listImages(),this._changedImages[t]=!0,this._changed=!0,this.dispatcher.broadcast("setImages",this._availableImages),this.fire(new e.Event("data",{dataType:"style"}));}listImages(){return this._checkLoaded(),this.imageManager.listImages()}addSource(t,i,o={}){if(this._checkLoaded(),void 0!==this.getSource(t))throw new Error("There is already a source with this ID");if(!i.type)throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(i).join(", ")}.`);if(["vector","raster","geojson","video","image"].indexOf(i.type)>=0&&this._validate(e.validateStyle.source,`sources.${t}`,i,null,o))return;this.map&&this.map._collectResourceTiming&&(i.collectResourceTiming=!0);const a=R(t,i,this.dispatcher,this);a.setEventedParent(this,()=>({isSourceLoaded:this.loaded(),source:a.serialize(),sourceId:t}));const r=i=>{const o=(i?"symbol:":"other:")+t,r=this._sourceCaches[o]=new e.SourceCache(o,a,i);(i?this._symbolSourceCaches:this._otherSourceCaches)[t]=r,r.style=this,r.onAdd(this.map);};r(!1),"vector"!==i.type&&"geojson"!==i.type||r(!0),a.onAdd&&a.onAdd(this.map),this._changed=!0;}removeSource(t){this._checkLoaded();const i=this.getSource(t);if(void 0===i)throw new Error("There is no source with this ID");for(const i in this._layers)if(this._layers[i].source===t)return this.fire(new e.ErrorEvent(new Error(`Source "${t}" cannot be removed while layer "${i}" is using it.`)));if(this.terrain&&this.terrain.get().source===t)return this.fire(new e.ErrorEvent(new Error(`Source "${t}" cannot be removed while terrain is using it.`)));const o=this._getSourceCaches(t);for(const t of o)delete this._sourceCaches[t.id],delete this._updatedSources[t.id],t.fire(new e.Event("data",{sourceDataType:"metadata",dataType:"source",sourceId:t.getSource().id})),t.setEventedParent(null),t.clearTiles();delete this._otherSourceCaches[t],delete this._symbolSourceCaches[t],i.setEventedParent(null),i.onRemove&&i.onRemove(this.map),this._changed=!0;}setGeoJSONSourceData(e,t){this._checkLoaded(),this.getSource(e).setData(t),this._changed=!0;}getSource(e){const t=this._getSourceCache(e);return t&&t.getSource()}addLayer(t,i,o={}){this._checkLoaded();const a=t.id;if(this.getLayer(a))return void this.fire(new e.ErrorEvent(new Error(`Layer with id "${a}" already exists on this map`)));let r;if("custom"===t.type){if(qe(this,e.validateCustomStyleLayer(t)))return;r=e.createStyleLayer(t);}else {if("object"==typeof t.source&&(this.addSource(a,t.source),t=e.clone$1(t),t=e.extend(t,{source:a})),this._validate(e.validateStyle.layer,`layers.${a}`,t,{arrayIndex:-1},o))return;r=e.createStyleLayer(t),this._validateLayer(r),r.setEventedParent(this,{layer:{id:a}}),this._serializedLayers[r.id]=r.serialize(),r.is3D()&&this._num3DLayers++;}const n=i?this._order.indexOf(i):this._order.length;if(i&&-1===n)return void this.fire(new e.ErrorEvent(new Error(`Layer with id "${i}" does not exist on this map.`)));this._order.splice(n,0,a),this._layerOrderChanged=!0,this._layers[a]=r;const s=this._getLayerSourceCache(r);if(this._removedLayers[a]&&r.source&&s&&"custom"!==r.type){const e=this._removedLayers[a];delete this._removedLayers[a],e.type!==r.type?this._updatedSources[r.source]="clear":(this._updatedSources[r.source]="reload",s.pause());}this._updateLayer(r),r.onAdd&&r.onAdd(this.map);}moveLayer(t,i){if(this._checkLoaded(),this._changed=!0,!this._layers[t])return void this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be moved.`)));if(t===i)return;const o=this._order.indexOf(t);this._order.splice(o,1);const a=i?this._order.indexOf(i):this._order.length;i&&-1===a?this.fire(new e.ErrorEvent(new Error(`Layer with id "${i}" does not exist on this map.`))):(this._order.splice(a,0,t),this._layerOrderChanged=!0);}removeLayer(t){this._checkLoaded();const i=this._layers[t];if(!i)return void this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be removed.`)));i.setEventedParent(null),i.is3D()&&this._num3DLayers--;const o=this._order.indexOf(t);this._order.splice(o,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[t]=i,delete this._layers[t],delete this._serializedLayers[t],delete this._updatedLayers[t],delete this._updatedPaintProps[t],i.onRemove&&i.onRemove(this.map);}getLayer(e){return this._layers[e]}hasLayer(e){return e in this._layers}setLayerZoomRange(t,i,o){this._checkLoaded();const a=this.getLayer(t);a?a.minzoom===i&&a.maxzoom===o||(null!=i&&(a.minzoom=i),null!=o&&(a.maxzoom=o),this._updateLayer(a)):this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot have zoom extent.`)));}setFilter(t,i,o={}){this._checkLoaded();const a=this.getLayer(t);if(a){if(!e.deepEqual(a.filter,i))return null==i?(a.filter=void 0,void this._updateLayer(a)):void(this._validate(e.validateStyle.filter,`layers.${a.id}.filter`,i,null,o)||(a.filter=e.clone$1(i),this._updateLayer(a)))}else this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be filtered.`)));}getFilter(t){return e.clone$1(this.getLayer(t).filter)}setLayoutProperty(t,i,o,a={}){this._checkLoaded();const r=this.getLayer(t);r?e.deepEqual(r.getLayoutProperty(i),o)||(r.setLayoutProperty(i,o,a),this._updateLayer(r)):this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be styled.`)));}getLayoutProperty(t,i){const o=this.getLayer(t);if(o)return o.getLayoutProperty(i);this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style.`)));}setPaintProperty(t,i,o,a={}){this._checkLoaded();const r=this.getLayer(t);r?e.deepEqual(r.getPaintProperty(i),o)||(r.setPaintProperty(i,o,a)&&this._updateLayer(r),this._changed=!0,this._updatedPaintProps[t]=!0):this.fire(new e.ErrorEvent(new Error(`The layer '${t}' does not exist in the map's style and cannot be styled.`)));}getPaintProperty(e,t){return this.getLayer(e).getPaintProperty(t)}setFeatureState(t,i){this._checkLoaded();const o=t.source,a=t.sourceLayer,r=this.getSource(o);if(void 0===r)return void this.fire(new e.ErrorEvent(new Error(`The source '${o}' does not exist in the map's style.`)));const n=r.type;if("geojson"===n&&a)return void this.fire(new e.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter.")));if("vector"===n&&!a)return void this.fire(new e.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));void 0===t.id&&this.fire(new e.ErrorEvent(new Error("The feature id parameter must be provided.")));const s=this._getSourceCaches(o);for(const e of s)e.setFeatureState(a,t.id,i);}removeFeatureState(t,i){this._checkLoaded();const o=t.source,a=this.getSource(o);if(void 0===a)return void this.fire(new e.ErrorEvent(new Error(`The source '${o}' does not exist in the map's style.`)));const r=a.type,n="vector"===r?t.sourceLayer:void 0;if("vector"===r&&!n)return void this.fire(new e.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));if(i&&"string"!=typeof t.id&&"number"!=typeof t.id)return void this.fire(new e.ErrorEvent(new Error("A feature id is required to remove its specific state property.")));const s=this._getSourceCaches(o);for(const e of s)e.removeFeatureState(n,t.id,i);}getFeatureState(t){this._checkLoaded();const i=t.source,o=t.sourceLayer,a=this.getSource(i);if(void 0!==a){if("vector"!==a.type||o)return void 0===t.id&&this.fire(new e.ErrorEvent(new Error("The feature id parameter must be provided."))),this._getSourceCaches(i)[0].getFeatureState(o,t.id);this.fire(new e.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));}else this.fire(new e.ErrorEvent(new Error(`The source '${i}' does not exist in the map's style.`)));}getTransition(){return e.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)}serialize(){const t={};for(const e in this._sourceCaches){const i=this._sourceCaches[e].getSource();t[i.id]||(t[i.id]=i.serialize());}return e.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,terrain:this.stylesheet.terrain,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t,layers:this._serializeLayers(this._order)},e=>void 0!==e)}_updateLayer(e){this._updatedLayers[e.id]=!0;const t=this._getLayerSourceCache(e);e.source&&!this._updatedSources[e.source]&&t&&"raster"!==t.getSource().type&&(this._updatedSources[e.source]="reload",t.pause()),this._changed=!0;}_flattenAndSortRenderedFeatures(e){const t=e=>"fill-extrusion"===this._layers[e].type,i={},o=[];for(let a=this._order.length-1;a>=0;a--){const r=this._order[a];if(t(r)){i[r]=a;for(const t of e){const e=t[r];if(e)for(const t of e)o.push(t);}}}o.sort((e,t)=>t.intersectionZ-e.intersectionZ);const a=[];for(let r=this._order.length-1;r>=0;r--){const n=this._order[r];if(t(n))for(let e=o.length-1;e>=0;e--){const t=o[e].feature;if(i[t.layer.id]{const t=this.getLayer(e);return t&&t.is3D()}):this.has3DLayers(),s=S.createFromScreenPoints(t,o);for(const e in this._sourceCaches){const t=this._sourceCaches[e].getSource().id;i.layers&&!a[t]||r.push(B(this._sourceCaches[e],this._layers,this._serializedLayers,s,i,o,n,!!this.map._showQueryGeometry));}return this.placement&&r.push(function(e,t,i,o,a,r,n){const s={},l=r.queryRenderedSymbols(o),c=[];for(const e of Object.keys(l).map(Number))c.push(n[e]);c.sort(O);for(const i of c){const o=i.featureIndex.lookupSymbolFeatures(l[i.bucketInstanceId],t,i.bucketIndex,i.sourceLayerIndex,a.filter,a.layers,a.availableImages,e);for(const e in o){const t=s[e]=s[e]||[],a=o[e];a.sort((e,t)=>{const o=i.featureSortOrder;if(o){const i=o.indexOf(e.featureIndex);return o.indexOf(t.featureIndex)-i}return t.featureIndex-e.featureIndex});for(const e of a)t.push(e);}}for(const t in s)s[t].forEach(o=>{const a=o.feature,r=i(e[t]).getFeatureState(a.layer["source-layer"],a.id);a.source=a.layer.source,a.layer["source-layer"]&&(a.sourceLayer=a.layer["source-layer"]),a.state=r;});return s}(this._layers,this._serializedLayers,this._getLayerSourceCache.bind(this),s.screenGeometry,i,this.placement.collisionIndex,this.placement.retainedQueryData)),this._flattenAndSortRenderedFeatures(r)}querySourceFeatures(t,i){i&&i.filter&&this._validate(e.validateStyle.filter,"querySourceFeatures.filter",i.filter,null,i);const o=this._getSourceCaches(t);let a=[];for(const e of o)a=a.concat(F(e,i));return a}addSourceType(e,t,i){return We.getSourceType(e)?i(new Error(`A source type called "${e}" already exists.`)):(We.setSourceType(e,t),t.workerSourceURL?void this.dispatcher.broadcast("loadWorkerSource",{name:e,url:t.workerSourceURL},i):i(null,null))}getLight(){return this.light.getLight()}setLight(t,i={}){this._checkLoaded();const o=this.light.getLight();let a=!1;for(const i in t)if(!e.deepEqual(t[i],o[i])){a=!0;break}if(!a)return;const r={now:e.browser.now(),transition:e.extend({duration:300,delay:0},this.stylesheet.transition)};this.light.setLight(t,i),this.light.updateTransitions(r);}setTerrain(t){if(this._checkLoaded(),!t)return delete this.terrain,delete this.stylesheet.terrain,this.dispatcher.broadcast("enableTerrain",!1),void this._force3DLayerUpdate();if("object"==typeof t.source){const i="terrain-dem-src";this.addSource(i,t.source),t=e.clone$1(t),t=e.extend(t,{source:i});}if(!this._validate(e.validateStyle.terrain,"terrain",t))if(this.terrain){const i=this.terrain,o=i.get();for(const a in t)if(!e.deepEqual(t[a],o[a])){i.set(t),this.stylesheet.terrain=t;const o={now:e.browser.now(),transition:e.extend({duration:0},this.stylesheet.transition)};i.updateTransitions(o);break}}else this._createTerrain(t);}_createTerrain(t){const i=this.terrain=new w(t);this.stylesheet.terrain=t,this.dispatcher.broadcast("enableTerrain",!0),this._force3DLayerUpdate();const o={now:e.browser.now(),transition:e.extend({duration:0},this.stylesheet.transition)};i.updateTransitions(o);}_force3DLayerUpdate(){for(const e in this._layers){const t=this._layers[e];"fill-extrusion"===t.type&&this._updateLayer(t);}}_validate(t,i,o,a,r={}){return (!r||!1!==r.validate)&&qe(this,t.call(e.validateStyle,e.extend({key:i,style:this.serialize(),value:o,styleSpec:e.styleSpec},a)))}_remove(){this._request&&(this._request.cancel(),this._request=null),this._spriteRequest&&(this._spriteRequest.cancel(),this._spriteRequest=null),e.evented.off("pluginStateChange",this._rtlTextPluginCallback);for(const e in this._layers)this._layers[e].setEventedParent(null);for(const e in this._sourceCaches)this._sourceCaches[e].clearTiles(),this._sourceCaches[e].setEventedParent(null);this.imageManager.setEventedParent(null),this.setEventedParent(null),this.dispatcher.remove();}_clearSource(e){const t=this._getSourceCaches(e);for(const e of t)e.clearTiles();}_reloadSource(e){const t=this._getSourceCaches(e);for(const e of t)e.resume(),e.reload();}_updateSources(e){for(const t in this._sourceCaches)this._sourceCaches[t].update(e);}_generateCollisionBoxes(){for(const e in this._sourceCaches){const t=this._sourceCaches[e];t.resume(),t.reload();}}_updatePlacement(t,i,o,a,r=!1){let n=!1,s=!1;const l={};for(const e of this._order){const i=this._layers[e];if("symbol"!==i.type)continue;if(!l[i.source]){const e=this._getLayerSourceCache(i);if(!e)continue;l[i.source]=e.getRenderableIds(!0).map(t=>e.getTileByID(t)).sort((e,t)=>t.tileID.overscaledZ-e.tileID.overscaledZ||(e.tileID.isLessThan(t.tileID)?-1:1));}const o=this.crossTileSymbolIndex.addLayer(i,l[i.source],t.center.lng);n=n||o;}if(this.crossTileSymbolIndex.pruneUnusedLayers(this._order),((r=r||this._layerOrderChanged||0===o)||!this.pauseablePlacement||this.pauseablePlacement.isDone()&&!this.placement.stillRecent(e.browser.now(),t.zoom))&&(this.pauseablePlacement=new Fe(t,this._order,r,i,o,a,this.placement),this._layerOrderChanged=!1),this.pauseablePlacement.isDone()?this.placement.setStale():(this.pauseablePlacement.continuePlacement(this._order,this._layers,l),this.pauseablePlacement.isDone()&&(this.placement=this.pauseablePlacement.commit(e.browser.now()),s=!0),n&&this.pauseablePlacement.placement.setStale()),s||n)for(const e of this._order){const t=this._layers[e];"symbol"===t.type&&this.placement.updateLayerOpacities(t,l[t.source]);}return !this.pauseablePlacement.isDone()||this.placement.hasTransitions(e.browser.now())}_releaseSymbolFadeTiles(){for(const e in this._sourceCaches)this._sourceCaches[e].releaseSymbolFadeTiles();}getImages(e,t,i){this.imageManager.getImages(t.icons,i),this._updateTilesForChangedImages();const o=e=>{e&&e.setDependencies(t.tileID.key,t.type,t.icons);};o(this._otherSourceCaches[t.source]),o(this._symbolSourceCaches[t.source]);}getGlyphs(e,t,i){this.glyphManager.getGlyphs(t.stacks,i);}getResource(t,i,o){return e.makeRequest(i,o)}_getSourceCache(e){return this._otherSourceCaches[e]}_getLayerSourceCache(e){return "symbol"===e.type?this._symbolSourceCaches[e.source]:this._otherSourceCaches[e.source]}_getSourceCaches(e){const t=[];return this._otherSourceCaches[e]&&t.push(this._otherSourceCaches[e]),this._symbolSourceCaches[e]&&t.push(this._symbolSourceCaches[e]),t}has3DLayers(){return this._num3DLayers>0}}We.getSourceType=function(e){return L[e]},We.setSourceType=function(e,t){L[e]=t;},We.registerForPluginStateChange=e.registerForPluginStateChange;var Xe="attribute highp vec3 a_pos_3f;uniform lowp mat4 u_matrix;varying highp vec3 v_uv;void main() {const mat3 half_neg_pi_around_x=mat3(1.0,0.0, 0.0,0.0,0.0,-1.0,0.0,1.0, 0.0);v_uv=half_neg_pi_around_x*a_pos_3f;vec4 pos=u_matrix*vec4(a_pos_3f,1.0);gl_Position=pos.xyww;}";let He={};He=It("","#ifdef TERRAIN\nuniform sampler2D u_dem;uniform sampler2D u_dem_prev;uniform vec4 u_dem_unpack;uniform vec2 u_dem_tl;uniform vec2 u_dem_tl_prev;uniform float u_dem_scale;uniform float u_dem_scale_prev;uniform float u_dem_size;uniform float u_dem_lerp;uniform float u_exaggeration;uniform float u_meter_to_dem;uniform mat4 u_label_plane_matrix_inv;uniform sampler2D u_depth;uniform vec2 u_depth_size_inv;vec4 tileUvToDemSample(vec2 uv,float dem_size,float dem_scale,vec2 dem_tl) {vec2 pos=dem_size*(uv*dem_scale+dem_tl)+1.0;vec2 f=fract(pos);return vec4((pos-f+0.5)/(dem_size+2.0),f);}float decodeElevation(vec4 v) {return dot(vec4(v.xyz*255.0,-1.0),u_dem_unpack);}float currentElevation(vec2 apos) {float dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale,u_dem_tl);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem,pos));float tr=decodeElevation(texture2D(u_dem,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);}float prevElevation(vec2 apos) {float dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale_prev,u_dem_tl_prev);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem_prev,pos));float tr=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem_prev,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);}\n#ifdef TERRAIN_VERTEX_MORPHING\nfloat elevation(vec2 apos) {float nextElevation=currentElevation(apos);float prevElevation=prevElevation(apos);return mix(prevElevation,nextElevation,u_dem_lerp);}\n#else\nfloat elevation(vec2 apos) {return currentElevation(apos);}\n#endif\nfloat unpack_depth(vec4 rgba_depth)\n{const vec4 bit_shift=vec4(1.0/(256.0*256.0*256.0),1.0/(256.0*256.0),1.0/256.0,1.0);return dot(rgba_depth,bit_shift)*2.0-1.0;}bool isOccluded(vec4 frag) {vec3 coord=frag.xyz/frag.w;float depth=unpack_depth(texture2D(u_depth,(coord.xy+1.0)*0.5));return coord.z > depth+0.0005;}float occlusionFade(vec4 frag) {vec3 coord=frag.xyz/frag.w;vec3 df=vec3(5.0*u_depth_size_inv,0.0);vec2 uv=0.5*coord.xy+0.5;vec4 depth=vec4(\nunpack_depth(texture2D(u_depth,uv-df.xz)),unpack_depth(texture2D(u_depth,uv+df.xz)),unpack_depth(texture2D(u_depth,uv-df.zy)),unpack_depth(texture2D(u_depth,uv+df.zy))\n);return dot(vec4(0.25),vec4(1.0)-clamp(300.0*(vec4(coord.z-0.001)-depth),0.0,1.0));}vec4 fourSample(vec2 pos,vec2 off) {vec4 demtl=vec4(texture2D(u_dem,pos).xyz*255.0,-1.0);float tl=dot(demtl,u_dem_unpack);vec4 demtr=vec4(texture2D(u_dem,pos+vec2(off.x,0.0)).xyz*255.0,-1.0);float tr=dot(demtr,u_dem_unpack);vec4 dembl=vec4(texture2D(u_dem,pos+vec2(0.0,off.y)).xyz*255.0,-1.0);float bl=dot(dembl,u_dem_unpack);vec4 dembr=vec4(texture2D(u_dem,pos+off).xyz*255.0,-1.0);float br=dot(dembr,u_dem_unpack);return vec4(tl,tr,bl,br);}float flatElevation(vec2 pack) {vec2 apos=floor(pack/8.0);vec2 span=10.0*(pack-apos*8.0);vec2 uvTex=(apos-vec2(1.0,1.0))/8190.0;float size=u_dem_size+2.0;float dd=1.0/size;vec2 pos=u_dem_size*(uvTex*u_dem_scale+u_dem_tl)+1.0;vec2 f=fract(pos);pos=(pos-f+0.5)*dd;vec4 h=fourSample(pos,vec2(dd));float z=mix(mix(h.x,h.y,f.x),mix(h.z,h.w,f.x),f.y);vec2 w=floor(0.5*(span*u_meter_to_dem-1.0));vec2 d=dd*w;vec4 bounds=vec4(d,vec2(1.0)-d);h=fourSample(pos-d,2.0*d+vec2(dd));vec4 diff=abs(h.xzxy-h.ywzw);vec2 slope=min(vec2(0.25),u_meter_to_dem*0.5*(diff.xz+diff.yw)/(2.0*w+vec2(1.0)));vec2 fix=slope*span;float base=z+max(fix.x,fix.y);return u_exaggeration*base;}float elevationFromUint16(float word) {return u_exaggeration*word/7.3;}\n#else\nfloat elevation(vec2 pos) { return 0.0; }bool isOccluded(vec4 frag) { return false; }float occlusionFade(vec4 frag) { return 1.0; }\n#endif",!0);const Ke=It("#ifdef GL_ES\nprecision mediump float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nconst float PI=3.141592653589793;","#ifdef GL_ES\nprecision highp float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(\nunpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}const float PI=3.141592653589793;const vec4 AWAY=vec4(-1000.0,-1000.0,-1000.0,1);//Normalized device coordinate that is not rendered."),Ye=It("uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),Je=It("uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}"),Qe=It("varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(\nantialiased_blur,0.0,extrude_length-radius/(radius+stroke_width)\n);gl_FragColor=v_visibility*opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","#define NUM_VISIBILITY_RINGS 2\n#define INV_SQRT2 0.70710678\n#define ELEVATION_BIAS 0.0001\n#define NUM_SAMPLES_PER_RING 16\nuniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvec2 calc_offset(vec2 extrusion,float radius,float stroke_width, float view_scale) {return extrusion*(radius+stroke_width)*u_extrude_scale*view_scale;}float cantilevered_elevation(vec2 pos,float radius,float stroke_width,float view_scale) {vec2 c1=pos+calc_offset(vec2(-1,-1),radius,stroke_width,view_scale);vec2 c2=pos+calc_offset(vec2(1,-1),radius,stroke_width,view_scale);vec2 c3=pos+calc_offset(vec2(1,1),radius,stroke_width,view_scale);vec2 c4=pos+calc_offset(vec2(-1,1),radius,stroke_width,view_scale);float h1=elevation(c1)+ELEVATION_BIAS;float h2=elevation(c2)+ELEVATION_BIAS;float h3=elevation(c3)+ELEVATION_BIAS;float h4=elevation(c4)+ELEVATION_BIAS;return max(h4,max(h3,max(h1,h2)));}float circle_elevation(vec2 pos) {\n#if defined(TERRAIN)\nreturn elevation(pos)+ELEVATION_BIAS;\n#else\nreturn 0.0;\n#endif\n}vec4 project_vertex(vec2 extrusion,vec4 world_center,vec4 projected_center,float radius,float stroke_width, float view_scale) {vec2 sample_offset=calc_offset(extrusion,radius,stroke_width,view_scale);\n#ifdef PITCH_WITH_MAP\nreturn u_matrix*( world_center+vec4(sample_offset,0,0) );\n#else\nreturn projected_center+vec4(sample_offset,0,0);\n#endif\n}float get_sample_step() {\n#ifdef PITCH_WITH_MAP\nreturn 2.0*PI/float(NUM_SAMPLES_PER_RING);\n#else\nreturn PI/float(NUM_SAMPLES_PER_RING);\n#endif\n}void main(void) {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);float height=circle_elevation(circle_center);vec4 world_center=vec4(circle_center,height,1);vec4 projected_center=u_matrix*world_center;float view_scale=0.0;\n#ifdef PITCH_WITH_MAP\n#ifdef SCALE_WITH_MAP\nview_scale=1.0;\n#else\nview_scale=projected_center.w/u_camera_to_center_distance;\n#endif\n#else\n#ifdef SCALE_WITH_MAP\nview_scale=u_camera_to_center_distance;\n#else\nview_scale=projected_center.w;\n#endif\n#endif\ngl_Position=project_vertex(extrude,world_center,projected_center,radius,stroke_width,view_scale);float visibility=0.0;\n#ifdef TERRAIN\nfloat step=get_sample_step();\n#ifdef PITCH_WITH_MAP\nfloat cantilevered_height=cantilevered_elevation(circle_center,radius,stroke_width,view_scale);vec4 occlusion_world_center=vec4(circle_center,cantilevered_height,1);vec4 occlusion_projected_center=u_matrix*occlusion_world_center;\n#else\nvec4 occlusion_world_center=world_center;vec4 occlusion_projected_center=projected_center;\n#endif\nfor(int ring=0; ring < NUM_VISIBILITY_RINGS; ring++) {float scale=(float(ring)+1.0)/float(NUM_VISIBILITY_RINGS);for(int i=0; i < NUM_SAMPLES_PER_RING; i++) {vec2 extrusion=vec2(cos(step*float(i)),-sin(step*float(i)))*scale;vec4 frag_pos=project_vertex(extrusion,occlusion_world_center,occlusion_projected_center,radius,stroke_width,view_scale);visibility+=float(!isOccluded(frag_pos));}}visibility/=float(NUM_VISIBILITY_RINGS)*float(NUM_SAMPLES_PER_RING);\n#else\nvisibility=1.0;\n#endif\nv_visibility=visibility;lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}"),et=It("void main() {gl_FragColor=vec4(1.0);}","attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),tt=It("uniform highp float u_intensity;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#define GAUSS_COEF 0.3989422804014327\nvoid main() {\n#pragma mapbox: initialize highp float weight\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\nconst highp float ZERO=1.0/255.0/16.0;\n#define GAUSS_COEF 0.3989422804014327\nvoid main(void) {\n#pragma mapbox: initialize highp float weight\n#pragma mapbox: initialize mediump float radius\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,elevation(floor(a_pos*0.5)),1);gl_Position=u_matrix*pos;}"),it=It("uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(0.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}"),ot=It("varying float v_placed;varying float v_notUsed;void main() {vec4 red =vec4(1.0,0.0,0.0,1.0);vec4 blue=vec4(0.0,0.0,1.0,0.5);gl_FragColor =mix(red,blue,step(0.5,v_placed))*0.5;gl_FragColor*=mix(1.0,0.1,step(0.5,v_notUsed));}","attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;attribute float a_size_scale;attribute vec2 a_padding;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,elevation(a_anchor_pos),1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,1.5);gl_Position=u_matrix*vec4(a_pos,elevation(a_pos),1.0);gl_Position.xy+=(a_extrude*a_size_scale+a_shift+a_padding)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"),at=It("varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}","attribute vec2 a_pos_2f;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos_2f;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(\nmix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"),rt=It("uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}","attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {float h=elevation(a_pos);v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,h,1);}"),nt=It("#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),st=It("varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),lt=It("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),ct=It("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),ht=It("varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 pos_nx=floor(a_pos_normal_ed.xyz*0.5);mediump vec3 top_up_ny=a_pos_normal_ed.xyz-2.0*pos_nx;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));base=max(0.0,base);height=max(0.0,height);float t=top_up_ny.x;\n#ifdef TERRAIN\nvec2 centroid_pos=a_centroid_pos;bool flat_roof=centroid_pos.x !=0.0;float ele=elevation(pos_nx.xy);float hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);float c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;float h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);gl_Position=mix(u_matrix*vec4(pos_nx.xy,h,1),AWAY,hidden);\n#else\ngl_Position=u_matrix*vec4(pos_nx.xy,t > 0.0 ? height : base,1);\n#endif\nfloat colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=(\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),ut=It("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 pos_nx=floor(a_pos_normal_ed.xyz*0.5);mediump vec3 top_up_ny=a_pos_normal_ed.xyz-2.0*pos_nx;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));float edgedistance=a_pos_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=top_up_ny.x;float z=t > 0.0 ? height : base;\n#ifdef TERRAIN\nvec2 centroid_pos=a_centroid_pos;bool flat_roof=centroid_pos.x !=0.0;float ele=elevation(pos_nx.xy);float hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);float c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;float h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);gl_Position=mix(u_matrix*vec4(pos_nx.xy,h,1),AWAY,hidden);\n#else\ngl_Position=u_matrix*vec4(pos_nx.xy,z,1);\n#endif\nvec2 pos=normal.z==1.0\n? pos_nx.xy\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=(\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),dt=It("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2(\n(c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c)\n)/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(\nderiv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),_t=It("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;void main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),mt=It("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_width2=vec2(outset,inset);}"),pt=It("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_width2=vec2(outset,inset);}"),ft=It("uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_linesofar;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"),gt=It("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_linesofar;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),vt=It("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(\ndot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),xt=It("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));}"),yt=It("#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"),bt=It("#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*fontScale);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}"),wt=It("uniform sampler2D u_image0;varying vec2 v_pos0;void main() {gl_FragColor=texture2D(u_image0,v_pos0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform float u_skirt_height;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;const float skirtOffset=24575.0;void main() {v_pos0=a_texture_pos/8192.0;float skirt=float(a_pos.x >=skirtOffset);float elevation=elevation(a_texture_pos)-skirt*u_skirt_height;vec2 decodedPos=a_pos-vec2(skirt*skirtOffset,0.0);gl_Position=u_matrix*vec4(decodedPos,elevation,1.0);}"),Tt=It("#ifdef GL_ES\nprecision highp float;\n#endif\nvec4 pack_depth(float ndc_z) {float depth=ndc_z*0.5+0.5;const vec4 bit_shift=vec4(256.0*256.0*256.0,256.0*256.0,256.0,1.0);const vec4 bit_mask =vec4(0.0,1.0/256.0,1.0/256.0,1.0/256.0);vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;}varying float v_depth;void main() {gl_FragColor=pack_depth(v_depth);}","uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying float v_depth;void main() {float elevation=elevation(a_texture_pos);gl_Position=u_matrix*vec4(a_pos,elevation,1.0);v_depth=gl_Position.z/gl_Position.w;}"),Et=It("\nvarying lowp vec3 v_uv;uniform lowp samplerCube u_cubemap;uniform lowp float u_opacity;uniform highp float u_temporal_offset;uniform highp vec3 u_sun_direction;highp vec3 hash(highp vec2 p) {highp vec3 p3=fract(vec3(p.xyx)*vec3(443.8975,397.2973,491.1871));p3+=dot(p3,p3.yxz+19.19);return fract(vec3((p3.x+p3.y)*p3.z,(p3.x+p3.z)*p3.y,(p3.y+p3.z)*p3.x));}vec3 dither(vec3 color,highp vec2 seed) {vec3 rnd=hash(seed)+hash(seed+0.59374)-0.5;color.rgb+=rnd/255.0;return color;}float sun_disk(highp vec3 ray_direction,highp vec3 sun_direction) {highp float cos_angle=dot(normalize(ray_direction),sun_direction);const highp float cos_sun_angular_diameter=0.99996192306;const highp float smoothstep_delta=1e-5;return smoothstep(\ncos_sun_angular_diameter-smoothstep_delta,cos_sun_angular_diameter+smoothstep_delta,cos_angle);}float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec3 uv=v_uv;const float y_bias=0.015;uv.y+=y_bias;uv.y=pow(abs(uv.y),1.0/5.0);uv.y=map(uv.y,0.0,1.0,-1.0,1.0);vec3 sky_color=textureCube(u_cubemap,uv).rgb;sky_color.rgb=dither(sky_color.rgb,gl_FragCoord.xy+u_temporal_offset);sky_color+=0.1*sun_disk(v_uv,u_sun_direction);gl_FragColor=vec4(sky_color*u_opacity,u_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}",Xe),Ct=It("varying highp vec3 v_uv;uniform lowp sampler2D u_color_ramp;uniform lowp vec3 u_center_direction;uniform lowp float u_radius;uniform lowp float u_opacity;uniform highp float u_temporal_offset;highp vec3 hash(highp vec2 p) {highp vec3 p3=fract(vec3(p.xyx)*vec3(443.8975,397.2973,491.1871));p3+=dot(p3,p3.yxz+19.19);return fract(vec3((p3.x+p3.y)*p3.z,(p3.x+p3.z)*p3.y,(p3.y+p3.z)*p3.x));}vec3 dither(vec3 color,highp vec2 seed) {vec3 rnd=hash(seed)+hash(seed+0.59374)-0.5;color.rgb+=rnd/255.0;return color;}void main() {float progress=acos(dot(normalize(v_uv),u_center_direction))/u_radius;vec4 color=texture2D(u_color_ramp,vec2(progress,0.5))*u_opacity;color.rgb=dither(color.rgb,gl_FragCoord.xy+u_temporal_offset);gl_FragColor=color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}",Xe),St=It("\nvarying highp vec3 v_position;uniform highp float u_sun_intensity;uniform highp float u_luminance;uniform lowp vec3 u_sun_direction;uniform highp vec4 u_color_tint_r;uniform highp vec4 u_color_tint_m;\n#ifdef GL_ES\nprecision highp float;\n#endif\n#define BETA_R vec3(5.5e-6,13.0e-6,22.4e-6)\n#define BETA_M vec3(21e-6,21e-6,21e-6)\n#define MIE_G 0.76\n#define DENSITY_HEIGHT_SCALE_R 8000.0\n#define DENSITY_HEIGHT_SCALE_M 1200.0\n#define PLANET_RADIUS 6360e3\n#define ATMOSPHERE_RADIUS 6420e3\n#define SAMPLE_STEPS 10\n#define DENSITY_STEPS 4\nfloat ray_sphere_exit(vec3 orig,vec3 dir,float radius) {float a=dot(dir,dir);float b=2.0*dot(dir,orig);float c=dot(orig,orig)-radius*radius;float d=sqrt(b*b-4.0*a*c);return (-b+d)/(2.0*a);}vec3 extinction(vec2 density) {return exp(-vec3(BETA_R*u_color_tint_r.a*density.x+BETA_M*u_color_tint_m.a*density.y));}vec2 local_density(vec3 point) {float height=max(length(point)-PLANET_RADIUS,0.0);float exp_r=exp(-height/DENSITY_HEIGHT_SCALE_R);float exp_m=exp(-height/DENSITY_HEIGHT_SCALE_M);return vec2(exp_r,exp_m);}float phase_ray(float cos_angle) {return (3.0/(16.0*PI))*(1.0+cos_angle*cos_angle);}float phase_mie(float cos_angle) {return (3.0/(8.0*PI))*((1.0-MIE_G*MIE_G)*(1.0+cos_angle*cos_angle))/((2.0+MIE_G*MIE_G)*pow(1.0+MIE_G*MIE_G-2.0*MIE_G*cos_angle,1.5));}vec2 density_to_atmosphere(vec3 point,vec3 light_dir) {float ray_len=ray_sphere_exit(point,light_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(DENSITY_STEPS);vec2 density_point_to_atmosphere=vec2(0.0);for (int i=0; i < DENSITY_STEPS;++i) {vec3 point_on_ray=point+light_dir*((float(i)+0.5)*step_len);density_point_to_atmosphere+=local_density(point_on_ray)*step_len;;}return density_point_to_atmosphere;}vec3 atmosphere(vec3 ray_dir,vec3 sun_direction,float sun_intensity) {vec2 density_orig_to_point=vec2(0.0);vec3 scatter_r=vec3(0.0);vec3 scatter_m=vec3(0.0);vec3 origin=vec3(0.0,PLANET_RADIUS,0.0);float ray_len=ray_sphere_exit(origin,ray_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(SAMPLE_STEPS);for (int i=0; i < SAMPLE_STEPS;++i) {vec3 point_on_ray=origin+ray_dir*((float(i)+0.5)*step_len);vec2 density=local_density(point_on_ray)*step_len;density_orig_to_point+=density;vec2 density_point_to_atmosphere=density_to_atmosphere(point_on_ray,sun_direction);vec2 density_orig_to_atmosphere=density_orig_to_point+density_point_to_atmosphere;vec3 extinction=extinction(density_orig_to_atmosphere);scatter_r+=density.x*extinction;scatter_m+=density.y*extinction;}float cos_angle=dot(ray_dir,sun_direction);float phase_r=phase_ray(cos_angle);float phase_m=phase_mie(cos_angle);vec3 beta_r=BETA_R*u_color_tint_r.rgb*u_color_tint_r.a;vec3 beta_m=BETA_M*u_color_tint_m.rgb*u_color_tint_m.a;return (scatter_r*phase_r*beta_r+scatter_m*phase_m*beta_m)*sun_intensity;}const float A=0.15;const float B=0.50;const float C=0.10;const float D=0.20;const float E=0.02;const float F=0.30;vec3 uncharted2_tonemap(vec3 x) {return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;}void main() {vec3 ray_direction=v_position;ray_direction.y=pow(ray_direction.y,5.0);const float y_bias=0.015;ray_direction.y+=y_bias;vec3 color=atmosphere(normalize(ray_direction),u_sun_direction,u_sun_intensity);float white_scale=1.0748724675633854;color=uncharted2_tonemap((log2(2.0/pow(u_luminance,4.0)))*color)*white_scale;gl_FragColor=vec4(color,1.0);}","attribute highp vec3 a_pos_3f;uniform mat3 u_matrix_3f;varying highp vec3 v_position;float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec4 pos=vec4(u_matrix_3f*a_pos_3f,1.0);v_position=pos.xyz;v_position.y*=-1.0;v_position.y=map(v_position.y,-1.0,1.0,0.0,1.0);gl_Position=vec4(a_pos_3f.xy,0.0,1.0);}");function It(e,t,i){const o=/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,a=t.match(/attribute (highp |mediump |lowp )?([\w]+) ([\w]+)/g),r=e.match(/uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g),n=t.match(/uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g);let s=n?n.concat(r):r;i||(s=He.staticUniforms.concat(s));const l={};return {fragmentSource:e=e.replace(o,(e,t,i,o,a)=>(l[a]=!0,"define"===t?`\n#ifndef HAS_UNIFORM_u_${a}\nvarying ${i} ${o} ${a};\n#else\nuniform ${i} ${o} u_${a};\n#endif\n`:`\n#ifdef HAS_UNIFORM_u_${a}\n ${i} ${o} ${a} = u_${a};\n#endif\n`)),vertexSource:t=t.replace(o,(e,t,i,o,a)=>{const r="float"===o?"vec2":"vec4",n=a.match(/color/)?"color":r;return l[a]?"define"===t?`\n#ifndef HAS_UNIFORM_u_${a}\nuniform lowp float u_${a}_t;\nattribute ${i} ${r} a_${a};\nvarying ${i} ${o} ${a};\n#else\nuniform ${i} ${o} u_${a};\n#endif\n`:"vec4"===n?`\n#ifndef HAS_UNIFORM_u_${a}\n ${a} = a_${a};\n#else\n ${i} ${o} ${a} = u_${a};\n#endif\n`:`\n#ifndef HAS_UNIFORM_u_${a}\n ${a} = unpack_mix_${n}(a_${a}, u_${a}_t);\n#else\n ${i} ${o} ${a} = u_${a};\n#endif\n`:"define"===t?`\n#ifndef HAS_UNIFORM_u_${a}\nuniform lowp float u_${a}_t;\nattribute ${i} ${r} a_${a};\n#else\nuniform ${i} ${o} u_${a};\n#endif\n`:"vec4"===n?`\n#ifndef HAS_UNIFORM_u_${a}\n ${i} ${o} ${a} = a_${a};\n#else\n ${i} ${o} ${a} = u_${a};\n#endif\n`:`\n#ifndef HAS_UNIFORM_u_${a}\n ${i} ${o} ${a} = unpack_mix_${n}(a_${a}, u_${a}_t);\n#else\n ${i} ${o} ${a} = u_${a};\n#endif\n`}),staticAttributes:a,staticUniforms:s}}var Pt=Object.freeze({__proto__:null,get preludeTerrain(){return He},prelude:Ke,background:Ye,backgroundPattern:Je,circle:Qe,clippingMask:et,heatmap:tt,heatmapTexture:it,collisionBox:ot,collisionCircle:at,debug:rt,fill:nt,fillOutline:st,fillOutlinePattern:lt,fillPattern:ct,fillExtrusion:ht,fillExtrusionPattern:ut,hillshadePrepare:dt,hillshade:_t,line:mt,lineGradient:pt,linePattern:ft,lineSDF:gt,raster:vt,symbolIcon:xt,symbolSDF:yt,symbolTextAndIcon:bt,terrainRaster:wt,terrainDepth:Tt,skybox:Et,skyboxGradient:Ct,skyboxCapture:St});class Mt{constructor(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null;}bind(e,t,i,o,a,r,n,s){this.context=e;let l=this.boundPaintVertexBuffers.length!==o.length;for(let e=0;!l&&e{const a=i.paint.get("hillshade-shadow-color"),r=i.paint.get("hillshade-highlight-color"),n=i.paint.get("hillshade-accent-color");let s=i.paint.get("hillshade-illumination-direction")*(Math.PI/180);"viewport"===i.paint.get("hillshade-illumination-anchor")&&(s-=e.transform.angle);const l=!e.options.moving;return {u_matrix:o||e.transform.calculatePosMatrix(t.tileID.toUnwrapped(),l),u_image:0,u_latrange:zt(0,t.tileID),u_light:[i.paint.get("hillshade-exaggeration"),s],u_shadow:a,u_highlight:r,u_accent:n}})(t,o,a,t.terrain?i.posMatrix:null);u.draw(l,c.TRIANGLES,r,n,s,e.CullFaceMode.disabled,d,a.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments);}function Dt(t,i,o){if(!i.needsDEMTextureUpload)return;const a=t.context,r=a.gl;a.pixelStoreUnpackPremultiplyAlpha.set(!1),i.demTexture=i.demTexture||t.getTileTexture(o.stride);const n=o.getPixels();i.demTexture?i.demTexture.update(n,{premultiply:!1}):i.demTexture=new e.Texture(a,n,r.RGBA,{premultiply:!1}),i.needsDEMTextureUpload=!1;}function Lt(t,i,o,a,r,n){const s=t.context,l=s.gl;if(!i.dem)return;const c=i.dem;if(s.activeTexture.set(l.TEXTURE1),Dt(t,i,c),!i.demTexture)return;i.demTexture.bind(l.NEAREST,l.CLAMP_TO_EDGE);const h=c.dim;s.activeTexture.set(l.TEXTURE0);let u=i.fbo;if(!u){const t=new e.Texture(s,{width:h,height:h,data:null},l.RGBA);t.bind(l.LINEAR,l.CLAMP_TO_EDGE),u=i.fbo=s.createFramebuffer(h,h,!0),u.colorAttachment.set(t.texture);}s.bindFramebuffer.set(u.framebuffer),s.viewport.set([0,0,h,h]),t.useProgram("hillshadePrepare").draw(s,l.TRIANGLES,a,r,n,e.CullFaceMode.disabled,((t,i)=>{const o=i.stride,a=e.create();return e.ortho(a,0,e.EXTENT,-e.EXTENT,0,0,1),e.translate(a,a,[0,-e.EXTENT,0]),{u_matrix:a,u_image:1,u_dimension:[o,o],u_zoom:t.overscaledZ,u_unpack:i.unpackVector}})(i.tileID,c),o.id,t.rasterBoundsBuffer,t.quadTriangleIndexBuffer,t.rasterBoundsSegments),i.needsHillshadePrepare=!1;}const Rt=(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_image0:new e.Uniform1i(t,i.u_image0),u_skirt_height:new e.Uniform1f(t,i.u_skirt_height)}),kt=(e,t)=>({u_matrix:e,u_image0:0,u_skirt_height:t}),Bt=new class{constructor(){this.operations={};}newMorphing(e,t,i,o,a){if(e in this.operations){const t=this.operations[e];t.to.tileID.key!==i.tileID.key&&(t.queued=i);}else this.operations[e]={startTime:o,phase:0,duration:a,from:t,to:i,queued:null};}getMorphValuesForProxy(e){if(!(e in this.operations))return null;const t=this.operations[e];return {from:t.from,to:t.to,phase:t.phase}}update(e){for(const t in this.operations){const i=this.operations[t];for(i.phase=(e-i.startTime)/i.duration;i.phase>=1||!this._validOp(i);)if(!this._nextOp(i,e)){delete this.operations[t];break}}}_nextOp(e,t){return !!e.queued&&(e.from=e.to,e.to=e.queued,e.queued=null,e.phase=0,e.startTime=t,!0)}_validOp(e){return e.from.hasData()&&e.to.hasData()}},Ft={0:null,1:"TERRAIN_VERTEX_MORPHING"};function Ot(t,i,o,a,r){const n=t.context,s=n.gl;let l=t.useProgram("terrainRaster"),c=0;const h=t.colorModeForRenderPass(),u=new e.DepthMode(s.LEQUAL,e.DepthMode.ReadWrite,t.depthRangeFor3D);Bt.update(r);const d=t.transform,_=6*Math.pow(1.5,22-d.zoom)*i.exaggeration();var m,p,f;for(const g of a){const a=o.getTile(g),v=e.StencilMode.disabled,x=i.prevTerrainTileForTile[g.key],y=i.terrainTileForTile[g.key];f=y,null!=(p=x)&&null!=f&&p.hasData()&&f.hasData()&&null!=p.demTexture&&null!=f.demTexture&&p.tileID.key!==f.tileID.key&&Bt.newMorphing(g.key,x,y,r,250),n.activeTexture.set(s.TEXTURE0),a.texture.bind(s.LINEAR,s.CLAMP_TO_EDGE,s.LINEAR_MIPMAP_NEAREST);const b=Bt.getMorphValuesForProxy(g.key),w=b?1:0;let T;b&&(T={morphing:{srcDemTile:b.from,dstDemTile:b.to,phase:e.easeCubicInOut(b.phase)}});const E=kt(g.posMatrix,Ut(g.canonical,d.renderWorldCopies)?_/10:_);c!==(m=w)&&(l=t.useProgram("terrainRaster",null,Ft[m]),c=m),i.setupElevationDraw(a,l,T),l.draw(n,s.TRIANGLES,u,v,h,e.CullFaceMode.backCCW,E,"terrain_raster",i.gridBuffer,i.gridIndexBuffer,i.gridSegments);}}function Ut(e,t){const i=1<({u_matrix:e});function Zt(t,i,o,a,r){if(r>0){const n=e.browser.now(),s=(n-t.timeAdded)/r,l=i?(n-i.timeAdded)/r:-1,c=o.getSource(),h=a.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),u=!i||Math.abs(i.tileID.overscaledZ-h)>Math.abs(t.tileID.overscaledZ-h),d=u&&t.refreshedUponExpiration?1:e.clamp(u?s:1-l,0,1);return t.refreshedUponExpiration&&s>=1&&(t.refreshedUponExpiration=!1),i?{opacity:1,mix:1-d}:{opacity:d,mix:0}}return {opacity:1,mix:0}}const Gt={fill:!0,line:!0,background:!0,hillshade:!0,raster:!0};class qt extends e.SourceCache{constructor(e){const t=R("proxy",{type:"geojson",maxzoom:e.transform.maxZoom},new E(q(),null),e.style);super("proxy",t,!1),t.setEventedParent(this),this.map=this.getSource().map=e,this.used=this._sourceLoaded=!0,this.renderCache=[],this.renderCachePool=[],this.proxyCachedFBO={};}update(t,i,o){if(t.freezeTileCoverage)return;this.transform=t;const a=t.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled,useElevationData:!0}).reduce((i,o)=>{if(i[o.key]="",!this._tiles[o.key]){const i=new e.Tile(o,this._source.tileSize*o.overscaleFactor(),t.tileZoom);i.state="loaded",this._tiles[o.key]=i;}return i},{});for(const e in this._tiles)e in a||(this.freeFBO(e),this._tiles[e].state="unloaded",delete this._tiles[e]);}freeFBO(e){const t=this.proxyCachedFBO[e];void 0!==t&&(this.renderCachePool.push(t),delete this.proxyCachedFBO[e]);}deallocRenderCache(){this.renderCache.forEach(e=>e.fb.destroy()),this.renderCache=[],this.renderCachePool=[],this.proxyCachedFBO={};}}class Vt extends e.OverscaledTileID{constructor(e,t,i){super(e.overscaledZ,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y),this.proxyTileKey=t,this.posMatrix=i;}}class $t extends e.Elevation{constructor(t,i){super(),this.painter=t,this.terrainTileForTile={},this.prevTerrainTileForTile={};const[o,a,r]=function(t){const i=new e.StructArrayLayout4i8,o=new e.StructArrayLayout3ui6;i.reserve(17161),o.reserve(33800);const a=e.EXTENT/128,r=e.EXTENT+a/2,n=r+a;for(let t=-a;tr||t<0||t>r?24575:0,n=e.clamp(Math.round(o),0,e.EXTENT),s=e.clamp(Math.round(t),0,e.EXTENT);i.emplaceBack(n+a,s,n,s);}const s=(e,t)=>{const i=131*t+e;o.emplaceBack(i+1,i,i+131),o.emplaceBack(i+131,i+131+1,i+1);};for(let e=1;e<129;e++)for(let t=1;t<129;t++)s(t,e);return [0,129].forEach(e=>{for(let t=0;t<130;t++)s(t,e),s(e,t);}),[i,o,32768]}(),n=t.context;this.gridBuffer=n.createVertexBuffer(o,A.members),this.gridIndexBuffer=n.createIndexBuffer(a),this.gridSegments=e.SegmentVector.simpleSegment(0,0,o.length,a.length),this.gridNoSkirtSegments=e.SegmentVector.simpleSegment(0,0,o.length,r),this.proxyCoords=[],this.proxiedCoords={},this._visibleDemTiles=[],this._sourceTilesOverlap={},this.proxySourceCache=new qt(i.map),this.orthoMatrix=e.create(),e.ortho(this.orthoMatrix,0,e.EXTENT,0,e.EXTENT,0,1);const s=n.gl;this._overlapStencilMode=new e.StencilMode({func:s.GEQUAL,mask:255},0,255,s.KEEP,s.KEEP,s.REPLACE),this._previousZoom=t.transform.zoom,this.pool=[],this._findCoveringTileCache={},this._tilesDirty={},this.style=i,i.on("data",this._onStyleDataEvent.bind(this));}update(t,i,o){if(t&&t.terrain){this.style!==t&&(t.on("data",this._onStyleDataEvent.bind(this)),this.style=t),this.enabled=!0;const a=t.terrain.properties;this.sourceCache=t._getSourceCache(a.get("source")),this._exaggeration=a.get("exaggeration");const r=()=>{this.sourceCache.used&&e.warnOnce(`Raster DEM source '${this.sourceCache.id}' is used both for terrain and as layer source.\n`+"This leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.");const t=this.sourceCache.getSource().tileSize/128,o=this.proxySourceCache.getSource().tileSize;this.sourceCache.update(i,t*o,!0),this._findCoveringTileCache[this.sourceCache.id]={};};this.sourceCache.usedForTerrain||(this._findCoveringTileCache[this.sourceCache.id]={},this.sourceCache.usedForTerrain=!0,r(),this._initializing=!0),r(),i.updateElevation(!o),this._findCoveringTileCache[this.proxySourceCache.id]={},this.proxySourceCache.update(i),this._depthDone=!1,this._emptyDEMTextureDirty=!0;}else this._disable();}_onStyleDataEvent(e){e.coord&&"source"===e.dataType?this._clearRenderCacheForTile(e.sourceCacheId,e.coord):"style"===e.dataType&&(this._invalidateRenderCache=!0);}_disable(){if(this.enabled&&(this.enabled=!1,this.proxySourceCache.deallocRenderCache(),this.painter.style))for(const e in this.painter.style._sourceCaches)this.painter.style._sourceCaches[e].usedForTerrain=!1;}destroy(){this._disable(),this._emptyDEMTexture&&this._emptyDEMTexture.destroy(),this.pool.forEach(e=>e.fb.destroy()),this.pool=[],this._depthFBO&&(this._depthFBO.destroy(),delete this._depthFBO,delete this._depthTexture);}_source(){return this.enabled?this.sourceCache:null}exaggeration(){return this._exaggeration}get visibleDemTiles(){return this._visibleDemTiles}get drapeBufferSize(){const e=2*this.proxySourceCache.getSource().tileSize;return [e,e]}updateTileBinding(t){if(!this.enabled)return;this.prevTerrainTileForTile=this.terrainTileForTile;const i=this.proxySourceCache,o=this.painter.transform;this._initializing&&(this._initializing=0===o._centerAltitude&&-1===this.getAtPoint(e.MercatorCoordinate.fromLngLat(o.center),-1),this._emptyDEMTextureDirty=!this._initializing);const a=this.painter.options;this.drapeFirst=(a.zooming||a.moving||a.rotating||!!this.forceDrapeFirst)&&!this._invalidateRenderCache,this._invalidateRenderCache=!1;const r=this.proxyCoords=i.getIds().map(e=>{const t=i.getTileByID(e).tileID;return t.posMatrix=o.calculatePosMatrix(t.toUnwrapped()),t});!function(t,i){const o=i.transform.pointCoordinate(i.transform.getCameraPoint()),a=new e.Point(o.x,o.y);t.sort((t,i)=>{if(i.overscaledZ-t.overscaledZ)return i.overscaledZ-t.overscaledZ;const o=new e.Point(t.canonical.x+(1<{this.proxyToSource[e.key]={};}),this.terrainTileForTile={};const s=this.painter.style._sourceCaches;for(const e in s){const i=s[e];if(!i.used)continue;if(i!==this.sourceCache&&(this._findCoveringTileCache[i.id]={}),this._setupProxiedCoordsForOrtho(i,t[e],n),i.usedForTerrain)continue;const o=t[e];i.getSource().reparseOverscaled&&this._assignTerrainTiles(o);}this.proxiedCoords[i.id]=r.map(e=>new Vt(e,e.key,this.orthoMatrix)),this._assignTerrainTiles(r),this._prepareDEMTextures(),this._setupRenderCache(n),this.drapeFirstPending=this.drapeFirst,this.renderingToTexture=!1,this._initFBOPool(),this._updateTimestamp=e.browser.now();const l={};this._visibleDemTiles=[];for(const e of this.proxyCoords){const t=this.terrainTileForTile[e.key];if(!t)continue;const i=t.tileID.key;i in l||(this._visibleDemTiles.push(t),l[i]=i);}}_assignTerrainTiles(e){this._initializing||e.forEach(e=>{if(this.terrainTileForTile[e.key])return;const t=this._findTileCoveringTileID(e,this.sourceCache);t&&(this.terrainTileForTile[e.key]=t);});}_prepareDEMTextures(){const e=this.painter.context,t=e.gl;for(const i in this.terrainTileForTile){const o=this.terrainTileForTile[i],a=o.dem;!a||o.demTexture&&!o.needsDEMTextureUpload||(e.activeTexture.set(t.TEXTURE1),Dt(this.painter,o,a));}}_prepareDemTileUniforms(e,t,i,o){if(!t||null==t.demTexture)return !1;const a=e.tileID.canonical,r=Math.pow(2,t.tileID.canonical.z-a.z),n=o||"";return i[`u_dem_tl${n}`]=[a.x*r%1,a.y*r%1],i[`u_dem_scale${n}`]=r,!0}get emptyDEMTexture(){return !this._emptyDEMTextureDirty&&this._emptyDEMTexture?this._emptyDEMTexture:this._updateEmptyDEMTexture()}_getLoadedAreaMinimum(){let e=0;const t=this._visibleDemTiles.reduce((t,i)=>{if(!i.dem)return t;const o=i.dem.tree.minimums[0];return o>0&&e++,t+o},0);return e?t/e:0}_updateEmptyDEMTexture(){const t=this.painter.context,i=t.gl;t.activeTexture.set(i.TEXTURE2);const o=this._getLoadedAreaMinimum(),a={width:1,height:1,data:new Uint8Array(e.DEMData.pack(o,this.sourceCache.getSource().encoding))};this._emptyDEMTextureDirty=!1;let r=this._emptyDEMTexture;return r?r.update(a,{premultiply:!1}):r=this._emptyDEMTexture=new e.Texture(t,a,i.RGBA,{premultiply:!1}),r}setupElevationDraw(t,i,o){const a=this.painter.context,r=a.gl,n=(s=this.sourceCache.getSource().encoding,{u_dem:2,u_dem_prev:4,u_dem_unpack:e.DEMData.getUnpackVector(s),u_dem_tl:[0,0],u_dem_tl_prev:[0,0],u_dem_scale:0,u_dem_scale_prev:0,u_dem_size:0,u_dem_lerp:1,u_depth:3,u_depth_size_inv:[0,0],u_exaggeration:0});var s;n.u_dem_size=this.sourceCache.getSource().tileSize,n.u_exaggeration=this.exaggeration();let l=null,c=null,h=1;if(o&&o.morphing){const e=o.morphing.srcDemTile,i=o.morphing.dstDemTile;h=o.morphing.phase,e&&i&&(this._prepareDemTileUniforms(t,e,n,"_prev")&&(c=e),this._prepareDemTileUniforms(t,i,n)&&(l=i));}if(c&&l?(a.activeTexture.set(r.TEXTURE2),l.demTexture.bind(r.NEAREST,r.CLAMP_TO_EDGE,r.NEAREST),a.activeTexture.set(r.TEXTURE4),c.demTexture.bind(r.NEAREST,r.CLAMP_TO_EDGE,r.NEAREST),n.u_dem_lerp=h):(l=this.terrainTileForTile[t.tileID.key],a.activeTexture.set(r.TEXTURE2),(this._prepareDemTileUniforms(t,l,n)?l.demTexture:this.emptyDEMTexture).bind(r.NEAREST,r.CLAMP_TO_EDGE,r.NEAREST)),o&&o.useDepthForOcclusion&&(a.activeTexture.set(r.TEXTURE3),this._depthTexture.bind(r.NEAREST,r.CLAMP_TO_EDGE,r.NEAREST),n.u_depth_size_inv=[1/this._depthFBO.width,1/this._depthFBO.height]),o&&o.useMeterToDem&&l){const t=(1<{i.bindFramebuffer.set(null),i.viewport.set([0,0,t.width,t.height]),this.renderingToTexture=!1;},n=t.currentLayer;let s=n,l=[];const c=t.style._order;let h=0;for(let u=0;us){if(!o&&!a)break;s++;}if(o)continue;const r=this.painter.style._getLayerSourceCache(e),n=r?this.proxyToSource[d.key][r.id]:[d];if(!n)continue;const l=n;i.viewport.set([0,0,p.fb.width,p.fb.height]),f!==(r?r.id:null)&&(this._setupStencil(n,e,r),f=r?r.id:null),t.renderLayer(t,r,e,l);}p.dirty=this.renderedToTile,this.renderedToTile&&l.push(_.tileID),5===h&&(h=0,l.length>0&&(r(),Ot(t,this,o,l,this._updateTimestamp),this.renderingToTexture=!0,l=[]));}r(),l.length>0&&Ot(t,this,o,l,this._updateTimestamp),t.currentLayer=this.drapeFirst?-1:s;}raycast(e,t,i){if(!this._visibleDemTiles)return null;const o=this._visibleDemTiles.filter(e=>e.dem).map(o=>{const a=o.tileID,r=Math.pow(2,a.overscaledZ),{x:n,y:s}=a.canonical,l=n/r,c=(n+1)/r,h=s/r,u=(s+1)/r;return {minx:l,miny:h,maxx:c,maxy:u,t:o.dem.tree.raycastRoot(l,h,c,u,e,t,i),tile:o}});o.sort((e,t)=>(null!==e.t?e.t:Number.MAX_VALUE)-(null!==t.t?t.t:Number.MAX_VALUE));for(const a of o){if(null==a.t)return null;const o=a.tile.dem.tree.raycast(a.minx,a.miny,a.maxx,a.maxy,e,t,i);if(null!=o)return o}return null}_createFBO(){const t=this.painter.context,i=t.gl,o=this.drapeBufferSize;t.activeTexture.set(i.TEXTURE0);const a=new e.Texture(t,{width:o[0],height:o[1],data:null},i.RGBA);a.bind(i.LINEAR,i.CLAMP_TO_EDGE);const r=t.createFramebuffer(o[0],o[1],!1);return r.colorAttachment.set(a.texture),t.extTextureFilterAnisotropic&&!t.extTextureFilterAnisotropicForceOff&&i.texParameterf(i.TEXTURE_2D,t.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,t.extTextureFilterAnisotropicMax),{fb:r,tex:a,dirty:!1,ref:1}}_initFBOPool(){for(;this.pool.length{const t=this.painter.style._layers[e],i=!t.isHidden(this.painter.transform.zoom),o=t.getCrossfadeParameters();return "custom"!==t.type&&!i&&!!o&&1!==o.t})}_clearRasterFadeFromRenderCache(){for(const e in this.painter.style._sourceCaches)if(!(this.painter.style._sourceCaches[e]._source instanceof z))return;for(let e=0;et.renderCachePool.length){const e=Object.values(t.proxyCachedFBO);t.proxyCachedFBO={},t.renderCachePool=t.renderCachePool.concat(e);}return}this._clearRasterFadeFromRenderCache();const i=this.proxyCoords,o=this._tilesDirty;for(let a=i.length-1;a>=0;a--){const r=i[a];if(t.getTileByID(r.key),void 0!==t.proxyCachedFBO[r.key]){const i=e[r.key],a=this.proxyToSource[r.key];let n=0;for(const e in a){const t=a[e],r=i[e];if(!r||r.length!==t.length||t.some((t,i)=>t!==r[i]||o[e]&&o[e].hasOwnProperty(t.key))){n=-1;break}++n;}t.renderCache[t.proxyCachedFBO[r.key]].dirty=n<0||n!==Object.values(i).length;}else {let e=t.renderCachePool.pop();void 0===e&&t.renderCache.length<50&&(e=t.renderCache.length,t.renderCache.push(this._createFBO())),void 0!==e&&(t.proxyCachedFBO[r.key]=e,t.renderCache[e].dirty=!0);}}this._tilesDirty={};}_setupStencil(t,i,o){if(!o||!this._sourceTilesOverlap[o.id])return void(this._overlapStencilType&&(this._overlapStencilType=!1));const a=this.painter.context,r=a.gl;if(t.length<=1)return void(this._overlapStencilType=!1);const n=this.currentFBO,s=n.fb;let l;if(i.isTileClipped())l=t.length,this._overlapStencilMode.test={func:r.EQUAL,mask:255},this._overlapStencilType="Clip";else {if(!(t[0].overscaledZ>t[t.length-1].overscaledZ))return void(this._overlapStencilType=!1);l=1,this._overlapStencilMode.test={func:r.GREATER,mask:255},this._overlapStencilType="Mask";}if(!s.depthAttachment){const t=a.createRenderbuffer(a.gl.DEPTH_STENCIL,s.width,s.height);s.depthAttachment=new e.DepthStencilAttachment(a,s.framebuffer),s.depthAttachment.set(t),a.clear({stencil:0});}n.ref+l>255&&(a.clear({stencil:0}),n.ref=0),n.ref+=l,this._overlapStencilMode.ref=n.ref,i.isTileClipped()&&this._renderTileClippingMasks(t,this._overlapStencilMode.ref);}stencilModeForRTTOverlap(t){return this.renderingToTexture&&this._overlapStencilType?("Clip"===this._overlapStencilType&&(this._overlapStencilMode.ref=this.painter._tileClippingMaskIDs[t.key]),this._overlapStencilMode):e.StencilMode.disabled}_renderTileClippingMasks(t,i){const o=this.painter,a=this.painter.context,r=a.gl;o._tileClippingMaskIDs={},a.setColorMode(e.ColorMode.disabled),a.setDepthMode(e.DepthMode.disabled);const n=o.useProgram("clippingMask");for(const s of t){const t=o._tileClippingMaskIDs[s.key]=--i;n.draw(a,r.TRIANGLES,e.DepthMode.disabled,new e.StencilMode({func:r.ALWAYS,mask:0},t,255,r.KEEP,r.KEEP,r.REPLACE),e.ColorMode.disabled,e.CullFaceMode.disabled,Nt(s.posMatrix),"$clipping",o.tileExtentBuffer,o.quadTriangleIndexBuffer,o.tileExtentSegments);}}pointCoordinate(t){const i=this.painter.transform;if(t.x<0||t.x>i.width||t.y<0||t.y>i.height)return null;const o=[t.x,t.y,1,1];e.transformMat4(o,o,i.pixelMatrixInverse),e.scale$1(o,o,1/o[3]),o[0]/=i.worldSize,o[1]/=i.worldSize;const a=i._camera.position,r=e.mercatorZfromAltitude(1,i.center.lat),n=[a[0],a[1],a[2]/r,0],s=e.subtract([],o.slice(0,3),n);e.normalize(s,s);const l=this.raycast(n,s,this._exaggeration);return null!==l&&l?(e.scaleAndAdd(n,n,s,l),n[3]=n[2],n[2]*=r,n):null}drawDepth(){const t=this.painter,i=t.context,o=this.proxySourceCache,a=Math.ceil(t.width),r=Math.ceil(t.height);if(!this._depthFBO||this._depthFBO.width===a&&this._depthFBO.height===r||(this._depthFBO.destroy(),delete this._depthFBO,delete this._depthTexture),!this._depthFBO){const t=i.gl,o=i.createFramebuffer(a,r,!0);i.activeTexture.set(t.TEXTURE0);const n=new e.Texture(i,{width:a,height:r,data:null},t.RGBA);n.bind(t.NEAREST,t.CLAMP_TO_EDGE),o.colorAttachment.set(n.texture);const s=i.createRenderbuffer(i.gl.DEPTH_COMPONENT16,a,r);o.depthAttachment.set(s),this._depthFBO=o,this._depthTexture=n;}i.bindFramebuffer.set(this._depthFBO.framebuffer),i.viewport.set([0,0,a,r]),function(t,i,o,a){const r=t.context,n=r.gl;r.clear({depth:1});const s=t.useProgram("terrainDepth"),l=new e.DepthMode(n.LESS,e.DepthMode.ReadWrite,t.depthRangeFor3D);for(const t of a){const a=o.getTile(t),c=kt(t.posMatrix,0);i.setupElevationDraw(a,s),s.draw(r,n.TRIANGLES,l,e.StencilMode.disabled,e.ColorMode.unblended,e.CullFaceMode.backCCW,c,"terrain_depth",i.gridBuffer,i.gridIndexBuffer,i.gridNoSkirtSegments);}}(t,this,o,this.proxyCoords),i.bindFramebuffer.set(null),i.viewport.set([0,0,t.width,t.height]),this._depthDone=!0;}_isLayerDrapedOverTerrain(e){return !!this.enabled&&Gt.hasOwnProperty(e.type)}_setupProxiedCoordsForOrtho(e,t,i){if(e.getSource()instanceof D)return this._setupProxiedCoordsForImageSource(e,t,i);this._findCoveringTileCache[e.id]=this._findCoveringTileCache[e.id]||{};const o=this.proxiedCoords[e.id]=[],a=this.proxyCoords;for(let t=0;t(e.min.x=Math.min(e.min.x,t.x-s.x),e.min.y=Math.min(e.min.y,t.y-s.y),e.max.x=Math.max(e.max.x,t.x-s.x),e.max.y=Math.max(e.max.y,t.y-s.y),e),{min:new e.Point(Number.MAX_VALUE,Number.MAX_VALUE),max:new e.Point(-Number.MAX_VALUE,-Number.MAX_VALUE)}),c=(t,i)=>{const o=t.wrap+t.canonical.x/(1<n+l.max.x||a+rs+l.max.y};for(let e=0;ee.key===i.tileID.key);if(e)return e}if(i.tileID.key!==t.key){const o=t.canonical.z-i.tileID.canonical.z;let r,n,s;a=e.create();const l=i.tileID.wrap-t.wrap<0?(r=e.EXTENT>>o,n=r*((i.tileID.canonical.x<=a){const o=t.canonical.z-a;i.getSource().reparseOverscaled?(s=Math.max(t.canonical.z+2,i.transform.tileZoom),n=new e.OverscaledTileID(s,t.wrap,a,t.canonical.x>>o,t.canonical.y>>o)):0!==o&&(s=a,n=new e.OverscaledTileID(s,t.wrap,a,t.canonical.x>>o,t.canonical.y>>o));}n.key!==t.key&&(c.push(n.key),o=i.getTile(n));}const h=e=>{c.forEach(t=>{a[t]=e;}),c.length=0;};for(s-=1;s>=l&&(!o||!o.hasData());s--){o&&h(o.tileID.key);const e=n.calculateScaledKey(s);if(o=i.getTileByID(e),o&&o.hasData())break;const t=a[e];if(null===t)break;void 0===t?c.push(e):o=i.getTileByID(t);}return h(o?o.tileID.key:null),o&&o.hasData()?o:null}findDEMTileFor(e){return this.enabled?this._findTileCoveringTileID(e,this.sourceCache):null}prepareDrawTile(e){this.renderedToTile||(this.renderedToTile=!0);}_clearRenderCacheForTile(e,t){let i=this._tilesDirty[e];i||(i=this._tilesDirty[e]={}),i[t.key]=!0;}}function jt(e){const t=[];for(let i=0;i`#define ${e}`));const f=p.concat(Ke.fragmentSource,o.fragmentSource).join("\n"),g=p.concat(Ke.vertexSource,He.vertexSource,o.vertexSource).join("\n"),v=s.createShader(s.FRAGMENT_SHADER);if(s.isContextLost())return void(this.failedToCreate=!0);s.shaderSource(v,f),s.compileShader(v),s.attachShader(this.program,v);const x=s.createShader(s.VERTEX_SHADER);if(s.isContextLost())return void(this.failedToCreate=!0);s.shaderSource(x,g),s.compileShader(x),s.attachShader(this.program,x),this.attributes={};const y={};this.numAttributes=h.length;for(let e=0;e({u_dem:new e.Uniform1i(t,i.u_dem),u_dem_prev:new e.Uniform1i(t,i.u_dem_prev),u_dem_unpack:new e.Uniform4f(t,i.u_dem_unpack),u_dem_tl:new e.Uniform2f(t,i.u_dem_tl),u_dem_scale:new e.Uniform1f(t,i.u_dem_scale),u_dem_tl_prev:new e.Uniform2f(t,i.u_dem_tl_prev),u_dem_scale_prev:new e.Uniform1f(t,i.u_dem_scale_prev),u_dem_size:new e.Uniform1f(t,i.u_dem_size),u_dem_lerp:new e.Uniform1f(t,i.u_dem_lerp),u_exaggeration:new e.Uniform1f(t,i.u_exaggeration),u_depth:new e.Uniform1i(t,i.u_depth),u_depth_size_inv:new e.Uniform2f(t,i.u_depth_size_inv),u_meter_to_dem:new e.Uniform1f(t,i.u_meter_to_dem),u_label_plane_matrix_inv:new e.UniformMatrix4f(t,i.u_label_plane_matrix_inv)}))(t,y));}setTerrainUniformValues(e,t){if(!this.terrainUniforms)return;const i=this.terrainUniforms;if(!this.failedToCreate){e.program.set(this.program);for(const e in t)i[e].set(t[e]);}}draw(e,t,i,o,a,r,n,s,l,c,h,u,d,_,m,p){const f=e.gl;if(this.failedToCreate)return;e.program.set(this.program),e.setDepthMode(i),e.setStencilMode(o),e.setColorMode(a),e.setCullFace(r);for(const e in this.fixedUniforms)this.fixedUniforms[e].set(n[e]);_&&_.setUniforms(e,this.binderUniforms,u,{zoom:d});const g={[f.LINES]:2,[f.TRIANGLES]:3,[f.LINE_STRIP]:1}[t];for(const i of h.get()){const o=i.vaos||(i.vaos={});(o[s]||(o[s]=new Mt)).bind(e,this,l,_?_.getPaintVertexBuffers():[],c,i.vertexOffset,m,p),f.drawElements(t,i.primitiveLength*g,f.UNSIGNED_SHORT,i.primitiveOffset*g*2);}}}function Xt(e,t,i){const o=1/C(i,1,t.transform.tileZoom),a=Math.pow(2,i.tileID.overscaledZ),r=i.tileSize*Math.pow(2,t.transform.tileZoom)/a,n=r*(i.tileID.canonical.x+i.tileID.wrap*a),s=r*i.tileID.canonical.y;return {u_image:0,u_texsize:i.imageAtlasTexture.size,u_scale:[o,e.fromScale,e.toScale],u_fade:e.t,u_pixel_coord_upper:[n>>16,s>>16],u_pixel_coord_lower:[65535&n,65535&s]}}const Ht=(t,i,o,a)=>{const r=i.style.light,n=r.properties.get("position"),s=[n.x,n.y,n.z],l=e.create$1();"viewport"===r.properties.get("anchor")&&(e.fromRotation(l,-i.transform.angle),e.transformMat3(s,s,l));const c=r.properties.get("color");return {u_matrix:t,u_lightpos:s,u_lightintensity:r.properties.get("intensity"),u_lightcolor:[c.r,c.g,c.b],u_vertical_gradient:+o,u_opacity:a}},Kt=(t,i,o,a,r,n,s)=>e.extend(Ht(t,i,o,a),Xt(n,i,s),{u_height_factor:-Math.pow(2,r.overscaledZ)/s.tileSize/8}),Yt=e=>({u_matrix:e}),Jt=(t,i,o,a)=>e.extend(Yt(t),Xt(o,i,a)),Qt=(e,t)=>({u_matrix:e,u_world:t}),ei=(t,i,o,a,r)=>e.extend(Jt(t,i,o,a),{u_world:r}),ti=(t,i,o,a)=>{const r=t.transform;let n;if("map"===a.paint.get("circle-pitch-alignment")){const e=C(o,1,r.zoom);n=[e,e];}else n=r.pixelsToGLUnits;return {u_camera_to_center_distance:r.cameraToCenterDistance,u_matrix:t.translatePosMatrix(i.posMatrix,o,a.paint.get("circle-translate"),a.paint.get("circle-translate-anchor")),u_device_pixel_ratio:e.browser.devicePixelRatio,u_extrude_scale:n}},ii=e=>{const t=[];return "map"===e.paint.get("circle-pitch-alignment")&&t.push("PITCH_WITH_MAP"),"map"===e.paint.get("circle-pitch-scale")&&t.push("SCALE_WITH_MAP"),t},oi=(t,i,o)=>{const a=e.EXTENT/o.tileSize;return {u_matrix:t,u_camera_to_center_distance:i.cameraToCenterDistance,u_extrude_scale:[i.pixelsToGLUnits[0]/a,i.pixelsToGLUnits[1]/a]}},ai=(e,t,i=1)=>({u_matrix:e,u_color:t,u_overlay:0,u_overlay_scale:i}),ri=(e,t,i,o)=>({u_matrix:e,u_extrude_scale:C(t,1,i),u_intensity:o}),ni=(t,i,o,a)=>{const r=t.transform;return {u_matrix:ui(t,i,o,a),u_ratio:1/C(i,1,r.zoom),u_device_pixel_ratio:e.browser.devicePixelRatio,u_units_to_pixels:[1/r.pixelsToGLUnits[0],1/r.pixelsToGLUnits[1]]}},si=(t,i,o,a,r)=>e.extend(ni(t,i,o,a),{u_image:0,u_image_height:r}),li=(t,i,o,a,r)=>{const n=t.transform,s=hi(i,n);return {u_matrix:ui(t,i,o,r),u_texsize:i.imageAtlasTexture.size,u_ratio:1/C(i,1,n.zoom),u_device_pixel_ratio:e.browser.devicePixelRatio,u_image:0,u_scale:[s,a.fromScale,a.toScale],u_fade:a.t,u_units_to_pixels:[1/n.pixelsToGLUnits[0],1/n.pixelsToGLUnits[1]]}},ci=(t,i,o,a,r,n)=>{const s=t.lineAtlas,l=hi(i,t.transform),c="round"===o.layout.get("line-cap"),h=s.getDash(a.from,c),u=s.getDash(a.to,c),d=h.width*r.fromScale,_=u.width*r.toScale;return e.extend(ni(t,i,o,n),{u_patternscale_a:[l/d,-h.height/2],u_patternscale_b:[l/_,-u.height/2],u_sdfgamma:s.width/(256*Math.min(d,_)*e.browser.devicePixelRatio)/2,u_image:0,u_tex_y_a:h.y,u_tex_y_b:u.y,u_mix:r.t})};function hi(e,t){return 1/C(e,1,t.tileZoom)}function ui(e,t,i,o){return e.translatePosMatrix(o||t.tileID.posMatrix,t,i.paint.get("line-translate"),i.paint.get("line-translate-anchor"))}const di=(e,t,i,o,a)=>{return {u_matrix:e,u_tl_parent:t,u_scale_parent:i,u_buffer_scale:1,u_fade_t:o.mix,u_opacity:o.opacity*a.paint.get("raster-opacity"),u_image0:0,u_image1:1,u_brightness_low:a.paint.get("raster-brightness-min"),u_brightness_high:a.paint.get("raster-brightness-max"),u_saturation_factor:(n=a.paint.get("raster-saturation"),n>0?1-1/(1.001-n):-n),u_contrast_factor:(r=a.paint.get("raster-contrast"),r>0?1/(1-r):1+r),u_spin_weights:_i(a.paint.get("raster-hue-rotate"))};var r,n;};function _i(e){e*=Math.PI/180;const t=Math.sin(e),i=Math.cos(e);return [(2*i+1)/3,(-Math.sqrt(3)*t-i+1)/3,(Math.sqrt(3)*t-i+1)/3]}const mi=(e,t,i,o,a,r,n,s,l,c)=>{const h=a.transform;return {u_is_size_zoom_constant:+("constant"===e||"source"===e),u_is_size_feature_constant:+("constant"===e||"camera"===e),u_size_t:t?t.uSizeT:0,u_size:t?t.uSize:0,u_camera_to_center_distance:h.cameraToCenterDistance,u_pitch:h.pitch/360*2*Math.PI,u_rotate_symbol:+i,u_aspect_ratio:h.width/h.height,u_fade_change:a.options.fadeDuration?a.symbolFadeChange:1,u_matrix:r,u_label_plane_matrix:n,u_coord_matrix:s,u_is_text:+l,u_pitch_with_map:+o,u_texsize:c,u_texture:0}},pi=(t,i,o,a,r,n,s,l,c,h,u)=>{const d=r.transform;return e.extend(mi(t,i,o,a,r,n,s,l,c,h),{u_gamma_scale:a?Math.cos(d._pitch)*d.cameraToCenterDistance:1,u_device_pixel_ratio:e.browser.devicePixelRatio,u_is_halo:+u})},fi=(t,i,o,a,r,n,s,l,c,h)=>e.extend(pi(t,i,o,a,r,n,s,l,!0,c,!0),{u_texsize_icon:h,u_texture_icon:1}),gi=(e,t,i)=>({u_matrix:e,u_opacity:t,u_color:i}),vi=(t,i,o,a,r,n)=>e.extend(function(e,t,i,o){const a=i.imageManager.getPattern(e.from.toString()),r=i.imageManager.getPattern(e.to.toString()),{width:n,height:s}=i.imageManager.getPixelSize(),l=Math.pow(2,o.tileID.overscaledZ),c=o.tileSize*Math.pow(2,i.transform.tileZoom)/l,h=c*(o.tileID.canonical.x+o.tileID.wrap*l),u=c*o.tileID.canonical.y;return {u_image:0,u_pattern_tl_a:a.tl,u_pattern_br_a:a.br,u_pattern_tl_b:r.tl,u_pattern_br_b:r.br,u_texsize:[n,s],u_mix:t.t,u_pattern_size_a:a.displaySize,u_pattern_size_b:r.displaySize,u_scale_a:t.fromScale,u_scale_b:t.toScale,u_tile_units_to_pixels:1/C(o,1,i.transform.tileZoom),u_pixel_coord_upper:[h>>16,u>>16],u_pixel_coord_lower:[65535&h,65535&u]}}(a,n,o,r),{u_matrix:t,u_opacity:i}),xi={fillExtrusion:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_lightpos:new e.Uniform3f(t,i.u_lightpos),u_lightintensity:new e.Uniform1f(t,i.u_lightintensity),u_lightcolor:new e.Uniform3f(t,i.u_lightcolor),u_vertical_gradient:new e.Uniform1f(t,i.u_vertical_gradient),u_opacity:new e.Uniform1f(t,i.u_opacity)}),fillExtrusionPattern:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_lightpos:new e.Uniform3f(t,i.u_lightpos),u_lightintensity:new e.Uniform1f(t,i.u_lightintensity),u_lightcolor:new e.Uniform3f(t,i.u_lightcolor),u_vertical_gradient:new e.Uniform1f(t,i.u_vertical_gradient),u_height_factor:new e.Uniform1f(t,i.u_height_factor),u_image:new e.Uniform1i(t,i.u_image),u_texsize:new e.Uniform2f(t,i.u_texsize),u_pixel_coord_upper:new e.Uniform2f(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.Uniform2f(t,i.u_pixel_coord_lower),u_scale:new e.Uniform3f(t,i.u_scale),u_fade:new e.Uniform1f(t,i.u_fade),u_opacity:new e.Uniform1f(t,i.u_opacity)}),fill:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix)}),fillPattern:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_image:new e.Uniform1i(t,i.u_image),u_texsize:new e.Uniform2f(t,i.u_texsize),u_pixel_coord_upper:new e.Uniform2f(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.Uniform2f(t,i.u_pixel_coord_lower),u_scale:new e.Uniform3f(t,i.u_scale),u_fade:new e.Uniform1f(t,i.u_fade)}),fillOutline:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_world:new e.Uniform2f(t,i.u_world)}),fillOutlinePattern:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_world:new e.Uniform2f(t,i.u_world),u_image:new e.Uniform1i(t,i.u_image),u_texsize:new e.Uniform2f(t,i.u_texsize),u_pixel_coord_upper:new e.Uniform2f(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.Uniform2f(t,i.u_pixel_coord_lower),u_scale:new e.Uniform3f(t,i.u_scale),u_fade:new e.Uniform1f(t,i.u_fade)}),circle:(t,i)=>({u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_extrude_scale:new e.Uniform2f(t,i.u_extrude_scale),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_matrix:new e.UniformMatrix4f(t,i.u_matrix)}),collisionBox:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_extrude_scale:new e.Uniform2f(t,i.u_extrude_scale)}),collisionCircle:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_inv_matrix:new e.UniformMatrix4f(t,i.u_inv_matrix),u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_viewport_size:new e.Uniform2f(t,i.u_viewport_size)}),debug:(t,i)=>({u_color:new e.UniformColor(t,i.u_color),u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_overlay:new e.Uniform1i(t,i.u_overlay),u_overlay_scale:new e.Uniform1f(t,i.u_overlay_scale)}),clippingMask:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix)}),heatmap:(t,i)=>({u_extrude_scale:new e.Uniform1f(t,i.u_extrude_scale),u_intensity:new e.Uniform1f(t,i.u_intensity),u_matrix:new e.UniformMatrix4f(t,i.u_matrix)}),heatmapTexture:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_world:new e.Uniform2f(t,i.u_world),u_image:new e.Uniform1i(t,i.u_image),u_color_ramp:new e.Uniform1i(t,i.u_color_ramp),u_opacity:new e.Uniform1f(t,i.u_opacity)}),hillshade:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_image:new e.Uniform1i(t,i.u_image),u_latrange:new e.Uniform2f(t,i.u_latrange),u_light:new e.Uniform2f(t,i.u_light),u_shadow:new e.UniformColor(t,i.u_shadow),u_highlight:new e.UniformColor(t,i.u_highlight),u_accent:new e.UniformColor(t,i.u_accent)}),hillshadePrepare:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_image:new e.Uniform1i(t,i.u_image),u_dimension:new e.Uniform2f(t,i.u_dimension),u_zoom:new e.Uniform1f(t,i.u_zoom),u_unpack:new e.Uniform4f(t,i.u_unpack)}),line:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_ratio:new e.Uniform1f(t,i.u_ratio),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.Uniform2f(t,i.u_units_to_pixels)}),lineGradient:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_ratio:new e.Uniform1f(t,i.u_ratio),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.Uniform2f(t,i.u_units_to_pixels),u_image:new e.Uniform1i(t,i.u_image),u_image_height:new e.Uniform1f(t,i.u_image_height)}),linePattern:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_texsize:new e.Uniform2f(t,i.u_texsize),u_ratio:new e.Uniform1f(t,i.u_ratio),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_image:new e.Uniform1i(t,i.u_image),u_units_to_pixels:new e.Uniform2f(t,i.u_units_to_pixels),u_scale:new e.Uniform3f(t,i.u_scale),u_fade:new e.Uniform1f(t,i.u_fade)}),lineSDF:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_ratio:new e.Uniform1f(t,i.u_ratio),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_units_to_pixels:new e.Uniform2f(t,i.u_units_to_pixels),u_patternscale_a:new e.Uniform2f(t,i.u_patternscale_a),u_patternscale_b:new e.Uniform2f(t,i.u_patternscale_b),u_sdfgamma:new e.Uniform1f(t,i.u_sdfgamma),u_image:new e.Uniform1i(t,i.u_image),u_tex_y_a:new e.Uniform1f(t,i.u_tex_y_a),u_tex_y_b:new e.Uniform1f(t,i.u_tex_y_b),u_mix:new e.Uniform1f(t,i.u_mix)}),raster:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_tl_parent:new e.Uniform2f(t,i.u_tl_parent),u_scale_parent:new e.Uniform1f(t,i.u_scale_parent),u_buffer_scale:new e.Uniform1f(t,i.u_buffer_scale),u_fade_t:new e.Uniform1f(t,i.u_fade_t),u_opacity:new e.Uniform1f(t,i.u_opacity),u_image0:new e.Uniform1i(t,i.u_image0),u_image1:new e.Uniform1i(t,i.u_image1),u_brightness_low:new e.Uniform1f(t,i.u_brightness_low),u_brightness_high:new e.Uniform1f(t,i.u_brightness_high),u_saturation_factor:new e.Uniform1f(t,i.u_saturation_factor),u_contrast_factor:new e.Uniform1f(t,i.u_contrast_factor),u_spin_weights:new e.Uniform3f(t,i.u_spin_weights)}),symbolIcon:(t,i)=>({u_is_size_zoom_constant:new e.Uniform1i(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.Uniform1i(t,i.u_is_size_feature_constant),u_size_t:new e.Uniform1f(t,i.u_size_t),u_size:new e.Uniform1f(t,i.u_size),u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_pitch:new e.Uniform1f(t,i.u_pitch),u_rotate_symbol:new e.Uniform1i(t,i.u_rotate_symbol),u_aspect_ratio:new e.Uniform1f(t,i.u_aspect_ratio),u_fade_change:new e.Uniform1f(t,i.u_fade_change),u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_label_plane_matrix:new e.UniformMatrix4f(t,i.u_label_plane_matrix),u_coord_matrix:new e.UniformMatrix4f(t,i.u_coord_matrix),u_is_text:new e.Uniform1i(t,i.u_is_text),u_pitch_with_map:new e.Uniform1i(t,i.u_pitch_with_map),u_texsize:new e.Uniform2f(t,i.u_texsize),u_texture:new e.Uniform1i(t,i.u_texture)}),symbolSDF:(t,i)=>({u_is_size_zoom_constant:new e.Uniform1i(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.Uniform1i(t,i.u_is_size_feature_constant),u_size_t:new e.Uniform1f(t,i.u_size_t),u_size:new e.Uniform1f(t,i.u_size),u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_pitch:new e.Uniform1f(t,i.u_pitch),u_rotate_symbol:new e.Uniform1i(t,i.u_rotate_symbol),u_aspect_ratio:new e.Uniform1f(t,i.u_aspect_ratio),u_fade_change:new e.Uniform1f(t,i.u_fade_change),u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_label_plane_matrix:new e.UniformMatrix4f(t,i.u_label_plane_matrix),u_coord_matrix:new e.UniformMatrix4f(t,i.u_coord_matrix),u_is_text:new e.Uniform1i(t,i.u_is_text),u_pitch_with_map:new e.Uniform1i(t,i.u_pitch_with_map),u_texsize:new e.Uniform2f(t,i.u_texsize),u_texture:new e.Uniform1i(t,i.u_texture),u_gamma_scale:new e.Uniform1f(t,i.u_gamma_scale),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_is_halo:new e.Uniform1i(t,i.u_is_halo)}),symbolTextAndIcon:(t,i)=>({u_is_size_zoom_constant:new e.Uniform1i(t,i.u_is_size_zoom_constant),u_is_size_feature_constant:new e.Uniform1i(t,i.u_is_size_feature_constant),u_size_t:new e.Uniform1f(t,i.u_size_t),u_size:new e.Uniform1f(t,i.u_size),u_camera_to_center_distance:new e.Uniform1f(t,i.u_camera_to_center_distance),u_pitch:new e.Uniform1f(t,i.u_pitch),u_rotate_symbol:new e.Uniform1i(t,i.u_rotate_symbol),u_aspect_ratio:new e.Uniform1f(t,i.u_aspect_ratio),u_fade_change:new e.Uniform1f(t,i.u_fade_change),u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_label_plane_matrix:new e.UniformMatrix4f(t,i.u_label_plane_matrix),u_coord_matrix:new e.UniformMatrix4f(t,i.u_coord_matrix),u_is_text:new e.Uniform1i(t,i.u_is_text),u_pitch_with_map:new e.Uniform1i(t,i.u_pitch_with_map),u_texsize:new e.Uniform2f(t,i.u_texsize),u_texsize_icon:new e.Uniform2f(t,i.u_texsize_icon),u_texture:new e.Uniform1i(t,i.u_texture),u_texture_icon:new e.Uniform1i(t,i.u_texture_icon),u_gamma_scale:new e.Uniform1f(t,i.u_gamma_scale),u_device_pixel_ratio:new e.Uniform1f(t,i.u_device_pixel_ratio),u_is_halo:new e.Uniform1i(t,i.u_is_halo)}),background:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_opacity:new e.Uniform1f(t,i.u_opacity),u_color:new e.UniformColor(t,i.u_color)}),backgroundPattern:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_opacity:new e.Uniform1f(t,i.u_opacity),u_image:new e.Uniform1i(t,i.u_image),u_pattern_tl_a:new e.Uniform2f(t,i.u_pattern_tl_a),u_pattern_br_a:new e.Uniform2f(t,i.u_pattern_br_a),u_pattern_tl_b:new e.Uniform2f(t,i.u_pattern_tl_b),u_pattern_br_b:new e.Uniform2f(t,i.u_pattern_br_b),u_texsize:new e.Uniform2f(t,i.u_texsize),u_mix:new e.Uniform1f(t,i.u_mix),u_pattern_size_a:new e.Uniform2f(t,i.u_pattern_size_a),u_pattern_size_b:new e.Uniform2f(t,i.u_pattern_size_b),u_scale_a:new e.Uniform1f(t,i.u_scale_a),u_scale_b:new e.Uniform1f(t,i.u_scale_b),u_pixel_coord_upper:new e.Uniform2f(t,i.u_pixel_coord_upper),u_pixel_coord_lower:new e.Uniform2f(t,i.u_pixel_coord_lower),u_tile_units_to_pixels:new e.Uniform1f(t,i.u_tile_units_to_pixels)}),terrainRaster:Rt,terrainDepth:Rt,skybox:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_sun_direction:new e.Uniform3f(t,i.u_sun_direction),u_cubemap:new e.Uniform1i(t,i.u_cubemap),u_opacity:new e.Uniform1f(t,i.u_opacity),u_temporal_offset:new e.Uniform1f(t,i.u_temporal_offset)}),skyboxGradient:(t,i)=>({u_matrix:new e.UniformMatrix4f(t,i.u_matrix),u_color_ramp:new e.Uniform1i(t,i.u_color_ramp),u_center_direction:new e.Uniform3f(t,i.u_center_direction),u_radius:new e.Uniform1f(t,i.u_radius),u_opacity:new e.Uniform1f(t,i.u_opacity),u_temporal_offset:new e.Uniform1f(t,i.u_temporal_offset)}),skyboxCapture:(t,i)=>({u_matrix_3f:new e.UniformMatrix3f(t,i.u_matrix_3f),u_sun_direction:new e.Uniform3f(t,i.u_sun_direction),u_sun_intensity:new e.Uniform1f(t,i.u_sun_intensity),u_color_tint_r:new e.Uniform4f(t,i.u_color_tint_r),u_color_tint_m:new e.Uniform4f(t,i.u_color_tint_m),u_luminance:new e.Uniform1f(t,i.u_luminance)})};let yi;function bi(t,i,o,a,r,n,s){const l=t.context,c=l.gl,h=t.useProgram("collisionBox"),u=[];let d=0,_=0;for(let m=0;m0){const i=e.create(),o=v;e.mul(i,g.placementInvProjMatrix,t.transform.glCoordMatrix),e.mul(i,i,g.placementViewportMatrix),u.push({circleArray:y,circleOffset:_,transform:o,invTransform:i}),d+=y.length/4,_=d;}x&&(t.terrain&&t.terrain.setupElevationDraw(f,h),h.draw(l,c.LINES,e.DepthMode.disabled,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.disabled,oi(v,t.transform,f),o.id,x.layoutVertexBuffer,x.indexBuffer,x.segments,null,t.transform.zoom,null,x.collisionVertexBuffer,x.collisionVertexBufferExt));}if(!s||!u.length)return;const m=t.useProgram("collisionCircle"),p=new e.StructArrayLayout2f1f2i16;p.resize(4*d),p._trim();let f=0;for(const e of u)for(let t=0;t=0&&(f[g.associatedIconIndex]={shiftedAnchor:I,angle:P});}else me(g.numGlyphs,m);}if(u){p.clear();const i=t.icon.placedSymbolArray;for(let t=0;te.getAtTileOffset(l,t.x,t.y):null);}const G=t.translatePosMatrix(l.posMatrix,a,n,s),q=v||r&&T||Z?wi:F,V=t.translatePosMatrix(U,a,n,s,!0),$=_&&0!==o.paint.get(r?"text-halo-width":"icon-halo-width").constantOr(1);let j;j=_?c.iconsInText?fi(w.kind,M,x,g,t,G,q,V,z,R):pi(w.kind,M,x,g,t,G,q,V,r,z,!0):mi(w.kind,M,x,g,t,G,q,V,r,z);const W={program:P,buffers:u,uniformValues:j,atlasTexture:A,atlasTextureIcon:k,atlasInterpolation:D,atlasInterpolationIcon:L,isSDF:_,hasHalo:$,tile:a,labelPlaneMatrixInv:O};if(y&&c.canOverlap){b=!0;const t=u.segments.get();for(const i of t)E.push({segments:new e.SegmentVector([i]),sortKey:i.sortKey,state:W});}else E.push({segments:u.segments,sortKey:0,state:W});}b&&E.sort((e,t)=>e.sortKey-t.sortKey);for(const e of E){const i=e.state;if(t.terrain&&t.terrain.setupElevationDraw(i.tile,i.program,{useDepthForOcclusion:!0,labelPlaneMatrixInv:i.labelPlaneMatrixInv}),_.activeTexture.set(m.TEXTURE0),i.atlasTexture.bind(i.atlasInterpolation,m.CLAMP_TO_EDGE),i.atlasTextureIcon&&(_.activeTexture.set(m.TEXTURE1),i.atlasTextureIcon&&i.atlasTextureIcon.bind(i.atlasInterpolationIcon,m.CLAMP_TO_EDGE)),i.isSDF){const a=i.uniformValues;i.hasHalo&&(a.u_is_halo=1,Ii(i.buffers,e.segments,o,t,i.program,w,u,d,a)),a.u_is_halo=0;}Ii(i.buffers,e.segments,o,t,i.program,w,u,d,i.uniformValues);}}function Ii(t,i,o,a,r,n,s,l,c){const h=a.context;r.draw(h,h.gl.TRIANGLES,n,s,l,e.CullFaceMode.disabled,c,o.id,t.layoutVertexBuffer,t.indexBuffer,i,o.paint,a.transform.zoom,t.programConfigurations.get(o.id),t.dynamicLayoutVertexBuffer,t.opacityVertexBuffer);}function Pi(t,i,o,a,r,n,s){const l=t.context.gl,c=o.paint.get("fill-pattern"),h=c&&c.constantOr(1),u=o.getCrossfadeParameters();let d,_,m,p,f;s?(_=h&&!o.getPaintProperty("fill-outline-color")?"fillOutlinePattern":"fillOutline",d=l.LINES):(_=h?"fillPattern":"fill",d=l.TRIANGLES);for(const g of a){const a=i.getTile(g);if(h&&!a.patternsLoaded())continue;const v=a.getBucket(o);if(!v)continue;t.prepareDrawTile(g);const x=v.programConfigurations.get(o.id),y=t.useProgram(_,x);h&&(t.context.activeTexture.set(l.TEXTURE0),a.imageAtlasTexture.bind(l.LINEAR,l.CLAMP_TO_EDGE),x.updatePaintBuffers(u));const b=c.constantOr(null);if(b&&a.imageAtlas){const e=a.imageAtlas,t=e.patternPositions[b.to.toString()],i=e.patternPositions[b.from.toString()];t&&i&&x.setConstantPatternPositions(t,i);}const w=t.translatePosMatrix(g.posMatrix,a,o.paint.get("fill-translate"),o.paint.get("fill-translate-anchor"));if(s){p=v.indexBuffer2,f=v.segments2;const e=t.terrain&&t.terrain.renderingToTexture?t.terrain.drapeBufferSize:[l.drawingBufferWidth,l.drawingBufferHeight];m="fillOutlinePattern"===_&&h?ei(w,t,u,a,e):Qt(w,e);}else p=v.indexBuffer,f=v.segments,m=h?Jt(w,t,u,a):Yt(w);y.draw(t.context,d,r,t.stencilModeForClipping(g),n,e.CullFaceMode.disabled,m,o.id,v.layoutVertexBuffer,p,f,o.paint,t.transform.zoom,x);}}function Mi(t,i,o,a,r,n,s){const l=t.context,c=l.gl,h=o.paint.get("fill-extrusion-pattern"),u=h.constantOr(1),d=o.getCrossfadeParameters(),_=o.paint.get("fill-extrusion-opacity");for(const m of a){const a=i.getTile(m),p=a.getBucket(o);if(!p)continue;const f=p.programConfigurations.get(o.id),g=t.useProgram(u?"fillExtrusionPattern":"fillExtrusion",f);if(t.terrain){const e=t.terrain;if(!p.enableTerrain)continue;if(e.setupElevationDraw(a,g,{useMeterToDem:!0}),zi(l,i,m,p,o,e),!p.centroidVertexBuffer){const e=g.attributes.a_centroid_pos;void 0!==e&&c.vertexAttrib2f(e,0,0);}}u&&(t.context.activeTexture.set(c.TEXTURE0),a.imageAtlasTexture.bind(c.LINEAR,c.CLAMP_TO_EDGE),f.updatePaintBuffers(d));const v=h.constantOr(null);if(v&&a.imageAtlas){const e=a.imageAtlas,t=e.patternPositions[v.to.toString()],i=e.patternPositions[v.from.toString()];t&&i&&f.setConstantPatternPositions(t,i);}const x=t.translatePosMatrix(m.posMatrix,a,o.paint.get("fill-extrusion-translate"),o.paint.get("fill-extrusion-translate-anchor")),y=o.paint.get("fill-extrusion-vertical-gradient"),b=u?Kt(x,t,y,_,m,d,a):Ht(x,t,y,_);g.draw(l,l.gl.TRIANGLES,r,n,s,e.CullFaceMode.backCCW,b,o.id,p.layoutVertexBuffer,p.indexBuffer,p.segments,o.paint,t.transform.zoom,f,t.terrain?p.centroidVertexBuffer:null);}}function zi(t,i,o,a,r,n){const s=[t=>{let i=t.canonical.x-1,o=t.wrap;return i<0&&(i=(1<{let i=t.canonical.x+1,o=t.wrap;return i===1<new e.OverscaledTileID(t.overscaledZ,t.wrap,t.canonical.z,t.canonical.x,(0===t.canonical.y?1<new e.OverscaledTileID(t.overscaledZ,t.wrap,t.canonical.z,t.canonical.x,t.canonical.y===(1<{const t=i.getSource().maxzoom;for(const o of [0,-1,1]){if(e.overscaledZ+o0&&e.overscaledZ(c[0]=Math.min(t.min.y,i.min.y),c[1]=Math.max(t.max.y,i.max.y),c[2]=e.EXTENT-i.min.x>t.max.x?i.min.x-e.EXTENT:t.max.x,c),u=(t,i)=>(c[0]=Math.min(t.min.x,i.min.x),c[1]=Math.max(t.max.x,i.max.x),c[2]=e.EXTENT-i.min.y>t.max.y?i.min.y-e.EXTENT:t.max.y,c),d=[(e,t)=>h(e,t),(e,t)=>h(t,e),(e,t)=>u(e,t),(e,t)=>u(t,e)],_=new e.Point(0,0);let m,p,f;const g=(t,i,a,r,s)=>{const l=[[r?a:t,r?t:a,0],[r?a:i,r?i:a,0]],c=s<0?e.EXTENT+s:s,h=[r?c:(t+i)/2,r?(t+i)/2:c,0];return 0===a&&s<0||0!==a&&s>0?n.getForTilePoints(f,[h],!0,p):l.push(h),n.getForTilePoints(o,l,!0,m),Math.max(l[0][2],l[1][2],h[2])/n.exaggeration()};for(let t=0;t<4;t++){const i=a.borders[t];if(0===i.length&&(a.borderDone[t]=!0),a.borderDone[t])continue;const r=f=s[t](o),c=l(r);if(!c||!c.enableTerrain)continue;if(p=n.findDEMTileFor(r),!p||!p.dem)continue;if(!m){const e=n.findDEMTileFor(o);if(!e||!e.dem)return;m=e;}const h=(t<2?1:5)-t,u=c.borders[h];let v=0;for(let o=0;on[0]+3));)c.borderDone[h]||c.encodeCentroid(void 0,s,!1),v++;if(s&&vn[1]-3)&&(o++,++v!==u.length);)s=c.featuresOnBorder[u[v]];if(s=c.featuresOnBorder[u[i]],r.intersectsCount()>1||s.intersectsCount()>1||1!==o){1!==o&&(v=i),a.encodeCentroid(void 0,r,!1),c.borderDone[h]||c.encodeCentroid(void 0,s,!1);continue}const l=d[t](r,s),m=t%2?e.EXTENT-1:0;_.x=g(l[0],Math.min(e.EXTENT-1,l[1]),m,t<2,l[2]),_.y=0,a.encodeCentroid(_,r,!1),c.borderDone[h]||c.encodeCentroid(_,s,!1);}else a.encodeCentroid(void 0,r,!1);}a.borderDone[t]=a.needsCentroidUpdate=!0,c.borderDone[h]||(c.borderDone[h]=c.needsCentroidUpdate=!0);}(a.needsCentroidUpdate||!a.centroidVertexBuffer&&0!==a.centroidVertexArray.length)&&a.uploadCentroid(t);}const Ai=new e.Color(1,0,0,1),Di=new e.Color(0,1,0,1),Li=new e.Color(0,0,1,1),Ri=new e.Color(1,0,1,1),ki=new e.Color(0,1,1,1);function Bi(e,t,i,o){Oi(e,0,t+i/2,e.transform.width,i,o);}function Fi(e,t,i,o){Oi(e,t-i/2,0,i,e.transform.height,o);}function Oi(t,i,o,a,r,n){const s=t.context,l=s.gl;l.enable(l.SCISSOR_TEST),l.scissor(i*e.browser.devicePixelRatio,o*e.browser.devicePixelRatio,a*e.browser.devicePixelRatio,r*e.browser.devicePixelRatio),s.clear({color:n}),l.disable(l.SCISSOR_TEST);}function Ui(t,i,o){const a=t.context,r=a.gl,n=o.posMatrix,s=t.useProgram("debug"),l=i.getTileByID(o.key);t.terrain&&t.terrain.setupElevationDraw(l,s);const c=e.DepthMode.disabled,h=e.StencilMode.disabled,u=t.colorModeForRenderPass();a.activeTexture.set(r.TEXTURE0),t.emptyTexture.bind(r.LINEAR,r.CLAMP_TO_EDGE),s.draw(a,r.LINE_STRIP,c,h,u,e.CullFaceMode.disabled,ai(n,e.Color.red),"$debug",t.debugBuffer,t.tileBorderIndexBuffer,t.debugSegments);const d=l.latestRawTileData,_=Math.floor((d&&d.byteLength||0)/1024),m=i.getTile(o).tileSize,p=512/Math.min(m,512)*(o.overscaledZ/t.transform.zoom)*.5;let f=o.canonical.toString();o.overscaledZ!==o.canonical.z&&(f+=` => ${o.overscaledZ}`),function(e,t){e.initDebugOverlayCanvas();const i=e.debugOverlayCanvas,o=e.context.gl,a=e.debugOverlayCanvas.getContext("2d");a.clearRect(0,0,i.width,i.height),a.shadowColor="white",a.shadowBlur=2,a.lineWidth=1.5,a.strokeStyle="white",a.textBaseline="top",a.font="bold 36px Open Sans, sans-serif",a.fillText(t,5,5),a.strokeText(t,5,5),e.debugOverlayTexture.update(i),e.debugOverlayTexture.bind(o.LINEAR,o.CLAMP_TO_EDGE);}(t,`${f} ${_}kb`),s.draw(a,r.TRIANGLES,c,h,e.ColorMode.alphaBlended,e.CullFaceMode.disabled,ai(n,e.Color.transparent,p),"$debug",t.debugBuffer,t.quadTriangleIndexBuffer,t.debugSegments);}const Ni=e.createLayout([{name:"a_pos_3f",components:3,type:"Float32"}]),{members:Zi}=Ni;function Gi(e,t,i,o){e.emplaceBack(t,i,o);}class qi{constructor(t){this.vertexArray=new e.StructArrayLayout3f12,this.indices=new e.StructArrayLayout3ui6,Gi(this.vertexArray,-1,-1,1),Gi(this.vertexArray,1,-1,1),Gi(this.vertexArray,-1,1,1),Gi(this.vertexArray,1,1,1),Gi(this.vertexArray,-1,-1,-1),Gi(this.vertexArray,1,-1,-1),Gi(this.vertexArray,-1,1,-1),Gi(this.vertexArray,1,1,-1),this.indices.emplaceBack(5,1,3),this.indices.emplaceBack(3,7,5),this.indices.emplaceBack(6,2,0),this.indices.emplaceBack(0,4,6),this.indices.emplaceBack(2,6,7),this.indices.emplaceBack(7,3,2),this.indices.emplaceBack(5,4,0),this.indices.emplaceBack(0,1,5),this.indices.emplaceBack(0,2,3),this.indices.emplaceBack(3,1,0),this.indices.emplaceBack(7,6,4),this.indices.emplaceBack(4,5,7),this.vertexBuffer=t.createVertexBuffer(this.vertexArray,Zi),this.indexBuffer=t.createIndexBuffer(this.indices),this.segment=e.SegmentVector.simpleSegment(0,0,36,12);}}function Vi(t,i,o,a,r,n){const s=t.gl,l=i.paint.get("sky-atmosphere-color"),c=i.paint.get("sky-atmosphere-halo-color"),h=i.paint.get("sky-atmosphere-sun-intensity"),u=((e,t,i,o,a)=>({u_matrix_3f:e,u_sun_direction:t,u_sun_intensity:i,u_color_tint_r:[o.r,o.g,o.b,o.a],u_color_tint_m:[a.r,a.g,a.b,a.a],u_luminance:5e-5}))(e.fromMat4([],a),r,h,l,c);s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_CUBE_MAP_POSITIVE_X+n,i.skyboxTexture,0),o.draw(t,s.TRIANGLES,e.DepthMode.disabled,e.StencilMode.disabled,e.ColorMode.unblended,e.CullFaceMode.frontCW,u,"skyboxCapture",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}const $i={symbol:function(t,i,o,a,r){if("translucent"!==t.renderPass)return;const n=e.StencilMode.disabled,s=t.colorModeForRenderPass();o.layout.get("text-variable-anchor")&&function(t,i,o,a,r,n,s){const l=i.transform,c="map"===r,h="map"===n;for(const r of t){const t=a.getTile(r),n=t.getBucket(o);if(!n||!n.text||!n.text.segments.get().length)continue;const u=e.evaluateSizeForZoom(n.textSizeData,l.zoom),d=C(t,1,i.transform.zoom),_=ie(r.posMatrix,h,c,i.transform,d),m="none"!==o.layout.get("icon-text-fit")&&n.hasIconData();if(u){const i=Math.pow(2,l.zoom-t.tileID.overscaledZ),o=l.elevation;Ei(n,c,h,s,e.symbolSize,l,_,r.posMatrix,i,u,m,o?e=>o.getAtTileOffset(r,e.x,e.y):e=>0);}}}(a,t,o,i,o.layout.get("text-rotation-alignment"),o.layout.get("text-pitch-alignment"),r),0!==o.paint.get("icon-opacity").constantOr(1)&&Si(t,i,o,a,!1,o.paint.get("icon-translate"),o.paint.get("icon-translate-anchor"),o.layout.get("icon-rotation-alignment"),o.layout.get("icon-pitch-alignment"),o.layout.get("icon-keep-upright"),n,s),0!==o.paint.get("text-opacity").constantOr(1)&&Si(t,i,o,a,!0,o.paint.get("text-translate"),o.paint.get("text-translate-anchor"),o.layout.get("text-rotation-alignment"),o.layout.get("text-pitch-alignment"),o.layout.get("text-keep-upright"),n,s),i.map.showCollisionBoxes&&(bi(t,i,o,a,o.paint.get("text-translate"),o.paint.get("text-translate-anchor"),!0),bi(t,i,o,a,o.paint.get("icon-translate"),o.paint.get("icon-translate-anchor"),!1));},circle:function(t,i,o,a){if("translucent"!==t.renderPass)return;const r=o.paint.get("circle-opacity"),n=o.paint.get("circle-stroke-width"),s=o.paint.get("circle-stroke-opacity"),l=void 0!==o.layout.get("circle-sort-key").constantOr(1);if(0===r.constantOr(1)&&(0===n.constantOr(1)||0===s.constantOr(1)))return;const c=t.context,h=c.gl,u=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),d=e.StencilMode.disabled,_=t.colorModeForRenderPass(),m=[];for(let r=0;re.sortKey-t.sortKey);for(const i of m){const{programConfiguration:a,program:r,layoutVertexBuffer:n,indexBuffer:s,uniformValues:l,tile:m}=i.state,p=i.segments;t.terrain&&t.terrain.setupElevationDraw(m,r,{useDepthForOcclusion:!0}),r.draw(c,h.TRIANGLES,u,d,_,e.CullFaceMode.disabled,l,o.id,n,s,p,o.paint,t.transform.zoom,a);}},heatmap:function(t,i,o,a){if(0!==o.paint.get("heatmap-opacity"))if("offscreen"===t.renderPass){const r=t.context,n=r.gl,s=e.StencilMode.disabled,l=new e.ColorMode([n.ONE,n.ONE],e.Color.transparent,[!0,!0,!0,!0]);!function(e,t,i){const o=e.gl;e.activeTexture.set(o.TEXTURE1),e.viewport.set([0,0,t.width/4,t.height/4]);let a=i.heatmapFbo;if(a)o.bindTexture(o.TEXTURE_2D,a.colorAttachment.get()),e.bindFramebuffer.set(a.framebuffer);else {const r=o.createTexture();o.bindTexture(o.TEXTURE_2D,r),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR),a=i.heatmapFbo=e.createFramebuffer(t.width/4,t.height/4,!1),function(e,t,i,o){const a=e.gl;a.texImage2D(a.TEXTURE_2D,0,a.RGBA,t.width/4,t.height/4,0,a.RGBA,e.extRenderToTextureHalfFloat?e.extTextureHalfFloat.HALF_FLOAT_OES:a.UNSIGNED_BYTE,null),o.colorAttachment.set(i);}(e,t,r,a);}}(r,t,o),r.clear({color:e.Color.transparent});for(let c=0;c{const r=e.create();e.ortho(r,0,t.width,t.height,0,0,1);const n=t.context.gl;return {u_matrix:r,u_world:[n.drawingBufferWidth,n.drawingBufferHeight],u_image:0,u_color_ramp:1,u_opacity:i.paint.get("heatmap-opacity")}})(t,i),i.id,t.viewportBuffer,t.quadTriangleIndexBuffer,t.viewportSegments,i.paint,t.transform.zoom);}(t,o));},line:function(t,i,o,a){if("translucent"!==t.renderPass)return;const r=o.paint.get("line-opacity"),n=o.paint.get("line-width");if(0===r.constantOr(1)||0===n.constantOr(1))return;const s=t.depthModeForSublayer(0,e.DepthMode.ReadOnly),l=t.colorModeForRenderPass(),c=o.paint.get("line-dasharray"),h=o.paint.get("line-pattern"),u=h.constantOr(1),d=o.paint.get("line-gradient"),_=o.getCrossfadeParameters(),m=u?"linePattern":c?"lineSDF":d?"lineGradient":"line",p=t.context,f=p.gl;let g=!0;for(const r of a){const a=i.getTile(r);if(u&&!a.patternsLoaded())continue;const n=a.getBucket(o);if(!n)continue;t.prepareDrawTile(r);const v=n.programConfigurations.get(o.id),x=t.context.program.get(),y=t.useProgram(m,v),b=g||y.program!==x,w=h.constantOr(null);if(w&&a.imageAtlas){const e=a.imageAtlas,t=e.patternPositions[w.to.toString()],i=e.patternPositions[w.from.toString()];t&&i&&v.setConstantPatternPositions(t,i);}const T=t.terrain?r.posMatrix:null,E=u?li(t,a,o,_,T):c?ci(t,a,o,c,_,T):d?si(t,a,o,T,n.lineClipsArray.length):ni(t,a,o,T);if(u)p.activeTexture.set(f.TEXTURE0),a.imageAtlasTexture.bind(f.LINEAR,f.CLAMP_TO_EDGE),v.updatePaintBuffers(_);else if(c&&(b||t.lineAtlas.dirty))p.activeTexture.set(f.TEXTURE0),t.lineAtlas.bind(p);else if(d){const a=n.gradients[o.id];let s=a.texture;if(o.gradientVersion!==a.version){let l=256;if(o.stepInterpolant){const o=i.getSource().maxzoom,a=r.canonical.z===o?Math.ceil(1<({u_matrix:e,u_sun_direction:t,u_cubemap:0,u_opacity:o,u_temporal_offset:a}))(l.skyboxMatrix,i.getCenter(t,!1),0,a,r);c.draw(n,s.TRIANGLES,o,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.backCW,h,"skybox",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}(t,o,s,a,l):"gradient"===n&&"sky"===t.renderPass&&function(t,i,o,a,r){const n=t.context,s=n.gl,l=t.transform,c=t.useProgram("skyboxGradient");i.skyboxGeometry||(i.skyboxGeometry=new qi(n)),n.activeTexture.set(s.TEXTURE0);let h=i.colorRampTexture;h||(h=i.colorRampTexture=new e.Texture(n,i.colorRamp,s.RGBA)),h.bind(s.LINEAR,s.CLAMP_TO_EDGE);const u=((t,i,o,a,r)=>({u_matrix:t,u_color_ramp:0,u_center_direction:i,u_radius:e.degToRad(o),u_opacity:a,u_temporal_offset:r}))(l.skyboxMatrix,i.getCenter(t,!1),i.paint.get("sky-gradient-radius"),a,r);c.draw(n,s.TRIANGLES,o,e.StencilMode.disabled,t.colorModeForRenderPass(),e.CullFaceMode.backCW,u,"skyboxGradient",i.skyboxGeometry.vertexBuffer,i.skyboxGeometry.indexBuffer,i.skyboxGeometry.segment);}(t,o,s,a,l);},debug:function(e,t,i){for(let o=0;o256&&this.clearStencil(),a.setColorMode(e.ColorMode.disabled),a.setDepthMode(e.DepthMode.disabled);const n=this.useProgram("clippingMask");this._tileClippingMaskIDs={};for(const t of o){const i=this._tileClippingMaskIDs[t.key]=this.nextStencilID++;n.draw(a,r.TRIANGLES,e.DepthMode.disabled,new e.StencilMode({func:r.ALWAYS,mask:0},i,255,r.KEEP,r.KEEP,r.REPLACE),e.ColorMode.disabled,e.CullFaceMode.disabled,Nt(t.posMatrix),"$clipping",this.tileExtentBuffer,this.quadTriangleIndexBuffer,this.tileExtentSegments);}}stencilModeFor3D(){this.currentStencilSource=void 0,this.nextStencilID+1>256&&this.clearStencil();const t=this.nextStencilID++,i=this.context.gl;return new e.StencilMode({func:i.NOTEQUAL,mask:255},t,255,i.KEEP,i.KEEP,i.REPLACE)}stencilModeForClipping(t){if(this.terrain)return this.terrain.stencilModeForRTTOverlap(t);const i=this.context.gl;return new e.StencilMode({func:i.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,i.KEEP,i.KEEP,i.REPLACE)}stencilConfigForOverlap(t){const i=this.context.gl,o=t.sort((e,t)=>t.overscaledZ-e.overscaledZ),a=o[o.length-1].overscaledZ,r=o[0].overscaledZ-a+1;if(r>1){this.currentStencilSource=void 0,this.nextStencilID+r>256&&this.clearStencil();const t={};for(let o=0;o=0;this.currentLayer--){const e=this.style._layers[o[this.currentLayer]],i=t._getLayerSourceCache(e);if(this.terrain&&this.terrain.renderLayer(e,i)||e.isSky())continue;const a=i?n[i.id]:void 0;this._renderTileClippingMasks(e,i,a),this.renderLayer(this,i,e,a);}if(this.renderPass="sky",this.transform.isHorizonVisible())for(this.currentLayer=0;this.currentLayer{const o=t._getLayerSourceCache(e);o&&!e.isHidden(this.transform.zoom)&&(!i||i.getSource().maxzoom0?t.pop():null}isPatternMissing(e){if(!e)return !1;if(!e.from||!e.to)return !0;const t=this.imageManager.getPattern(e.from.toString()),i=this.imageManager.getPattern(e.to.toString());return !t||!i}currentGlobalDefines(){const e=this.terrain&&this.terrain.renderingToTexture,t=[];return this.terrain&&!this.terrain.renderingToTexture&&t.push("TERRAIN"),e&&t.push("RENDER_TO_TEXTURE"),this._showOverdrawInspector&&t.push("OVERDRAW_INSPECTOR"),t}useProgram(e,t,i){this.cache=this.cache||{};const o=i||[],a=this.currentGlobalDefines().concat(o),r=Wt.cacheKey(e,a,t);return this.cache[r]||(this.cache[r]=new Wt(this.context,e,Pt[e],t,xi[e],a)),this.cache[r]}setCustomLayerDefaults(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault();}setBaseState(){const e=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(e.FUNC_ADD);}initDebugOverlayCanvas(){null==this.debugOverlayCanvas&&(this.debugOverlayCanvas=e.window.document.createElement("canvas"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512,this.debugOverlayTexture=new e.Texture(this.context,this.debugOverlayCanvas,this.context.gl.RGBA));}destroy(){this._terrain&&this._terrain.destroy(),this.emptyTexture.destroy(),this.debugOverlayTexture&&this.debugOverlayTexture.destroy();}prepareDrawTile(e){this.terrain&&this.terrain.prepareDrawTile(e);}setTileLoadedFlag(e){this.tileLoaded=e;}saveCanvasCopy(){this.frameCopies.push(this.canvasCopy()),this.tileLoaded=!1;}canvasCopy(){const e=this.context.gl,t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.copyTexImage2D(e.TEXTURE_2D,0,e.RGBA,0,0,e.drawingBufferWidth,e.drawingBufferHeight,0),t}getCanvasCopiesAndTimestamps(){return {canvasCopies:this.frameCopies,timeStamps:this.loadTimeStamps}}}class Wi{constructor(e=0,t=0,i=0,o=0){if(isNaN(e)||e<0||isNaN(t)||t<0||isNaN(i)||i<0||isNaN(o)||o<0)throw new Error("Invalid value for edge-insets, top, bottom, left and right must all be numbers");this.top=e,this.bottom=t,this.left=i,this.right=o;}interpolate(t,i,o){return null!=i.top&&null!=t.top&&(this.top=e.number(t.top,i.top,o)),null!=i.bottom&&null!=t.bottom&&(this.bottom=e.number(t.bottom,i.bottom,o)),null!=i.left&&null!=t.left&&(this.left=e.number(t.left,i.left,o)),null!=i.right&&null!=t.right&&(this.right=e.number(t.right,i.right,o)),this}getCenter(t,i){const o=e.clamp((this.left+t-this.right)/2,0,t),a=e.clamp((this.top+i-this.bottom)/2,0,i);return new e.Point(o,a)}equals(e){return this.top===e.top&&this.bottom===e.bottom&&this.left===e.left&&this.right===e.right}clone(){return new Wi(this.top,this.bottom,this.left,this.right)}toJSON(){return {top:this.top,bottom:this.bottom,left:this.left,right:this.right}}}function Xi(e,t){return [e[4*t],e[4*t+1],e[4*t+2],e[4*t+3]]}function Hi(e,t,i){e[4*t+0]=i[0],e[4*t+1]=i[1],e[4*t+2]=i[2],e[4*t+3]=i[3];}function Ki(t,i){const o=Xi(t,3);e.fromQuat(t,i),Hi(t,3,o);}function Yi(e,t){Hi(e,3,[t[0],t[1],t[2],1]);}function Ji(t,i){const o=e.identity$1([]);return e.rotateZ$1(o,o,-i),e.rotateX$1(o,o,-t),o}function Qi(t,i){const o=[t[0],t[1],0],a=[i[0],i[1],0];if(e.length(o)>=1e-15){const t=e.normalize([],o);e.scale$2(a,t,e.dot(a,t)),i[0]=a[0],i[1]=a[1];}const r=e.cross([],i,t);if(e.len(r)<1e-15)return null;const n=Math.atan2(-r[1],r[0]);return Ji(Math.atan2(Math.sqrt(t[0]*t[0]+t[1]*t[1]),-t[2]),n)}class eo{constructor(e,t){this.position=e,this.orientation=t;}get position(){return this._position}set position(t){this._position=this._renderWorldCopies?function(t){if(!t)return;const i=Array.isArray(t)?new e.MercatorCoordinate(t[0],t[1],t[2]):t;return i.x=e.wrap(i.x,0,1),i}(t):t;}lookAtPoint(t,i){if(this.orientation=null,!this.position)return;const o=this._elevation?this._elevation.getAtPoint(e.MercatorCoordinate.fromLngLat(t)):0,a=this.position,r=e.MercatorCoordinate.fromLngLat(t,o),n=[r.x-a.x,r.y-a.y,r.z-a.z];i||(i=[0,0,1]),i[2]=Math.abs(i[2]),this.orientation=Qi(n,i);}setPitchBearing(t,i){this.orientation=Ji(e.degToRad(t),e.degToRad(-i));}}class to{constructor(t,i){this._transform=e.identity([]),this._orientation=e.identity$1([]),i&&(this._orientation=i,Ki(this._transform,this._orientation)),t&&Yi(this._transform,t);}get mercatorPosition(){const t=this.position;return new e.MercatorCoordinate(t[0],t[1],t[2])}get position(){const e=Xi(this._transform,3);return [e[0],e[1],e[2]]}set position(e){Yi(this._transform,e);}get orientation(){return this._orientation}set orientation(e){this._orientation=e,Ki(this._transform,this._orientation);}getPitchBearing(){const e=this.forward(),t=this.right();return {bearing:Math.atan2(-t[1],t[0]),pitch:Math.atan2(Math.sqrt(e[0]*e[0]+e[1]*e[1]),-e[2])}}setPitchBearing(e,t){this._orientation=Ji(e,t),Ki(this._transform,this._orientation);}forward(){const e=Xi(this._transform,2);return [-e[0],-e[1],-e[2]]}up(){const e=Xi(this._transform,1);return [-e[0],-e[1],-e[2]]}right(){const e=Xi(this._transform,0);return [e[0],e[1],e[2]]}getCameraToWorld(t,i){const o=new Float64Array(16);return e.invert(o,this.getWorldToCamera(t,i)),o}getWorldToCamera(t,i){const o=new Float64Array(16),a=new Float64Array(4),r=this.position;return e.conjugate(a,this._orientation),e.scale$2(r,r,-t),e.fromQuat(o,a),e.translate(o,o,r),o[1]*=-1,o[5]*=-1,o[9]*=-1,o[13]*=-1,o[8]*=i,o[9]*=i,o[10]*=i,o[11]*=i,o}getCameraToClipPerspective(t,i,o,a){const r=new Float64Array(16);return e.perspective(r,t,i,o,a),r}clone(){return new to([...this.position],[...this.orientation])}}class io{constructor(t,i,o,a,r){this.tileSize=512,this.maxValidLatitude=85.051129,this._renderWorldCopies=void 0===r||r,this._minZoom=t||0,this._maxZoom=i||22,this._minPitch=null==o?0:o,this._maxPitch=null==a?60:a,this.setMaxBounds(),this.width=0,this.height=0,this._center=new e.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new Wi,this._posMatrixCache={},this._alignedPosMatrixCache={},this._camera=new to,this._centerAltitude=0,this.cameraElevationReference="ground";}clone(){const e=new io(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return e._elevation=this._elevation,e._centerAltitude=this._centerAltitude,e.tileSize=this.tileSize,e.latRange=this.latRange,e.width=this.width,e.height=this.height,e.cameraElevationReference=this.cameraElevationReference,e._center=this._center,e._setZoom(this.zoom),e._cameraZoom=this._cameraZoom,e.angle=this.angle,e._fov=this._fov,e._pitch=this._pitch,e._unmodified=this._unmodified,e._edgeInsets=this._edgeInsets.clone(),e._camera=this._camera.clone(),e._calcMatrices(),e.freezeTileCoverage=this.freezeTileCoverage,e}get elevation(){return this._elevation}set elevation(e){this._elevation!==e&&(this._elevation=e,e?this._updateCenterElevation()&&this._updateCameraOnTerrain():(this._cameraZoom=null,this._centerAltitude=0),this._calcMatrices());}updateElevation(e){this._terrainEnabled()&&null==this._cameraZoom&&this._updateCenterElevation()&&this._updateCameraOnTerrain(),e&&this._constrainCameraAltitude(),this._calcMatrices();}get minZoom(){return this._minZoom}set minZoom(e){this._minZoom!==e&&(this._minZoom=e,this.zoom=Math.max(this.zoom,e));}get maxZoom(){return this._maxZoom}set maxZoom(e){this._maxZoom!==e&&(this._maxZoom=e,this.zoom=Math.min(this.zoom,e));}get minPitch(){return this._minPitch}set minPitch(e){this._minPitch!==e&&(this._minPitch=e,this.pitch=Math.max(this.pitch,e));}get maxPitch(){return this._maxPitch}set maxPitch(e){this._maxPitch!==e&&(this._maxPitch=e,this.pitch=Math.min(this.pitch,e));}get renderWorldCopies(){return this._renderWorldCopies}set renderWorldCopies(e){void 0===e?e=!0:null===e&&(e=!1),this._renderWorldCopies=e;}get worldSize(){return this.tileSize*this.scale}get centerOffset(){return this.centerPoint._sub(this.size._div(2))}get size(){return new e.Point(this.width,this.height)}get bearing(){return -this.angle/Math.PI*180}set bearing(t){const i=-e.wrap(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=e.create$2(),e.rotate(this.rotationMatrix,this.rotationMatrix,this.angle));}get pitch(){return this._pitch/Math.PI*180}set pitch(t){const i=e.clamp(t,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices());}get fov(){return this._fov/Math.PI*180}set fov(e){e=Math.max(.01,Math.min(60,e)),this._fov!==e&&(this._unmodified=!1,this._fov=e/180*Math.PI,this._calcMatrices());}get zoom(){return this._zoom}set zoom(e){const t=Math.min(Math.max(e,this.minZoom),this.maxZoom);this._zoom!==t&&(this._unmodified=!1,this._setZoom(t),this._terrainEnabled()&&this._updateCameraOnTerrain(),this._constrain(),this._calcMatrices());}_setZoom(e){this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom;}_updateCenterElevation(){if(!this._elevation)return !1;const t=this._elevation.getAtPoint(e.MercatorCoordinate.fromLngLat(this.center),-1);return -1===t?(this._cameraZoom=null,!1):(this._centerAltitude=t,!0)}_updateCameraOnTerrain(){const t=this.cameraToCenterDistance/this.worldSize,i=e.mercatorZfromAltitude(this._centerAltitude,this.center.lat);this._cameraZoom=this._zoomFromMercatorZ(i+t);}get center(){return this._center}set center(e){e.lat===this._center.lat&&e.lng===this._center.lng||(this._unmodified=!1,this._center=e,this._terrainEnabled()&&("ground"===this.cameraElevationReference?this._updateCenterElevation()?this._updateCameraOnTerrain():this._cameraZoom=null:this._updateZoomFromElevation()),this._constrain(),this._calcMatrices());}_updateZoomFromElevation(){if(null==this._cameraZoom||!this._elevation)return;const t=this._cameraZoom,i=this._elevation.getAtPoint(e.MercatorCoordinate.fromLngLat(this.center)),o=e.mercatorZfromAltitude(i,this.center.lat),a=this._mercatorZfromZoom(t),r=this._mercatorZfromZoom(this._maxZoom),n=Math.max(a-o,r);this._setZoom(this._zoomFromMercatorZ(n));}get padding(){return this._edgeInsets.toJSON()}set padding(e){this._edgeInsets.equals(e)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,e,1),this._calcMatrices());}computeZoomRelativeTo(t){const i=this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint,t.toAltitude()));let o;o=t.zt.maxzoom&&(i=t.maxzoom);const r=e.MercatorCoordinate.fromLngLat(this.center),n=1<({aabb:new e.Aabb([t*n,0,-p],[(t+1)*n,n,p]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}),g=[],v=[],x=i,y=t.reparseOverscaled?o:i,b=(e,t)=>{if(!this._elevation)return;const i=this._elevation.getMinMaxForTile(t);i&&(e.min[2]=i.min,e.max[2]=i.max,e.center[2]=(e.min[2]+e.max[2])/2);},w=e=>e*e,T=w((u-this._centerAltitude)*h),E=(e,t)=>{if(t*w(.707)0;){const o=g.pop(),r=o.x,n=o.y;let c=o.fullyVisible;if(!c){const e=o.aabb.intersects(l);if(0===e)continue;c=2===e;}let u=!0;if(m<=o.zoom&&o.zoom>1),l=o.aabb.quadrant(t);let h=null;a&&o.zoom>x-6&&(h=new e.OverscaledTileID(o.zoom+1===x?y:o.zoom+1,o.wrap,o.zoom+1,i,s),b(l,h)),g.push({aabb:l,zoom:o.zoom+1,x:i,y:s,wrap:o.wrap,fullyVisible:c,tileID:h});}else {const a=o.zoom===x?y:o.zoom;if(t.minzoom&&t.minzoom>a)continue;const l=s[0]-(.5+r+(o.wrap<e.distanceSq-t.distanceSq).map(e=>e.tileID)}resize(e,t){this.width=e,this.height=t,this.pixelsToGLUnits=[2/e,-2/t],this._constrain(),this._calcMatrices();}get unmodified(){return this._unmodified}zoomScale(e){return Math.pow(2,e)}scaleZoom(e){return Math.log(e)/Math.LN2}project(t){const i=e.clamp(t.lat,-this.maxValidLatitude,this.maxValidLatitude);return new e.Point(e.mercatorXfromLng(t.lng)*this.worldSize,e.mercatorYfromLat(i)*this.worldSize)}unproject(t){return new e.MercatorCoordinate(t.x/this.worldSize,t.y/this.worldSize).toLngLat()}get point(){return this.project(this.center)}setLocationAtPoint(t,i){const o=this.pointCoordinate(i),a=this.pointCoordinate(this.centerPoint),r=this.locationCoordinate(t),n=new e.MercatorCoordinate(r.x-(o.x-a.x),r.y-(o.y-a.y));this.center=this.coordinateLocation(n),this._renderWorldCopies&&(this.center=this.center.wrap());}setLocation(e){this.center=this.coordinateLocation(e),this._renderWorldCopies&&(this.center=this.center.wrap());}locationPoint(e){return this._coordinatePoint(this.locationCoordinate(e),!1)}locationPoint3D(e){return this._coordinatePoint(this.locationCoordinate(e),!0)}pointLocation(e){return this.coordinateLocation(this.pointCoordinate(e))}pointLocation3D(e){return this.coordinateLocation(this.pointCoordinate3D(e))}locationCoordinate(t){return e.MercatorCoordinate.fromLngLat(t)}coordinateLocation(e){return e.toLngLat()}pointRayIntersection(t,i){const o=null!=i?i:this._centerAltitude,a=[t.x,t.y,0,1],r=[t.x,t.y,1,1];e.transformMat4(a,a,this.pixelMatrixInverse),e.transformMat4(r,r,this.pixelMatrixInverse);const n=r[3];e.scale$1(a,a,1/a[3]),e.scale$1(r,r,1/n);const s=a[2],l=r[2];return {p0:a,p1:r,t:s===l?0:(o-s)/(l-s)}}screenPointToMercatorRay(t){const i=[t.x,t.y,0,1],o=[t.x,t.y,1,1];return e.transformMat4(i,i,this.pixelMatrixInverse),e.transformMat4(o,o,this.pixelMatrixInverse),e.scale$1(i,i,1/i[3]),e.scale$1(o,o,1/o[3]),i[2]=e.mercatorZfromAltitude(i[2],this._center.lat)*this.worldSize,o[2]=e.mercatorZfromAltitude(o[2],this._center.lat)*this.worldSize,e.scale$1(i,i,1/this.worldSize),e.scale$1(o,o,1/this.worldSize),new e.Ray([i[0],i[1],i[2]],e.normalize([],e.sub([],o,i)))}rayIntersectionCoordinate(t){const{p0:i,p1:o,t:a}=t,r=e.mercatorZfromAltitude(i[2],this._center.lat),n=e.mercatorZfromAltitude(o[2],this._center.lat);return new e.MercatorCoordinate(e.number(i[0],o[0],a)/this.worldSize,e.number(i[1],o[1],a)/this.worldSize,e.number(r,n,a))}pointCoordinate(t){const i=this.horizonLineFromTop(),o=i>t.y?new e.Point(t.x,i):t;return this.rayIntersectionCoordinate(this.pointRayIntersection(o))}pointCoordinate3D(t){if(!this.elevation)return this.pointCoordinate(t);const i=this.elevation;let o=this.elevation.pointCoordinate(t);if(o)return new e.MercatorCoordinate(o[0],o[1],o[2]);let a=0,r=this.horizonLineFromTop();if(t.y>r)return this.pointCoordinate(t);const n=.02*r,s=t.clone();for(let t=0;t<10&&r-a>n;t++){s.y=e.number(a,r,.66);const t=i.pointCoordinate(s);t?(r=s.y,o=t):a=s.y;}return o?new e.MercatorCoordinate(o[0],o[1],o[2]):this.pointCoordinate(t)}isPointAboveHorizon(e){if(this.elevation)return !this.elevation.pointCoordinate(e);{const t=this.horizonLineFromTop();return e.y0?new e.Point(a[0]/a[3],a[1]/a[3]):new e.Point(Number.MAX_VALUE,Number.MAX_VALUE)}getBounds(){return this._terrainEnabled()?this._getBounds3D():(new e.LngLatBounds).extend(this.pointLocation(new e.Point(0,0))).extend(this.pointLocation(new e.Point(this.width,0))).extend(this.pointLocation(new e.Point(this.width,this.height))).extend(this.pointLocation(new e.Point(0,this.height)))}_getBounds3D(){const t=this.elevation,i=t.visibleDemTiles.reduce((e,t)=>{if(t.dem){const i=t.dem.tree;e.min=Math.min(e.min,i.minimums[0]),e.max=Math.max(e.max,i.maximums[0]);}return e},{min:Number.MAX_VALUE,max:0});i.min*=t.exaggeration(),i.max*=t.exaggeration();const o=this.horizonLineFromTop();return [new e.Point(0,o),new e.Point(this.width,o),new e.Point(this.width,this.height),new e.Point(0,this.height)].reduce((e,t)=>e.extend(this.coordinateLocation(this.rayIntersectionCoordinate(this.pointRayIntersection(t,i.min)))).extend(this.coordinateLocation(this.rayIntersectionCoordinate(this.pointRayIntersection(t,i.max)))),new e.LngLatBounds)}horizonLineFromTop(){const e=this.height/2/Math.tan(this._fov/2)/Math.tan(Math.max(this._pitch,.1))+this.centerOffset.y;return Math.max(0,this.height/2-.97*e)}getMaxBounds(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new e.LngLatBounds([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null}setMaxBounds(e){e?(this.lngRange=[e.getWest(),e.getEast()],this.latRange=[e.getSouth(),e.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-this.maxValidLatitude,this.maxValidLatitude]);}calculatePosMatrix(t,i=!1){const o=t.key,a=i?this._alignedPosMatrixCache:this._posMatrixCache;if(a[o])return a[o];const r=t.canonical,n=this.worldSize/this.zoomScale(r.z),s=r.x+Math.pow(2,r.z)*t.wrap,l=e.identity(new Float64Array(16));return e.translate(l,l,[s*n,r.y*n,0]),e.scale(l,l,[n/e.EXTENT,n/e.EXTENT,1]),e.multiply(l,i?this.alignedProjMatrix:this.projMatrix,l),a[o]=new Float32Array(l),a[o]}customLayerMatrix(){return this.mercatorMatrix.slice()}recenterOnTerrain(){if(!this._elevation)return;const t=this._elevation;this._updateCameraState();const i=this._camera.position,o=this._camera.forward();if(i.z<=0||o[2]>=0)return;const a=e.mercatorZfromAltitude(1,this._center.lat);i[2]/=a,o[2]/=a,e.normalize(o,o);const r=t.raycast(i,o,t.exaggeration());if(r){const t=e.scaleAndAdd([],i,o,r),a=new e.MercatorCoordinate(t[0],t[1],e.mercatorZfromAltitude(t[2],e.latFromMercatorY(t[1]))),n=this._camera.position,s=a.z+e.length([a.x-n[0],a.y-n[1],a.z-n[2]]);this._cameraZoom=this._zoomFromMercatorZ(s),this._centerAltitude=a.toAltitude(),this._center=a.toLngLat(),this._updateZoomFromElevation(),this._constrain(),this._calcMatrices();}}_constrainCameraAltitude(){if(!this._elevation)return;const t=this._elevation;this._updateCameraState();const i=t.getAtPoint(this._camera.mercatorPosition),o=this._minimumHeightOverTerrain()*Math.cos(e.degToRad(this._maxPitch)),a=e.mercatorZfromAltitude(i,this._center.lat),r=this._camera.position[2]-a;if(rn&&(a=n-t);}if(this.lngRange){const e=u.x,t=c.x/2;e-tl&&(o=l-t);}void 0===o&&void 0===a||(this.center=this.unproject(new e.Point(void 0!==o?o:u.x,void 0!==a?a:u.y))),this._constrainCameraAltitude(),this._unmodified=h,this._constraining=!1;}_minZoomForBounds(){const t=(e,t)=>Math.log2(e/(this.tileSize*Math.abs(t[1]-t[0])));let i=0;if(this.latRange){const o=this.latRange;i=t(this.height,[e.mercatorYfromLat(o[0]),e.mercatorYfromLat(o[1])]);}let o=0;if(this.lngRange){const i=this.lngRange;o=t(this.width,[e.mercatorXfromLng(i[0]),e.mercatorXfromLng(i[1])]);}return Math.max(i,o)}_maxCameraBoundsDistance(){return this._mercatorZfromZoom(this._minZoomForBounds())}_calcMatrices(){if(!this.height)return;const t=this.centerOffset;this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;const i=e.mercatorZfromAltitude(1,this.center.lat)*this.worldSize;this._updateCameraState();const o=Math.PI/2+this._pitch,a=this.fovAboveCenter,r=this._camera.position[2]*this.worldSize/Math.cos(this._pitch),n=Math.sin(a)*r/Math.sin(e.clamp(Math.PI-o-a,.01,Math.PI-.01)),s=this.point,l=s.x,c=s.y,h=1.01*(Math.cos(Math.PI/2-this._pitch)*n+r),u=this.height/50,d=this._camera.getWorldToCamera(this.worldSize,i),_=this._camera.getCameraToClipPerspective(this._fov,this.width/this.height,u,h);_[8]=2*-t.x/this.width,_[9]=2*t.y/this.height;let m=e.mul([],_,d);this.mercatorMatrix=e.scale([],m,[this.worldSize,this.worldSize,this.worldSize/i]),this.projMatrix=m,this.invProjMatrix=e.invert(new Float64Array(16),this.projMatrix);const p=new Float32Array(16);e.identity(p),e.scale(p,p,[1,-1,1]),e.rotateX(p,p,this._pitch),e.rotateZ(p,p,this.angle);const f=e.perspective(new Float32Array(16),this._fov,this.width/this.height,u,h);this.skyboxMatrix=e.multiply(p,f,p);const g=this.width%2/2,v=this.height%2/2,x=Math.cos(this.angle),y=Math.sin(this.angle),b=l-Math.round(l)+x*g+y*v,w=c-Math.round(c)+x*v+y*g,T=new Float64Array(m);if(e.translate(T,T,[b>.5?b-1:b,w>.5?w-1:w,0]),this.alignedProjMatrix=T,m=e.create(),e.scale(m,m,[this.width/2,-this.height/2,1]),e.translate(m,m,[1,-1,0]),this.labelPlaneMatrix=m,m=e.create(),e.scale(m,m,[1,-1,1]),e.translate(m,m,[-1,-1,0]),e.scale(m,m,[2/this.width,2/this.height,1]),this.glCoordMatrix=m,this.pixelMatrix=e.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),m=e.invert(new Float64Array(16),this.pixelMatrix),!m)throw new Error("failed to invert matrix");this.pixelMatrixInverse=m,this._posMatrixCache={},this._alignedPosMatrixCache={};}_updateCameraState(){if(!this.height)return;this._camera.setPitchBearing(this._pitch,this.angle);const t=this._camera.forward(),i=this.cameraToCenterDistance,o=this.point,a=this._mercatorZfromZoom(this._cameraZoom?this._cameraZoom:this._zoom)-e.mercatorZfromAltitude(this._centerAltitude,this.center.lat),r=this.cameraToCenterDistance/a;this._camera.position=[o.x/this.worldSize-t[0]*i/r,o.y/this.worldSize-t[1]*i/r,e.mercatorZfromAltitude(this._centerAltitude,this._center.lat)+-t[2]*i/r];}_translateCameraConstrained(t){const i=this._maxCameraBoundsDistance()*Math.cos(this._pitch),o=t[2];let a=1;o>0&&(a=Math.min((i-this._camera.position[2])/o,1)),this._camera.position=e.scaleAndAdd([],this._camera.position,t,a),this._updateStateFromCamera();}_updateStateFromCamera(){const t=this._camera.position,i=this._camera.forward(),{pitch:o,bearing:a}=this._camera.getPitchBearing(),r=e.mercatorZfromAltitude(this._centerAltitude,this.center.lat),n=this._mercatorZfromZoom(this._maxZoom)*Math.cos(e.degToRad(this._maxPitch)),s=Math.max((t[2]-r)/Math.cos(o),n),l=this._zoomFromMercatorZ(s);e.scaleAndAdd(t,t,i,s),this._pitch=e.clamp(o,e.degToRad(this.minPitch),e.degToRad(this.maxPitch)),this.angle=e.wrap(a,-Math.PI,Math.PI),this._setZoom(e.clamp(l,this._minZoom,this._maxZoom)),this._terrainEnabled()&&this._updateCameraOnTerrain(),this._center=new e.MercatorCoordinate(t[0],t[1],t[2]).toLngLat(),this._unmodified=!1,this._constrain(),this._calcMatrices();}_worldSizeFromZoom(e){return Math.pow(2,e)*this.tileSize}_mercatorZfromZoom(e){return this.cameraToCenterDistance/this._worldSizeFromZoom(e)}_minimumHeightOverTerrain(){const e=Math.min((null!=this._cameraZoom?this._cameraZoom:this._zoom)+2,this._maxZoom);return this._mercatorZfromZoom(e)}_zoomFromMercatorZ(e){return this.scaleZoom(this.cameraToCenterDistance/(e*this.tileSize))}_terrainEnabled(){return !!this._elevation}isHorizonVisibleForPoints(t,i){const o=Math.min(t.x,i.x),a=Math.max(t.x,i.x),r=Math.min(t.y,i.y),n=Math.max(t.y,i.y),s=[new e.Point(o,r),new e.Point(a,n),new e.Point(o,n),new e.Point(a,r)],l=this._renderWorldCopies?-3:0,c=this._renderWorldCopies?4:1;for(const e of s){const t=this.pointRayIntersection(e);if(t.t<0)return !0;const i=this.rayIntersectionCoordinate(t);if(i.xc||i.y>1)return !0}return !1}isHorizonVisible(){return this.pitch+e.radToDeg(this.fovAboveCenter)>88||this.isHorizonVisibleForPoints(new e.Point(0,0),new e.Point(this.width,this.height))}zoomDeltaToMovement(t,i){const o=e.length(e.sub([],this._camera.position,t)),a=this._zoomFromMercatorZ(o)+i;return o-this._mercatorZfromZoom(a)}getCameraPoint(){const t=Math.tan(this._pitch)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new e.Point(0,t))}}class oo{constructor(t){this._hashName=t&&encodeURIComponent(t),e.bindAll(["_getCurrentHash","_onHashChange","_updateHash"],this),this._updateHash=function(e,t){let i=!1,o=null;const a=()=>{o=null,i&&(e(),o=setTimeout(a,300),i=!1);};return ()=>(i=!0,o||a(),o)}(this._updateHashUnthrottled.bind(this));}addTo(t){return this._map=t,e.window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this}remove(){return e.window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),clearTimeout(this._updateHash()),delete this._map,this}getHashString(t){const i=this._map.getCenter(),o=Math.round(100*this._map.getZoom())/100,a=Math.ceil((o*Math.LN2+Math.log(512/360/.5))/Math.LN10),r=Math.pow(10,a),n=Math.round(i.lng*r)/r,s=Math.round(i.lat*r)/r,l=this._map.getBearing(),c=this._map.getPitch();let h="";if(h+=t?`/${n}/${s}/${o}`:`${o}/${s}/${n}`,(l||c)&&(h+=`/${Math.round(10*l)/10}`),c&&(h+=`/${Math.round(c)}`),this._hashName){const t=this._hashName;let i=!1;const o=e.window.location.hash.slice(1).split("&").map(e=>{const o=e.split("=")[0];return o===t?(i=!0,`${o}=${h}`):e}).filter(e=>e);return i||o.push(`${t}=${h}`),`#${o.join("&")}`}return `#${h}`}_getCurrentHash(){const t=e.window.location.hash.replace("#","");if(this._hashName){let e;return t.split("&").map(e=>e.split("=")).forEach(t=>{t[0]===this._hashName&&(e=t);}),(e&&e[1]||"").split("/")}return t.split("/")}_onHashChange(){const e=this._getCurrentHash();if(e.length>=3&&!e.some(e=>isNaN(e))){const t=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(e[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+e[2],+e[1]],zoom:+e[0],bearing:t,pitch:+(e[4]||0)}),!0}return !1}_updateHashUnthrottled(){const t=e.window.location.href.replace(/(#.+)?$/,this.getHashString());try{e.window.history.replaceState(e.window.history.state,null,t);}catch(e){}}}const ao={linearity:.3,easing:e.bezier(0,0,.3,1)},ro=e.extend({deceleration:2500,maxSpeed:1400},ao),no=e.extend({deceleration:20,maxSpeed:1400},ao),so=e.extend({deceleration:1e3,maxSpeed:360},ao),lo=e.extend({deceleration:1e3,maxSpeed:90},ao);class co{constructor(e){this._map=e,this.clear();}clear(){this._inertiaBuffer=[];}record(t){this._drainInertiaBuffer(),this._inertiaBuffer.push({time:e.browser.now(),settings:t});}_drainInertiaBuffer(){const t=this._inertiaBuffer,i=e.browser.now();for(;t.length>0&&i-t[0].time>160;)t.shift();}_onMoveEnd(t){if(this._drainInertiaBuffer(),this._inertiaBuffer.length<2)return;const i={zoom:0,bearing:0,pitch:0,pan:new e.Point(0,0),pinchAround:void 0,around:void 0};for(const{settings:e}of this._inertiaBuffer)i.zoom+=e.zoomDelta||0,i.bearing+=e.bearingDelta||0,i.pitch+=e.pitchDelta||0,e.panDelta&&i.pan._add(e.panDelta),e.around&&(i.around=e.around),e.pinchAround&&(i.pinchAround=e.pinchAround);const o=this._inertiaBuffer[this._inertiaBuffer.length-1].time-this._inertiaBuffer[0].time,a={};if(i.pan.mag()){const r=uo(i.pan.mag(),o,e.extend({},ro,t||{}));a.offset=i.pan.mult(r.amount/i.pan.mag()),a.center=this._map.transform.center,ho(a,r);}if(i.zoom){const e=uo(i.zoom,o,no);a.zoom=this._map.transform.zoom+e.amount,ho(a,e);}if(i.bearing){const t=uo(i.bearing,o,so);a.bearing=this._map.transform.bearing+e.clamp(t.amount,-179,179),ho(a,t);}if(i.pitch){const e=uo(i.pitch,o,lo);a.pitch=this._map.transform.pitch+e.amount,ho(a,e);}if(a.zoom||a.bearing){const e=void 0===i.pinchAround?i.around:i.pinchAround;a.around=e?this._map.unproject(e):this._map.getCenter();}return this.clear(),e.extend(a,{noMoveStart:!0})}}function ho(e,t){(!e.duration||e.durationo.unproject(e)),l=n.reduce((e,t,i,o)=>e.add(t.div(o.length)),new e.Point(0,0));super(t,{points:n,point:l,lngLats:s,lngLat:o.unproject(l),originalEvent:a}),this._defaultPrevented=!1;}}class po extends e.Event{preventDefault(){this._defaultPrevented=!0;}get defaultPrevented(){return this._defaultPrevented}constructor(e,t,i){super(e,{originalEvent:i}),this._defaultPrevented=!1;}}class fo{constructor(e,t){this._map=e,this._clickTolerance=t.clickTolerance;}reset(){delete this._mousedownPos;}wheel(e){return this._firePreventable(new po(e.type,this._map,e))}mousedown(e,t){return this._mousedownPos=t,this._firePreventable(new _o(e.type,this._map,e))}mouseup(e){this._map.fire(new _o(e.type,this._map,e));}click(e,t){this._mousedownPos&&this._mousedownPos.dist(t)>=this._clickTolerance||this._map.fire(new _o(e.type,this._map,e));}dblclick(e){return this._firePreventable(new _o(e.type,this._map,e))}mouseover(e){this._map.fire(new _o(e.type,this._map,e));}mouseout(e){this._map.fire(new _o(e.type,this._map,e));}touchstart(e){return this._firePreventable(new mo(e.type,this._map,e))}touchmove(e){this._map.fire(new mo(e.type,this._map,e));}touchend(e){this._map.fire(new mo(e.type,this._map,e));}touchcancel(e){this._map.fire(new mo(e.type,this._map,e));}_firePreventable(e){if(this._map.fire(e),e.defaultPrevented)return {}}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class go{constructor(e){this._map=e;}reset(){this._delayContextMenu=!1,delete this._contextMenuEvent;}mousemove(e){this._map.fire(new _o(e.type,this._map,e));}mousedown(){this._delayContextMenu=!0;}mouseup(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new _o("contextmenu",this._map,this._contextMenuEvent)),delete this._contextMenuEvent);}contextmenu(e){this._delayContextMenu?this._contextMenuEvent=e:this._map.fire(new _o(e.type,this._map,e)),this._map.listens("contextmenu")&&e.preventDefault();}isEnabled(){return !0}isActive(){return !1}enable(){}disable(){}}class vo{constructor(e,t){this._map=e,this._el=e.getCanvasContainer(),this._container=e.getContainer(),this._clickTolerance=t.clickTolerance||1;}isEnabled(){return !!this._enabled}isActive(){return !!this._active}enable(){this.isEnabled()||(this._enabled=!0);}disable(){this.isEnabled()&&(this._enabled=!1);}mousedown(e,t){this.isEnabled()&&e.shiftKey&&0===e.button&&(i.disableDrag(),this._startPos=this._lastPos=t,this._active=!0);}mousemoveWindow(e,t){if(!this._active)return;const o=t;if(this._lastPos.equals(o)||!this._box&&o.dist(this._startPos)e.fitScreenCoordinates(a,r,this._map.getBearing(),{linear:!1})};this._fireEvent("boxzoomcancel",t);}keydown(e){this._active&&27===e.keyCode&&(this.reset(),this._fireEvent("boxzoomcancel",e));}reset(){this._active=!1,this._container.classList.remove("mapboxgl-crosshair"),this._box&&(i.remove(this._box),this._box=null),i.enableDrag(),delete this._startPos,delete this._lastPos;}_fireEvent(t,i){return this._map.fire(new e.Event(t,{originalEvent:i}))}}function xo(e,t){const i={};for(let o=0;othis.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=t.timeStamp),o.length===this.numTouches&&(this.centroid=function(t){const i=new e.Point(0,0);for(const e of t)i._add(e);return i.div(t.length)}(i),this.touches=xo(o,i)));}touchmove(e,t,i){if(this.aborted||!this.centroid)return;const o=xo(i,t);for(const e in this.touches){const t=this.touches[e],i=o[e];(!i||i.dist(t)>30)&&(this.aborted=!0);}}touchend(e,t,i){if((!this.centroid||e.timeStamp-this.startTime>500)&&(this.aborted=!0),0===i.length){const e=!this.aborted&&this.centroid;if(this.reset(),e)return e}}}class bo{constructor(e){this.singleTap=new yo(e),this.numTaps=e.numTaps,this.reset();}reset(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset();}touchstart(e,t,i){this.singleTap.touchstart(e,t,i);}touchmove(e,t,i){this.singleTap.touchmove(e,t,i);}touchend(e,t,i){const o=this.singleTap.touchend(e,t,i);if(o){const t=e.timeStamp-this.lastTime<500,i=!this.lastTap||this.lastTap.dist(o)<30;if(t&&i||this.reset(),this.count++,this.lastTime=e.timeStamp,this.lastTap=o,this.count===this.numTaps)return this.reset(),o}}}class wo{constructor(){this._zoomIn=new bo({numTouches:1,numTaps:2}),this._zoomOut=new bo({numTouches:2,numTaps:1}),this.reset();}reset(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset();}touchstart(e,t,i){this._zoomIn.touchstart(e,t,i),this._zoomOut.touchstart(e,t,i);}touchmove(e,t,i){this._zoomIn.touchmove(e,t,i),this._zoomOut.touchmove(e,t,i);}touchend(e,t,i){const o=this._zoomIn.touchend(e,t,i),a=this._zoomOut.touchend(e,t,i);return o?(this._active=!0,e.preventDefault(),setTimeout(()=>this.reset(),0),{cameraAnimation:t=>t.easeTo({duration:300,zoom:t.getZoom()+1,around:t.unproject(o)},{originalEvent:e})}):a?(this._active=!0,e.preventDefault(),setTimeout(()=>this.reset(),0),{cameraAnimation:t=>t.easeTo({duration:300,zoom:t.getZoom()-1,around:t.unproject(a)},{originalEvent:e})}):void 0}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}const To={0:1,2:2};class Eo{constructor(e){this.reset(),this._clickTolerance=e.clickTolerance||1;}reset(){this._active=!1,this._moved=!1,delete this._lastPoint,delete this._eventButton;}_correctButton(e,t){return !1}_move(e,t){return {}}mousedown(e,t){if(this._lastPoint)return;const o=i.mouseButton(e);this._correctButton(e,o)&&(this._lastPoint=t,this._eventButton=o);}mousemoveWindow(e,t){const i=this._lastPoint;if(i)if(e.preventDefault(),function(e,t){const i=To[t];return void 0===e.buttons||(e.buttons&i)!==i}(e,this._eventButton))this.reset();else if(this._moved||!(t.dist(i)0&&(this._active=!0);const a=xo(o,i),r=new e.Point(0,0),n=new e.Point(0,0);let s=0;for(const e in a){const t=a[e],i=this._touches[e];i&&(r._add(t),n._add(t.sub(i)),s++,a[e]=t);}if(this._touches=a,sMath.abs(e.x)}class Bo extends Mo{reset(){super.reset(),this._valid=void 0,delete this._firstMove,delete this._lastPoints;}_start(e){this._lastPoints=e,ko(e[0].sub(e[1]))&&(this._valid=!1);}_move(e,t,i){const o=e[0].sub(this._lastPoints[0]),a=e[1].sub(this._lastPoints[1]);if(this._valid=this.gestureBeginsVertically(o,a,i.timeStamp),this._valid)return this._lastPoints=e,this._active=!0,{pitchDelta:(o.y+a.y)/2*-.5}}gestureBeginsVertically(e,t,i){if(void 0!==this._valid)return this._valid;const o=e.mag()>=2,a=t.mag()>=2;if(!o&&!a)return;if(!o||!a)return void 0===this._firstMove&&(this._firstMove=i),i-this._firstMove<100&&void 0;const r=e.y>0==t.y>0;return ko(e)&&ko(t)&&r}}const Fo={panStep:100,bearingStep:15,pitchStep:10};class Oo{constructor(){const e=Fo;this._panStep=e.panStep,this._bearingStep=e.bearingStep,this._pitchStep=e.pitchStep,this._rotationDisabled=!1;}reset(){this._active=!1;}keydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=0,i=0,o=0,a=0,r=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?i=-1:(e.preventDefault(),a=-1);break;case 39:e.shiftKey?i=1:(e.preventDefault(),a=1);break;case 38:e.shiftKey?o=1:(e.preventDefault(),r=-1);break;case 40:e.shiftKey?o=-1:(e.preventDefault(),r=1);break;default:return}return this._rotationDisabled&&(i=0,o=0),{cameraAnimation:n=>{const s=n.getZoom();n.easeTo({duration:300,easeId:"keyboardHandler",easing:Uo,zoom:t?Math.round(s)+t*(e.shiftKey?2:1):s,bearing:n.getBearing()+i*this._bearingStep,pitch:n.getPitch()+o*this._pitchStep,offset:[-a*this._panStep,-r*this._panStep],center:n.getCenter()},{originalEvent:e});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}disableRotation(){this._rotationDisabled=!0;}enableRotation(){this._rotationDisabled=!1;}}function Uo(e){return e*(2-e)}class No{constructor(t,i){this._map=t,this._el=t.getCanvasContainer(),this._handler=i,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=1/450,e.bindAll(["_onTimeout"],this);}setZoomRate(e){this._defaultZoomRate=e;}setWheelZoomRate(e){this._wheelZoomRate=e;}isEnabled(){return !!this._enabled}isActive(){return !!this._active||void 0!==this._finishTimeout}isZooming(){return !!this._zooming}enable(e){this.isEnabled()||(this._enabled=!0,this._aroundCenter=e&&"center"===e.around);}disable(){this.isEnabled()&&(this._enabled=!1);}wheel(t){if(!this.isEnabled())return;let i=t.deltaMode===e.window.WheelEvent.DOM_DELTA_LINE?40*t.deltaY:t.deltaY;const o=e.browser.now(),a=o-(this._lastWheelEventTime||0);this._lastWheelEventTime=o,0!==i&&i%4.000244140625==0?this._type="wheel":0!==i&&Math.abs(i)<4?this._type="trackpad":a>400?(this._type=null,this._lastValue=i,this._timeout=setTimeout(this._onTimeout,40,t)):this._type||(this._type=Math.abs(a*i)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,i+=this._lastValue)),t.shiftKey&&i&&(i/=4),this._type&&(this._lastWheelEvent=t,this._delta-=i,this._active||this._start(t)),t.preventDefault();}_onTimeout(e){this._type="wheel",this._delta-=this._lastValue,this._active||this._start(e);}_start(e){if(!this._delta)return;this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);const t=i.mousePos(this._el,e);this._aroundPoint=this._aroundCenter?this._map.transform.centerPoint:t,this._aroundCoord=this._map.transform.pointCoordinate3D(this._aroundPoint),this._targetZoom=void 0,this._frameId||(this._frameId=!0,this._handler._triggerRenderFrame());}renderFrame(){if(!this._frameId)return;if(this._frameId=null,!this.isActive())return;const t=this._map.transform,i=()=>t._terrainEnabled()?t.computeZoomRelativeTo(this._aroundCoord):t.zoom;if(0!==this._delta){const e="wheel"===this._type&&Math.abs(this._delta)>4.000244140625?this._wheelZoomRate:this._defaultZoomRate;let o=2/(1+Math.exp(-Math.abs(this._delta*e)));this._delta<0&&0!==o&&(o=1/o);const a=i(),r=Math.pow(2,a),n="number"==typeof this._targetZoom?t.zoomScale(this._targetZoom):r;this._targetZoom=Math.min(t.maxZoom,Math.max(t.minZoom,t.scaleZoom(n*o))),"wheel"===this._type&&(this._startZoom=i(),this._easing=this._smoothOutEasing(200)),this._delta=0;}const o="number"==typeof this._targetZoom?this._targetZoom:i(),a=this._startZoom,r=this._easing;let n,s=!1;if("wheel"===this._type&&a&&r){const t=Math.min((e.browser.now()-this._lastWheelEventTime)/200,1),i=r(t);n=e.number(a,o,i),t<1?this._frameId||(this._frameId=!0):s=!0;}else n=o,s=!0;return this._active=!0,s&&(this._active=!1,this._finishTimeout=setTimeout(()=>{this._zooming=!1,this._handler._triggerRenderFrame(),delete this._targetZoom,delete this._finishTimeout;},200)),{noInertia:!0,needsRenderFrame:!s,zoomDelta:n-i(),around:this._aroundPoint,aroundCoord:this._aroundCoord,originalEvent:this._lastWheelEvent}}_smoothOutEasing(t){let i=e.ease;if(this._prevEase){const t=this._prevEase,o=(e.browser.now()-t.start)/t.duration,a=t.easing(o+.01)-t.easing(o),r=.27/Math.sqrt(a*a+1e-4)*.01,n=Math.sqrt(.0729-r*r);i=e.bezier(r,n,.25,1);}return this._prevEase={start:e.browser.now(),duration:t,easing:i},i}reset(){this._active=!1;}}class Zo{constructor(e,t){this._clickZoom=e,this._tapZoom=t;}enable(){this._clickZoom.enable(),this._tapZoom.enable();}disable(){this._clickZoom.disable(),this._tapZoom.disable();}isEnabled(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()}isActive(){return this._clickZoom.isActive()||this._tapZoom.isActive()}}class Go{constructor(){this.reset();}reset(){this._active=!1;}dblclick(e,t){return e.preventDefault(),{cameraAnimation:i=>{i.easeTo({duration:300,zoom:i.getZoom()+(e.shiftKey?-1:1),around:i.unproject(t)},{originalEvent:e});}}}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class qo{constructor(){this._tap=new bo({numTouches:1,numTaps:1}),this.reset();}reset(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,this._tap.reset();}touchstart(e,t,i){this._swipePoint||(this._tapTime&&e.timeStamp-this._tapTime>500&&this.reset(),this._tapTime?i.length>0&&(this._swipePoint=t[0],this._swipeTouch=i[0].identifier):this._tap.touchstart(e,t,i));}touchmove(e,t,i){if(this._tapTime){if(this._swipePoint){if(i[0].identifier!==this._swipeTouch)return;const o=t[0],a=o.y-this._swipePoint.y;return this._swipePoint=o,e.preventDefault(),this._active=!0,{zoomDelta:a/128}}}else this._tap.touchmove(e,t,i);}touchend(e,t,i){this._tapTime?this._swipePoint&&0===i.length&&this.reset():this._tap.touchend(e,t,i)&&(this._tapTime=e.timeStamp);}touchcancel(){this.reset();}enable(){this._enabled=!0;}disable(){this._enabled=!1,this.reset();}isEnabled(){return this._enabled}isActive(){return this._active}}class Vo{constructor(e,t,i){this._el=e,this._mousePan=t,this._touchPan=i;}enable(e){this._inertiaOptions=e||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add("mapboxgl-touch-drag-pan");}disable(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove("mapboxgl-touch-drag-pan");}isEnabled(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()}isActive(){return this._mousePan.isActive()||this._touchPan.isActive()}}class $o{constructor(e,t,i){this._pitchWithRotate=e.pitchWithRotate,this._mouseRotate=t,this._mousePitch=i;}enable(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable();}disable(){this._mouseRotate.disable(),this._mousePitch.disable();}isEnabled(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())}isActive(){return this._mouseRotate.isActive()||this._mousePitch.isActive()}}class jo{constructor(e,t,i,o){this._el=e,this._touchZoom=t,this._touchRotate=i,this._tapDragZoom=o,this._rotationDisabled=!1,this._enabled=!0;}enable(e){this._touchZoom.enable(e),this._rotationDisabled||this._touchRotate.enable(e),this._tapDragZoom.enable(),this._el.classList.add("mapboxgl-touch-zoom-rotate");}disable(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove("mapboxgl-touch-zoom-rotate");}isEnabled(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()}isActive(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()}disableRotation(){this._rotationDisabled=!0,this._touchRotate.disable();}enableRotation(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable();}}const Wo=e=>e.zoom||e.drag||e.pitch||e.rotate;class Xo extends e.Event{}class Ho{constructor(){this.constants=[1,1,.01],this.radius=0;}setup(t,i){const o=e.sub([],i,t);this.radius=e.length(o[2]<0?e.div([],o,this.constants):[o[0],o[1],0]);}projectRay(t){e.div(t,t,this.constants),e.normalize(t,t),e.mul$1(t,t,this.constants);const i=e.scale$2([],t,this.radius);if(i[2]>0){const t=e.scale$2([],[0,0,1],e.dot(i,[0,0,1])),o=e.scale$2([],e.normalize([],[i[0],i[1],0]),this.radius),a=e.add([],i,e.scale$2([],e.sub([],e.add([],o,t),i),2));i[0]=a[0],i[1]=a[1];}return i}}function Ko(e){return e.panDelta&&e.panDelta.mag()||e.zoomDelta||e.bearingDelta||e.pitchDelta}class Yo{constructor(t,o){this._map=t,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new co(t),this._bearingSnap=o.bearingSnap,this._previousActiveHandlers={},this._trackingEllipsoid=new Ho,this._dragOrigin=null,this._eventsInProgress={},this._addDefaultHandlers(o),e.bindAll(["handleEvent","handleWindowEvent"],this);const a=this._el;this._listeners=[[a,"touchstart",{passive:!0}],[a,"touchmove",{passive:!1}],[a,"touchend",void 0],[a,"touchcancel",void 0],[a,"mousedown",void 0],[a,"mousemove",void 0],[a,"mouseup",void 0],[e.window.document,"mousemove",{capture:!0}],[e.window.document,"mouseup",void 0],[a,"mouseover",void 0],[a,"mouseout",void 0],[a,"dblclick",void 0],[a,"click",void 0],[a,"keydown",{capture:!1}],[a,"keyup",void 0],[a,"wheel",{passive:!1}],[a,"contextmenu",void 0],[e.window,"blur",void 0]];for(const[t,o,a]of this._listeners)i.addEventListener(t,o,t===e.window.document?this.handleWindowEvent:this.handleEvent,a);}destroy(){for(const[t,o,a]of this._listeners)i.removeEventListener(t,o,t===e.window.document?this.handleWindowEvent:this.handleEvent,a);}_addDefaultHandlers(e){const t=this._map,i=t.getCanvasContainer();this._add("mapEvent",new fo(t,e));const o=t.boxZoom=new vo(t,e);this._add("boxZoom",o);const a=new wo,r=new Go;t.doubleClickZoom=new Zo(r,a),this._add("tapZoom",a),this._add("clickZoom",r);const n=new qo;this._add("tapDragZoom",n);const s=t.touchPitch=new Bo;this._add("touchPitch",s);const l=new So(e),c=new Io(e);t.dragRotate=new $o(e,l,c),this._add("mouseRotate",l,["mousePitch"]),this._add("mousePitch",c,["mouseRotate"]);const h=new Co(e),u=new Po(e);t.dragPan=new Vo(i,h,u),this._add("mousePan",h),this._add("touchPan",u,["touchZoom","touchRotate"]);const d=new Ro,_=new Do;t.touchZoomRotate=new jo(i,_,d,n),this._add("touchRotate",d,["touchPan","touchZoom"]),this._add("touchZoom",_,["touchPan","touchRotate"]);const m=t.scrollZoom=new No(t,this);this._add("scrollZoom",m,["mousePan"]);const p=t.keyboard=new Oo;this._add("keyboard",p),this._add("blockableMapEvent",new go(t));for(const i of ["boxZoom","doubleClickZoom","tapDragZoom","touchPitch","dragRotate","dragPan","touchZoomRotate","scrollZoom","keyboard"])e.interactive&&e[i]&&t[i].enable(e[i]);}_add(e,t,i){this._handlers.push({handlerName:e,handler:t,allowed:i}),this._handlersById[e]=t;}stop(e){if(!this._updatingCamera){for(const{handler:e}of this._handlers)e.reset();this._inertia.clear(),this._fireEvents({},{},e),this._changes=[];}}isActive(){for(const{handler:e}of this._handlers)if(e.isActive())return !0;return !1}isZooming(){return !!this._eventsInProgress.zoom||this._map.scrollZoom.isZooming()}isRotating(){return !!this._eventsInProgress.rotate}isMoving(){return Boolean(Wo(this._eventsInProgress))||this.isZooming()}_blockedByActive(e,t,i){for(const o in e)if(o!==i&&(!t||t.indexOf(o)<0))return !0;return !1}handleWindowEvent(e){this.handleEvent(e,`${e.type}Window`);}_getMapTouches(e){const t=[];for(const i of e)this._el.contains(i.target)&&t.push(i);return t}handleEvent(e,t){if("blur"===e.type)return void this.stop(!0);this._updatingCamera=!0;const o="renderFrame"===e.type?void 0:e,a={needsRenderFrame:!1},r={},n={},s=e.touches?this._getMapTouches(e.touches):void 0,l=s?i.touchPos(this._el,s):i.mousePos(this._el,e);for(const{handlerName:i,handler:c,allowed:h}of this._handlers){if(!c.isEnabled())continue;let u;this._blockedByActive(n,h,i)?c.reset():c[t||e.type]&&(u=c[t||e.type](e,l,s),this.mergeHandlerResult(a,r,u,i,o),u&&u.needsRenderFrame&&this._triggerRenderFrame()),(u||c.isActive())&&(n[i]=c);}const c={};for(const e in this._previousActiveHandlers)n[e]||(c[e]=o);this._previousActiveHandlers=n,(Object.keys(c).length||Ko(a))&&(this._changes.push([a,r,c]),this._triggerRenderFrame()),(Object.keys(n).length||Ko(a))&&this._map._stop(!0),this._updatingCamera=!1;const{cameraAnimation:h}=a;h&&(this._inertia.clear(),this._fireEvents({},{},!0),this._changes=[],h(this._map));}mergeHandlerResult(t,i,o,a,r){if(!o)return;e.extend(t,o);const n={handlerName:a,originalEvent:o.originalEvent||r};void 0!==o.zoomDelta&&(i.zoom=n),void 0!==o.panDelta&&(i.drag=n),void 0!==o.pitchDelta&&(i.pitch=n),void 0!==o.bearingDelta&&(i.rotate=n);}_applyChanges(){const t={},i={},o={};for(const[a,r,n]of this._changes)a.panDelta&&(t.panDelta=(t.panDelta||new e.Point(0,0))._add(a.panDelta)),a.zoomDelta&&(t.zoomDelta=(t.zoomDelta||0)+a.zoomDelta),a.bearingDelta&&(t.bearingDelta=(t.bearingDelta||0)+a.bearingDelta),a.pitchDelta&&(t.pitchDelta=(t.pitchDelta||0)+a.pitchDelta),void 0!==a.around&&(t.around=a.around),void 0!==a.aroundCoord&&(t.aroundCoord=a.aroundCoord),void 0!==a.pinchAround&&(t.pinchAround=a.pinchAround),a.noInertia&&(t.noInertia=a.noInertia),e.extend(i,r),e.extend(o,n);this._updateMapTransform(t,i,o),this._changes=[];}_updateMapTransform(t,i,o){const a=this._map,r=a.transform,n=e=>[e.x,e.y,e.z];if((e=>{const t=this._eventsInProgress.drag;return t&&!this._handlersById[t.handlerName].isActive()})()&&!Ko(t)){const e=r.zoom;r.cameraElevationReference="sea",r.recenterOnTerrain(),r.cameraElevationReference="ground",e!==r.zoom&&this._map._update(!0);}if(!Ko(t))return this._fireEvents(i,o,!0);let{panDelta:s,zoomDelta:l,bearingDelta:c,pitchDelta:h,around:u,aroundCoord:d,pinchAround:_}=t;void 0!==_&&(u=_),(e=>i.drag&&!this._eventsInProgress.drag)()&&u&&(this._dragOrigin=n(r.pointCoordinate3D(u)),this._trackingEllipsoid.setup(r._camera.position,this._dragOrigin)),r.cameraElevationReference="sea",a._stop(!0),u=u||a.transform.centerPoint,c&&(r.bearing+=c),h&&(r.pitch+=h),r._updateCameraState();const m=[0,0,0];if(s){const e=r.screenPointToMercatorRay(u),t=r.screenPointToMercatorRay(u.sub(s)),i=this._trackingEllipsoid.projectRay(e.dir),o=this._trackingEllipsoid.projectRay(t.dir);m[0]=o[0]-i[0],m[1]=o[1]-i[1];}const p=r.zoom,f=[0,0,0];if(l){const t=n(d||r.pointCoordinate3D(u)),i={dir:e.normalize([],e.sub([],t,r._camera.position))},o=r.screenPointToMercatorRay(r.centerPoint);if(i.dir[2]<0){const a=e.altitudeFromMercatorZ(t[2],t[1]),s=r.rayIntersectionCoordinate(r.pointRayIntersection(r.centerPoint,a)),c=r.zoomDeltaToMovement(n(s),l)*(o.dir[2]/i.dir[2]);e.scale$2(f,i.dir,c);}else if(r._terrainEnabled()){const o=r.zoomDeltaToMovement(t,l);e.scale$2(f,i.dir,o);}}const g=e.add(m,m,f);r._translateCameraConstrained(g),l&&Math.abs(r.zoom-p)>1e-4&&r.recenterOnTerrain(),r.cameraElevationReference="ground",this._map._update(),t.noInertia||this._inertia.record(t),this._fireEvents(i,o,!0);}_fireEvents(t,i,o){const a=Wo(this._eventsInProgress),r=Wo(t),n={};for(const e in t){const{originalEvent:i}=t[e];this._eventsInProgress[e]||(n[`${e}start`]=i),this._eventsInProgress[e]=t[e];}!a&&r&&this._fireEvent("movestart",r.originalEvent);for(const e in n)this._fireEvent(e,n[e]);r&&this._fireEvent("move",r.originalEvent);for(const e in t){const{originalEvent:i}=t[e];this._fireEvent(e,i);}const s={};let l;for(const e in this._eventsInProgress){const{handlerName:t,originalEvent:o}=this._eventsInProgress[e];this._handlersById[t].isActive()||(delete this._eventsInProgress[e],l=i[t]||o,s[`${e}end`]=l);}for(const e in s)this._fireEvent(e,s[e]);const c=Wo(this._eventsInProgress);if(o&&(a||r)&&!c){this._updatingCamera=!0;const t=this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),i=e=>0!==e&&-this._bearingSnap{delete this._frameId,this.handleEvent(new Xo("renderFrame",{timeStamp:e})),this._applyChanges();})}_triggerRenderFrame(){void 0===this._frameId&&(this._frameId=this._requestFrame());}}class Jo extends e.Evented{constructor(t,i){super(),this._moving=!1,this._zooming=!1,this.transform=t,this._bearingSnap=i.bearingSnap,e.bindAll(["_renderFrameCallback"],this);}getCenter(){return new e.LngLat(this.transform.center.lng,this.transform.center.lat)}setCenter(e,t){return this.jumpTo({center:e},t)}panBy(t,i,o){return t=e.Point.convert(t).mult(-1),this.panTo(this.transform.center,e.extend({offset:t},i),o)}panTo(t,i,o){return this.easeTo(e.extend({center:t},i),o)}getZoom(){return this.transform.zoom}setZoom(e,t){return this.jumpTo({zoom:e},t),this}zoomTo(t,i,o){return this.easeTo(e.extend({zoom:t},i),o)}zoomIn(e,t){return this.zoomTo(this.getZoom()+1,e,t),this}zoomOut(e,t){return this.zoomTo(this.getZoom()-1,e,t),this}getBearing(){return this.transform.bearing}setBearing(e,t){return this.jumpTo({bearing:e},t),this}getPadding(){return this.transform.padding}setPadding(e,t){return this.jumpTo({padding:e},t),this}rotateTo(t,i,o){return this.easeTo(e.extend({bearing:t},i),o)}resetNorth(t,i){return this.rotateTo(0,e.extend({duration:1e3},t),i),this}resetNorthPitch(t,i){return this.easeTo(e.extend({bearing:0,pitch:0,duration:1e3},t),i),this}snapToNorth(e,t){return Math.abs(this.getBearing()){if(this._zooming&&(o.zoom=e.number(a,l,t)),this._rotating&&(o.bearing=e.number(r,c,t)),this._pitching&&(o.pitch=e.number(n,h,t)),this._padding&&(o.interpolatePadding(s,u,t),_=o.centerPoint.add(d)),x)o.setLocationAtPoint(x,y);else {const e=o.zoomScale(o.zoom-a),i=l>a?Math.min(2,v):Math.max(.5,v),r=Math.pow(i,1-t),n=o.unproject(f.add(g.mult(t*r)).mult(e));o.setLocationAtPoint(o.renderWorldCopies?n.wrap():n,_);}this._fireMoveEvents(i);},e=>{o.recenterOnTerrain(),this._afterEase(i,e);},t),this}_prepareEase(t,i,o={}){this._moving=!0,this.transform.cameraElevationReference="sea",i||o.moving||this.fire(new e.Event("movestart",t)),this._zooming&&!o.zooming&&this.fire(new e.Event("zoomstart",t)),this._rotating&&!o.rotating&&this.fire(new e.Event("rotatestart",t)),this._pitching&&!o.pitching&&this.fire(new e.Event("pitchstart",t));}_fireMoveEvents(t){this.fire(new e.Event("move",t)),this._zooming&&this.fire(new e.Event("zoom",t)),this._rotating&&this.fire(new e.Event("rotate",t)),this._pitching&&this.fire(new e.Event("pitch",t));}_afterEase(t,i){if(this._easeId&&i&&this._easeId===i)return;delete this._easeId,this.transform.cameraElevationReference="ground";const o=this._zooming,a=this._rotating,r=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,o&&this.fire(new e.Event("zoomend",t)),a&&this.fire(new e.Event("rotateend",t)),r&&this.fire(new e.Event("pitchend",t)),this.fire(new e.Event("moveend",t));}flyTo(t,i){if(!t.essential&&e.browser.prefersReducedMotion){const o=e.pick(t,["center","zoom","bearing","pitch","around"]);return this.jumpTo(o,i)}this.stop(),t=e.extend({offset:[0,0],speed:1.2,curve:1.42,easing:e.ease},t);const o=this.transform,a=this.getZoom(),r=this.getBearing(),n=this.getPitch(),s=this.getPadding(),l="zoom"in t?e.clamp(+t.zoom,o.minZoom,o.maxZoom):a,c="bearing"in t?this._normalizeBearing(t.bearing,r):r,h="pitch"in t?+t.pitch:n,u="padding"in t?t.padding:o.padding,d=o.zoomScale(l-a),_=e.Point.convert(t.offset);let m=o.centerPoint.add(_);const p=o.pointLocation(m),f=e.LngLat.convert(t.center||p);this._normalizeCenter(f);const g=o.project(p),v=o.project(f).sub(g);let x=t.curve;const y=Math.max(o.width,o.height),b=y/d,w=v.mag();if("minZoom"in t){const i=e.clamp(Math.min(t.minZoom,a,l),o.minZoom,o.maxZoom),r=y/o.zoomScale(i-a);x=Math.sqrt(r/w*2);}const T=x*x;function E(e){const t=(b*b-y*y+(e?-1:1)*T*T*w*w)/(2*(e?b:y)*T*w);return Math.log(Math.sqrt(t*t+1)-t)}function C(e){return (Math.exp(e)-Math.exp(-e))/2}function S(e){return (Math.exp(e)+Math.exp(-e))/2}const I=E(0);let P=function(e){return S(I)/S(I+x*e)},M=function(e){return y*((S(I)*(C(t=I+x*e)/S(t))-C(I))/T)/w;var t;},z=(E(1)-I)/x;if(Math.abs(w)<1e-6||!isFinite(z)){if(Math.abs(y-b)<1e-6)return this.easeTo(t,i);const e=bt.maxDuration&&(t.duration=0),this._zooming=!0,this._rotating=r!==c,this._pitching=h!==n,this._padding=!o.isPaddingEqual(u),this._prepareEase(i,!1),this._ease(t=>{const d=t*z,p=1/P(d);o.zoom=1===t?l:a+o.scaleZoom(p),this._rotating&&(o.bearing=e.number(r,c,t)),this._pitching&&(o.pitch=e.number(n,h,t)),this._padding&&(o.interpolatePadding(s,u,t),m=o.centerPoint.add(_));const x=1===t?f:o.unproject(g.add(v.mult(M(d))).mult(p));o.setLocationAtPoint(o.renderWorldCopies?x.wrap():x,m),o._updateCenterElevation(),this._fireMoveEvents(i);},()=>this._afterEase(i),t),this}isEasing(){return !!this._easeFrameId}stop(){return this._stop()}_stop(e,t){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){const e=this._onEaseEnd;delete this._onEaseEnd,e.call(this,t);}if(!e){const e=this.handlers;e&&e.stop(!1);}return this}_ease(t,i,o){!1===o.animate||0===o.duration?(t(1),i()):(this._easeStart=e.browser.now(),this._easeOptions=o,this._onEaseFrame=t,this._onEaseEnd=i,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback));}_renderFrameCallback(){const t=Math.min((e.browser.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(t)),t<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop();}_normalizeBearing(t,i){t=e.wrap(t,-180,180);const o=Math.abs(t-i);return Math.abs(t-360-i)180?-360:i<-180?360:0;}}class Qo{constructor(t={}){this.options=t,e.bindAll(["_toggleAttribution","_updateEditLink","_updateData","_updateCompact"],this);}getDefaultPosition(){return "bottom-right"}onAdd(e){const t=this.options&&this.options.compact;return this._map=e,this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-attrib"),this._compactButton=i.create("button","mapboxgl-ctrl-attrib-button",this._container),this._compactButton.addEventListener("click",this._toggleAttribution),this._setElementTitle(this._compactButton,"ToggleAttribution"),this._innerContainer=i.create("div","mapboxgl-ctrl-attrib-inner",this._container),this._innerContainer.setAttribute("role","list"),t&&this._container.classList.add("mapboxgl-compact"),this._updateAttributions(),this._updateEditLink(),this._map.on("styledata",this._updateData),this._map.on("sourcedata",this._updateData),this._map.on("moveend",this._updateEditLink),void 0===t&&(this._map.on("resize",this._updateCompact),this._updateCompact()),this._container}onRemove(){i.remove(this._container),this._map.off("styledata",this._updateData),this._map.off("sourcedata",this._updateData),this._map.off("moveend",this._updateEditLink),this._map.off("resize",this._updateCompact),this._map=void 0,this._attribHTML=void 0;}_setElementTitle(e,t){const i=this._map._getUIString(`AttributionControl.${t}`);e.title=i,e.setAttribute("aria-label",i);}_toggleAttribution(){this._container.classList.contains("mapboxgl-compact-show")?(this._container.classList.remove("mapboxgl-compact-show"),this._compactButton.setAttribute("aria-pressed","false")):(this._container.classList.add("mapboxgl-compact-show"),this._compactButton.setAttribute("aria-pressed","true"));}_updateEditLink(){let t=this._editLink;t||(t=this._editLink=this._container.querySelector(".mapbox-improve-map"));const i=[{key:"owner",value:this.styleOwner},{key:"id",value:this.styleId},{key:"access_token",value:this._map._requestManager._customAccessToken||e.config.ACCESS_TOKEN}];if(t){const o=i.reduce((e,t,o)=>(t.value&&(e+=`${t.key}=${t.value}${o"string"!=typeof e?"":e)):"string"==typeof this.options.customAttribution&&e.push(this.options.customAttribution)),this._map.style.stylesheet){const e=this._map.style.stylesheet;this.styleOwner=e.owner,this.styleId=e.id;}const t=this._map.style._sourceCaches;for(const i in t){const o=t[i];if(o.used){const t=o.getSource();t.attribution&&e.indexOf(t.attribution)<0&&e.push(t.attribution);}}e.sort((e,t)=>e.length-t.length),e=e.filter((t,i)=>{for(let o=i+1;o=0)return !1;return !0});const i=e.join(" | ");i!==this._attribHTML&&(this._attribHTML=i,e.length?(this._innerContainer.innerHTML=i,this._container.classList.remove("mapboxgl-attrib-empty")):this._container.classList.add("mapboxgl-attrib-empty"),this._editLink=null);}_updateCompact(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add("mapboxgl-compact"):this._container.classList.remove("mapboxgl-compact","mapboxgl-compact-show");}}class ea{constructor(){e.bindAll(["_updateLogo"],this),e.bindAll(["_updateCompact"],this);}onAdd(e){this._map=e,this._container=i.create("div","mapboxgl-ctrl");const t=i.create("a","mapboxgl-ctrl-logo");return t.target="_blank",t.rel="noopener nofollow",t.href="https://www.mapbox.com/",t.setAttribute("aria-label",this._map._getUIString("LogoControl.Title")),t.setAttribute("rel","noopener nofollow"),this._container.appendChild(t),this._container.style.display="none",this._map.on("sourcedata",this._updateLogo),this._updateLogo(),this._map.on("resize",this._updateCompact),this._updateCompact(),this._container}onRemove(){i.remove(this._container),this._map.off("sourcedata",this._updateLogo),this._map.off("resize",this._updateCompact);}getDefaultPosition(){return "bottom-left"}_updateLogo(e){e&&"metadata"!==e.sourceDataType||(this._container.style.display=this._logoRequired()?"block":"none");}_logoRequired(){if(!this._map.style)return;const e=this._map.style._sourceCaches;if(0===Object.entries(e).length)return !0;for(const t in e){const i=e[t].getSource();if(i.hasOwnProperty("mapbox_logo")&&!i.mapbox_logo)return !1}return !0}_updateCompact(){const e=this._container.children;if(e.length){const t=e[0];this._map.getCanvasContainer().offsetWidth<250?t.classList.add("mapboxgl-compact"):t.classList.remove("mapboxgl-compact");}}}class ta{constructor(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1;}add(e){const t=++this._id;return this._queue.push({callback:e,id:t,cancelled:!1}),t}remove(e){const t=this._currentlyRunning,i=t?this._queue.concat(t):this._queue;for(const t of i)if(t.id===e)return void(t.cancelled=!0)}run(e=0){const t=this._currentlyRunning=this._queue;this._queue=[];for(const i of t)if(!i.cancelled&&(i.callback(e),this._cleared))break;this._cleared=!1,this._currentlyRunning=!1;}clear(){this._currentlyRunning&&(this._cleared=!0),this._queue=[];}}const ia={"AttributionControl.ToggleAttribution":"Toggle attribution","AttributionControl.MapFeedback":"Map feedback","FullscreenControl.Enter":"Enter fullscreen","FullscreenControl.Exit":"Exit fullscreen","GeolocateControl.FindMyLocation":"Find my location","GeolocateControl.LocationNotAvailable":"Location not available","LogoControl.Title":"Mapbox logo","NavigationControl.ResetBearing":"Reset bearing to north","NavigationControl.ZoomIn":"Zoom in","NavigationControl.ZoomOut":"Zoom out","ScaleControl.Feet":"ft","ScaleControl.Meters":"m","ScaleControl.Kilometers":"km","ScaleControl.Miles":"mi","ScaleControl.NauticalMiles":"nm"},{HTMLImageElement:oa,HTMLElement:aa,ImageBitmap:ra}=e.window,na={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:-2,maxZoom:22,minPitch:0,maxPitch:85,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,touchPitch:!0,bearingSnap:7,clickTolerance:3,pitchWithRotate:!0,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0,renderWorldCopies:!0,refreshExpiredTiles:!0,maxTileCacheSize:null,localIdeographFontFamily:"sans-serif",transformRequest:null,accessToken:null,fadeDuration:300,crossSourceCollisions:!0};function sa(e){e.parentNode&&e.parentNode.removeChild(e);}const la={showCompass:!0,showZoom:!0,visualizePitch:!1};class ca{constructor(t,o,a=!1){this._clickTolerance=10,this.element=o,this.mouseRotate=new So({clickTolerance:t.dragRotate._mouseRotate._clickTolerance}),this.map=t,a&&(this.mousePitch=new Io({clickTolerance:t.dragRotate._mousePitch._clickTolerance})),e.bindAll(["mousedown","mousemove","mouseup","touchstart","touchmove","touchend","reset"],this),i.addEventListener(o,"mousedown",this.mousedown),i.addEventListener(o,"touchstart",this.touchstart,{passive:!1}),i.addEventListener(o,"touchmove",this.touchmove),i.addEventListener(o,"touchend",this.touchend),i.addEventListener(o,"touchcancel",this.reset);}down(e,t){this.mouseRotate.mousedown(e,t),this.mousePitch&&this.mousePitch.mousedown(e,t),i.disableDrag();}move(e,t){const i=this.map,o=this.mouseRotate.mousemoveWindow(e,t);if(o&&o.bearingDelta&&i.setBearing(i.getBearing()+o.bearingDelta),this.mousePitch){const o=this.mousePitch.mousemoveWindow(e,t);o&&o.pitchDelta&&i.setPitch(i.getPitch()+o.pitchDelta);}}off(){const e=this.element;i.removeEventListener(e,"mousedown",this.mousedown),i.removeEventListener(e,"touchstart",this.touchstart,{passive:!1}),i.removeEventListener(e,"touchmove",this.touchmove),i.removeEventListener(e,"touchend",this.touchend),i.removeEventListener(e,"touchcancel",this.reset),this.offTemp();}offTemp(){i.enableDrag(),i.removeEventListener(e.window,"mousemove",this.mousemove),i.removeEventListener(e.window,"mouseup",this.mouseup);}mousedown(t){this.down(e.extend({},t,{ctrlKey:!0,preventDefault:()=>t.preventDefault()}),i.mousePos(this.element,t)),i.addEventListener(e.window,"mousemove",this.mousemove),i.addEventListener(e.window,"mouseup",this.mouseup);}mousemove(e){this.move(e,i.mousePos(this.element,e));}mouseup(e){this.mouseRotate.mouseupWindow(e),this.mousePitch&&this.mousePitch.mouseupWindow(e),this.offTemp();}touchstart(e){1!==e.targetTouches.length?this.reset():(this._startPos=this._lastPos=i.touchPos(this.element,e.targetTouches)[0],this.down({type:"mousedown",button:0,ctrlKey:!0,preventDefault:()=>e.preventDefault()},this._startPos));}touchmove(e){1!==e.targetTouches.length?this.reset():(this._lastPos=i.touchPos(this.element,e.targetTouches)[0],this.move({preventDefault:()=>e.preventDefault()},this._lastPos));}touchend(e){0===e.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)o.width||i.y>o.height;o.locationPoint(a).distSqr(i)180;){const e=o.locationPoint(t);if(e.x>=0&&e.y>=0&&e.x<=o.width&&e.y<=o.height)break;t.lng>o.center.lng?t.lng-=360:t.lng+=360;}return t}const ua={center:"translate(-50%,-50%)",top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"};function da(e,t,i){const o=e.classList;for(const e in ua)o.remove(`mapboxgl-${i}-anchor-${e}`);o.add(`mapboxgl-${i}-anchor-${t}`);}class _a extends e.Evented{constructor(t,o){if(super(),(t instanceof e.window.HTMLElement||o)&&(t=e.extend({element:t},o)),e.bindAll(["_update","_onMove","_onUp","_addDragHandler","_onMapClick","_onKeyPress"],this),this._anchor=t&&t.anchor||"center",this._color=t&&t.color||"#3FB1CE",this._scale=t&&t.scale||1,this._draggable=t&&t.draggable||!1,this._clickTolerance=t&&t.clickTolerance||0,this._isDragging=!1,this._state="inactive",this._rotation=t&&t.rotation||0,this._rotationAlignment=t&&t.rotationAlignment||"auto",this._pitchAlignment=t&&t.pitchAlignment&&"auto"!==t.pitchAlignment?t.pitchAlignment:this._rotationAlignment,t&&t.element)this._element=t.element,this._offset=e.Point.convert(t&&t.offset||[0,0]);else {this._defaultMarker=!0,this._element=i.create("div"),this._element.setAttribute("aria-label","Map marker");const o=i.createNS("http://www.w3.org/2000/svg","svg"),a=41,r=27;o.setAttributeNS(null,"display","block"),o.setAttributeNS(null,"height",`${a}px`),o.setAttributeNS(null,"width",`${r}px`),o.setAttributeNS(null,"viewBox",`0 0 ${r} ${a}`);const n=i.createNS("http://www.w3.org/2000/svg","g");n.setAttributeNS(null,"stroke","none"),n.setAttributeNS(null,"stroke-width","1"),n.setAttributeNS(null,"fill","none"),n.setAttributeNS(null,"fill-rule","evenodd");const s=i.createNS("http://www.w3.org/2000/svg","g");s.setAttributeNS(null,"fill-rule","nonzero");const l=i.createNS("http://www.w3.org/2000/svg","g");l.setAttributeNS(null,"transform","translate(3.0, 29.0)"),l.setAttributeNS(null,"fill","#000000");const c=[{rx:"10.5",ry:"5.25002273"},{rx:"10.5",ry:"5.25002273"},{rx:"9.5",ry:"4.77275007"},{rx:"8.5",ry:"4.29549936"},{rx:"7.5",ry:"3.81822308"},{rx:"6.5",ry:"3.34094679"},{rx:"5.5",ry:"2.86367051"},{rx:"4.5",ry:"2.38636864"}];for(const e of c){const t=i.createNS("http://www.w3.org/2000/svg","ellipse");t.setAttributeNS(null,"opacity","0.04"),t.setAttributeNS(null,"cx","10.5"),t.setAttributeNS(null,"cy","5.80029008"),t.setAttributeNS(null,"rx",e.rx),t.setAttributeNS(null,"ry",e.ry),l.appendChild(t);}const h=i.createNS("http://www.w3.org/2000/svg","g");h.setAttributeNS(null,"fill",this._color);const u=i.createNS("http://www.w3.org/2000/svg","path");u.setAttributeNS(null,"d","M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z"),h.appendChild(u);const d=i.createNS("http://www.w3.org/2000/svg","g");d.setAttributeNS(null,"opacity","0.25"),d.setAttributeNS(null,"fill","#000000");const _=i.createNS("http://www.w3.org/2000/svg","path");_.setAttributeNS(null,"d","M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z"),d.appendChild(_);const m=i.createNS("http://www.w3.org/2000/svg","g");m.setAttributeNS(null,"transform","translate(6.0, 7.0)"),m.setAttributeNS(null,"fill","#FFFFFF");const p=i.createNS("http://www.w3.org/2000/svg","g");p.setAttributeNS(null,"transform","translate(8.0, 8.0)");const f=i.createNS("http://www.w3.org/2000/svg","circle");f.setAttributeNS(null,"fill","#000000"),f.setAttributeNS(null,"opacity","0.25"),f.setAttributeNS(null,"cx","5.5"),f.setAttributeNS(null,"cy","5.5"),f.setAttributeNS(null,"r","5.4999962");const g=i.createNS("http://www.w3.org/2000/svg","circle");g.setAttributeNS(null,"fill","#FFFFFF"),g.setAttributeNS(null,"cx","5.5"),g.setAttributeNS(null,"cy","5.5"),g.setAttributeNS(null,"r","5.4999962"),p.appendChild(f),p.appendChild(g),s.appendChild(l),s.appendChild(h),s.appendChild(d),s.appendChild(m),s.appendChild(p),o.appendChild(s),o.setAttributeNS(null,"height",`${a*this._scale}px`),o.setAttributeNS(null,"width",`${r*this._scale}px`),this._element.appendChild(o),this._offset=e.Point.convert(t&&t.offset||[0,-14]);}this._element.classList.add("mapboxgl-marker"),this._element.addEventListener("dragstart",e=>{e.preventDefault();}),this._element.addEventListener("mousedown",e=>{e.preventDefault();}),da(this._element,this._anchor,"marker"),this._popup=null;}addTo(e){return this.remove(),this._map=e,e.getCanvasContainer().appendChild(this._element),e.on("move",this._update),e.on("moveend",this._update),this.setDraggable(this._draggable),this._update(),this._map.on("click",this._onMapClick),this}remove(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map.off("mousedown",this._addDragHandler),this._map.off("touchstart",this._addDragHandler),this._map.off("mouseup",this._onUp),this._map.off("touchend",this._onUp),this._map.off("mousemove",this._onMove),this._map.off("touchmove",this._onMove),delete this._map),i.remove(this._element),this._popup&&this._popup.remove(),this}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.LngLat.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this}getElement(){return this._element}setPopup(e){if(this._popup&&(this._popup.remove(),this._popup=null,this._element.removeEventListener("keypress",this._onKeyPress),this._originalTabIndex||this._element.removeAttribute("tabindex")),e){if(!("offset"in e.options)){const t=38.1,i=13.5,o=Math.sqrt(Math.pow(i,2)/2);e.options.offset=this._defaultMarker?{top:[0,0],"top-left":[0,0],"top-right":[0,0],bottom:[0,-t],"bottom-left":[o,-1*(t-i+o)],"bottom-right":[-o,-1*(t-i+o)],left:[i,-1*(t-i)],right:[-i,-1*(t-i)]}:this._offset;}this._popup=e,this._lngLat&&this._popup.setLngLat(this._lngLat),this._originalTabIndex=this._element.getAttribute("tabindex"),this._originalTabIndex||this._element.setAttribute("tabindex","0"),this._element.addEventListener("keypress",this._onKeyPress);}return this}_onKeyPress(e){const t=e.code,i=e.charCode||e.keyCode;"Space"!==t&&"Enter"!==t&&32!==i&&13!==i||this.togglePopup();}_onMapClick(e){const t=e.originalEvent.target,i=this._element;this._popup&&(t===i||i.contains(t))&&this.togglePopup();}getPopup(){return this._popup}togglePopup(){const e=this._popup;return e?(e.isOpen()?e.remove():e.addTo(this._map),this):this}_updateOcclusion(){this._occlusionTimer||(this._occlusionTimer=setTimeout(this._onOcclusionTimer.bind(this),60));}_onOcclusionTimer(){const e=this._map.transform,t=this._pos?this._pos.sub(this._transformedOffset()):null;if(t&&t.x>=0&&t.x=0&&t.y=e;}this._isDragging&&(this._pos=t.point.sub(this._positionDelta),this._lngLat=this._map.unproject(this._pos),this.setLngLat(this._lngLat),this._element.style.pointerEvents="none","pending"===this._state&&(this._state="active",this.fire(new e.Event("dragstart"))),this.fire(new e.Event("drag")));}_onUp(){this._element.style.pointerEvents="auto",this._positionDelta=null,this._pointerdownPos=null,this._isDragging=!1,this._map.off("mousemove",this._onMove),this._map.off("touchmove",this._onMove),"active"===this._state&&this.fire(new e.Event("dragend")),this._state="inactive";}_addDragHandler(e){this._element.contains(e.originalEvent.target)&&(e.preventDefault(),this._positionDelta=e.point.sub(this._pos).add(this._transformedOffset()),this._pointerdownPos=e.point,this._state="pending",this._map.on("mousemove",this._onMove),this._map.on("touchmove",this._onMove),this._map.once("mouseup",this._onUp),this._map.once("touchend",this._onUp));}setDraggable(e){return this._draggable=!!e,this._map&&(e?(this._map.on("mousedown",this._addDragHandler),this._map.on("touchstart",this._addDragHandler)):(this._map.off("mousedown",this._addDragHandler),this._map.off("touchstart",this._addDragHandler))),this}isDraggable(){return this._draggable}setRotation(e){return this._rotation=e||0,this._update(),this}getRotation(){return this._rotation}setRotationAlignment(e){return this._rotationAlignment=e||"auto",this._update(),this}getRotationAlignment(){return this._rotationAlignment}setPitchAlignment(e){return this._pitchAlignment=e&&"auto"!==e?e:this._rotationAlignment,this._update(),this}getPitchAlignment(){return this._pitchAlignment}}const ma={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showAccuracyCircle:!0,showUserLocation:!0};let pa,fa=0,ga=!1;const va={maxWidth:100,unit:"metric"};function xa(e,t,i){const o=i&&i.maxWidth||100,a=e._container.clientHeight/2,r=e.unproject([0,a]),n=e.unproject([o,a]),s=r.distanceTo(n);if(i&&"imperial"===i.unit){const i=3.2808*s;i>5280?ya(t,o,i/5280,e._getUIString("ScaleControl.Miles")):ya(t,o,i,e._getUIString("ScaleControl.Feet"));}else i&&"nautical"===i.unit?ya(t,o,s/1852,e._getUIString("ScaleControl.NauticalMiles")):s>=1e3?ya(t,o,s/1e3,e._getUIString("ScaleControl.Kilometers")):ya(t,o,s,e._getUIString("ScaleControl.Meters"));}function ya(e,t,i,o){const a=function(e){const t=Math.pow(10,`${Math.floor(e)}`.length-1);let i=e/t;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:i>=1?1:function(e){const t=Math.pow(10,Math.ceil(-Math.log(e)/Math.LN10));return Math.round(e*t)/t}(i),t*i}(i);e.style.width=`${t*(a/i)}px`,e.innerHTML=`${a} ${o}`;}const ba={closeButton:!0,closeOnClick:!0,focusAfterOpen:!0,className:"",maxWidth:"240px"},wa=["a[href]","[tabindex]:not([tabindex='-1'])","[contenteditable]:not([contenteditable='false'])","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].join(", "),Ta={version:e.version,supported:t,setRTLTextPlugin:e.setRTLTextPlugin,getRTLTextPluginStatus:e.getRTLTextPluginStatus,Map:class extends Jo{constructor(t){if(null!=(t=e.extend({},na,t)).minZoom&&null!=t.maxZoom&&t.minZoom>t.maxZoom)throw new Error("maxZoom must be greater than or equal to minZoom");if(null!=t.minPitch&&null!=t.maxPitch&&t.minPitch>t.maxPitch)throw new Error("maxPitch must be greater than or equal to minPitch");if(null!=t.minPitch&&t.minPitch<0)throw new Error("minPitch must be greater than or equal to 0");if(null!=t.maxPitch&&t.maxPitch>85)throw new Error("maxPitch must be less than or equal to 85");if(super(new io(t.minZoom,t.maxZoom,t.minPitch,t.maxPitch,t.renderWorldCopies),t),this._interactive=t.interactive,this._maxTileCacheSize=t.maxTileCacheSize,this._failIfMajorPerformanceCaveat=t.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=t.preserveDrawingBuffer,this._antialias=t.antialias,this._trackResize=t.trackResize,this._bearingSnap=t.bearingSnap,this._refreshExpiredTiles=t.refreshExpiredTiles,this._fadeDuration=t.fadeDuration,this._isInitialLoad=!0,this._crossSourceCollisions=t.crossSourceCollisions,this._crossFadingFactor=1,this._collectResourceTiming=t.collectResourceTiming,this._renderTaskQueue=new ta,this._controls=[],this._mapId=e.uniqueId(),this._locale=e.extend({},ia,t.locale),this._clickTolerance=t.clickTolerance,this._requestManager=new e.RequestManager(t.transformRequest,t.accessToken),"string"==typeof t.container){if(this._container=e.window.document.getElementById(t.container),!this._container)throw new Error(`Container '${t.container}' not found.`)}else {if(!(t.container instanceof aa))throw new Error("Invalid type: 'container' must be a String or HTMLElement.");this._container=t.container;}if(t.maxBounds&&this.setMaxBounds(t.maxBounds),e.bindAll(["_onWindowOnline","_onWindowResize","_onMapScroll","_contextLost","_contextRestored"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error("Failed to initialize WebGL.");this.on("move",()=>this._update(!1)),this.on("moveend",()=>this._update(!1)),this.on("zoom",()=>this._update(!0)),void 0!==e.window&&(e.window.addEventListener("online",this._onWindowOnline,!1),e.window.addEventListener("resize",this._onWindowResize,!1),e.window.addEventListener("orientationchange",this._onWindowResize,!1)),this.handlers=new Yo(this,t),this._hash=t.hash&&new oo("string"==typeof t.hash&&t.hash||void 0).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:t.center,zoom:t.zoom,bearing:t.bearing,pitch:t.pitch}),t.bounds&&(this.resize(),this.fitBounds(t.bounds,e.extend({},t.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=t.localIdeographFontFamily,t.style&&this.setStyle(t.style,{localIdeographFontFamily:t.localIdeographFontFamily}),t.attributionControl&&this.addControl(new Qo({customAttribution:t.customAttribution})),this._logoControl=new ea,this.addControl(this._logoControl,t.logoPosition),this.on("style.load",()=>{this.transform.unmodified&&this.jumpTo(this.style.stylesheet);}),this.on("data",t=>{this._update("style"===t.dataType),this.fire(new e.Event(`${t.dataType}data`,t));}),this.on("dataloading",t=>{this.fire(new e.Event(`${t.dataType}dataloading`,t));});}_getMapId(){return this._mapId}addControl(t,i){if(void 0===i&&(i=t.getDefaultPosition?t.getDefaultPosition():"top-right"),!t||!t.onAdd)return this.fire(new e.ErrorEvent(new Error("Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.")));const o=t.onAdd(this);this._controls.push(t);const a=this._controlPositions[i];return -1!==i.indexOf("bottom")?a.insertBefore(o,a.firstChild):a.appendChild(o),this}removeControl(t){if(!t||!t.onRemove)return this.fire(new e.ErrorEvent(new Error("Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.")));const i=this._controls.indexOf(t);return i>-1&&this._controls.splice(i,1),t.onRemove(this),this}hasControl(e){return this._controls.indexOf(e)>-1}resize(t){const i=this._containerDimensions(),o=i[0],a=i[1];this._resizeCanvas(o,a),this.transform.resize(o,a),this.painter.resize(o,a);const r=!this._moving;return r&&(this.stop(),this.fire(new e.Event("movestart",t)).fire(new e.Event("move",t))),this.fire(new e.Event("resize",t)),r&&this.fire(new e.Event("moveend",t)),this}getBounds(){return this.transform.getBounds()}getMaxBounds(){return this.transform.getMaxBounds()}setMaxBounds(t){return this.transform.setMaxBounds(e.LngLatBounds.convert(t)),this._update()}setMinZoom(e){if((e=null==e?-2:e)>=-2&&e<=this.transform.maxZoom)return this.transform.minZoom=e,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=e,this._update(),this.getZoom()>e&&this.setZoom(e),this;throw new Error("maxZoom must be greater than the current minZoom")}getMaxZoom(){return this.transform.maxZoom}setMinPitch(e){if((e=null==e?0:e)<0)throw new Error("minPitch must be greater than or equal to 0");if(e>=0&&e<=this.transform.maxPitch)return this.transform.minPitch=e,this._update(),this.getPitch()85)throw new Error("maxPitch must be less than or equal to 85");if(e>=this.transform.minPitch)return this.transform.maxPitch=e,this._update(),this.getPitch()>e&&this.setPitch(e),this;throw new Error("maxPitch must be greater than the current minPitch")}getMaxPitch(){return this.transform.maxPitch}getRenderWorldCopies(){return this.transform.renderWorldCopies}setRenderWorldCopies(e){return this.transform.renderWorldCopies=e,this._update()}project(t){return this.transform.locationPoint3D(e.LngLat.convert(t))}unproject(t){return this.transform.pointLocation3D(e.Point.convert(t))}isMoving(){return this._moving||this.handlers&&this.handlers.isMoving()}isZooming(){return this._zooming||this.handlers&&this.handlers.isZooming()}isRotating(){return this._rotating||this.handlers&&this.handlers.isRotating()}_createDelegatedListener(e,t,i){if("mouseenter"===e||"mouseover"===e){let o=!1;const a=a=>{const r=this.getLayer(t)?this.queryRenderedFeatures(a.point,{layers:[t]}):[];r.length?o||(o=!0,i.call(this,new _o(e,this,a.originalEvent,{features:r}))):o=!1;};return {layer:t,listener:i,delegates:{mousemove:a,mouseout:()=>{o=!1;}}}}if("mouseleave"===e||"mouseout"===e){let o=!1;const a=a=>{(this.getLayer(t)?this.queryRenderedFeatures(a.point,{layers:[t]}):[]).length?o=!0:o&&(o=!1,i.call(this,new _o(e,this,a.originalEvent)));},r=t=>{o&&(o=!1,i.call(this,new _o(e,this,t.originalEvent)));};return {layer:t,listener:i,delegates:{mousemove:a,mouseout:r}}}{const o=e=>{const o=this.getLayer(t)?this.queryRenderedFeatures(e.point,{layers:[t]}):[];o.length&&(e.features=o,i.call(this,e),delete e.features);};return {layer:t,listener:i,delegates:{[e]:o}}}}on(e,t,i){if(void 0===i)return super.on(e,t);const o=this._createDelegatedListener(e,t,i);this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[e]=this._delegatedListeners[e]||[],this._delegatedListeners[e].push(o);for(const e in o.delegates)this.on(e,o.delegates[e]);return this}once(e,t,i){if(void 0===i)return super.once(e,t);const o=this._createDelegatedListener(e,t,i);for(const e in o.delegates)this.once(e,o.delegates[e]);return this}off(e,t,i){return void 0===i?super.off(e,t):(this._delegatedListeners&&this._delegatedListeners[e]&&(o=>{const a=this._delegatedListeners[e];for(let e=0;e{t?this.fire(new e.ErrorEvent(t)):o&&this._updateDiff(o,i);});}else "object"==typeof t&&this._updateDiff(t,i);}_updateDiff(t,i){try{this.style.setState(t)&&(this._update(!0),this._updateTerrain());}catch(o){e.warnOnce(`Unable to perform style diff: ${o.message||o.error||o}. Rebuilding the style from scratch.`),this._updateStyle(t,i);}}getStyle(){if(this.style)return this.style.serialize()}isStyleLoaded(){return this.style?this.style.loaded():e.warnOnce("There is no style added to the map.")}addSource(e,t){return this._lazyInitEmptyStyle(),this.style.addSource(e,t),this._update(!0)}isSourceLoaded(t){const i=this.style&&this.style._getSourceCaches(t);if(0!==i.length)return i.every(e=>e.loaded());this.fire(new e.ErrorEvent(new Error(`There is no source with ID '${t}'`)));}areTilesLoaded(){const e=this.style&&this.style._sourceCaches;for(const t in e){const i=e[t]._tiles;for(const e in i){const t=i[e];if("loaded"!==t.state&&"errored"!==t.state)return !1}}return !0}addSourceType(e,t,i){return this._lazyInitEmptyStyle(),this.style.addSourceType(e,t,i)}removeSource(e){return this.style.removeSource(e),this._updateTerrain(),this._update(!0)}getSource(e){return this.style.getSource(e)}addImage(t,i,{pixelRatio:o=1,sdf:a=!1,stretchX:r,stretchY:n,content:s}={}){if(this._lazyInitEmptyStyle(),i instanceof oa||ra&&i instanceof ra){const{width:l,height:c,data:h}=e.browser.getImageData(i);this.style.addImage(t,{data:new e.RGBAImage({width:l,height:c},h),pixelRatio:o,stretchX:r,stretchY:n,content:s,sdf:a,version:0});}else {if(void 0===i.width||void 0===i.height)return this.fire(new e.ErrorEvent(new Error("Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));{const{width:l,height:c,data:h}=i,u=i;this.style.addImage(t,{data:new e.RGBAImage({width:l,height:c},new Uint8Array(h)),pixelRatio:o,stretchX:r,stretchY:n,content:s,sdf:a,version:0,userImage:u}),u.onAdd&&u.onAdd(this,t);}}}updateImage(t,i){const o=this.style.getImage(t);if(!o)return this.fire(new e.ErrorEvent(new Error("The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.")));const a=i instanceof oa||ra&&i instanceof ra?e.browser.getImageData(i):i,{width:r,height:n,data:s}=a;return void 0===r||void 0===n?this.fire(new e.ErrorEvent(new Error("Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`"))):r!==o.data.width||n!==o.data.height?this.fire(new e.ErrorEvent(new Error("The width and height of the updated image must be that same as the previous version of the image"))):(o.data.replace(s,!(i instanceof oa||ra&&i instanceof ra)),void this.style.updateImage(t,o))}hasImage(t){return t?!!this.style.getImage(t):(this.fire(new e.ErrorEvent(new Error("Missing required image id"))),!1)}removeImage(e){this.style.removeImage(e);}loadImage(t,i){e.getImage(this._requestManager.transformRequest(t,e.ResourceType.Image),i);}listImages(){return this.style.listImages()}addLayer(e,t){return this._lazyInitEmptyStyle(),this.style.addLayer(e,t),this._update(!0)}moveLayer(e,t){return this.style.moveLayer(e,t),this._update(!0)}removeLayer(e){return this.style.removeLayer(e),this._update(!0)}getLayer(e){return this.style.getLayer(e)}setLayerZoomRange(e,t,i){return this.style.setLayerZoomRange(e,t,i),this._update(!0)}setFilter(e,t,i={}){return this.style.setFilter(e,t,i),this._update(!0)}getFilter(e){return this.style.getFilter(e)}setPaintProperty(e,t,i,o={}){return this.style.setPaintProperty(e,t,i,o),this._update(!0)}getPaintProperty(e,t){return this.style.getPaintProperty(e,t)}setLayoutProperty(e,t,i,o={}){return this.style.setLayoutProperty(e,t,i,o),this._update(!0)}getLayoutProperty(e,t){return this.style.getLayoutProperty(e,t)}setLight(e,t={}){return this._lazyInitEmptyStyle(),this.style.setLight(e,t),this._update(!0)}getLight(){return this.style.getLight()}setTerrain(e){return this._lazyInitEmptyStyle(),this.style.setTerrain(e),this._update(!0)}setFeatureState(e,t){return this.style.setFeatureState(e,t),this._update()}removeFeatureState(e,t){return this.style.removeFeatureState(e,t),this._update()}getFeatureState(e){return this.style.getFeatureState(e)}getContainer(){return this._container}getCanvasContainer(){return this._canvasContainer}getCanvas(){return this._canvas}_containerDimensions(){let e=0,t=0;return this._container&&(e=this._container.clientWidth||400,t=this._container.clientHeight||300),[e,t]}_detectMissingCSS(){"rgb(250, 128, 114)"!==e.window.getComputedStyle(this._missingCSSCanary).getPropertyValue("background-color")&&e.warnOnce("This page appears to be missing CSS declarations for Mapbox GL JS, which may cause the map to display incorrectly. Please ensure your page includes mapbox-gl.css, as described in https://www.mapbox.com/mapbox-gl-js/api/.");}_setupContainer(){const e=this._container;e.classList.add("mapboxgl-map"),(this._missingCSSCanary=i.create("div","mapboxgl-canary",e)).style.visibility="hidden",this._detectMissingCSS();const t=this._canvasContainer=i.create("div","mapboxgl-canvas-container",e);this._interactive&&t.classList.add("mapboxgl-interactive"),this._canvas=i.create("canvas","mapboxgl-canvas",t),this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex","0"),this._canvas.setAttribute("aria-label","Map"),this._canvas.setAttribute("role","region");const o=this._containerDimensions();this._resizeCanvas(o[0],o[1]);const a=this._controlContainer=i.create("div","mapboxgl-control-container",e),r=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(e=>{r[e]=i.create("div",`mapboxgl-ctrl-${e}`,a);}),this._container.addEventListener("scroll",this._onMapScroll,!1);}_resizeCanvas(t,i){const o=e.browser.devicePixelRatio||1;this._canvas.width=o*t,this._canvas.height=o*i,this._canvas.style.width=`${t}px`,this._canvas.style.height=`${i}px`;}_setupPainter(){const i=e.extend({},t.webGLContextAttributes,{failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer,antialias:this._antialias||!1}),o=this._canvas.getContext("webgl",i)||this._canvas.getContext("experimental-webgl",i);o?(this.painter=new ji(o,this.transform),this.on("data",e=>{"source"===e.dataType&&this.painter.setTileLoadedFlag(!0);}),e.webpSupported.testSupport(o)):this.fire(new e.ErrorEvent(new Error("Failed to initialize WebGL")));}_contextLost(t){t.preventDefault(),this._frame&&(this._frame.cancel(),this._frame=null),this.fire(new e.Event("webglcontextlost",{originalEvent:t}));}_contextRestored(t){this._setupPainter(),this.resize(),this._update(),this.fire(new e.Event("webglcontextrestored",{originalEvent:t}));}_onMapScroll(e){if(e.target===this._container)return this._container.scrollTop=0,this._container.scrollLeft=0,!1}loaded(){return !this._styleDirty&&!this._sourcesDirty&&!!this.style&&this.style.loaded()}_update(e){return this.style?(this._styleDirty=this._styleDirty||e,this._sourcesDirty=!0,this.triggerRepaint(),this):this}_requestRenderFrame(e){return this._update(),this._renderTaskQueue.add(e)}_cancelRenderFrame(e){this._renderTaskQueue.remove(e);}_render(t){let i,o=0;const a=this.painter.context.extTimerQuery;if(this.listens("gpu-timing-frame")&&(i=a.createQueryEXT(),a.beginQueryEXT(a.TIME_ELAPSED_EXT,i),o=e.browser.now()),this.painter.context.setDirty(),this.painter.setBaseState(),this._renderTaskQueue.run(t),this._removed)return;let r=!1;const n=this._isInitialLoad?0:this._fadeDuration;if(this.style&&this._styleDirty){this._styleDirty=!1;const t=this.transform.zoom,i=e.browser.now();this.style.zoomHistory.update(t,i);const o=new e.EvaluationParameters(t,{now:i,fadeDuration:n,zoomHistory:this.style.zoomHistory,transition:this.style.getTransition()}),a=o.crossFadingFactor();1===a&&a===this._crossFadingFactor||(r=!0,this._crossFadingFactor=a),this.style.update(o);}if(this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this._updateTerrain(),this.style._updateSources(this.transform)),this._placementDirty=this.style&&this.style._updatePlacement(this.painter.transform,this.showCollisionBoxes,n,this._crossSourceCollisions),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,showQueryGeometry:!!this._showQueryGeometry,rotating:this.isRotating(),zooming:this.isZooming(),moving:this.isMoving(),fadeDuration:n,isInitialLoad:this._isInitialLoad,showPadding:this.showPadding,gpuTiming:!!this.listens("gpu-timing-layer"),speedIndexTiming:this.speedIndexTiming}),this.fire(new e.Event("render")),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire(new e.Event("load"))),this.style&&(this.style.hasTransitions()||r)&&(this._styleDirty=!0),this.style&&!this._placementDirty&&this.style._releaseSymbolFadeTiles(),this.listens("gpu-timing-frame")){const t=e.browser.now()-o;a.endQueryEXT(a.TIME_ELAPSED_EXT,i),setTimeout(()=>{const o=a.getQueryObjectEXT(i,a.QUERY_RESULT_EXT)/1e6;a.deleteQueryEXT(i),this.fire(new e.Event("gpu-timing-frame",{cpuTime:t,gpuTime:o}));},50);}if(this.listens("gpu-timing-layer")){const t=this.painter.collectGpuTimers();setTimeout(()=>{const i=this.painter.queryGpuTimers(t);this.fire(new e.Event("gpu-timing-layer",{layerTimes:i}));},50);}const s=this._sourcesDirty||this._styleDirty||this._placementDirty;if(s||this._repaint)this.triggerRepaint();else if(this._triggerFrame(!1),!this.isMoving()&&this.loaded()&&(this.fire(new e.Event("idle")),this._isInitialLoad&&this._authenticate(),this._isInitialLoad=!1,this.speedIndexTiming)){const t=this._calculateSpeedIndex();this.fire(new e.Event("speedindexcompleted",{speedIndex:t})),this.speedIndexTiming=!1;}return !this._loaded||this._fullyLoaded||s||(this._fullyLoaded=!0),this}_authenticate(){e.getMapSessionAPI(this._getMapId(),this._requestManager._skuToken,this._requestManager._customAccessToken,t=>{if(t&&(t.message===e.AUTH_ERR_MSG||401===t.status)){console.error("Error: A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/"),e.browser.setErrorState();const t=this.painter.context.gl;this._logoControl instanceof ea&&this._logoControl._updateLogo(),t&&t.clear(t.DEPTH_BUFFER_BIT|t.COLOR_BUFFER_BIT|t.STENCIL_BUFFER_BIT);}}),e.postMapLoadEvent(this._getMapId(),this._requestManager._skuToken,this._requestManager._customAccessToken,()=>{});}_updateTerrain(){this.painter.updateTerrain(this.style,this.isMoving()||this.isRotating()||this.isZooming());}_calculateSpeedIndex(){const e=this.painter.canvasCopy(),t=this.painter.getCanvasCopiesAndTimestamps();t.timeStamps.push(performance.now());const i=this.painter.context.gl,o=i.createFramebuffer();function a(e){i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,e,0);const t=new Uint8Array(i.drawingBufferWidth*i.drawingBufferHeight*4);return i.readPixels(0,0,i.drawingBufferWidth,i.drawingBufferHeight,i.RGBA,i.UNSIGNED_BYTE,t),t}return i.bindFramebuffer(i.FRAMEBUFFER,o),this._canvasPixelComparison(a(e),t.canvasCopies.map(a),t.timeStamps)}_canvasPixelComparison(e,t,i){let o=i[1]-i[0];const a=e.length/4;for(let r=0;r{const t=!!this._renderNextFrame;this._frame=null,this._renderNextFrame=null,t&&this._render(e);}));}_onWindowOnline(){this._update();}_onWindowResize(e){this._trackResize&&this.resize({originalEvent:e})._update();}get showTileBoundaries(){return !!this._showTileBoundaries}set showTileBoundaries(e){this._showTileBoundaries!==e&&(this._showTileBoundaries=e,this._update());}get speedIndexTiming(){return !!this._speedIndexTiming}set speedIndexTiming(e){this._speedIndexTiming!==e&&(this._speedIndexTiming=e,this._update());}get showPadding(){return !!this._showPadding}set showPadding(e){this._showPadding!==e&&(this._showPadding=e,this._update());}get showCollisionBoxes(){return !!this._showCollisionBoxes}set showCollisionBoxes(e){this._showCollisionBoxes!==e&&(this._showCollisionBoxes=e,e?this.style._generateCollisionBoxes():this._update());}get showOverdrawInspector(){return !!this._showOverdrawInspector}set showOverdrawInspector(e){this._showOverdrawInspector!==e&&(this._showOverdrawInspector=e,this._update());}get repaint(){return !!this._repaint}set repaint(e){this._repaint!==e&&(this._repaint=e,this.triggerRepaint());}get vertices(){return !!this._vertices}set vertices(e){this._vertices=e,this._update();}_setCacheLimits(t,i){e.setCacheLimits(t,i);}get version(){return e.version}},NavigationControl:class{constructor(t){this.options=e.extend({},la,t),this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),this._container.addEventListener("contextmenu",e=>e.preventDefault()),this.options.showZoom&&(e.bindAll(["_setButtonTitle","_updateZoomButtons"],this),this._zoomInButton=this._createButton("mapboxgl-ctrl-zoom-in",e=>this._map.zoomIn({},{originalEvent:e})),i.create("span","mapboxgl-ctrl-icon",this._zoomInButton).setAttribute("aria-hidden",!0),this._zoomOutButton=this._createButton("mapboxgl-ctrl-zoom-out",e=>this._map.zoomOut({},{originalEvent:e})),i.create("span","mapboxgl-ctrl-icon",this._zoomOutButton).setAttribute("aria-hidden",!0)),this.options.showCompass&&(e.bindAll(["_rotateCompassArrow"],this),this._compass=this._createButton("mapboxgl-ctrl-compass",e=>{this.options.visualizePitch?this._map.resetNorthPitch({},{originalEvent:e}):this._map.resetNorth({},{originalEvent:e});}),this._compassIcon=i.create("span","mapboxgl-ctrl-icon",this._compass),this._compassIcon.setAttribute("aria-hidden",!0));}_updateZoomButtons(){const e=this._map.getZoom(),t=e===this._map.getMaxZoom(),i=e===this._map.getMinZoom();this._zoomInButton.disabled=t,this._zoomOutButton.disabled=i,this._zoomInButton.setAttribute("aria-disabled",t.toString()),this._zoomOutButton.setAttribute("aria-disabled",i.toString());}_rotateCompassArrow(){const e=this.options.visualizePitch?`scale(${1/Math.pow(Math.cos(this._map.transform.pitch*(Math.PI/180)),.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle*(180/Math.PI)}deg)`:`rotate(${this._map.transform.angle*(180/Math.PI)}deg)`;this._compassIcon.style.transform=e;}onAdd(e){return this._map=e,this.options.showZoom&&(this._setButtonTitle(this._zoomInButton,"ZoomIn"),this._setButtonTitle(this._zoomOutButton,"ZoomOut"),this._map.on("zoom",this._updateZoomButtons),this._updateZoomButtons()),this.options.showCompass&&(this._setButtonTitle(this._compass,"ResetBearing"),this.options.visualizePitch&&this._map.on("pitch",this._rotateCompassArrow),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new ca(this._map,this._compass,this.options.visualizePitch)),this._container}onRemove(){i.remove(this._container),this.options.showZoom&&this._map.off("zoom",this._updateZoomButtons),this.options.showCompass&&(this.options.visualizePitch&&this._map.off("pitch",this._rotateCompassArrow),this._map.off("rotate",this._rotateCompassArrow),this._handler.off(),delete this._handler),delete this._map;}_createButton(e,t){const o=i.create("button",e,this._container);return o.type="button",o.addEventListener("click",t),o}_setButtonTitle(e,t){const i=this._map._getUIString(`NavigationControl.${t}`);e.title=i,e.setAttribute("aria-label",i);}},GeolocateControl:class extends e.Evented{constructor(t){super(),this.options=e.extend({},ma,t),e.bindAll(["_onSuccess","_onError","_onZoom","_finish","_setupUI","_updateCamera","_updateMarker"],this);}onAdd(t){var o;return this._map=t,this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),o=this._setupUI,void 0!==pa?o(pa):void 0!==e.window.navigator.permissions?e.window.navigator.permissions.query({name:"geolocation"}).then(e=>{pa="denied"!==e.state,o(pa);}):(pa=!!e.window.navigator.geolocation,o(pa)),this._container}onRemove(){void 0!==this._geolocationWatchID&&(e.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker&&this._userLocationDotMarker.remove(),this.options.showAccuracyCircle&&this._accuracyCircleMarker&&this._accuracyCircleMarker.remove(),i.remove(this._container),this._map.off("zoom",this._onZoom),this._map=void 0,fa=0,ga=!1;}_isOutOfMapMaxBounds(e){const t=this._map.getMaxBounds(),i=e.coords;return t&&(i.longitudet.getEast()||i.latitudet.getNorth())}_setErrorState(){switch(this._watchState){case"WAITING_ACTIVE":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"ACTIVE_LOCK":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");break;case"BACKGROUND":this._watchState="BACKGROUND_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");}}_onSuccess(t){if(this._map){if(this._isOutOfMapMaxBounds(t))return this._setErrorState(),this.fire(new e.Event("outofmaxbounds",t)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=t,this._watchState){case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"BACKGROUND":case"BACKGROUND_ERROR":this._watchState="BACKGROUND",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");}this.options.showUserLocation&&"OFF"!==this._watchState&&this._updateMarker(t),this.options.trackUserLocation&&"ACTIVE_LOCK"!==this._watchState||this._updateCamera(t),this.options.showUserLocation&&this._dotElement.classList.remove("mapboxgl-user-location-dot-stale"),this.fire(new e.Event("geolocate",t)),this._finish();}}_updateCamera(t){const i=new e.LngLat(t.coords.longitude,t.coords.latitude),o=t.coords.accuracy,a=this._map.getBearing(),r=e.extend({bearing:a},this.options.fitBoundsOptions);this._map.fitBounds(i.toBounds(o),r,{geolocateSource:!0});}_updateMarker(t){if(t){const i=new e.LngLat(t.coords.longitude,t.coords.latitude);this._accuracyCircleMarker.setLngLat(i).addTo(this._map),this._userLocationDotMarker.setLngLat(i).addTo(this._map),this._accuracy=t.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove();}_updateCircleRadius(){const e=this._map._container.clientHeight/2,t=this._map.unproject([0,e]),i=this._map.unproject([1,e]),o=t.distanceTo(i),a=Math.ceil(2*this._accuracy/o);this._circleElement.style.width=`${a}px`,this._circleElement.style.height=`${a}px`;}_onZoom(){this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius();}_onError(t){if(this._map){if(this.options.trackUserLocation)if(1===t.code){this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.disabled=!0;const e=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.title=e,this._geolocateButton.setAttribute("aria-label",e),void 0!==this._geolocationWatchID&&this._clearWatch();}else {if(3===t.code&&ga)return;this._setErrorState();}"OFF"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add("mapboxgl-user-location-dot-stale"),this.fire(new e.Event("error",t)),this._finish();}}_finish(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0;}_setupUI(t){if(this._container.addEventListener("contextmenu",e=>e.preventDefault()),this._geolocateButton=i.create("button","mapboxgl-ctrl-geolocate",this._container),i.create("span","mapboxgl-ctrl-icon",this._geolocateButton).setAttribute("aria-hidden",!0),this._geolocateButton.type="button",!1===t){e.warnOnce("Geolocation support is not available so the GeolocateControl will be disabled.");const t=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.disabled=!0,this._geolocateButton.title=t,this._geolocateButton.setAttribute("aria-label",t);}else {const e=this._map._getUIString("GeolocateControl.FindMyLocation");this._geolocateButton.title=e,this._geolocateButton.setAttribute("aria-label",e);}this.options.trackUserLocation&&(this._geolocateButton.setAttribute("aria-pressed","false"),this._watchState="OFF"),this.options.showUserLocation&&(this._dotElement=i.create("div","mapboxgl-user-location-dot"),this._userLocationDotMarker=new _a(this._dotElement),this._circleElement=i.create("div","mapboxgl-user-location-accuracy-circle"),this._accuracyCircleMarker=new _a({element:this._circleElement,pitchAlignment:"map"}),this.options.trackUserLocation&&(this._watchState="OFF"),this._map.on("zoom",this._onZoom)),this._geolocateButton.addEventListener("click",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on("movestart",t=>{t.geolocateSource||"ACTIVE_LOCK"!==this._watchState||t.originalEvent&&"resize"===t.originalEvent.type||(this._watchState="BACKGROUND",this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this.fire(new e.Event("trackuserlocationend")));});}trigger(){if(!this._setup)return e.warnOnce("Geolocate control triggered before added to a map"),!1;if(this.options.trackUserLocation){switch(this._watchState){case"OFF":this._watchState="WAITING_ACTIVE",this.fire(new e.Event("trackuserlocationstart"));break;case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":case"BACKGROUND_ERROR":fa--,ga=!1,this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this.fire(new e.Event("trackuserlocationend"));break;case"BACKGROUND":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new e.Event("trackuserlocationstart"));}switch(this._watchState){case"WAITING_ACTIVE":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_LOCK":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"BACKGROUND":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");break;case"BACKGROUND_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error");}if("OFF"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){let t;this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","true"),fa++,fa>1?(t={maximumAge:6e5,timeout:0},ga=!0):(t=this.options.positionOptions,ga=!1),this._geolocationWatchID=e.window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t);}}else e.window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return !0}_clearWatch(){e.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","false"),this.options.showUserLocation&&this._updateMarker(null);}},AttributionControl:Qo,ScaleControl:class{constructor(t){this.options=e.extend({},va,t),e.bindAll(["_onMove","setUnit"],this);}getDefaultPosition(){return "bottom-left"}_onMove(){xa(this._map,this._container,this.options);}onAdd(e){return this._map=e,this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",e.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container}onRemove(){i.remove(this._container),this._map.off("move",this._onMove),this._map=void 0;}setUnit(e){this.options.unit=e,xa(this._map,this._container,this.options);}},FullscreenControl:class{constructor(t){this._fullscreen=!1,t&&t.container&&(t.container instanceof e.window.HTMLElement?this._container=t.container:e.warnOnce("Full screen control 'container' must be a DOM element.")),e.bindAll(["_onClickFullscreen","_changeIcon"],this),"onfullscreenchange"in e.window.document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in e.window.document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in e.window.document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in e.window.document&&(this._fullscreenchange="MSFullscreenChange");}onAdd(t){return this._map=t,this._container||(this._container=this._map.getContainer()),this._controlContainer=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display="none",e.warnOnce("This device does not support fullscreen mode.")),this._controlContainer}onRemove(){i.remove(this._controlContainer),this._map=null,e.window.document.removeEventListener(this._fullscreenchange,this._changeIcon);}_checkFullscreenSupport(){return !!(e.window.document.fullscreenEnabled||e.window.document.mozFullScreenEnabled||e.window.document.msFullscreenEnabled||e.window.document.webkitFullscreenEnabled)}_setupUI(){const t=this._fullscreenButton=i.create("button","mapboxgl-ctrl-fullscreen",this._controlContainer);i.create("span","mapboxgl-ctrl-icon",t).setAttribute("aria-hidden",!0),t.type="button",this._updateTitle(),this._fullscreenButton.addEventListener("click",this._onClickFullscreen),e.window.document.addEventListener(this._fullscreenchange,this._changeIcon);}_updateTitle(){const e=this._getTitle();this._fullscreenButton.setAttribute("aria-label",e),this._fullscreenButton.title=e;}_getTitle(){return this._map._getUIString(this._isFullscreen()?"FullscreenControl.Exit":"FullscreenControl.Enter")}_isFullscreen(){return this._fullscreen}_changeIcon(){(e.window.document.fullscreenElement||e.window.document.mozFullScreenElement||e.window.document.webkitFullscreenElement||e.window.document.msFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle("mapboxgl-ctrl-shrink"),this._fullscreenButton.classList.toggle("mapboxgl-ctrl-fullscreen"),this._updateTitle());}_onClickFullscreen(){this._isFullscreen()?e.window.document.exitFullscreen?e.window.document.exitFullscreen():e.window.document.mozCancelFullScreen?e.window.document.mozCancelFullScreen():e.window.document.msExitFullscreen?e.window.document.msExitFullscreen():e.window.document.webkitCancelFullScreen&&e.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen();}},Popup:class extends e.Evented{constructor(t){super(),this.options=e.extend(Object.create(ba),t),e.bindAll(["_update","_onClose","remove","_onMouseMove","_onMouseUp","_onDrag"],this);}addTo(t){return this._map&&this.remove(),this._map=t,this.options.closeOnClick&&this._map.on("click",this._onClose),this.options.closeOnMove&&this._map.on("move",this._onClose),this._map.on("remove",this.remove),this._update(),this._focusFirstElement(),this._trackPointer?(this._map.on("mousemove",this._onMouseMove),this._map.on("mouseup",this._onMouseUp),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")):this._map.on("move",this._update),this.fire(new e.Event("open")),this}isOpen(){return !!this._map}remove(){return this._content&&i.remove(this._content),this._container&&(i.remove(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("move",this._onClose),this._map.off("click",this._onClose),this._map.off("remove",this.remove),this._map.off("mousemove",this._onMouseMove),this._map.off("mouseup",this._onMouseUp),this._map.off("drag",this._onDrag),delete this._map),this.fire(new e.Event("close")),this}getLngLat(){return this._lngLat}setLngLat(t){return this._lngLat=e.LngLat.convert(t),this._pos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on("move",this._update),this._map.off("mousemove",this._onMouseMove),this._container&&this._container.classList.remove("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.remove("mapboxgl-track-pointer")),this}trackPointer(){return this._trackPointer=!0,this._pos=null,this._update(),this._map&&(this._map.off("move",this._update),this._map.on("mousemove",this._onMouseMove),this._map.on("drag",this._onDrag),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")),this}getElement(){return this._container}setText(t){return this.setDOMContent(e.window.document.createTextNode(t))}setHTML(t){const i=e.window.document.createDocumentFragment(),o=e.window.document.createElement("body");let a;for(o.innerHTML=t;a=o.firstChild,a;)i.appendChild(a);return this.setDOMContent(i)}getMaxWidth(){return this._container&&this._container.style.maxWidth}setMaxWidth(e){return this.options.maxWidth=e,this._update(),this}setDOMContent(e){if(this._content)for(;this._content.hasChildNodes();)this._content.firstChild&&this._content.removeChild(this._content.firstChild);else this._content=i.create("div","mapboxgl-popup-content",this._container);return this._content.appendChild(e),this._createCloseButton(),this._update(),this._focusFirstElement(),this}addClassName(e){this._container&&this._container.classList.add(e);}removeClassName(e){this._container&&this._container.classList.remove(e);}setOffset(e){return this.options.offset=e,this._update(),this}toggleClassName(e){if(this._container)return this._container.classList.toggle(e)}_createCloseButton(){this.options.closeButton&&(this._closeButton=i.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.setAttribute("aria-label","Close popup"),this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClose));}_onMouseUp(e){this._update(e.point);}_onMouseMove(e){this._update(e.point);}_onDrag(e){this._update(e.point);}_update(t){if(!this._map||!this._lngLat&&!this._trackPointer||!this._content)return;if(this._container||(this._container=i.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=i.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content),this.options.className&&this.options.className.split(" ").forEach(e=>this._container.classList.add(e)),this._trackPointer&&this._container.classList.add("mapboxgl-popup-track-pointer")),this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=ha(this._lngLat,this._pos,this._map.transform)),this._trackPointer&&!t)return;const o=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat);let a=this.options.anchor;const r=function t(i){if(i){if("number"==typeof i){const t=Math.round(Math.sqrt(.5*Math.pow(i,2)));return {center:new e.Point(0,0),top:new e.Point(0,i),"top-left":new e.Point(t,t),"top-right":new e.Point(-t,t),bottom:new e.Point(0,-i),"bottom-left":new e.Point(t,-t),"bottom-right":new e.Point(-t,-t),left:new e.Point(i,0),right:new e.Point(-i,0)}}if(i instanceof e.Point||Array.isArray(i)){const t=e.Point.convert(i);return {center:t,top:t,"top-left":t,"top-right":t,bottom:t,"bottom-left":t,"bottom-right":t,left:t,right:t}}return {center:e.Point.convert(i.center||[0,0]),top:e.Point.convert(i.top||[0,0]),"top-left":e.Point.convert(i["top-left"]||[0,0]),"top-right":e.Point.convert(i["top-right"]||[0,0]),bottom:e.Point.convert(i.bottom||[0,0]),"bottom-left":e.Point.convert(i["bottom-left"]||[0,0]),"bottom-right":e.Point.convert(i["bottom-right"]||[0,0]),left:e.Point.convert(i.left||[0,0]),right:e.Point.convert(i.right||[0,0])}}return t(new e.Point(0,0))}(this.options.offset);if(!a){const e=this._container.offsetWidth,t=this._container.offsetHeight;let i;i=o.y+r.bottom.ythis._map.transform.height-t?["bottom"]:[],o.xthis._map.transform.width-e/2&&i.push("right"),a=0===i.length?"bottom":i.join("-");}const n=o.add(r[a]).round();i.setTransform(this._container,`${ua[a]} translate(${n.x}px,${n.y}px)`),da(this._container,a,"popup");}_focusFirstElement(){if(!this.options.focusAfterOpen||!this._container)return;const e=this._container.querySelector(wa);e&&e.focus();}_onClose(){this.remove();}},Marker:_a,Style:We,LngLat:e.LngLat,LngLatBounds:e.LngLatBounds,Point:e.Point,MercatorCoordinate:e.MercatorCoordinate,FreeCameraOptions:eo,Evented:e.Evented,config:e.config,prewarm:function(){q().acquire(N);},clearPrewarmedResources:function(){const e=G;e&&(e.isPreloaded()&&1===e.numActive()?(e.release(N),G=null):console.warn("Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()"));},get accessToken(){return e.config.ACCESS_TOKEN},set accessToken(t){e.config.ACCESS_TOKEN=t;},get baseApiUrl(){return e.config.API_URL},set baseApiUrl(t){e.config.API_URL=t;},get workerCount(){return Z.workerCount},set workerCount(e){Z.workerCount=e;},get maxParallelImageRequests(){return e.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(t){e.config.MAX_PARALLEL_IMAGE_REQUESTS=t;},clearStorage(t){e.clearTileCache(t);},workerUrl:""};return Ta})); + +// + +return mapboxgl; + +}))); +//# sourceMappingURL=mapbox-gl.js.map diff --git a/public/mapbox/mapbox-gl-unminified.js b/public/mapbox/mapbox-gl-unminified.js new file mode 100644 index 0000000..887b9c7 --- /dev/null +++ b/public/mapbox/mapbox-gl-unminified.js @@ -0,0 +1,45619 @@ +/* Mapbox GL JS is Copyright © 2020 Mapbox and subject to the Mapbox Terms of Service ((https://www.mapbox.com/legal/tos/). */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : +typeof define === 'function' && define.amd ? define(factory) : +(global = global || self, global.mapboxgl = factory()); +}(this, (function () { 'use strict'; + +/* eslint-disable */ + +var shared, worker, mapboxgl; +// define gets called three times: one for each chunk. we rely on the order +// they're imported to know which is which +function define(_, chunk) { +if (!shared) { + shared = chunk; +} else if (!worker) { + worker = chunk; +} else { + var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' + + var sharedChunk = {}; + shared(sharedChunk); + mapboxgl = chunk(sharedChunk); + if (typeof window !== 'undefined') { + mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); + } +} +} + + +define(['exports'], function (exports) { 'use strict'; + +var version = "2.1.0-dev"; + +var unitbezier = UnitBezier; +function UnitBezier(p1x, p1y, p2x, p2y) { + this.cx = 3 * p1x; + this.bx = 3 * (p2x - p1x) - this.cx; + this.ax = 1 - this.cx - this.bx; + this.cy = 3 * p1y; + this.by = 3 * (p2y - p1y) - this.cy; + this.ay = 1 - this.cy - this.by; + this.p1x = p1x; + this.p1y = p2y; + this.p2x = p2x; + this.p2y = p2y; +} +UnitBezier.prototype.sampleCurveX = function (t) { + return ((this.ax * t + this.bx) * t + this.cx) * t; +}; +UnitBezier.prototype.sampleCurveY = function (t) { + return ((this.ay * t + this.by) * t + this.cy) * t; +}; +UnitBezier.prototype.sampleCurveDerivativeX = function (t) { + return (3 * this.ax * t + 2 * this.bx) * t + this.cx; +}; +UnitBezier.prototype.solveCurveX = function (x, epsilon) { + if (typeof epsilon === 'undefined') + epsilon = 0.000001; + var t0, t1, t2, x2, i; + for (t2 = x, i = 0; i < 8; i++) { + x2 = this.sampleCurveX(t2) - x; + if (Math.abs(x2) < epsilon) + return t2; + var d2 = this.sampleCurveDerivativeX(t2); + if (Math.abs(d2) < 0.000001) + break; + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) + return t0; + if (t2 > t1) + return t1; + while (t0 < t1) { + x2 = this.sampleCurveX(t2); + if (Math.abs(x2 - x) < epsilon) + return t2; + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) * 0.5 + t0; + } + return t2; +}; +UnitBezier.prototype.solve = function (x, epsilon) { + return this.sampleCurveY(this.solveCurveX(x, epsilon)); +}; + +var pointGeometry = Point; +function Point(x, y) { + this.x = x; + this.y = y; +} +Point.prototype = { + clone: function () { + return new Point(this.x, this.y); + }, + add: function (p) { + return this.clone()._add(p); + }, + sub: function (p) { + return this.clone()._sub(p); + }, + multByPoint: function (p) { + return this.clone()._multByPoint(p); + }, + divByPoint: function (p) { + return this.clone()._divByPoint(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); + }, + rotateAround: function (a, p) { + return this.clone()._rotateAround(a, p); + }, + 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 (other) { + return this.x === other.x && this.y === other.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); + }, + 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; + }, + _multByPoint: function (p) { + this.x *= p.x; + this.y *= p.y; + return this; + }, + _divByPoint: function (p) { + this.x /= p.x; + this.y /= p.y; + 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; + }, + _rotateAround: function (angle, p) { + var cos = Math.cos(angle), sin = Math.sin(angle), x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), y = p.y + sin * (this.x - p.x) + cos * (this.y - p.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; + } +}; +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; + +var window$1 = typeof self !== 'undefined' ? self : {}; + +function deepEqual(a, b) { + if (Array.isArray(a)) { + if (!Array.isArray(b) || a.length !== b.length) + return false; + for (let i = 0; i < a.length; i++) { + if (!deepEqual(a[i], b[i])) + return false; + } + return true; + } + if (typeof a === 'object' && a !== null && b !== null) { + if (!(typeof b === 'object')) + return false; + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) + return false; + for (const key in a) { + if (!deepEqual(a[key], b[key])) + return false; + } + return true; + } + return a === b; +} + +const MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; +const DEG_TO_RAD = Math.PI / 180; +const RAD_TO_DEG = 180 / Math.PI; +function degToRad(a) { + return a * DEG_TO_RAD; +} +function radToDeg(a) { + return a * RAD_TO_DEG; +} +function easeCubicInOut(t) { + if (t <= 0) + return 0; + if (t >= 1) + return 1; + const t2 = t * t, t3 = t2 * t; + return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); +} +function getBounds(points) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const p of points) { + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + maxX = Math.max(maxX, p.x); + maxY = Math.max(maxY, p.y); + } + return { + min: new pointGeometry(minX, minY), + max: new pointGeometry(maxX, maxY) + }; +} +function polygonizeBounds(min, max, buffer = 0, close = true) { + const offset = new pointGeometry(buffer, buffer); + const minBuf = min.sub(offset); + const maxBuf = max.add(offset); + const polygon = [ + minBuf, + new pointGeometry(maxBuf.x, minBuf.y), + maxBuf, + new pointGeometry(minBuf.x, maxBuf.y) + ]; + if (close) { + polygon.push(minBuf); + } + return polygon; +} +function bufferConvexPolygon(ring, buffer) { + const output = []; + for (let currIdx = 0; currIdx < ring.length; currIdx++) { + const prevIdx = wrap(currIdx - 1, -1, ring.length - 1); + const nextIdx = wrap(currIdx + 1, -1, ring.length - 1); + const prev = ring[prevIdx]; + const curr = ring[currIdx]; + const next = ring[nextIdx]; + const p1 = prev.sub(curr).unit(); + const p2 = next.sub(curr).unit(); + const interiorAngle = p2.angleWithSep(p1.x, p1.y); + const offset = p1.add(p2).unit().mult(-1 * buffer / Math.sin(interiorAngle / 2)); + output.push(curr.add(offset)); + } + return output; +} +function bezier(p1x, p1y, p2x, p2y) { + const bezier = new unitbezier(p1x, p1y, p2x, p2y); + return function (t) { + return bezier.solve(t); + }; +} +const ease = bezier(0.25, 0.1, 0.25, 1); +function clamp(n, min, max) { + return Math.min(max, Math.max(min, n)); +} +function wrap(n, min, max) { + const d = max - min; + const w = ((n - min) % d + d) % d + min; + return w === min ? max : w; +} +function asyncAll(array, fn, callback) { + if (!array.length) { + return callback(null, []); + } + let remaining = array.length; + const results = new Array(array.length); + let error = null; + array.forEach((item, i) => { + fn(item, (err, result) => { + if (err) + error = err; + results[i] = result; + if (--remaining === 0) + callback(error, results); + }); + }); +} +function values(obj) { + const result = []; + for (const k in obj) { + result.push(obj[k]); + } + return result; +} +function keysDifference(obj, other) { + const difference = []; + for (const i in obj) { + if (!(i in other)) { + difference.push(i); + } + } + return difference; +} +function extend(dest, ...sources) { + for (const src of sources) { + for (const k in src) { + dest[k] = src[k]; + } + } + return dest; +} +function pick(src, properties) { + const result = {}; + for (let i = 0; i < properties.length; i++) { + const k = properties[i]; + if (k in src) { + result[k] = src[k]; + } + } + return result; +} +let id = 1; +function uniqueId() { + return id++; +} +function uuid() { + function b(a) { + return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([10000000] + -[1000] + -4000 + -8000 + -100000000000).replace(/[018]/g, b); + } + return b(); +} +function nextPowerOfTwo(value) { + if (value <= 1) + return 1; + return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); +} +function prevPowerOfTwo(value) { + if (value <= 1) + return 1; + return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); +} +function validateUuid(str) { + return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false; +} +function bindAll(fns, context) { + fns.forEach(fn => { + if (!context[fn]) { + return; + } + context[fn] = context[fn].bind(context); + }); +} +function endsWith(string, suffix) { + return string.indexOf(suffix, string.length - suffix.length) !== -1; +} +function mapObject(input, iterator, context) { + const output = {}; + for (const key in input) { + output[key] = iterator.call(context || this, input[key], key, input); + } + return output; +} +function filterObject(input, iterator, context) { + const output = {}; + for (const key in input) { + if (iterator.call(context || this, input[key], key, input)) { + output[key] = input[key]; + } + } + return output; +} +function clone(input) { + if (Array.isArray(input)) { + return input.map(clone); + } else if (typeof input === 'object' && input) { + return mapObject(input, clone); + } else { + return input; + } +} +function arraysIntersect(a, b) { + for (let l = 0; l < a.length; l++) { + if (b.indexOf(a[l]) >= 0) + return true; + } + return false; +} +const warnOnceHistory = {}; +function warnOnce(message) { + if (!warnOnceHistory[message]) { + if (typeof console !== 'undefined') + console.warn(message); + warnOnceHistory[message] = true; + } +} +function isCounterClockwise(a, b, c) { + return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); +} +function calculateSignedArea(ring) { + let sum = 0; + for (let 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; +} +function isWorker() { + return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope; +} +function parseCacheControl(cacheControl) { + const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; + const header = {}; + cacheControl.replace(re, ($0, $1, $2, $3) => { + const value = $2 || $3; + header[$1] = value ? value.toLowerCase() : true; + return ''; + }); + if (header['max-age']) { + const maxAge = parseInt(header['max-age'], 10); + if (isNaN(maxAge)) + delete header['max-age']; + else + header['max-age'] = maxAge; + } + return header; +} +let _isSafari = null; +function isSafari(scope) { + if (_isSafari == null) { + const userAgent = scope.navigator ? scope.navigator.userAgent : null; + _isSafari = !!scope.safari || !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || !!userAgent.match('Safari') && !userAgent.match('Chrome'))); + } + return _isSafari; +} +function storageAvailable(type) { + try { + const storage = window$1[type]; + storage.setItem('_mapbox_test_', 1); + storage.removeItem('_mapbox_test_'); + return true; + } catch (e) { + return false; + } +} +function b64EncodeUnicode(str) { + return window$1.btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => { + return String.fromCharCode(Number('0x' + p1)); + })); +} +function b64DecodeUnicode(str) { + return decodeURIComponent(window$1.atob(str).split('').map(c => { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); +} + +let linkEl; +let reducedMotionQuery; +let errorState = false; +let stubTime; +const exported = { + now() { + if (stubTime !== undefined) { + return stubTime; + } + return window$1.performance.now(); + }, + setErrorState() { + errorState = true; + }, + setNow(time) { + stubTime = time; + }, + restoreNow() { + stubTime = undefined; + }, + frame(fn) { + if (errorState) + return { + cancel: () => { + } + }; + const frame = window$1.requestAnimationFrame(fn); + return { cancel: () => window$1.cancelAnimationFrame(frame) }; + }, + getImageData(img, padding = 0) { + const canvas = window$1.document.createElement('canvas'); + const context = canvas.getContext('2d'); + if (!context) { + throw new Error('failed to create canvas 2d context'); + } + canvas.width = img.width; + canvas.height = img.height; + context.drawImage(img, 0, 0, img.width, img.height); + return context.getImageData(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding); + }, + resolveURL(path) { + if (!linkEl) + linkEl = window$1.document.createElement('a'); + linkEl.href = path; + return linkEl.href; + }, + get devicePixelRatio() { + return window$1.devicePixelRatio; + }, + get prefersReducedMotion() { + if (!window$1.matchMedia) + return false; + if (reducedMotionQuery == null) { + reducedMotionQuery = window$1.matchMedia('(prefers-reduced-motion: reduce)'); + } + return reducedMotionQuery.matches; + } +}; + +let mapboxHTTPURLRegex; +const config = { + API_URL: 'https://api.mapbox.com', + get API_URL_REGEX() { + if (mapboxHTTPURLRegex == null) { + const prodMapboxHTTPURLRegex = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; + try { + mapboxHTTPURLRegex = process.env.API_URL_REGEX != null ? new RegExp(process.env.API_URL_REGEX) : prodMapboxHTTPURLRegex; + } catch (e) { + mapboxHTTPURLRegex = prodMapboxHTTPURLRegex; + } + } + return mapboxHTTPURLRegex; + }, + get EVENTS_URL() { + if (!this.API_URL) { + return null; + } + if (this.API_URL.indexOf('https://api.mapbox.cn') === 0) { + return 'https://events.mapbox.cn/events/v2'; + } else if (this.API_URL.indexOf('https://api.mapbox.com') === 0) { + return 'https://events.mapbox.com/events/v2'; + } else { + return null; + } + }, + SESSION_PATH: '/map-sessions/v1', + FEEDBACK_URL: 'https://apps.mapbox.com/feedback', + TILE_URL_VERSION: 'v4', + RASTER_URL_PREFIX: 'raster/v1', + REQUIRE_ACCESS_TOKEN: true, + ACCESS_TOKEN: null, + MAX_PARALLEL_IMAGE_REQUESTS: 16 +}; + +const exported$1 = { + supported: false, + testSupport +}; +let glForTesting; +let webpCheckComplete = false; +let webpImgTest; +let webpImgTestOnloadComplete = false; +if (window$1.document) { + webpImgTest = window$1.document.createElement('img'); + webpImgTest.onload = function () { + if (glForTesting) + testWebpTextureUpload(glForTesting); + glForTesting = null; + webpImgTestOnloadComplete = true; + }; + webpImgTest.onerror = function () { + webpCheckComplete = true; + glForTesting = null; + }; + webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; +} +function testSupport(gl) { + if (webpCheckComplete || !webpImgTest) + return; + if (webpImgTestOnloadComplete) { + testWebpTextureUpload(gl); + } else { + glForTesting = gl; + } +} +function testWebpTextureUpload(gl) { + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + try { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest); + if (gl.isContextLost()) + return; + exported$1.supported = true; + } catch (e) { + } + gl.deleteTexture(texture); + webpCheckComplete = true; +} + +const SKU_ID = '01'; +function createSkuToken() { + const TOKEN_VERSION = '1'; + const base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + let sessionRandomizer = ''; + for (let i = 0; i < 10; i++) { + sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; + } + const expiration = 12 * 60 * 60 * 1000; + const token = [ + TOKEN_VERSION, + SKU_ID, + sessionRandomizer + ].join(''); + const tokenExpiresAt = Date.now() + expiration; + return { + token, + tokenExpiresAt + }; +} + +const AUTH_ERR_MSG = 'NO_ACCESS_TOKEN'; +class RequestManager { + constructor(transformRequestFn, customAccessToken) { + this._transformRequestFn = transformRequestFn; + this._customAccessToken = customAccessToken; + this._createSkuToken(); + } + _createSkuToken() { + const skuToken = createSkuToken(); + this._skuToken = skuToken.token; + this._skuTokenExpiresAt = skuToken.tokenExpiresAt; + } + _isSkuTokenExpired() { + return Date.now() > this._skuTokenExpiresAt; + } + transformRequest(url, type) { + if (this._transformRequestFn) { + return this._transformRequestFn(url, type) || { url }; + } + return { url }; + } + normalizeStyleURL(url, accessToken) { + if (!isMapboxURL(url)) + return url; + const urlObject = parseUrl(url); + urlObject.path = `/styles/v1${ urlObject.path }`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } + normalizeGlyphsURL(url, accessToken) { + if (!isMapboxURL(url)) + return url; + const urlObject = parseUrl(url); + urlObject.path = `/fonts/v1${ urlObject.path }`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } + normalizeSourceURL(url, accessToken) { + if (!isMapboxURL(url)) + return url; + const urlObject = parseUrl(url); + urlObject.path = `/v4/${ urlObject.authority }.json`; + urlObject.params.push('secure'); + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } + normalizeSpriteURL(url, format, extension, accessToken) { + const urlObject = parseUrl(url); + if (!isMapboxURL(url)) { + urlObject.path += `${ format }${ extension }`; + return formatUrl(urlObject); + } + urlObject.path = `/styles/v1${ urlObject.path }/sprite${ format }${ extension }`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } + normalizeTileURL(tileURL, use2x, rasterTileSize) { + if (this._isSkuTokenExpired()) { + this._createSkuToken(); + } + if (tileURL && !isMapboxURL(tileURL)) + return tileURL; + const urlObject = parseUrl(tileURL); + const imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; + const extension = exported$1.supported ? '.webp' : '$1'; + const use2xAs512 = rasterTileSize && urlObject.authority !== 'raster' && rasterTileSize === 512; + const suffix = use2x || use2xAs512 ? '@2x' : ''; + urlObject.path = urlObject.path.replace(imageExtensionRe, `${ suffix }${ extension }`); + if (urlObject.authority === 'raster') { + urlObject.path = `/${ config.RASTER_URL_PREFIX }${ urlObject.path }`; + } else { + const tileURLAPIPrefixRe = /^.+\/v4\//; + urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/'); + urlObject.path = `/${ config.TILE_URL_VERSION }${ urlObject.path }`; + } + const accessToken = this._customAccessToken || getAccessToken(urlObject.params) || config.ACCESS_TOKEN; + if (config.REQUIRE_ACCESS_TOKEN && accessToken && this._skuToken) { + urlObject.params.push(`sku=${ this._skuToken }`); + } + return this._makeAPIURL(urlObject, accessToken); + } + canonicalizeTileURL(url, removeAccessToken) { + const extensionRe = /\.[\w]+$/; + const urlObject = parseUrl(url); + if (!urlObject.path.match(/^(\/v4\/|\/raster\/v1\/)/) || !urlObject.path.match(extensionRe)) { + return url; + } + let result = 'mapbox://'; + if (urlObject.path.match(/^\/raster\/v1\//)) { + const rasterPrefix = `/${ config.RASTER_URL_PREFIX }/`; + result += `raster/${ urlObject.path.replace(rasterPrefix, '') }`; + } else { + const tilesPrefix = `/${ config.TILE_URL_VERSION }/`; + result += `tiles/${ urlObject.path.replace(tilesPrefix, '') }`; + } + let params = urlObject.params; + if (removeAccessToken) { + params = params.filter(p => !p.match(/^access_token=/)); + } + if (params.length) + result += `?${ params.join('&') }`; + return result; + } + canonicalizeTileset(tileJSON, sourceURL) { + const removeAccessToken = sourceURL ? isMapboxURL(sourceURL) : false; + const canonical = []; + for (const url of tileJSON.tiles || []) { + if (isMapboxHTTPURL(url)) { + canonical.push(this.canonicalizeTileURL(url, removeAccessToken)); + } else { + canonical.push(url); + } + } + return canonical; + } + _makeAPIURL(urlObject, accessToken) { + const help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; + const apiUrlObject = parseUrl(config.API_URL); + urlObject.protocol = apiUrlObject.protocol; + urlObject.authority = apiUrlObject.authority; + if (urlObject.protocol === 'http') { + const i = urlObject.params.indexOf('secure'); + if (i >= 0) + urlObject.params.splice(i, 1); + } + if (apiUrlObject.path !== '/') { + urlObject.path = `${ apiUrlObject.path }${ urlObject.path }`; + } + if (!config.REQUIRE_ACCESS_TOKEN) + return formatUrl(urlObject); + accessToken = accessToken || config.ACCESS_TOKEN; + if (!accessToken) + throw new Error(`An API access token is required to use Mapbox GL. ${ help }`); + if (accessToken[0] === 's') + throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${ help }`); + urlObject.params = urlObject.params.filter(d => d.indexOf('access_token') === -1); + urlObject.params.push(`access_token=${ accessToken }`); + return formatUrl(urlObject); + } +} +function isMapboxURL(url) { + return url.indexOf('mapbox:') === 0; +} +function isMapboxHTTPURL(url) { + return config.API_URL_REGEX.test(url); +} +function hasCacheDefeatingSku(url) { + return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url); +} +function getAccessToken(params) { + for (const param of params) { + const match = param.match(/^access_token=(.*)$/); + if (match) { + return match[1]; + } + } + return null; +} +const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; +function parseUrl(url) { + const parts = url.match(urlRe); + if (!parts) { + throw new Error('Unable to parse URL object'); + } + return { + protocol: parts[1], + authority: parts[2], + path: parts[3] || '/', + params: parts[4] ? parts[4].split('&') : [] + }; +} +function formatUrl(obj) { + const params = obj.params.length ? `?${ obj.params.join('&') }` : ''; + return `${ obj.protocol }://${ obj.authority }${ obj.path }${ params }`; +} +const telemEventKey = 'mapbox.eventData'; +function parseAccessToken(accessToken) { + if (!accessToken) { + return null; + } + const parts = accessToken.split('.'); + if (!parts || parts.length !== 3) { + return null; + } + try { + const jsonData = JSON.parse(b64DecodeUnicode(parts[1])); + return jsonData; + } catch (e) { + return null; + } +} +class TelemetryEvent { + constructor(type) { + this.type = type; + this.anonId = null; + this.eventData = {}; + this.queue = []; + this.pendingRequest = null; + } + getStorageKey(domain) { + const tokenData = parseAccessToken(config.ACCESS_TOKEN); + let u = ''; + if (tokenData && tokenData['u']) { + u = b64EncodeUnicode(tokenData['u']); + } else { + u = config.ACCESS_TOKEN || ''; + } + return domain ? `${ telemEventKey }.${ domain }:${ u }` : `${ telemEventKey }:${ u }`; + } + fetchEventData() { + const isLocalStorageAvailable = storageAvailable('localStorage'); + const storageKey = this.getStorageKey(); + const uuidKey = this.getStorageKey('uuid'); + if (isLocalStorageAvailable) { + try { + const data = window$1.localStorage.getItem(storageKey); + if (data) { + this.eventData = JSON.parse(data); + } + const uuid = window$1.localStorage.getItem(uuidKey); + if (uuid) + this.anonId = uuid; + } catch (e) { + warnOnce('Unable to read from LocalStorage'); + } + } + } + saveEventData() { + const isLocalStorageAvailable = storageAvailable('localStorage'); + const storageKey = this.getStorageKey(); + const uuidKey = this.getStorageKey('uuid'); + if (isLocalStorageAvailable) { + try { + window$1.localStorage.setItem(uuidKey, this.anonId); + if (Object.keys(this.eventData).length >= 1) { + window$1.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); + } + } catch (e) { + warnOnce('Unable to write to LocalStorage'); + } + } + } + processRequests(_) { + } + postEvent(timestamp, additionalPayload, callback, customAccessToken) { + if (!config.EVENTS_URL) + return; + const eventsUrlObject = parseUrl(config.EVENTS_URL); + eventsUrlObject.params.push(`access_token=${ customAccessToken || config.ACCESS_TOKEN || '' }`); + const payload = { + event: this.type, + created: new Date(timestamp).toISOString(), + sdkIdentifier: 'mapbox-gl-js', + sdkVersion: version, + skuId: SKU_ID, + userId: this.anonId + }; + const finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload; + const request = { + url: formatUrl(eventsUrlObject), + headers: { 'Content-Type': 'text/plain' }, + body: JSON.stringify([finalPayload]) + }; + this.pendingRequest = postData(request, error => { + this.pendingRequest = null; + callback(error); + this.saveEventData(); + this.processRequests(customAccessToken); + }); + } + queueRequest(event, customAccessToken) { + this.queue.push(event); + this.processRequests(customAccessToken); + } +} +class MapLoadEvent extends TelemetryEvent { + constructor() { + super('map.load'); + this.success = {}; + this.skuToken = ''; + } + postMapLoadEvent(mapId, skuToken, customAccessToken, callback) { + this.skuToken = skuToken; + this.errorCb = callback; + if (config.EVENTS_URL) { + if (customAccessToken || config.ACCESS_TOKEN) { + this.queueRequest({ + id: mapId, + timestamp: Date.now() + }, customAccessToken); + } else { + this.errorCb(new Error('A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/')); + } + } + } + processRequests(customAccessToken) { + if (this.pendingRequest || this.queue.length === 0) + return; + const {id, timestamp} = this.queue.shift(); + if (id && this.success[id]) + return; + if (!this.anonId) { + this.fetchEventData(); + } + if (!validateUuid(this.anonId)) { + this.anonId = uuid(); + } + this.postEvent(timestamp, { skuToken: this.skuToken }, err => { + if (err) { + this.errorCb(err); + } else { + if (id) + this.success[id] = true; + } + }, customAccessToken); + } +} +class MapSessionAPI extends TelemetryEvent { + constructor() { + super('map.auth'); + this.success = {}; + this.skuToken = ''; + } + getSession(timestamp, token, callback, customAccessToken) { + if (!config.API_URL || !config.SESSION_PATH) + return; + const authUrlObject = parseUrl(config.API_URL + config.SESSION_PATH); + authUrlObject.params.push(`sku=${ token || '' }`); + authUrlObject.params.push(`access_token=${ customAccessToken || config.ACCESS_TOKEN || '' }`); + const request = { + url: formatUrl(authUrlObject), + headers: { 'Content-Type': 'text/plain' } + }; + this.pendingRequest = getData(request, error => { + this.pendingRequest = null; + callback(error); + this.saveEventData(); + this.processRequests(customAccessToken); + }); + } + getSessionAPI(mapId, skuToken, customAccessToken, callback) { + this.skuToken = skuToken; + this.errorCb = callback; + if (config.SESSION_PATH && config.API_URL) { + if (customAccessToken || config.ACCESS_TOKEN) { + this.queueRequest({ + id: mapId, + timestamp: Date.now() + }, customAccessToken); + } else { + this.errorCb(new Error(AUTH_ERR_MSG)); + } + } + } + processRequests(customAccessToken) { + if (this.pendingRequest || this.queue.length === 0) + return; + const {id, timestamp} = this.queue.shift(); + if (id && this.success[id]) + return; + this.getSession(timestamp, this.skuToken, err => { + if (err) { + this.errorCb(err); + } else { + if (id) + this.success[id] = true; + } + }, customAccessToken); + } +} +class TurnstileEvent extends TelemetryEvent { + constructor(customAccessToken) { + super('appUserTurnstile'); + this._customAccessToken = customAccessToken; + } + postTurnstileEvent(tileUrls, customAccessToken) { + if (config.EVENTS_URL && config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(url => isMapboxURL(url) || isMapboxHTTPURL(url))) { + this.queueRequest(Date.now(), customAccessToken); + } + } + processRequests(customAccessToken) { + if (this.pendingRequest || this.queue.length === 0) { + return; + } + if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { + this.fetchEventData(); + } + const tokenData = parseAccessToken(config.ACCESS_TOKEN); + const tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; + let dueForEvent = tokenU !== this.eventData.tokenU; + if (!validateUuid(this.anonId)) { + this.anonId = uuid(); + dueForEvent = true; + } + const nextUpdate = this.queue.shift(); + if (this.eventData.lastSuccess) { + const lastUpdate = new Date(this.eventData.lastSuccess); + const nextDate = new Date(nextUpdate); + const daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); + dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); + } else { + dueForEvent = true; + } + if (!dueForEvent) { + return this.processRequests(); + } + this.postEvent(nextUpdate, { 'enabled.telemetry': false }, err => { + if (!err) { + this.eventData.lastSuccess = nextUpdate; + this.eventData.tokenU = tokenU; + } + }, customAccessToken); + } +} +const turnstileEvent_ = new TurnstileEvent(); +const postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); +const mapLoadEvent_ = new MapLoadEvent(); +const postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); +const mapSessionAPI_ = new MapSessionAPI(); +const getMapSessionAPI = mapSessionAPI_.getSessionAPI.bind(mapSessionAPI_); + +const CACHE_NAME = 'mapbox-tiles'; +let cacheLimit = 500; +let cacheCheckThreshold = 50; +const MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; +let sharedCache; +function cacheOpen() { + if (window$1.caches && !sharedCache) { + sharedCache = window$1.caches.open(CACHE_NAME); + } +} +let responseConstructorSupportsReadableStream; +function prepareBody(response, callback) { + if (responseConstructorSupportsReadableStream === undefined) { + try { + new Response(new ReadableStream()); + responseConstructorSupportsReadableStream = true; + } catch (e) { + responseConstructorSupportsReadableStream = false; + } + } + if (responseConstructorSupportsReadableStream) { + callback(response.body); + } else { + response.blob().then(callback); + } +} +function cachePut(request, response, requestTime) { + cacheOpen(); + if (!sharedCache) + return; + const options = { + status: response.status, + statusText: response.statusText, + headers: new window$1.Headers() + }; + response.headers.forEach((v, k) => options.headers.set(k, v)); + const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); + if (cacheControl['no-store']) { + return; + } + if (cacheControl['max-age']) { + options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString()); + } + const timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime; + if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) + return; + prepareBody(response, body => { + const clonedResponse = new window$1.Response(body, options); + cacheOpen(); + if (!sharedCache) + return; + sharedCache.then(cache => cache.put(stripQueryParameters(request.url), clonedResponse)).catch(e => warnOnce(e.message)); + }); +} +function stripQueryParameters(url) { + const start = url.indexOf('?'); + return start < 0 ? url : url.slice(0, start); +} +function cacheGet(request, callback) { + cacheOpen(); + if (!sharedCache) + return callback(null); + const strippedURL = stripQueryParameters(request.url); + sharedCache.then(cache => { + cache.match(strippedURL).then(response => { + const fresh = isFresh(response); + cache.delete(strippedURL); + if (fresh) { + cache.put(strippedURL, response.clone()); + } + callback(null, response, fresh); + }).catch(callback); + }).catch(callback); +} +function isFresh(response) { + if (!response) + return false; + const expires = new Date(response.headers.get('Expires') || 0); + const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); + return expires > Date.now() && !cacheControl['no-cache']; +} +let globalEntryCounter = Infinity; +function cacheEntryPossiblyAdded(dispatcher) { + globalEntryCounter++; + if (globalEntryCounter > cacheCheckThreshold) { + dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit); + globalEntryCounter = 0; + } +} +function enforceCacheSizeLimit(limit) { + cacheOpen(); + if (!sharedCache) + return; + sharedCache.then(cache => { + cache.keys().then(keys => { + for (let i = 0; i < keys.length - limit; i++) { + cache.delete(keys[i]); + } + }); + }); +} +function clearTileCache(callback) { + const promise = window$1.caches.delete(CACHE_NAME); + if (callback) { + promise.catch(callback).then(() => callback()); + } +} +function setCacheLimits(limit, checkThreshold) { + cacheLimit = limit; + cacheCheckThreshold = checkThreshold; +} + +let supportsOffscreenCanvas; +function offscreenCanvasSupported() { + if (supportsOffscreenCanvas == null) { + supportsOffscreenCanvas = window$1.OffscreenCanvas && new window$1.OffscreenCanvas(1, 1).getContext('2d') && typeof window$1.createImageBitmap === 'function'; + } + return supportsOffscreenCanvas; +} + +const ResourceType = { + Unknown: 'Unknown', + Style: 'Style', + Source: 'Source', + Tile: 'Tile', + Glyphs: 'Glyphs', + SpriteImage: 'SpriteImage', + SpriteJSON: 'SpriteJSON', + Image: 'Image' +}; +if (typeof Object.freeze == 'function') { + Object.freeze(ResourceType); +} +class AJAXError extends Error { + constructor(message, status, url) { + if (status === 401 && isMapboxHTTPURL(url)) { + message += ': you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; + } + super(message); + this.status = status; + this.url = url; + } + toString() { + return `${ this.name }: ${ this.message } (${ this.status }): ${ this.url }`; + } +} +const getReferrer = isWorker() ? () => self.worker && self.worker.referrer : () => (window$1.location.protocol === 'blob:' ? window$1.parent : window$1).location.href; +const isFileURL = url => /^file:/.test(url) || /^file:/.test(getReferrer()) && !/^\w+:/.test(url); +function makeFetchRequest(requestParameters, callback) { + const controller = new window$1.AbortController(); + const request = new window$1.Request(requestParameters.url, { + method: requestParameters.method || 'GET', + body: requestParameters.body, + credentials: requestParameters.credentials, + headers: requestParameters.headers, + referrer: getReferrer(), + signal: controller.signal + }); + let complete = false; + let aborted = false; + const cacheIgnoringSearch = hasCacheDefeatingSku(request.url); + if (requestParameters.type === 'json') { + request.headers.set('Accept', 'application/json'); + } + const validateOrFetch = (err, cachedResponse, responseIsFresh) => { + if (aborted) + return; + if (err) { + if (err.message !== 'SecurityError') { + warnOnce(err); + } + } + if (cachedResponse && responseIsFresh) { + return finishRequest(cachedResponse); + } + const requestTime = Date.now(); + window$1.fetch(request).then(response => { + if (response.ok) { + const cacheableResponse = cacheIgnoringSearch ? response.clone() : null; + return finishRequest(response, cacheableResponse, requestTime); + } else { + return callback(new AJAXError(response.statusText, response.status, requestParameters.url)); + } + }).catch(error => { + if (error.code === 20) { + return; + } + callback(new Error(error.message)); + }); + }; + const finishRequest = (response, cacheableResponse, requestTime) => { + (requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() : requestParameters.type === 'json' ? response.json() : response.text()).then(result => { + if (aborted) + return; + if (cacheableResponse && requestTime) { + cachePut(request, cacheableResponse, requestTime); + } + complete = true; + callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires')); + }).catch(err => { + if (!aborted) + callback(new Error(err.message)); + }); + }; + if (cacheIgnoringSearch) { + cacheGet(request, validateOrFetch); + } else { + validateOrFetch(null, null); + } + return { + cancel: () => { + aborted = true; + if (!complete) + controller.abort(); + } + }; +} +function makeXMLHttpRequest(requestParameters, callback) { + const xhr = new window$1.XMLHttpRequest(); + xhr.open(requestParameters.method || 'GET', requestParameters.url, true); + if (requestParameters.type === 'arrayBuffer') { + xhr.responseType = 'arraybuffer'; + } + for (const k in requestParameters.headers) { + xhr.setRequestHeader(k, requestParameters.headers[k]); + } + if (requestParameters.type === 'json') { + xhr.responseType = 'text'; + xhr.setRequestHeader('Accept', 'application/json'); + } + xhr.withCredentials = requestParameters.credentials === 'include'; + xhr.onerror = () => { + callback(new Error(xhr.statusText)); + }; + xhr.onload = () => { + if ((xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) && xhr.response !== null) { + let data = xhr.response; + if (requestParameters.type === 'json') { + try { + data = JSON.parse(xhr.response); + } catch (err) { + return callback(err); + } + } + callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires')); + } else { + callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url)); + } + }; + xhr.send(requestParameters.body); + return { cancel: () => xhr.abort() }; +} +const makeRequest = function (requestParameters, callback) { + if (!isFileURL(requestParameters.url)) { + if (window$1.fetch && window$1.Request && window$1.AbortController && window$1.Request.prototype.hasOwnProperty('signal')) { + return makeFetchRequest(requestParameters, callback); + } + if (isWorker() && self.worker && self.worker.actor) { + const queueOnMainThread = true; + return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread); + } + } + return makeXMLHttpRequest(requestParameters, callback); +}; +const getJSON = function (requestParameters, callback) { + return makeRequest(extend(requestParameters, { type: 'json' }), callback); +}; +const getArrayBuffer = function (requestParameters, callback) { + return makeRequest(extend(requestParameters, { type: 'arrayBuffer' }), callback); +}; +const postData = function (requestParameters, callback) { + return makeRequest(extend(requestParameters, { method: 'POST' }), callback); +}; +const getData = function (requestParameters, callback) { + return makeRequest(extend(requestParameters, { method: 'GET' }), callback); +}; +function sameOrigin(url) { + const a = window$1.document.createElement('a'); + a.href = url; + return a.protocol === window$1.document.location.protocol && a.host === window$1.document.location.host; +} +const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; +function arrayBufferToImage(data, callback, cacheControl, expires) { + const img = new window$1.Image(); + const URL = window$1.URL; + img.onload = () => { + callback(null, img); + URL.revokeObjectURL(img.src); + img.onload = null; + window$1.requestAnimationFrame(() => { + img.src = transparentPngUrl; + }); + }; + img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.')); + const blob = new window$1.Blob([new Uint8Array(data)], { type: 'image/png' }); + img.cacheControl = cacheControl; + img.expires = expires; + img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; +} +function arrayBufferToImageBitmap(data, callback) { + const blob = new window$1.Blob([new Uint8Array(data)], { type: 'image/png' }); + window$1.createImageBitmap(blob).then(imgBitmap => { + callback(null, imgBitmap); + }).catch(e => { + callback(new Error(`Could not load image because of ${ e.message }. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`)); + }); +} +let imageQueue, numImageRequests; +const resetImageRequestQueue = () => { + imageQueue = []; + numImageRequests = 0; +}; +resetImageRequestQueue(); +const getImage = function (requestParameters, callback) { + if (exported$1.supported) { + if (!requestParameters.headers) { + requestParameters.headers = {}; + } + requestParameters.headers.accept = 'image/webp,*/*'; + } + if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { + const queued = { + requestParameters, + callback, + cancelled: false, + cancel() { + this.cancelled = true; + } + }; + imageQueue.push(queued); + return queued; + } + numImageRequests++; + let advanced = false; + const advanceImageRequestQueue = () => { + if (advanced) + return; + advanced = true; + numImageRequests--; + while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { + const request = imageQueue.shift(); + const {requestParameters, callback, cancelled} = request; + if (!cancelled) { + request.cancel = getImage(requestParameters, callback).cancel; + } + } + }; + const request = getArrayBuffer(requestParameters, (err, data, cacheControl, expires) => { + advanceImageRequestQueue(); + if (err) { + callback(err); + } else if (data) { + if (offscreenCanvasSupported()) { + arrayBufferToImageBitmap(data, callback); + } else { + arrayBufferToImage(data, callback, cacheControl, expires); + } + } + }); + return { + cancel: () => { + request.cancel(); + advanceImageRequestQueue(); + } + }; +}; +const getVideo = function (urls, callback) { + const video = window$1.document.createElement('video'); + video.muted = true; + video.onloadstart = function () { + callback(null, video); + }; + for (let i = 0; i < urls.length; i++) { + const s = window$1.document.createElement('source'); + if (!sameOrigin(urls[i])) { + video.crossOrigin = 'Anonymous'; + } + s.src = urls[i]; + video.appendChild(s); + } + return { + cancel: () => { + } + }; +}; + +function _addEventListener(type, listener, listenerList) { + const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; + if (!listenerExists) { + listenerList[type] = listenerList[type] || []; + listenerList[type].push(listener); + } +} +function _removeEventListener(type, listener, listenerList) { + if (listenerList && listenerList[type]) { + const index = listenerList[type].indexOf(listener); + if (index !== -1) { + listenerList[type].splice(index, 1); + } + } +} +class Event { + constructor(type, data = {}) { + extend(this, data); + this.type = type; + } +} +class ErrorEvent extends Event { + constructor(error, data = {}) { + super('error', extend({ error }, data)); + } +} +class Evented { + on(type, listener) { + this._listeners = this._listeners || {}; + _addEventListener(type, listener, this._listeners); + return this; + } + off(type, listener) { + _removeEventListener(type, listener, this._listeners); + _removeEventListener(type, listener, this._oneTimeListeners); + return this; + } + once(type, listener) { + if (!listener) { + return new Promise(resolve => this.once(type, resolve)); + } + this._oneTimeListeners = this._oneTimeListeners || {}; + _addEventListener(type, listener, this._oneTimeListeners); + return this; + } + fire(event, properties) { + if (typeof event === 'string') { + event = new Event(event, properties || {}); + } + const type = event.type; + if (this.listens(type)) { + event.target = this; + const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; + for (const listener of listeners) { + listener.call(this, event); + } + const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; + for (const listener of oneTimeListeners) { + _removeEventListener(type, listener, this._oneTimeListeners); + listener.call(this, event); + } + const parent = this._eventedParent; + if (parent) { + extend(event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData); + parent.fire(event); + } + } else if (event instanceof ErrorEvent) { + console.error(event.error); + } + return this; + } + listens(type) { + return !!(this._listeners && this._listeners[type] && this._listeners[type].length > 0 || this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0 || this._eventedParent && this._eventedParent.listens(type)); + } + setEventedParent(parent, data) { + this._eventedParent = parent; + this._eventedParentData = data; + return this; + } +} + +var $version = 8; +var $root = { + version: { + required: true, + type: "enum", + values: [ + 8 + ] + }, + name: { + type: "string" + }, + metadata: { + type: "*" + }, + center: { + type: "array", + value: "number" + }, + zoom: { + type: "number" + }, + bearing: { + type: "number", + "default": 0, + period: 360, + units: "degrees" + }, + pitch: { + type: "number", + "default": 0, + units: "degrees" + }, + light: { + type: "light" + }, + terrain: { + type: "terrain" + }, + sources: { + required: true, + type: "sources" + }, + sprite: { + type: "string" + }, + glyphs: { + type: "string" + }, + transition: { + type: "transition" + }, + layers: { + required: true, + type: "array", + value: "layer" + } +}; +var sources = { + "*": { + type: "source" + } +}; +var source = [ + "source_vector", + "source_raster", + "source_raster_dem", + "source_geojson", + "source_video", + "source_image" +]; +var source_vector = { + type: { + required: true, + type: "enum", + values: { + vector: { + } + } + }, + url: { + type: "string" + }, + tiles: { + type: "array", + value: "string" + }, + bounds: { + type: "array", + value: "number", + length: 4, + "default": [ + -180, + -85.051129, + 180, + 85.051129 + ] + }, + scheme: { + type: "enum", + values: { + xyz: { + }, + tms: { + } + }, + "default": "xyz" + }, + minzoom: { + type: "number", + "default": 0 + }, + maxzoom: { + type: "number", + "default": 22 + }, + attribution: { + type: "string" + }, + promoteId: { + type: "promoteId" + }, + volatile: { + type: "boolean", + "default": false + }, + "*": { + type: "*" + } +}; +var source_raster = { + type: { + required: true, + type: "enum", + values: { + raster: { + } + } + }, + url: { + type: "string" + }, + tiles: { + type: "array", + value: "string" + }, + bounds: { + type: "array", + value: "number", + length: 4, + "default": [ + -180, + -85.051129, + 180, + 85.051129 + ] + }, + minzoom: { + type: "number", + "default": 0 + }, + maxzoom: { + type: "number", + "default": 22 + }, + tileSize: { + type: "number", + "default": 512, + units: "pixels" + }, + scheme: { + type: "enum", + values: { + xyz: { + }, + tms: { + } + }, + "default": "xyz" + }, + attribution: { + type: "string" + }, + volatile: { + type: "boolean", + "default": false + }, + "*": { + type: "*" + } +}; +var source_raster_dem = { + type: { + required: true, + type: "enum", + values: { + "raster-dem": { + } + } + }, + url: { + type: "string" + }, + tiles: { + type: "array", + value: "string" + }, + bounds: { + type: "array", + value: "number", + length: 4, + "default": [ + -180, + -85.051129, + 180, + 85.051129 + ] + }, + minzoom: { + type: "number", + "default": 0 + }, + maxzoom: { + type: "number", + "default": 22 + }, + tileSize: { + type: "number", + "default": 512, + units: "pixels" + }, + attribution: { + type: "string" + }, + encoding: { + type: "enum", + values: { + terrarium: { + }, + mapbox: { + } + }, + "default": "mapbox" + }, + volatile: { + type: "boolean", + "default": false + }, + "*": { + type: "*" + } +}; +var source_geojson = { + type: { + required: true, + type: "enum", + values: { + geojson: { + } + } + }, + data: { + type: "*" + }, + maxzoom: { + type: "number", + "default": 18 + }, + attribution: { + type: "string" + }, + buffer: { + type: "number", + "default": 128, + maximum: 512, + minimum: 0 + }, + filter: { + type: "*" + }, + tolerance: { + type: "number", + "default": 0.375 + }, + cluster: { + type: "boolean", + "default": false + }, + clusterRadius: { + type: "number", + "default": 50, + minimum: 0 + }, + clusterMaxZoom: { + type: "number" + }, + clusterMinPoints: { + type: "number" + }, + clusterProperties: { + type: "*" + }, + lineMetrics: { + type: "boolean", + "default": false + }, + generateId: { + type: "boolean", + "default": false + }, + promoteId: { + type: "promoteId" + } +}; +var source_video = { + type: { + required: true, + type: "enum", + values: { + video: { + } + } + }, + urls: { + required: true, + type: "array", + value: "string" + }, + coordinates: { + required: true, + type: "array", + length: 4, + value: { + type: "array", + length: 2, + value: "number" + } + } +}; +var source_image = { + type: { + required: true, + type: "enum", + values: { + image: { + } + } + }, + url: { + required: true, + type: "string" + }, + coordinates: { + required: true, + type: "array", + length: 4, + value: { + type: "array", + length: 2, + value: "number" + } + } +}; +var layer = { + id: { + type: "string", + required: true + }, + type: { + type: "enum", + values: { + fill: { + }, + line: { + }, + symbol: { + }, + circle: { + }, + heatmap: { + }, + "fill-extrusion": { + }, + raster: { + }, + hillshade: { + }, + background: { + }, + sky: { + } + }, + required: true + }, + metadata: { + type: "*" + }, + source: { + type: "string" + }, + "source-layer": { + type: "string" + }, + minzoom: { + type: "number", + minimum: 0, + maximum: 24 + }, + maxzoom: { + type: "number", + minimum: 0, + maximum: 24 + }, + filter: { + type: "filter" + }, + layout: { + type: "layout" + }, + paint: { + type: "paint" + } +}; +var layout = [ + "layout_fill", + "layout_line", + "layout_circle", + "layout_heatmap", + "layout_fill-extrusion", + "layout_symbol", + "layout_raster", + "layout_hillshade", + "layout_background", + "layout_sky" +]; +var layout_background = { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_sky = { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_fill = { + "fill-sort-key": { + type: "number", + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_circle = { + "circle-sort-key": { + type: "number", + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_heatmap = { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_line = { + "line-cap": { + type: "enum", + values: { + butt: { + }, + round: { + }, + square: { + } + }, + "default": "butt", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "line-join": { + type: "enum", + values: { + bevel: { + }, + round: { + }, + miter: { + } + }, + "default": "miter", + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "line-miter-limit": { + type: "number", + "default": 2, + requires: [ + { + "line-join": "miter" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "line-round-limit": { + type: "number", + "default": 1.05, + requires: [ + { + "line-join": "round" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "line-sort-key": { + type: "number", + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_symbol = { + "symbol-placement": { + type: "enum", + values: { + point: { + }, + line: { + }, + "line-center": { + } + }, + "default": "point", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "symbol-spacing": { + type: "number", + "default": 250, + minimum: 1, + units: "pixels", + requires: [ + { + "symbol-placement": "line" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "symbol-avoid-edges": { + type: "boolean", + "default": false, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "symbol-sort-key": { + type: "number", + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "symbol-z-order": { + type: "enum", + values: { + auto: { + }, + "viewport-y": { + }, + source: { + } + }, + "default": "auto", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-allow-overlap": { + type: "boolean", + "default": false, + requires: [ + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-ignore-placement": { + type: "boolean", + "default": false, + requires: [ + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-optional": { + type: "boolean", + "default": false, + requires: [ + "icon-image", + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-rotation-alignment": { + type: "enum", + values: { + map: { + }, + viewport: { + }, + auto: { + } + }, + "default": "auto", + requires: [ + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-size": { + type: "number", + "default": 1, + minimum: 0, + units: "factor of the original icon size", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "icon-text-fit": { + type: "enum", + values: { + none: { + }, + width: { + }, + height: { + }, + both: { + } + }, + "default": "none", + requires: [ + "icon-image", + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-text-fit-padding": { + type: "array", + value: "number", + length: 4, + "default": [ + 0, + 0, + 0, + 0 + ], + units: "pixels", + requires: [ + "icon-image", + "text-field", + { + "icon-text-fit": [ + "both", + "width", + "height" + ] + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-image": { + type: "resolvedImage", + tokens: true, + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "icon-rotate": { + type: "number", + "default": 0, + period: 360, + units: "degrees", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "icon-padding": { + type: "number", + "default": 2, + minimum: 0, + units: "pixels", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-keep-upright": { + type: "boolean", + "default": false, + requires: [ + "icon-image", + { + "icon-rotation-alignment": "map" + }, + { + "symbol-placement": [ + "line", + "line-center" + ] + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-offset": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "icon-anchor": { + type: "enum", + values: { + center: { + }, + left: { + }, + right: { + }, + top: { + }, + bottom: { + }, + "top-left": { + }, + "top-right": { + }, + "bottom-left": { + }, + "bottom-right": { + } + }, + "default": "center", + requires: [ + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "icon-pitch-alignment": { + type: "enum", + values: { + map: { + }, + viewport: { + }, + auto: { + } + }, + "default": "auto", + requires: [ + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-pitch-alignment": { + type: "enum", + values: { + map: { + }, + viewport: { + }, + auto: { + } + }, + "default": "auto", + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-rotation-alignment": { + type: "enum", + values: { + map: { + }, + viewport: { + }, + auto: { + } + }, + "default": "auto", + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-field": { + type: "formatted", + "default": "", + tokens: true, + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-font": { + type: "array", + value: "string", + "default": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-size": { + type: "number", + "default": 16, + minimum: 0, + units: "pixels", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-max-width": { + type: "number", + "default": 10, + minimum: 0, + units: "ems", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-line-height": { + type: "number", + "default": 1.2, + units: "ems", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-letter-spacing": { + type: "number", + "default": 0, + units: "ems", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-justify": { + type: "enum", + values: { + auto: { + }, + left: { + }, + center: { + }, + right: { + } + }, + "default": "center", + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-radial-offset": { + type: "number", + units: "ems", + "default": 0, + requires: [ + "text-field" + ], + "property-type": "data-driven", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + } + }, + "text-variable-anchor": { + type: "array", + value: "enum", + values: { + center: { + }, + left: { + }, + right: { + }, + top: { + }, + bottom: { + }, + "top-left": { + }, + "top-right": { + }, + "bottom-left": { + }, + "bottom-right": { + } + }, + requires: [ + "text-field", + { + "symbol-placement": [ + "point" + ] + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-anchor": { + type: "enum", + values: { + center: { + }, + left: { + }, + right: { + }, + top: { + }, + bottom: { + }, + "top-left": { + }, + "top-right": { + }, + "bottom-left": { + }, + "bottom-right": { + } + }, + "default": "center", + requires: [ + "text-field", + { + "!": "text-variable-anchor" + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-max-angle": { + type: "number", + "default": 45, + units: "degrees", + requires: [ + "text-field", + { + "symbol-placement": [ + "line", + "line-center" + ] + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-writing-mode": { + type: "array", + value: "enum", + values: { + horizontal: { + }, + vertical: { + } + }, + requires: [ + "text-field", + { + "symbol-placement": [ + "point" + ] + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-rotate": { + type: "number", + "default": 0, + period: 360, + units: "degrees", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-padding": { + type: "number", + "default": 2, + minimum: 0, + units: "pixels", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-keep-upright": { + type: "boolean", + "default": true, + requires: [ + "text-field", + { + "text-rotation-alignment": "map" + }, + { + "symbol-placement": [ + "line", + "line-center" + ] + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-transform": { + type: "enum", + values: { + none: { + }, + uppercase: { + }, + lowercase: { + } + }, + "default": "none", + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-offset": { + type: "array", + value: "number", + units: "ems", + length: 2, + "default": [ + 0, + 0 + ], + requires: [ + "text-field", + { + "!": "text-radial-offset" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, + "text-allow-overlap": { + type: "boolean", + "default": false, + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-ignore-placement": { + type: "boolean", + "default": false, + requires: [ + "text-field" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-optional": { + type: "boolean", + "default": false, + requires: [ + "text-field", + "icon-image" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_raster = { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var layout_hillshade = { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}; +var filter = { + type: "array", + value: "*" +}; +var filter_operator = { + type: "enum", + values: { + "==": { + }, + "!=": { + }, + ">": { + }, + ">=": { + }, + "<": { + }, + "<=": { + }, + "in": { + }, + "!in": { + }, + all: { + }, + any: { + }, + none: { + }, + has: { + }, + "!has": { + }, + within: { + } + } +}; +var geometry_type = { + type: "enum", + values: { + Point: { + }, + LineString: { + }, + Polygon: { + } + } +}; +var function_stop = { + type: "array", + minimum: 0, + maximum: 24, + value: [ + "number", + "color" + ], + length: 2 +}; +var expression = { + type: "array", + value: "*", + minimum: 1 +}; +var light = { + anchor: { + type: "enum", + "default": "viewport", + values: { + map: { + }, + viewport: { + } + }, + "property-type": "data-constant", + transition: false, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + } + }, + position: { + type: "array", + "default": [ + 1.15, + 210, + 30 + ], + length: 3, + value: "number", + "property-type": "data-constant", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + } + }, + color: { + type: "color", + "property-type": "data-constant", + "default": "#ffffff", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + transition: true + }, + intensity: { + type: "number", + "property-type": "data-constant", + "default": 0.5, + minimum: 0, + maximum: 1, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + transition: true + } +}; +var terrain = { + source: { + type: "string", + required: true + }, + exaggeration: { + type: "number", + "property-type": "data-constant", + "default": 1, + minimum: 0, + maximum: 1000, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + transition: true + } +}; +var paint = [ + "paint_fill", + "paint_line", + "paint_circle", + "paint_heatmap", + "paint_fill-extrusion", + "paint_symbol", + "paint_raster", + "paint_hillshade", + "paint_background", + "paint_sky" +]; +var paint_fill = { + "fill-antialias": { + type: "boolean", + "default": true, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-color": { + type: "color", + "default": "#000000", + transition: true, + requires: [ + { + "!": "fill-pattern" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-outline-color": { + type: "color", + transition: true, + requires: [ + { + "!": "fill-pattern" + }, + { + "fill-antialias": true + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "fill-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-pattern": { + type: "resolvedImage", + transition: true, + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "cross-faded-data-driven" + } +}; +var paint_line = { + "line-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-color": { + type: "color", + "default": "#000000", + transition: true, + requires: [ + { + "!": "line-pattern" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "line-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "line-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "line-width": { + type: "number", + "default": 1, + minimum: 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-gap-width": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-offset": { + type: "number", + "default": 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-blur": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "line-dasharray": { + type: "array", + value: "number", + minimum: 0, + transition: true, + units: "line widths", + requires: [ + { + "!": "line-pattern" + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "cross-faded" + }, + "line-pattern": { + type: "resolvedImage", + transition: true, + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "cross-faded-data-driven" + }, + "line-gradient": { + type: "color", + transition: false, + requires: [ + { + "!": "line-dasharray" + }, + { + "!": "line-pattern" + }, + { + source: "geojson", + has: { + lineMetrics: true + } + } + ], + expression: { + interpolated: true, + parameters: [ + "line-progress" + ] + }, + "property-type": "color-ramp" + } +}; +var paint_circle = { + "circle-radius": { + type: "number", + "default": 5, + minimum: 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-color": { + type: "color", + "default": "#000000", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-blur": { + type: "number", + "default": 0, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "circle-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "circle-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "circle-pitch-scale": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "circle-pitch-alignment": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "viewport", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "circle-stroke-width": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-stroke-color": { + type: "color", + "default": "#000000", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "circle-stroke-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + } +}; +var paint_heatmap = { + "heatmap-radius": { + type: "number", + "default": 30, + minimum: 1, + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "heatmap-weight": { + type: "number", + "default": 1, + minimum: 0, + transition: false, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "heatmap-intensity": { + type: "number", + "default": 1, + minimum: 0, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "heatmap-color": { + type: "color", + "default": [ + "interpolate", + [ + "linear" + ], + [ + "heatmap-density" + ], + 0, + "rgba(0, 0, 255, 0)", + 0.1, + "royalblue", + 0.3, + "cyan", + 0.5, + "lime", + 0.7, + "yellow", + 1, + "red" + ], + transition: false, + expression: { + interpolated: true, + parameters: [ + "heatmap-density" + ] + }, + "property-type": "color-ramp" + }, + "heatmap-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var paint_symbol = { + "icon-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "icon-color": { + type: "color", + "default": "#000000", + transition: true, + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "icon-halo-color": { + type: "color", + "default": "rgba(0, 0, 0, 0)", + transition: true, + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "icon-halo-width": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "icon-halo-blur": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "icon-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + requires: [ + "icon-image" + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "icon-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "icon-image", + "icon-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "text-color": { + type: "color", + "default": "#000000", + transition: true, + overridable: true, + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "text-halo-color": { + type: "color", + "default": "rgba(0, 0, 0, 0)", + transition: true, + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "text-halo-width": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "text-halo-blur": { + type: "number", + "default": 0, + minimum: 0, + transition: true, + units: "pixels", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "text-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + requires: [ + "text-field" + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "text-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "text-field", + "text-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var paint_raster = { + "raster-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-hue-rotate": { + type: "number", + "default": 0, + period: 360, + transition: true, + units: "degrees", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-brightness-min": { + type: "number", + "default": 0, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-brightness-max": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-saturation": { + type: "number", + "default": 0, + minimum: -1, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-contrast": { + type: "number", + "default": 0, + minimum: -1, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-resampling": { + type: "enum", + values: { + linear: { + }, + nearest: { + } + }, + "default": "linear", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "raster-fade-duration": { + type: "number", + "default": 300, + minimum: 0, + transition: false, + units: "milliseconds", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var paint_hillshade = { + "hillshade-illumination-direction": { + type: "number", + "default": 335, + minimum: 0, + maximum: 359, + transition: false, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "hillshade-illumination-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "viewport", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "hillshade-exaggeration": { + type: "number", + "default": 0.5, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "hillshade-shadow-color": { + type: "color", + "default": "#000000", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "hillshade-highlight-color": { + type: "color", + "default": "#FFFFFF", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "hillshade-accent-color": { + type: "color", + "default": "#000000", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var paint_background = { + "background-color": { + type: "color", + "default": "#000000", + transition: true, + requires: [ + { + "!": "background-pattern" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "background-pattern": { + type: "resolvedImage", + transition: true, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "cross-faded" + }, + "background-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var paint_sky = { + "sky-type": { + type: "enum", + values: { + gradient: { + }, + atmosphere: { + } + }, + "default": "atmosphere", + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "sky-atmosphere-sun": { + type: "array", + value: "number", + length: 2, + units: "degrees", + minimum: [ + 0, + 0 + ], + maximum: [ + 360, + 180 + ], + transition: false, + requires: [ + { + "sky-type": "atmosphere" + } + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "sky-atmosphere-sun-intensity": { + type: "number", + requires: [ + { + "sky-type": "atmosphere" + } + ], + "default": 10, + minimum: 0, + maximum: 100, + transition: false, + "property-type": "data-constant" + }, + "sky-gradient-center": { + type: "array", + requires: [ + { + "sky-type": "gradient" + } + ], + value: "number", + "default": [ + 0, + 0 + ], + length: 2, + units: "degrees", + minimum: [ + 0, + 0 + ], + maximum: [ + 360, + 180 + ], + transition: false, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "sky-gradient-radius": { + type: "number", + requires: [ + { + "sky-type": "gradient" + } + ], + "default": 90, + minimum: 0, + maximum: 180, + transition: false, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "sky-gradient": { + type: "color", + "default": [ + "interpolate", + [ + "linear" + ], + [ + "sky-radial-progress" + ], + 0.8, + "#87ceeb", + 1, + "white" + ], + transition: false, + requires: [ + { + "sky-type": "gradient" + } + ], + expression: { + interpolated: true, + parameters: [ + "sky-radial-progress" + ] + }, + "property-type": "color-ramp" + }, + "sky-atmosphere-halo-color": { + type: "color", + "default": "white", + transition: false, + requires: [ + { + "sky-type": "atmosphere" + } + ], + "property-type": "data-constant" + }, + "sky-atmosphere-color": { + type: "color", + "default": "white", + transition: false, + requires: [ + { + "sky-type": "atmosphere" + } + ], + "property-type": "data-constant" + }, + "sky-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}; +var transition = { + duration: { + type: "number", + "default": 300, + minimum: 0, + units: "milliseconds" + }, + delay: { + type: "number", + "default": 0, + minimum: 0, + units: "milliseconds" + } +}; +var promoteId = { + "*": { + type: "string" + } +}; +var spec = { + $version: $version, + $root: $root, + sources: sources, + source: source, + source_vector: source_vector, + source_raster: source_raster, + source_raster_dem: source_raster_dem, + source_geojson: source_geojson, + source_video: source_video, + source_image: source_image, + layer: layer, + layout: layout, + layout_background: layout_background, + layout_sky: layout_sky, + layout_fill: layout_fill, + layout_circle: layout_circle, + layout_heatmap: layout_heatmap, + "layout_fill-extrusion": { + visibility: { + type: "enum", + values: { + visible: { + }, + none: { + } + }, + "default": "visible", + "property-type": "constant" + } +}, + layout_line: layout_line, + layout_symbol: layout_symbol, + layout_raster: layout_raster, + layout_hillshade: layout_hillshade, + filter: filter, + filter_operator: filter_operator, + geometry_type: geometry_type, + "function": { + expression: { + type: "expression" + }, + stops: { + type: "array", + value: "function_stop" + }, + base: { + type: "number", + "default": 1, + minimum: 0 + }, + property: { + type: "string", + "default": "$zoom" + }, + type: { + type: "enum", + values: { + identity: { + }, + exponential: { + }, + interval: { + }, + categorical: { + } + }, + "default": "exponential" + }, + colorSpace: { + type: "enum", + values: { + rgb: { + }, + lab: { + }, + hcl: { + } + }, + "default": "rgb" + }, + "default": { + type: "*", + required: false + } +}, + function_stop: function_stop, + expression: expression, + light: light, + terrain: terrain, + paint: paint, + paint_fill: paint_fill, + "paint_fill-extrusion": { + "fill-extrusion-opacity": { + type: "number", + "default": 1, + minimum: 0, + maximum: 1, + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-extrusion-color": { + type: "color", + "default": "#000000", + transition: true, + requires: [ + { + "!": "fill-extrusion-pattern" + } + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-extrusion-translate": { + type: "array", + value: "number", + length: 2, + "default": [ + 0, + 0 + ], + transition: true, + units: "pixels", + expression: { + interpolated: true, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-extrusion-translate-anchor": { + type: "enum", + values: { + map: { + }, + viewport: { + } + }, + "default": "map", + requires: [ + "fill-extrusion-translate" + ], + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + }, + "fill-extrusion-pattern": { + type: "resolvedImage", + transition: true, + expression: { + interpolated: false, + parameters: [ + "zoom", + "feature" + ] + }, + "property-type": "cross-faded-data-driven" + }, + "fill-extrusion-height": { + type: "number", + "default": 0, + minimum: 0, + units: "meters", + transition: true, + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-extrusion-base": { + type: "number", + "default": 0, + minimum: 0, + units: "meters", + transition: true, + requires: [ + "fill-extrusion-height" + ], + expression: { + interpolated: true, + parameters: [ + "zoom", + "feature", + "feature-state" + ] + }, + "property-type": "data-driven" + }, + "fill-extrusion-vertical-gradient": { + type: "boolean", + "default": true, + transition: false, + expression: { + interpolated: false, + parameters: [ + "zoom" + ] + }, + "property-type": "data-constant" + } +}, + paint_line: paint_line, + paint_circle: paint_circle, + paint_heatmap: paint_heatmap, + paint_symbol: paint_symbol, + paint_raster: paint_raster, + paint_hillshade: paint_hillshade, + paint_background: paint_background, + paint_sky: paint_sky, + transition: transition, + "property-type": { + "data-driven": { + type: "property-type" + }, + "cross-faded": { + type: "property-type" + }, + "cross-faded-data-driven": { + type: "property-type" + }, + "color-ramp": { + type: "property-type" + }, + "data-constant": { + type: "property-type" + }, + constant: { + type: "property-type" + } +}, + promoteId: promoteId +}; + +class ValidationError { + constructor(key, value, message, identifier) { + this.message = (key ? `${ key }: ` : '') + message; + if (identifier) + this.identifier = identifier; + if (value !== null && value !== undefined && value.__line__) { + this.line = value.__line__; + } + } +} + +function validateConstants(options) { + const key = options.key; + const constants = options.value; + if (constants) { + return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; + } else { + return []; + } +} + +function extend$1 (output, ...inputs) { + for (const input of inputs) { + for (const k in input) { + output[k] = input[k]; + } + } + return output; +} + +function unbundle(value) { + if (value instanceof Number || value instanceof String || value instanceof Boolean) { + return value.valueOf(); + } else { + return value; + } +} +function deepUnbundle(value) { + if (Array.isArray(value)) { + return value.map(deepUnbundle); + } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) { + const unbundledValue = {}; + for (const key in value) { + unbundledValue[key] = deepUnbundle(value[key]); + } + return unbundledValue; + } + return unbundle(value); +} + +class ParsingError extends Error { + constructor(key, message) { + super(message); + this.message = message; + this.key = key; + } +} + +class Scope { + constructor(parent, bindings = []) { + this.parent = parent; + this.bindings = {}; + for (const [name, expression] of bindings) { + this.bindings[name] = expression; + } + } + concat(bindings) { + return new Scope(this, bindings); + } + get(name) { + if (this.bindings[name]) { + return this.bindings[name]; + } + if (this.parent) { + return this.parent.get(name); + } + throw new Error(`${ name } not found in scope.`); + } + has(name) { + if (this.bindings[name]) + return true; + return this.parent ? this.parent.has(name) : false; + } +} + +const NullType = { kind: 'null' }; +const NumberType = { kind: 'number' }; +const StringType = { kind: 'string' }; +const BooleanType = { kind: 'boolean' }; +const ColorType = { kind: 'color' }; +const ObjectType = { kind: 'object' }; +const ValueType = { kind: 'value' }; +const ErrorType = { kind: 'error' }; +const CollatorType = { kind: 'collator' }; +const FormattedType = { kind: 'formatted' }; +const ResolvedImageType = { kind: 'resolvedImage' }; +function array(itemType, N) { + return { + kind: 'array', + itemType, + N + }; +} +function toString(type) { + if (type.kind === 'array') { + const itemType = toString(type.itemType); + return typeof type.N === 'number' ? `array<${ itemType }, ${ type.N }>` : type.itemType.kind === 'value' ? 'array' : `array<${ itemType }>`; + } else { + return type.kind; + } +} +const valueMemberTypes = [ + NullType, + NumberType, + StringType, + BooleanType, + ColorType, + FormattedType, + ObjectType, + array(ValueType), + ResolvedImageType +]; +function checkSubtype(expected, t) { + if (t.kind === 'error') { + return null; + } else if (expected.kind === 'array') { + if (t.kind === 'array' && (t.N === 0 && t.itemType.kind === 'value' || !checkSubtype(expected.itemType, t.itemType)) && (typeof expected.N !== 'number' || expected.N === t.N)) { + return null; + } + } else if (expected.kind === t.kind) { + return null; + } else if (expected.kind === 'value') { + for (const memberType of valueMemberTypes) { + if (!checkSubtype(memberType, t)) { + return null; + } + } + } + return `Expected ${ toString(expected) } but found ${ toString(t) } instead.`; +} +function isValidType(provided, allowedTypes) { + return allowedTypes.some(t => t.kind === provided.kind); +} +function isValidNativeType(provided, allowedTypes) { + return allowedTypes.some(t => { + if (t === 'null') { + return provided === null; + } else if (t === 'array') { + return Array.isArray(provided); + } else if (t === 'object') { + return provided && !Array.isArray(provided) && typeof provided === 'object'; + } else { + return t === typeof provided; + } + }); +} + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +var csscolorparser = createCommonjsModule(function (module, exports) { +var kCSSColorTable = { + 'transparent': [ + 0, + 0, + 0, + 0 + ], + 'aliceblue': [ + 240, + 248, + 255, + 1 + ], + 'antiquewhite': [ + 250, + 235, + 215, + 1 + ], + 'aqua': [ + 0, + 255, + 255, + 1 + ], + 'aquamarine': [ + 127, + 255, + 212, + 1 + ], + 'azure': [ + 240, + 255, + 255, + 1 + ], + 'beige': [ + 245, + 245, + 220, + 1 + ], + 'bisque': [ + 255, + 228, + 196, + 1 + ], + 'black': [ + 0, + 0, + 0, + 1 + ], + 'blanchedalmond': [ + 255, + 235, + 205, + 1 + ], + 'blue': [ + 0, + 0, + 255, + 1 + ], + 'blueviolet': [ + 138, + 43, + 226, + 1 + ], + 'brown': [ + 165, + 42, + 42, + 1 + ], + 'burlywood': [ + 222, + 184, + 135, + 1 + ], + 'cadetblue': [ + 95, + 158, + 160, + 1 + ], + 'chartreuse': [ + 127, + 255, + 0, + 1 + ], + 'chocolate': [ + 210, + 105, + 30, + 1 + ], + 'coral': [ + 255, + 127, + 80, + 1 + ], + 'cornflowerblue': [ + 100, + 149, + 237, + 1 + ], + 'cornsilk': [ + 255, + 248, + 220, + 1 + ], + 'crimson': [ + 220, + 20, + 60, + 1 + ], + 'cyan': [ + 0, + 255, + 255, + 1 + ], + 'darkblue': [ + 0, + 0, + 139, + 1 + ], + 'darkcyan': [ + 0, + 139, + 139, + 1 + ], + 'darkgoldenrod': [ + 184, + 134, + 11, + 1 + ], + 'darkgray': [ + 169, + 169, + 169, + 1 + ], + 'darkgreen': [ + 0, + 100, + 0, + 1 + ], + 'darkgrey': [ + 169, + 169, + 169, + 1 + ], + 'darkkhaki': [ + 189, + 183, + 107, + 1 + ], + 'darkmagenta': [ + 139, + 0, + 139, + 1 + ], + 'darkolivegreen': [ + 85, + 107, + 47, + 1 + ], + 'darkorange': [ + 255, + 140, + 0, + 1 + ], + 'darkorchid': [ + 153, + 50, + 204, + 1 + ], + 'darkred': [ + 139, + 0, + 0, + 1 + ], + 'darksalmon': [ + 233, + 150, + 122, + 1 + ], + 'darkseagreen': [ + 143, + 188, + 143, + 1 + ], + 'darkslateblue': [ + 72, + 61, + 139, + 1 + ], + 'darkslategray': [ + 47, + 79, + 79, + 1 + ], + 'darkslategrey': [ + 47, + 79, + 79, + 1 + ], + 'darkturquoise': [ + 0, + 206, + 209, + 1 + ], + 'darkviolet': [ + 148, + 0, + 211, + 1 + ], + 'deeppink': [ + 255, + 20, + 147, + 1 + ], + 'deepskyblue': [ + 0, + 191, + 255, + 1 + ], + 'dimgray': [ + 105, + 105, + 105, + 1 + ], + 'dimgrey': [ + 105, + 105, + 105, + 1 + ], + 'dodgerblue': [ + 30, + 144, + 255, + 1 + ], + 'firebrick': [ + 178, + 34, + 34, + 1 + ], + 'floralwhite': [ + 255, + 250, + 240, + 1 + ], + 'forestgreen': [ + 34, + 139, + 34, + 1 + ], + 'fuchsia': [ + 255, + 0, + 255, + 1 + ], + 'gainsboro': [ + 220, + 220, + 220, + 1 + ], + 'ghostwhite': [ + 248, + 248, + 255, + 1 + ], + 'gold': [ + 255, + 215, + 0, + 1 + ], + 'goldenrod': [ + 218, + 165, + 32, + 1 + ], + 'gray': [ + 128, + 128, + 128, + 1 + ], + 'green': [ + 0, + 128, + 0, + 1 + ], + 'greenyellow': [ + 173, + 255, + 47, + 1 + ], + 'grey': [ + 128, + 128, + 128, + 1 + ], + 'honeydew': [ + 240, + 255, + 240, + 1 + ], + 'hotpink': [ + 255, + 105, + 180, + 1 + ], + 'indianred': [ + 205, + 92, + 92, + 1 + ], + 'indigo': [ + 75, + 0, + 130, + 1 + ], + 'ivory': [ + 255, + 255, + 240, + 1 + ], + 'khaki': [ + 240, + 230, + 140, + 1 + ], + 'lavender': [ + 230, + 230, + 250, + 1 + ], + 'lavenderblush': [ + 255, + 240, + 245, + 1 + ], + 'lawngreen': [ + 124, + 252, + 0, + 1 + ], + 'lemonchiffon': [ + 255, + 250, + 205, + 1 + ], + 'lightblue': [ + 173, + 216, + 230, + 1 + ], + 'lightcoral': [ + 240, + 128, + 128, + 1 + ], + 'lightcyan': [ + 224, + 255, + 255, + 1 + ], + 'lightgoldenrodyellow': [ + 250, + 250, + 210, + 1 + ], + 'lightgray': [ + 211, + 211, + 211, + 1 + ], + 'lightgreen': [ + 144, + 238, + 144, + 1 + ], + 'lightgrey': [ + 211, + 211, + 211, + 1 + ], + 'lightpink': [ + 255, + 182, + 193, + 1 + ], + 'lightsalmon': [ + 255, + 160, + 122, + 1 + ], + 'lightseagreen': [ + 32, + 178, + 170, + 1 + ], + 'lightskyblue': [ + 135, + 206, + 250, + 1 + ], + 'lightslategray': [ + 119, + 136, + 153, + 1 + ], + 'lightslategrey': [ + 119, + 136, + 153, + 1 + ], + 'lightsteelblue': [ + 176, + 196, + 222, + 1 + ], + 'lightyellow': [ + 255, + 255, + 224, + 1 + ], + 'lime': [ + 0, + 255, + 0, + 1 + ], + 'limegreen': [ + 50, + 205, + 50, + 1 + ], + 'linen': [ + 250, + 240, + 230, + 1 + ], + 'magenta': [ + 255, + 0, + 255, + 1 + ], + 'maroon': [ + 128, + 0, + 0, + 1 + ], + 'mediumaquamarine': [ + 102, + 205, + 170, + 1 + ], + 'mediumblue': [ + 0, + 0, + 205, + 1 + ], + 'mediumorchid': [ + 186, + 85, + 211, + 1 + ], + 'mediumpurple': [ + 147, + 112, + 219, + 1 + ], + 'mediumseagreen': [ + 60, + 179, + 113, + 1 + ], + 'mediumslateblue': [ + 123, + 104, + 238, + 1 + ], + 'mediumspringgreen': [ + 0, + 250, + 154, + 1 + ], + 'mediumturquoise': [ + 72, + 209, + 204, + 1 + ], + 'mediumvioletred': [ + 199, + 21, + 133, + 1 + ], + 'midnightblue': [ + 25, + 25, + 112, + 1 + ], + 'mintcream': [ + 245, + 255, + 250, + 1 + ], + 'mistyrose': [ + 255, + 228, + 225, + 1 + ], + 'moccasin': [ + 255, + 228, + 181, + 1 + ], + 'navajowhite': [ + 255, + 222, + 173, + 1 + ], + 'navy': [ + 0, + 0, + 128, + 1 + ], + 'oldlace': [ + 253, + 245, + 230, + 1 + ], + 'olive': [ + 128, + 128, + 0, + 1 + ], + 'olivedrab': [ + 107, + 142, + 35, + 1 + ], + 'orange': [ + 255, + 165, + 0, + 1 + ], + 'orangered': [ + 255, + 69, + 0, + 1 + ], + 'orchid': [ + 218, + 112, + 214, + 1 + ], + 'palegoldenrod': [ + 238, + 232, + 170, + 1 + ], + 'palegreen': [ + 152, + 251, + 152, + 1 + ], + 'paleturquoise': [ + 175, + 238, + 238, + 1 + ], + 'palevioletred': [ + 219, + 112, + 147, + 1 + ], + 'papayawhip': [ + 255, + 239, + 213, + 1 + ], + 'peachpuff': [ + 255, + 218, + 185, + 1 + ], + 'peru': [ + 205, + 133, + 63, + 1 + ], + 'pink': [ + 255, + 192, + 203, + 1 + ], + 'plum': [ + 221, + 160, + 221, + 1 + ], + 'powderblue': [ + 176, + 224, + 230, + 1 + ], + 'purple': [ + 128, + 0, + 128, + 1 + ], + 'rebeccapurple': [ + 102, + 51, + 153, + 1 + ], + 'red': [ + 255, + 0, + 0, + 1 + ], + 'rosybrown': [ + 188, + 143, + 143, + 1 + ], + 'royalblue': [ + 65, + 105, + 225, + 1 + ], + 'saddlebrown': [ + 139, + 69, + 19, + 1 + ], + 'salmon': [ + 250, + 128, + 114, + 1 + ], + 'sandybrown': [ + 244, + 164, + 96, + 1 + ], + 'seagreen': [ + 46, + 139, + 87, + 1 + ], + 'seashell': [ + 255, + 245, + 238, + 1 + ], + 'sienna': [ + 160, + 82, + 45, + 1 + ], + 'silver': [ + 192, + 192, + 192, + 1 + ], + 'skyblue': [ + 135, + 206, + 235, + 1 + ], + 'slateblue': [ + 106, + 90, + 205, + 1 + ], + 'slategray': [ + 112, + 128, + 144, + 1 + ], + 'slategrey': [ + 112, + 128, + 144, + 1 + ], + 'snow': [ + 255, + 250, + 250, + 1 + ], + 'springgreen': [ + 0, + 255, + 127, + 1 + ], + 'steelblue': [ + 70, + 130, + 180, + 1 + ], + 'tan': [ + 210, + 180, + 140, + 1 + ], + 'teal': [ + 0, + 128, + 128, + 1 + ], + 'thistle': [ + 216, + 191, + 216, + 1 + ], + 'tomato': [ + 255, + 99, + 71, + 1 + ], + 'turquoise': [ + 64, + 224, + 208, + 1 + ], + 'violet': [ + 238, + 130, + 238, + 1 + ], + 'wheat': [ + 245, + 222, + 179, + 1 + ], + 'white': [ + 255, + 255, + 255, + 1 + ], + 'whitesmoke': [ + 245, + 245, + 245, + 1 + ], + 'yellow': [ + 255, + 255, + 0, + 1 + ], + 'yellowgreen': [ + 154, + 205, + 50, + 1 + ] +}; +function clamp_css_byte(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; +} +function clamp_css_float(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; +} +function parse_css_int(str) { + if (str[str.length - 1] === '%') + return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseInt(str)); +} +function parse_css_float(str) { + if (str[str.length - 1] === '%') + return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str)); +} +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) + h += 1; + else if (h > 1) + h -= 1; + if (h * 6 < 1) + return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) + return m2; + if (h * 3 < 2) + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + return m1; +} +function parseCSSColor(css_str) { + var str = css_str.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) + return kCSSColorTable[str].slice(); + if (str[0] === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); + if (!(iv >= 0 && iv <= 4095)) + return null; + return [ + (iv & 3840) >> 4 | (iv & 3840) >> 8, + iv & 240 | (iv & 240) >> 4, + iv & 15 | (iv & 15) << 4, + 1 + ]; + } else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); + if (!(iv >= 0 && iv <= 16777215)) + return null; + return [ + (iv & 16711680) >> 16, + (iv & 65280) >> 8, + iv & 255, + 1 + ]; + } + return null; + } + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) + return null; + alpha = parse_css_float(params.pop()); + case 'rgb': + if (params.length !== 3) + return null; + return [ + parse_css_int(params[0]), + parse_css_int(params[1]), + parse_css_int(params[2]), + alpha + ]; + case 'hsla': + if (params.length !== 4) + return null; + alpha = parse_css_float(params.pop()); + case 'hsl': + if (params.length !== 3) + return null; + var h = (parseFloat(params[0]) % 360 + 360) % 360 / 360; + var s = parse_css_float(params[1]); + var l = parse_css_float(params[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + return [ + clamp_css_byte(css_hue_to_rgb(m1, m2, h + 1 / 3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h - 1 / 3) * 255), + alpha + ]; + default: + return null; + } + } + return null; +} +try { + exports.parseCSSColor = parseCSSColor; +} catch (e) { +} +}); +var csscolorparser_1 = csscolorparser.parseCSSColor; + +class Color { + constructor(r, g, b, a = 1) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + static parse(input) { + if (!input) { + return undefined; + } + if (input instanceof Color) { + return input; + } + if (typeof input !== 'string') { + return undefined; + } + const rgba = csscolorparser_1(input); + if (!rgba) { + return undefined; + } + return new Color(rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3]); + } + toString() { + const [r, g, b, a] = this.toArray(); + return `rgba(${ Math.round(r) },${ Math.round(g) },${ Math.round(b) },${ a })`; + } + toArray() { + const {r, g, b, a} = this; + return a === 0 ? [ + 0, + 0, + 0, + 0 + ] : [ + r * 255 / a, + g * 255 / a, + b * 255 / a, + a + ]; + } +} +Color.black = new Color(0, 0, 0, 1); +Color.white = new Color(1, 1, 1, 1); +Color.transparent = new Color(0, 0, 0, 0); +Color.red = new Color(1, 0, 0, 1); +Color.blue = new Color(0, 0, 1, 1); + +class Collator { + constructor(caseSensitive, diacriticSensitive, locale) { + if (caseSensitive) + this.sensitivity = diacriticSensitive ? 'variant' : 'case'; + else + this.sensitivity = diacriticSensitive ? 'accent' : 'base'; + this.locale = locale; + this.collator = new Intl.Collator(this.locale ? this.locale : [], { + sensitivity: this.sensitivity, + usage: 'search' + }); + } + compare(lhs, rhs) { + return this.collator.compare(lhs, rhs); + } + resolvedLocale() { + return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale; + } +} + +class FormattedSection { + constructor(text, image, scale, fontStack, textColor) { + this.text = text; + this.image = image; + this.scale = scale; + this.fontStack = fontStack; + this.textColor = textColor; + } +} +class Formatted { + constructor(sections) { + this.sections = sections; + } + static fromString(unformatted) { + return new Formatted([new FormattedSection(unformatted, null, null, null, null)]); + } + isEmpty() { + if (this.sections.length === 0) + return true; + return !this.sections.some(section => section.text.length !== 0 || section.image && section.image.name.length !== 0); + } + static factory(text) { + if (text instanceof Formatted) { + return text; + } else { + return Formatted.fromString(text); + } + } + toString() { + if (this.sections.length === 0) + return ''; + return this.sections.map(section => section.text).join(''); + } + serialize() { + const serialized = ['format']; + for (const section of this.sections) { + if (section.image) { + serialized.push([ + 'image', + section.image.name + ]); + continue; + } + serialized.push(section.text); + const options = {}; + if (section.fontStack) { + options['text-font'] = [ + 'literal', + section.fontStack.split(',') + ]; + } + if (section.scale) { + options['font-scale'] = section.scale; + } + if (section.textColor) { + options['text-color'] = ['rgba'].concat(section.textColor.toArray()); + } + serialized.push(options); + } + return serialized; + } +} + +class ResolvedImage { + constructor(options) { + this.name = options.name; + this.available = options.available; + } + toString() { + return this.name; + } + static fromString(name) { + if (!name) + return null; + return new ResolvedImage({ + name, + available: false + }); + } + serialize() { + return [ + 'image', + this.name + ]; + } +} + +function validateRGBA(r, g, b, a) { + if (!(typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255)) { + const value = typeof a === 'number' ? [ + r, + g, + b, + a + ] : [ + r, + g, + b + ]; + return `Invalid rgba value [${ value.join(', ') }]: 'r', 'g', and 'b' must be between 0 and 255.`; + } + if (!(typeof a === 'undefined' || typeof a === 'number' && a >= 0 && a <= 1)) { + return `Invalid rgba value [${ [ + r, + g, + b, + a + ].join(', ') }]: 'a' must be between 0 and 1.`; + } + return null; +} +function isValue(mixed) { + if (mixed === null) { + return true; + } else if (typeof mixed === 'string') { + return true; + } else if (typeof mixed === 'boolean') { + return true; + } else if (typeof mixed === 'number') { + return true; + } else if (mixed instanceof Color) { + return true; + } else if (mixed instanceof Collator) { + return true; + } else if (mixed instanceof Formatted) { + return true; + } else if (mixed instanceof ResolvedImage) { + return true; + } else if (Array.isArray(mixed)) { + for (const item of mixed) { + if (!isValue(item)) { + return false; + } + } + return true; + } else if (typeof mixed === 'object') { + for (const key in mixed) { + if (!isValue(mixed[key])) { + return false; + } + } + return true; + } else { + return false; + } +} +function typeOf(value) { + if (value === null) { + return NullType; + } else if (typeof value === 'string') { + return StringType; + } else if (typeof value === 'boolean') { + return BooleanType; + } else if (typeof value === 'number') { + return NumberType; + } else if (value instanceof Color) { + return ColorType; + } else if (value instanceof Collator) { + return CollatorType; + } else if (value instanceof Formatted) { + return FormattedType; + } else if (value instanceof ResolvedImage) { + return ResolvedImageType; + } else if (Array.isArray(value)) { + const length = value.length; + let itemType; + for (const item of value) { + const t = typeOf(item); + if (!itemType) { + itemType = t; + } else if (itemType === t) { + continue; + } else { + itemType = ValueType; + break; + } + } + return array(itemType || ValueType, length); + } else { + return ObjectType; + } +} +function toString$1(value) { + const type = typeof value; + if (value === null) { + return ''; + } else if (type === 'string' || type === 'number' || type === 'boolean') { + return String(value); + } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) { + return value.toString(); + } else { + return JSON.stringify(value); + } +} + +class Literal { + constructor(type, value) { + this.type = type; + this.value = value; + } + static parse(args, context) { + if (args.length !== 2) + return context.error(`'literal' expression requires exactly one argument, but found ${ args.length - 1 } instead.`); + if (!isValue(args[1])) + return context.error(`invalid value`); + const value = args[1]; + let type = typeOf(value); + const expected = context.expectedType; + if (type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0)) { + type = expected; + } + return new Literal(type, value); + } + evaluate() { + return this.value; + } + eachChild() { + } + outputDefined() { + return true; + } + serialize() { + if (this.type.kind === 'array' || this.type.kind === 'object') { + return [ + 'literal', + this.value + ]; + } else if (this.value instanceof Color) { + return ['rgba'].concat(this.value.toArray()); + } else if (this.value instanceof Formatted) { + return this.value.serialize(); + } else { + return this.value; + } + } +} + +class RuntimeError { + constructor(message) { + this.name = 'ExpressionEvaluationError'; + this.message = message; + } + toJSON() { + return this.message; + } +} + +const types = { + string: StringType, + number: NumberType, + boolean: BooleanType, + object: ObjectType +}; +class Assertion { + constructor(type, args) { + this.type = type; + this.args = args; + } + static parse(args, context) { + if (args.length < 2) + return context.error(`Expected at least one argument.`); + let i = 1; + let type; + const name = args[0]; + if (name === 'array') { + let itemType; + if (args.length > 2) { + const type = args[1]; + if (typeof type !== 'string' || !(type in types) || type === 'object') + return context.error('The item type argument of "array" must be one of string, number, boolean', 1); + itemType = types[type]; + i++; + } else { + itemType = ValueType; + } + let N; + if (args.length > 3) { + if (args[2] !== null && (typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2]))) { + return context.error('The length argument to "array" must be a positive integer literal', 2); + } + N = args[2]; + i++; + } + type = array(itemType, N); + } else { + type = types[name]; + } + const parsed = []; + for (; i < args.length; i++) { + const input = context.parse(args[i], i, ValueType); + if (!input) + return null; + parsed.push(input); + } + return new Assertion(type, parsed); + } + evaluate(ctx) { + for (let i = 0; i < this.args.length; i++) { + const value = this.args[i].evaluate(ctx); + const error = checkSubtype(this.type, typeOf(value)); + if (!error) { + return value; + } else if (i === this.args.length - 1) { + throw new RuntimeError(`Expected value to be of type ${ toString(this.type) }, but found ${ toString(typeOf(value)) } instead.`); + } + } + return null; + } + eachChild(fn) { + this.args.forEach(fn); + } + outputDefined() { + return this.args.every(arg => arg.outputDefined()); + } + serialize() { + const type = this.type; + const serialized = [type.kind]; + if (type.kind === 'array') { + const itemType = type.itemType; + if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') { + serialized.push(itemType.kind); + const N = type.N; + if (typeof N === 'number' || this.args.length > 1) { + serialized.push(N); + } + } + } + return serialized.concat(this.args.map(arg => arg.serialize())); + } +} + +class FormatExpression { + constructor(sections) { + this.type = FormattedType; + this.sections = sections; + } + static parse(args, context) { + if (args.length < 2) { + return context.error(`Expected at least one argument.`); + } + const firstArg = args[1]; + if (!Array.isArray(firstArg) && typeof firstArg === 'object') { + return context.error(`First argument must be an image or text section.`); + } + const sections = []; + let nextTokenMayBeObject = false; + for (let i = 1; i <= args.length - 1; ++i) { + const arg = args[i]; + if (nextTokenMayBeObject && typeof arg === 'object' && !Array.isArray(arg)) { + nextTokenMayBeObject = false; + let scale = null; + if (arg['font-scale']) { + scale = context.parse(arg['font-scale'], 1, NumberType); + if (!scale) + return null; + } + let font = null; + if (arg['text-font']) { + font = context.parse(arg['text-font'], 1, array(StringType)); + if (!font) + return null; + } + let textColor = null; + if (arg['text-color']) { + textColor = context.parse(arg['text-color'], 1, ColorType); + if (!textColor) + return null; + } + const lastExpression = sections[sections.length - 1]; + lastExpression.scale = scale; + lastExpression.font = font; + lastExpression.textColor = textColor; + } else { + const content = context.parse(args[i], 1, ValueType); + if (!content) + return null; + const kind = content.type.kind; + if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') + return context.error(`Formatted text type must be 'string', 'value', 'image' or 'null'.`); + nextTokenMayBeObject = true; + sections.push({ + content, + scale: null, + font: null, + textColor: null + }); + } + } + return new FormatExpression(sections); + } + evaluate(ctx) { + const evaluateSection = section => { + const evaluatedContent = section.content.evaluate(ctx); + if (typeOf(evaluatedContent) === ResolvedImageType) { + return new FormattedSection('', evaluatedContent, null, null, null); + } + return new FormattedSection(toString$1(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null); + }; + return new Formatted(this.sections.map(evaluateSection)); + } + eachChild(fn) { + for (const section of this.sections) { + fn(section.content); + if (section.scale) { + fn(section.scale); + } + if (section.font) { + fn(section.font); + } + if (section.textColor) { + fn(section.textColor); + } + } + } + outputDefined() { + return false; + } + serialize() { + const serialized = ['format']; + for (const section of this.sections) { + serialized.push(section.content.serialize()); + const options = {}; + if (section.scale) { + options['font-scale'] = section.scale.serialize(); + } + if (section.font) { + options['text-font'] = section.font.serialize(); + } + if (section.textColor) { + options['text-color'] = section.textColor.serialize(); + } + serialized.push(options); + } + return serialized; + } +} + +class ImageExpression { + constructor(input) { + this.type = ResolvedImageType; + this.input = input; + } + static parse(args, context) { + if (args.length !== 2) { + return context.error(`Expected two arguments.`); + } + const name = context.parse(args[1], 1, StringType); + if (!name) + return context.error(`No image name provided.`); + return new ImageExpression(name); + } + evaluate(ctx) { + const evaluatedImageName = this.input.evaluate(ctx); + const value = ResolvedImage.fromString(evaluatedImageName); + if (value && ctx.availableImages) + value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1; + return value; + } + eachChild(fn) { + fn(this.input); + } + outputDefined() { + return false; + } + serialize() { + return [ + 'image', + this.input.serialize() + ]; + } +} + +const types$1 = { + 'to-boolean': BooleanType, + 'to-color': ColorType, + 'to-number': NumberType, + 'to-string': StringType +}; +class Coercion { + constructor(type, args) { + this.type = type; + this.args = args; + } + static parse(args, context) { + if (args.length < 2) + return context.error(`Expected at least one argument.`); + const name = args[0]; + if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) + return context.error(`Expected one argument.`); + const type = types$1[name]; + const parsed = []; + for (let i = 1; i < args.length; i++) { + const input = context.parse(args[i], i, ValueType); + if (!input) + return null; + parsed.push(input); + } + return new Coercion(type, parsed); + } + evaluate(ctx) { + if (this.type.kind === 'boolean') { + return Boolean(this.args[0].evaluate(ctx)); + } else if (this.type.kind === 'color') { + let input; + let error; + for (const arg of this.args) { + input = arg.evaluate(ctx); + error = null; + if (input instanceof Color) { + return input; + } else if (typeof input === 'string') { + const c = ctx.parseColor(input); + if (c) + return c; + } else if (Array.isArray(input)) { + if (input.length < 3 || input.length > 4) { + error = `Invalid rbga value ${ JSON.stringify(input) }: expected an array containing either three or four numeric values.`; + } else { + error = validateRGBA(input[0], input[1], input[2], input[3]); + } + if (!error) { + return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]); + } + } + } + throw new RuntimeError(error || `Could not parse color from value '${ typeof input === 'string' ? input : String(JSON.stringify(input)) }'`); + } else if (this.type.kind === 'number') { + let value = null; + for (const arg of this.args) { + value = arg.evaluate(ctx); + if (value === null) + return 0; + const num = Number(value); + if (isNaN(num)) + continue; + return num; + } + throw new RuntimeError(`Could not convert ${ JSON.stringify(value) } to number.`); + } else if (this.type.kind === 'formatted') { + return Formatted.fromString(toString$1(this.args[0].evaluate(ctx))); + } else if (this.type.kind === 'resolvedImage') { + return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx))); + } else { + return toString$1(this.args[0].evaluate(ctx)); + } + } + eachChild(fn) { + this.args.forEach(fn); + } + outputDefined() { + return this.args.every(arg => arg.outputDefined()); + } + serialize() { + if (this.type.kind === 'formatted') { + return new FormatExpression([{ + content: this.args[0], + scale: null, + font: null, + textColor: null + }]).serialize(); + } + if (this.type.kind === 'resolvedImage') { + return new ImageExpression(this.args[0]).serialize(); + } + const serialized = [`to-${ this.type.kind }`]; + this.eachChild(child => { + serialized.push(child.serialize()); + }); + return serialized; + } +} + +const geometryTypes = [ + 'Unknown', + 'Point', + 'LineString', + 'Polygon' +]; +class EvaluationContext { + constructor() { + this.globals = null; + this.feature = null; + this.featureState = null; + this.formattedSection = null; + this._parseColorCache = {}; + this.availableImages = null; + this.canonical = null; + } + id() { + return this.feature && 'id' in this.feature ? this.feature.id : null; + } + geometryType() { + return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; + } + geometry() { + return this.feature && 'geometry' in this.feature ? this.feature.geometry : null; + } + canonicalID() { + return this.canonical; + } + properties() { + return this.feature && this.feature.properties || {}; + } + parseColor(input) { + let cached = this._parseColorCache[input]; + if (!cached) { + cached = this._parseColorCache[input] = Color.parse(input); + } + return cached; + } +} + +class CompoundExpression { + constructor(name, type, evaluate, args) { + this.name = name; + this.type = type; + this._evaluate = evaluate; + this.args = args; + } + evaluate(ctx) { + return this._evaluate(ctx, this.args); + } + eachChild(fn) { + this.args.forEach(fn); + } + outputDefined() { + return false; + } + serialize() { + return [this.name].concat(this.args.map(arg => arg.serialize())); + } + static parse(args, context) { + const op = args[0]; + const definition = CompoundExpression.definitions[op]; + if (!definition) { + return context.error(`Unknown expression "${ op }". If you wanted a literal array, use ["literal", [...]].`, 0); + } + const type = Array.isArray(definition) ? definition[0] : definition.type; + const availableOverloads = Array.isArray(definition) ? [[ + definition[1], + definition[2] + ]] : definition.overloads; + const overloads = availableOverloads.filter(([signature]) => !Array.isArray(signature) || signature.length === args.length - 1); + let signatureContext = null; + for (const [params, evaluate] of overloads) { + signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); + const parsedArgs = []; + let argParseFailed = false; + for (let i = 1; i < args.length; i++) { + const arg = args[i]; + const expectedType = Array.isArray(params) ? params[i - 1] : params.type; + const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); + if (!parsed) { + argParseFailed = true; + break; + } + parsedArgs.push(parsed); + } + if (argParseFailed) { + continue; + } + if (Array.isArray(params)) { + if (params.length !== parsedArgs.length) { + signatureContext.error(`Expected ${ params.length } arguments, but found ${ parsedArgs.length } instead.`); + continue; + } + } + for (let i = 0; i < parsedArgs.length; i++) { + const expected = Array.isArray(params) ? params[i] : params.type; + const arg = parsedArgs[i]; + signatureContext.concat(i + 1).checkSubtype(expected, arg.type); + } + if (signatureContext.errors.length === 0) { + return new CompoundExpression(op, type, evaluate, parsedArgs); + } + } + if (overloads.length === 1) { + context.errors.push(...signatureContext.errors); + } else { + const expected = overloads.length ? overloads : availableOverloads; + const signatures = expected.map(([params]) => stringifySignature(params)).join(' | '); + const actualTypes = []; + for (let i = 1; i < args.length; i++) { + const parsed = context.parse(args[i], 1 + actualTypes.length); + if (!parsed) + return null; + actualTypes.push(toString(parsed.type)); + } + context.error(`Expected arguments of type ${ signatures }, but found (${ actualTypes.join(', ') }) instead.`); + } + return null; + } + static register(registry, definitions) { + CompoundExpression.definitions = definitions; + for (const name in definitions) { + registry[name] = CompoundExpression; + } + } +} +function stringifySignature(signature) { + if (Array.isArray(signature)) { + return `(${ signature.map(toString).join(', ') })`; + } else { + return `(${ toString(signature.type) }...)`; + } +} + +class CollatorExpression { + constructor(caseSensitive, diacriticSensitive, locale) { + this.type = CollatorType; + this.locale = locale; + this.caseSensitive = caseSensitive; + this.diacriticSensitive = diacriticSensitive; + } + static parse(args, context) { + if (args.length !== 2) + return context.error(`Expected one argument.`); + const options = args[1]; + if (typeof options !== 'object' || Array.isArray(options)) + return context.error(`Collator options argument must be an object.`); + const caseSensitive = context.parse(options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); + if (!caseSensitive) + return null; + const diacriticSensitive = context.parse(options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); + if (!diacriticSensitive) + return null; + let locale = null; + if (options['locale']) { + locale = context.parse(options['locale'], 1, StringType); + if (!locale) + return null; + } + return new CollatorExpression(caseSensitive, diacriticSensitive, locale); + } + evaluate(ctx) { + return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); + } + eachChild(fn) { + fn(this.caseSensitive); + fn(this.diacriticSensitive); + if (this.locale) { + fn(this.locale); + } + } + outputDefined() { + return false; + } + serialize() { + const options = {}; + options['case-sensitive'] = this.caseSensitive.serialize(); + options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); + if (this.locale) { + options['locale'] = this.locale.serialize(); + } + return [ + 'collator', + options + ]; + } +} + +const EXTENT = 8192; +function updateBBox(bbox, coord) { + bbox[0] = Math.min(bbox[0], coord[0]); + bbox[1] = Math.min(bbox[1], coord[1]); + bbox[2] = Math.max(bbox[2], coord[0]); + bbox[3] = Math.max(bbox[3], coord[1]); +} +function mercatorXfromLng(lng) { + return (180 + lng) / 360; +} +function mercatorYfromLat(lat) { + return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))) / 360; +} +function boxWithinBox(bbox1, bbox2) { + if (bbox1[0] <= bbox2[0]) + return false; + if (bbox1[2] >= bbox2[2]) + return false; + if (bbox1[1] <= bbox2[1]) + return false; + if (bbox1[3] >= bbox2[3]) + return false; + return true; +} +function getTileCoordinates(p, canonical) { + const x = mercatorXfromLng(p[0]); + const y = mercatorYfromLat(p[1]); + const tilesAtZoom = Math.pow(2, canonical.z); + return [ + Math.round(x * tilesAtZoom * EXTENT), + Math.round(y * tilesAtZoom * EXTENT) + ]; +} +function onBoundary(p, p1, p2) { + const x1 = p[0] - p1[0]; + const y1 = p[1] - p1[1]; + const x2 = p[0] - p2[0]; + const y2 = p[1] - p2[1]; + return x1 * y2 - x2 * y1 === 0 && x1 * x2 <= 0 && y1 * y2 <= 0; +} +function rayIntersect(p, p1, p2) { + return p1[1] > p[1] !== p2[1] > p[1] && p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]; +} +function pointWithinPolygon(point, rings) { + let inside = false; + for (let i = 0, len = rings.length; i < len; i++) { + const ring = rings[i]; + for (let j = 0, len2 = ring.length; j < len2 - 1; j++) { + if (onBoundary(point, ring[j], ring[j + 1])) + return false; + if (rayIntersect(point, ring[j], ring[j + 1])) + inside = !inside; + } + } + return inside; +} +function pointWithinPolygons(point, polygons) { + for (let i = 0; i < polygons.length; i++) { + if (pointWithinPolygon(point, polygons[i])) + return true; + } + return false; +} +function perp(v1, v2) { + return v1[0] * v2[1] - v1[1] * v2[0]; +} +function twoSided(p1, p2, q1, q2) { + const x1 = p1[0] - q1[0]; + const y1 = p1[1] - q1[1]; + const x2 = p2[0] - q1[0]; + const y2 = p2[1] - q1[1]; + const x3 = q2[0] - q1[0]; + const y3 = q2[1] - q1[1]; + const det1 = x1 * y3 - x3 * y1; + const det2 = x2 * y3 - x3 * y2; + if (det1 > 0 && det2 < 0 || det1 < 0 && det2 > 0) + return true; + return false; +} +function lineIntersectLine(a, b, c, d) { + const vectorP = [ + b[0] - a[0], + b[1] - a[1] + ]; + const vectorQ = [ + d[0] - c[0], + d[1] - c[1] + ]; + if (perp(vectorQ, vectorP) === 0) + return false; + if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) + return true; + return false; +} +function lineIntersectPolygon(p1, p2, polygon) { + for (const ring of polygon) { + for (let j = 0; j < ring.length - 1; ++j) { + if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) { + return true; + } + } + } + return false; +} +function lineStringWithinPolygon(line, polygon) { + for (let i = 0; i < line.length; ++i) { + if (!pointWithinPolygon(line[i], polygon)) { + return false; + } + } + for (let i = 0; i < line.length - 1; ++i) { + if (lineIntersectPolygon(line[i], line[i + 1], polygon)) { + return false; + } + } + return true; +} +function lineStringWithinPolygons(line, polygons) { + for (let i = 0; i < polygons.length; i++) { + if (lineStringWithinPolygon(line, polygons[i])) + return true; + } + return false; +} +function getTilePolygon(coordinates, bbox, canonical) { + const polygon = []; + for (let i = 0; i < coordinates.length; i++) { + const ring = []; + for (let j = 0; j < coordinates[i].length; j++) { + const coord = getTileCoordinates(coordinates[i][j], canonical); + updateBBox(bbox, coord); + ring.push(coord); + } + polygon.push(ring); + } + return polygon; +} +function getTilePolygons(coordinates, bbox, canonical) { + const polygons = []; + for (let i = 0; i < coordinates.length; i++) { + const polygon = getTilePolygon(coordinates[i], bbox, canonical); + polygons.push(polygon); + } + return polygons; +} +function updatePoint(p, bbox, polyBBox, worldSize) { + if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) { + const halfWorldSize = worldSize * 0.5; + let shift = p[0] - polyBBox[0] > halfWorldSize ? -worldSize : polyBBox[0] - p[0] > halfWorldSize ? worldSize : 0; + if (shift === 0) { + shift = p[0] - polyBBox[2] > halfWorldSize ? -worldSize : polyBBox[2] - p[0] > halfWorldSize ? worldSize : 0; + } + p[0] += shift; + } + updateBBox(bbox, p); +} +function resetBBox(bbox) { + bbox[0] = bbox[1] = Infinity; + bbox[2] = bbox[3] = -Infinity; +} +function getTilePoints(geometry, pointBBox, polyBBox, canonical) { + const worldSize = Math.pow(2, canonical.z) * EXTENT; + const shifts = [ + canonical.x * EXTENT, + canonical.y * EXTENT + ]; + const tilePoints = []; + for (const points of geometry) { + for (const point of points) { + const p = [ + point.x + shifts[0], + point.y + shifts[1] + ]; + updatePoint(p, pointBBox, polyBBox, worldSize); + tilePoints.push(p); + } + } + return tilePoints; +} +function getTileLines(geometry, lineBBox, polyBBox, canonical) { + const worldSize = Math.pow(2, canonical.z) * EXTENT; + const shifts = [ + canonical.x * EXTENT, + canonical.y * EXTENT + ]; + const tileLines = []; + for (const line of geometry) { + const tileLine = []; + for (const point of line) { + const p = [ + point.x + shifts[0], + point.y + shifts[1] + ]; + updateBBox(lineBBox, p); + tileLine.push(p); + } + tileLines.push(tileLine); + } + if (lineBBox[2] - lineBBox[0] <= worldSize / 2) { + resetBBox(lineBBox); + for (const line of tileLines) { + for (const p of line) { + updatePoint(p, lineBBox, polyBBox, worldSize); + } + } + } + return tileLines; +} +function pointsWithinPolygons(ctx, polygonGeometry) { + const pointBBox = [ + Infinity, + Infinity, + -Infinity, + -Infinity + ]; + const polyBBox = [ + Infinity, + Infinity, + -Infinity, + -Infinity + ]; + const canonical = ctx.canonicalID(); + if (polygonGeometry.type === 'Polygon') { + const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); + const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); + if (!boxWithinBox(pointBBox, polyBBox)) + return false; + for (const point of tilePoints) { + if (!pointWithinPolygon(point, tilePolygon)) + return false; + } + } + if (polygonGeometry.type === 'MultiPolygon') { + const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); + const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); + if (!boxWithinBox(pointBBox, polyBBox)) + return false; + for (const point of tilePoints) { + if (!pointWithinPolygons(point, tilePolygons)) + return false; + } + } + return true; +} +function linesWithinPolygons(ctx, polygonGeometry) { + const lineBBox = [ + Infinity, + Infinity, + -Infinity, + -Infinity + ]; + const polyBBox = [ + Infinity, + Infinity, + -Infinity, + -Infinity + ]; + const canonical = ctx.canonicalID(); + if (polygonGeometry.type === 'Polygon') { + const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); + const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); + if (!boxWithinBox(lineBBox, polyBBox)) + return false; + for (const line of tileLines) { + if (!lineStringWithinPolygon(line, tilePolygon)) + return false; + } + } + if (polygonGeometry.type === 'MultiPolygon') { + const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); + const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); + if (!boxWithinBox(lineBBox, polyBBox)) + return false; + for (const line of tileLines) { + if (!lineStringWithinPolygons(line, tilePolygons)) + return false; + } + } + return true; +} +class Within { + constructor(geojson, geometries) { + this.type = BooleanType; + this.geojson = geojson; + this.geometries = geometries; + } + static parse(args, context) { + if (args.length !== 2) + return context.error(`'within' expression requires exactly one argument, but found ${ args.length - 1 } instead.`); + if (isValue(args[1])) { + const geojson = args[1]; + if (geojson.type === 'FeatureCollection') { + for (let i = 0; i < geojson.features.length; ++i) { + const type = geojson.features[i].geometry.type; + if (type === 'Polygon' || type === 'MultiPolygon') { + return new Within(geojson, geojson.features[i].geometry); + } + } + } else if (geojson.type === 'Feature') { + const type = geojson.geometry.type; + if (type === 'Polygon' || type === 'MultiPolygon') { + return new Within(geojson, geojson.geometry); + } + } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') { + return new Within(geojson, geojson); + } + } + return context.error(`'within' expression requires valid geojson object that contains polygon geometry type.`); + } + evaluate(ctx) { + if (ctx.geometry() != null && ctx.canonicalID() != null) { + if (ctx.geometryType() === 'Point') { + return pointsWithinPolygons(ctx, this.geometries); + } else if (ctx.geometryType() === 'LineString') { + return linesWithinPolygons(ctx, this.geometries); + } + } + return false; + } + eachChild() { + } + outputDefined() { + return true; + } + serialize() { + return [ + 'within', + this.geojson + ]; + } +} + +function isFeatureConstant(e) { + if (e instanceof CompoundExpression) { + if (e.name === 'get' && e.args.length === 1) { + return false; + } else if (e.name === 'feature-state') { + return false; + } else if (e.name === 'has' && e.args.length === 1) { + return false; + } else if (e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id') { + return false; + } else if (/^filter-/.test(e.name)) { + return false; + } + } + if (e instanceof Within) { + return false; + } + let result = true; + e.eachChild(arg => { + if (result && !isFeatureConstant(arg)) { + result = false; + } + }); + return result; +} +function isStateConstant(e) { + if (e instanceof CompoundExpression) { + if (e.name === 'feature-state') { + return false; + } + } + let result = true; + e.eachChild(arg => { + if (result && !isStateConstant(arg)) { + result = false; + } + }); + return result; +} +function isGlobalPropertyConstant(e, properties) { + if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { + return false; + } + let result = true; + e.eachChild(arg => { + if (result && !isGlobalPropertyConstant(arg, properties)) { + result = false; + } + }); + return result; +} + +class Var { + constructor(name, boundExpression) { + this.type = boundExpression.type; + this.name = name; + this.boundExpression = boundExpression; + } + static parse(args, context) { + if (args.length !== 2 || typeof args[1] !== 'string') + return context.error(`'var' expression requires exactly one string literal argument.`); + const name = args[1]; + if (!context.scope.has(name)) { + return context.error(`Unknown variable "${ name }". Make sure "${ name }" has been bound in an enclosing "let" expression before using it.`, 1); + } + return new Var(name, context.scope.get(name)); + } + evaluate(ctx) { + return this.boundExpression.evaluate(ctx); + } + eachChild() { + } + outputDefined() { + return false; + } + serialize() { + return [ + 'var', + this.name + ]; + } +} + +class ParsingContext { + constructor(registry, path = [], expectedType, scope = new Scope(), errors = []) { + this.registry = registry; + this.path = path; + this.key = path.map(part => `[${ part }]`).join(''); + this.scope = scope; + this.errors = errors; + this.expectedType = expectedType; + } + parse(expr, index, expectedType, bindings, options = {}) { + if (index) { + return this.concat(index, expectedType, bindings)._parse(expr, options); + } + return this._parse(expr, options); + } + _parse(expr, options) { + if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { + expr = [ + 'literal', + expr + ]; + } + function annotate(parsed, type, typeAnnotation) { + if (typeAnnotation === 'assert') { + return new Assertion(type, [parsed]); + } else if (typeAnnotation === 'coerce') { + return new Coercion(type, [parsed]); + } else { + return parsed; + } + } + if (Array.isArray(expr)) { + if (expr.length === 0) { + return this.error(`Expected an array with at least one element. If you wanted a literal array, use ["literal", []].`); + } + const op = expr[0]; + if (typeof op !== 'string') { + this.error(`Expression name must be a string, but found ${ typeof op } instead. If you wanted a literal array, use ["literal", [...]].`, 0); + return null; + } + const Expr = this.registry[op]; + if (Expr) { + let parsed = Expr.parse(expr, this); + if (!parsed) + return null; + if (this.expectedType) { + const expected = this.expectedType; + const actual = parsed.type; + if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') { + parsed = annotate(parsed, expected, options.typeAnnotation || 'assert'); + } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) { + parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce'); + } else if (this.checkSubtype(expected, actual)) { + return null; + } + } + if (!(parsed instanceof Literal) && parsed.type.kind !== 'resolvedImage' && isConstant(parsed)) { + const ec = new EvaluationContext(); + try { + parsed = new Literal(parsed.type, parsed.evaluate(ec)); + } catch (e) { + this.error(e.message); + return null; + } + } + return parsed; + } + return this.error(`Unknown expression "${ op }". If you wanted a literal array, use ["literal", [...]].`, 0); + } else if (typeof expr === 'undefined') { + return this.error(`'undefined' value invalid. Use null instead.`); + } else if (typeof expr === 'object') { + return this.error(`Bare objects invalid. Use ["literal", {...}] instead.`); + } else { + return this.error(`Expected an array, but found ${ typeof expr } instead.`); + } + } + concat(index, expectedType, bindings) { + const path = typeof index === 'number' ? this.path.concat(index) : this.path; + const scope = bindings ? this.scope.concat(bindings) : this.scope; + return new ParsingContext(this.registry, path, expectedType || null, scope, this.errors); + } + error(error, ...keys) { + const key = `${ this.key }${ keys.map(k => `[${ k }]`).join('') }`; + this.errors.push(new ParsingError(key, error)); + } + checkSubtype(expected, t) { + const error = checkSubtype(expected, t); + if (error) + this.error(error); + return error; + } +} +function isConstant(expression) { + if (expression instanceof Var) { + return isConstant(expression.boundExpression); + } else if (expression instanceof CompoundExpression && expression.name === 'error') { + return false; + } else if (expression instanceof CollatorExpression) { + return false; + } else if (expression instanceof Within) { + return false; + } + const isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion; + let childrenConstant = true; + expression.eachChild(child => { + if (isTypeAnnotation) { + childrenConstant = childrenConstant && isConstant(child); + } else { + childrenConstant = childrenConstant && child instanceof Literal; + } + }); + if (!childrenConstant) { + return false; + } + return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, [ + 'zoom', + 'heatmap-density', + 'line-progress', + 'sky-radial-progress', + 'accumulated', + 'is-supported-script' + ]); +} + +function findStopLessThanOrEqualTo(stops, input) { + const lastIndex = stops.length - 1; + let lowerIndex = 0; + let upperIndex = lastIndex; + let currentIndex = 0; + let currentValue, nextValue; + while (lowerIndex <= upperIndex) { + currentIndex = Math.floor((lowerIndex + upperIndex) / 2); + currentValue = stops[currentIndex]; + nextValue = stops[currentIndex + 1]; + if (currentValue <= input) { + if (currentIndex === lastIndex || input < nextValue) { + return currentIndex; + } + lowerIndex = currentIndex + 1; + } else if (currentValue > input) { + upperIndex = currentIndex - 1; + } else { + throw new RuntimeError('Input is not a number.'); + } + } + return 0; +} + +class Step { + constructor(type, input, stops) { + this.type = type; + this.input = input; + this.labels = []; + this.outputs = []; + for (const [label, expression] of stops) { + this.labels.push(label); + this.outputs.push(expression); + } + } + static parse(args, context) { + if (args.length - 1 < 4) { + return context.error(`Expected at least 4 arguments, but found only ${ args.length - 1 }.`); + } + if ((args.length - 1) % 2 !== 0) { + return context.error(`Expected an even number of arguments.`); + } + const input = context.parse(args[1], 1, NumberType); + if (!input) + return null; + const stops = []; + let outputType = null; + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } + for (let i = 1; i < args.length; i += 2) { + const label = i === 1 ? -Infinity : args[i]; + const value = args[i + 1]; + const labelKey = i; + const valueKey = i + 1; + if (typeof label !== 'number') { + return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); + } + if (stops.length && stops[stops.length - 1][0] >= label) { + return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey); + } + const parsed = context.parse(value, valueKey, outputType); + if (!parsed) + return null; + outputType = outputType || parsed.type; + stops.push([ + label, + parsed + ]); + } + return new Step(outputType, input, stops); + } + evaluate(ctx) { + const labels = this.labels; + const outputs = this.outputs; + if (labels.length === 1) { + return outputs[0].evaluate(ctx); + } + const value = this.input.evaluate(ctx); + if (value <= labels[0]) { + return outputs[0].evaluate(ctx); + } + const stopCount = labels.length; + if (value >= labels[stopCount - 1]) { + return outputs[stopCount - 1].evaluate(ctx); + } + const index = findStopLessThanOrEqualTo(labels, value); + return outputs[index].evaluate(ctx); + } + eachChild(fn) { + fn(this.input); + for (const expression of this.outputs) { + fn(expression); + } + } + outputDefined() { + return this.outputs.every(out => out.outputDefined()); + } + serialize() { + const serialized = [ + 'step', + this.input.serialize() + ]; + for (let i = 0; i < this.labels.length; i++) { + if (i > 0) { + serialized.push(this.labels[i]); + } + serialized.push(this.outputs[i].serialize()); + } + return serialized; + } +} + +function number(a, b, t) { + return a * (1 - t) + b * t; +} +function color(from, to, t) { + return new Color(number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t)); +} +function array$1(from, to, t) { + return from.map((d, i) => { + return number(d, to[i], t); + }); +} + +var interpolate = /*#__PURE__*/Object.freeze({ +__proto__: null, +number: number, +color: color, +array: array$1 +}); + +const Xn = 0.95047, Yn = 1, Zn = 1.08883, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI; +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} +function xyz2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} +function rgb2xyz(x) { + x /= 255; + return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} +function rgbToLab(rgbColor) { + const b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.072175 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.119192 * a + 0.9503041 * l) / Zn); + return { + l: 116 * y - 16, + a: 500 * (x - y), + b: 200 * (y - z), + alpha: rgbColor.a + }; +} +function labToRgb(labColor) { + let y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200; + y = Yn * lab2xyz(y); + x = Xn * lab2xyz(x); + z = Zn * lab2xyz(z); + return new Color(xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), xyz2rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha); +} +function interpolateLab(from, to, t) { + return { + l: number(from.l, to.l, t), + a: number(from.a, to.a, t), + b: number(from.b, to.b, t), + alpha: number(from.alpha, to.alpha, t) + }; +} +function rgbToHcl(rgbColor) { + const {l, a, b} = rgbToLab(rgbColor); + const h = Math.atan2(b, a) * rad2deg; + return { + h: h < 0 ? h + 360 : h, + c: Math.sqrt(a * a + b * b), + l, + alpha: rgbColor.a + }; +} +function hclToRgb(hclColor) { + const h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l; + return labToRgb({ + l, + a: Math.cos(h) * c, + b: Math.sin(h) * c, + alpha: hclColor.alpha + }); +} +function interpolateHue(a, b, t) { + const d = b - a; + return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); +} +function interpolateHcl(from, to, t) { + return { + h: interpolateHue(from.h, to.h, t), + c: number(from.c, to.c, t), + l: number(from.l, to.l, t), + alpha: number(from.alpha, to.alpha, t) + }; +} +const lab = { + forward: rgbToLab, + reverse: labToRgb, + interpolate: interpolateLab +}; +const hcl = { + forward: rgbToHcl, + reverse: hclToRgb, + interpolate: interpolateHcl +}; + +var colorSpaces = /*#__PURE__*/Object.freeze({ +__proto__: null, +lab: lab, +hcl: hcl +}); + +class Interpolate { + constructor(type, operator, interpolation, input, stops) { + this.type = type; + this.operator = operator; + this.interpolation = interpolation; + this.input = input; + this.labels = []; + this.outputs = []; + for (const [label, expression] of stops) { + this.labels.push(label); + this.outputs.push(expression); + } + } + static interpolationFactor(interpolation, input, lower, upper) { + let t = 0; + if (interpolation.name === 'exponential') { + t = exponentialInterpolation(input, interpolation.base, lower, upper); + } else if (interpolation.name === 'linear') { + t = exponentialInterpolation(input, 1, lower, upper); + } else if (interpolation.name === 'cubic-bezier') { + const c = interpolation.controlPoints; + const ub = new unitbezier(c[0], c[1], c[2], c[3]); + t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); + } + return t; + } + static parse(args, context) { + let [operator, interpolation, input, ...rest] = args; + if (!Array.isArray(interpolation) || interpolation.length === 0) { + return context.error(`Expected an interpolation type expression.`, 1); + } + if (interpolation[0] === 'linear') { + interpolation = { name: 'linear' }; + } else if (interpolation[0] === 'exponential') { + const base = interpolation[1]; + if (typeof base !== 'number') + return context.error(`Exponential interpolation requires a numeric base.`, 1, 1); + interpolation = { + name: 'exponential', + base + }; + } else if (interpolation[0] === 'cubic-bezier') { + const controlPoints = interpolation.slice(1); + if (controlPoints.length !== 4 || controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1)) { + return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); + } + interpolation = { + name: 'cubic-bezier', + controlPoints: controlPoints + }; + } else { + return context.error(`Unknown interpolation type ${ String(interpolation[0]) }`, 1, 0); + } + if (args.length - 1 < 4) { + return context.error(`Expected at least 4 arguments, but found only ${ args.length - 1 }.`); + } + if ((args.length - 1) % 2 !== 0) { + return context.error(`Expected an even number of arguments.`); + } + input = context.parse(input, 2, NumberType); + if (!input) + return null; + const stops = []; + let outputType = null; + if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { + outputType = ColorType; + } else if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } + for (let i = 0; i < rest.length; i += 2) { + const label = rest[i]; + const value = rest[i + 1]; + const labelKey = i + 3; + const valueKey = i + 4; + if (typeof label !== 'number') { + return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); + } + if (stops.length && stops[stops.length - 1][0] >= label) { + return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey); + } + const parsed = context.parse(value, valueKey, outputType); + if (!parsed) + return null; + outputType = outputType || parsed.type; + stops.push([ + label, + parsed + ]); + } + if (outputType.kind !== 'number' && outputType.kind !== 'color' && !(outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number')) { + return context.error(`Type ${ toString(outputType) } is not interpolatable.`); + } + return new Interpolate(outputType, operator, interpolation, input, stops); + } + evaluate(ctx) { + const labels = this.labels; + const outputs = this.outputs; + if (labels.length === 1) { + return outputs[0].evaluate(ctx); + } + const value = this.input.evaluate(ctx); + if (value <= labels[0]) { + return outputs[0].evaluate(ctx); + } + const stopCount = labels.length; + if (value >= labels[stopCount - 1]) { + return outputs[stopCount - 1].evaluate(ctx); + } + const index = findStopLessThanOrEqualTo(labels, value); + const lower = labels[index]; + const upper = labels[index + 1]; + const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); + const outputLower = outputs[index].evaluate(ctx); + const outputUpper = outputs[index + 1].evaluate(ctx); + if (this.operator === 'interpolate') { + return interpolate[this.type.kind.toLowerCase()](outputLower, outputUpper, t); + } else if (this.operator === 'interpolate-hcl') { + return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t)); + } else { + return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t)); + } + } + eachChild(fn) { + fn(this.input); + for (const expression of this.outputs) { + fn(expression); + } + } + outputDefined() { + return this.outputs.every(out => out.outputDefined()); + } + serialize() { + let interpolation; + if (this.interpolation.name === 'linear') { + interpolation = ['linear']; + } else if (this.interpolation.name === 'exponential') { + if (this.interpolation.base === 1) { + interpolation = ['linear']; + } else { + interpolation = [ + 'exponential', + this.interpolation.base + ]; + } + } else { + interpolation = ['cubic-bezier'].concat(this.interpolation.controlPoints); + } + const serialized = [ + this.operator, + interpolation, + this.input.serialize() + ]; + for (let i = 0; i < this.labels.length; i++) { + serialized.push(this.labels[i], this.outputs[i].serialize()); + } + return serialized; + } +} +function exponentialInterpolation(input, base, lowerValue, upperValue) { + const difference = upperValue - lowerValue; + const progress = input - lowerValue; + if (difference === 0) { + return 0; + } else if (base === 1) { + return progress / difference; + } else { + return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); + } +} + +class Coalesce { + constructor(type, args) { + this.type = type; + this.args = args; + } + static parse(args, context) { + if (args.length < 2) { + return context.error('Expectected at least one argument.'); + } + let outputType = null; + const expectedType = context.expectedType; + if (expectedType && expectedType.kind !== 'value') { + outputType = expectedType; + } + const parsedArgs = []; + for (const arg of args.slice(1)) { + const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, { typeAnnotation: 'omit' }); + if (!parsed) + return null; + outputType = outputType || parsed.type; + parsedArgs.push(parsed); + } + const needsAnnotation = expectedType && parsedArgs.some(arg => checkSubtype(expectedType, arg.type)); + return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce(outputType, parsedArgs); + } + evaluate(ctx) { + let result = null; + let argCount = 0; + let requestedImageName; + for (const arg of this.args) { + argCount++; + result = arg.evaluate(ctx); + if (result && result instanceof ResolvedImage && !result.available) { + if (!requestedImageName) { + requestedImageName = result.name; + } + result = null; + if (argCount === this.args.length) { + result = requestedImageName; + } + } + if (result !== null) + break; + } + return result; + } + eachChild(fn) { + this.args.forEach(fn); + } + outputDefined() { + return this.args.every(arg => arg.outputDefined()); + } + serialize() { + const serialized = ['coalesce']; + this.eachChild(child => { + serialized.push(child.serialize()); + }); + return serialized; + } +} + +class Let { + constructor(bindings, result) { + this.type = result.type; + this.bindings = [].concat(bindings); + this.result = result; + } + evaluate(ctx) { + return this.result.evaluate(ctx); + } + eachChild(fn) { + for (const binding of this.bindings) { + fn(binding[1]); + } + fn(this.result); + } + static parse(args, context) { + if (args.length < 4) + return context.error(`Expected at least 3 arguments, but found ${ args.length - 1 } instead.`); + const bindings = []; + for (let i = 1; i < args.length - 1; i += 2) { + const name = args[i]; + if (typeof name !== 'string') { + return context.error(`Expected string, but found ${ typeof name } instead.`, i); + } + if (/[^a-zA-Z0-9_]/.test(name)) { + return context.error(`Variable names must contain only alphanumeric characters or '_'.`, i); + } + const value = context.parse(args[i + 1], i + 1); + if (!value) + return null; + bindings.push([ + name, + value + ]); + } + const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); + if (!result) + return null; + return new Let(bindings, result); + } + outputDefined() { + return this.result.outputDefined(); + } + serialize() { + const serialized = ['let']; + for (const [name, expr] of this.bindings) { + serialized.push(name, expr.serialize()); + } + serialized.push(this.result.serialize()); + return serialized; + } +} + +class At { + constructor(type, index, input) { + this.type = type; + this.index = index; + this.input = input; + } + static parse(args, context) { + if (args.length !== 3) + return context.error(`Expected 2 arguments, but found ${ args.length - 1 } instead.`); + const index = context.parse(args[1], 1, NumberType); + const input = context.parse(args[2], 2, array(context.expectedType || ValueType)); + if (!index || !input) + return null; + const t = input.type; + return new At(t.itemType, index, input); + } + evaluate(ctx) { + const index = this.index.evaluate(ctx); + const array = this.input.evaluate(ctx); + if (index < 0) { + throw new RuntimeError(`Array index out of bounds: ${ index } < 0.`); + } + if (index >= array.length) { + throw new RuntimeError(`Array index out of bounds: ${ index } > ${ array.length - 1 }.`); + } + if (index !== Math.floor(index)) { + throw new RuntimeError(`Array index must be an integer, but found ${ index } instead.`); + } + return array[index]; + } + eachChild(fn) { + fn(this.index); + fn(this.input); + } + outputDefined() { + return false; + } + serialize() { + return [ + 'at', + this.index.serialize(), + this.input.serialize() + ]; + } +} + +class In { + constructor(needle, haystack) { + this.type = BooleanType; + this.needle = needle; + this.haystack = haystack; + } + static parse(args, context) { + if (args.length !== 3) { + return context.error(`Expected 2 arguments, but found ${ args.length - 1 } instead.`); + } + const needle = context.parse(args[1], 1, ValueType); + const haystack = context.parse(args[2], 2, ValueType); + if (!needle || !haystack) + return null; + if (!isValidType(needle.type, [ + BooleanType, + StringType, + NumberType, + NullType, + ValueType + ])) { + return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${ toString(needle.type) } instead`); + } + return new In(needle, haystack); + } + evaluate(ctx) { + const needle = this.needle.evaluate(ctx); + const haystack = this.haystack.evaluate(ctx); + if (!haystack) + return false; + if (!isValidNativeType(needle, [ + 'boolean', + 'string', + 'number', + 'null' + ])) { + throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${ toString(typeOf(needle)) } instead.`); + } + if (!isValidNativeType(haystack, [ + 'string', + 'array' + ])) { + throw new RuntimeError(`Expected second argument to be of type array or string, but found ${ toString(typeOf(haystack)) } instead.`); + } + return haystack.indexOf(needle) >= 0; + } + eachChild(fn) { + fn(this.needle); + fn(this.haystack); + } + outputDefined() { + return true; + } + serialize() { + return [ + 'in', + this.needle.serialize(), + this.haystack.serialize() + ]; + } +} + +class IndexOf { + constructor(needle, haystack, fromIndex) { + this.type = NumberType; + this.needle = needle; + this.haystack = haystack; + this.fromIndex = fromIndex; + } + static parse(args, context) { + if (args.length <= 2 || args.length >= 5) { + return context.error(`Expected 3 or 4 arguments, but found ${ args.length - 1 } instead.`); + } + const needle = context.parse(args[1], 1, ValueType); + const haystack = context.parse(args[2], 2, ValueType); + if (!needle || !haystack) + return null; + if (!isValidType(needle.type, [ + BooleanType, + StringType, + NumberType, + NullType, + ValueType + ])) { + return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${ toString(needle.type) } instead`); + } + if (args.length === 4) { + const fromIndex = context.parse(args[3], 3, NumberType); + if (!fromIndex) + return null; + return new IndexOf(needle, haystack, fromIndex); + } else { + return new IndexOf(needle, haystack); + } + } + evaluate(ctx) { + const needle = this.needle.evaluate(ctx); + const haystack = this.haystack.evaluate(ctx); + if (!isValidNativeType(needle, [ + 'boolean', + 'string', + 'number', + 'null' + ])) { + throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${ toString(typeOf(needle)) } instead.`); + } + if (!isValidNativeType(haystack, [ + 'string', + 'array' + ])) { + throw new RuntimeError(`Expected second argument to be of type array or string, but found ${ toString(typeOf(haystack)) } instead.`); + } + if (this.fromIndex) { + const fromIndex = this.fromIndex.evaluate(ctx); + return haystack.indexOf(needle, fromIndex); + } + return haystack.indexOf(needle); + } + eachChild(fn) { + fn(this.needle); + fn(this.haystack); + if (this.fromIndex) { + fn(this.fromIndex); + } + } + outputDefined() { + return false; + } + serialize() { + if (this.fromIndex != null && this.fromIndex !== undefined) { + const fromIndex = this.fromIndex.serialize(); + return [ + 'index-of', + this.needle.serialize(), + this.haystack.serialize(), + fromIndex + ]; + } + return [ + 'index-of', + this.needle.serialize(), + this.haystack.serialize() + ]; + } +} + +class Match { + constructor(inputType, outputType, input, cases, outputs, otherwise) { + this.inputType = inputType; + this.type = outputType; + this.input = input; + this.cases = cases; + this.outputs = outputs; + this.otherwise = otherwise; + } + static parse(args, context) { + if (args.length < 5) + return context.error(`Expected at least 4 arguments, but found only ${ args.length - 1 }.`); + if (args.length % 2 !== 1) + return context.error(`Expected an even number of arguments.`); + let inputType; + let outputType; + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } + const cases = {}; + const outputs = []; + for (let i = 2; i < args.length - 1; i += 2) { + let labels = args[i]; + const value = args[i + 1]; + if (!Array.isArray(labels)) { + labels = [labels]; + } + const labelContext = context.concat(i); + if (labels.length === 0) { + return labelContext.error('Expected at least one branch label.'); + } + for (const label of labels) { + if (typeof label !== 'number' && typeof label !== 'string') { + return labelContext.error(`Branch labels must be numbers or strings.`); + } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) { + return labelContext.error(`Branch labels must be integers no larger than ${ Number.MAX_SAFE_INTEGER }.`); + } else if (typeof label === 'number' && Math.floor(label) !== label) { + return labelContext.error(`Numeric branch labels must be integer values.`); + } else if (!inputType) { + inputType = typeOf(label); + } else if (labelContext.checkSubtype(inputType, typeOf(label))) { + return null; + } + if (typeof cases[String(label)] !== 'undefined') { + return labelContext.error('Branch labels must be unique.'); + } + cases[String(label)] = outputs.length; + } + const result = context.parse(value, i, outputType); + if (!result) + return null; + outputType = outputType || result.type; + outputs.push(result); + } + const input = context.parse(args[1], 1, ValueType); + if (!input) + return null; + const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); + if (!otherwise) + return null; + if (input.type.kind !== 'value' && context.concat(1).checkSubtype(inputType, input.type)) { + return null; + } + return new Match(inputType, outputType, input, cases, outputs, otherwise); + } + evaluate(ctx) { + const input = this.input.evaluate(ctx); + const output = typeOf(input) === this.inputType && this.outputs[this.cases[input]] || this.otherwise; + return output.evaluate(ctx); + } + eachChild(fn) { + fn(this.input); + this.outputs.forEach(fn); + fn(this.otherwise); + } + outputDefined() { + return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined(); + } + serialize() { + const serialized = [ + 'match', + this.input.serialize() + ]; + const sortedLabels = Object.keys(this.cases).sort(); + const groupedByOutput = []; + const outputLookup = {}; + for (const label of sortedLabels) { + const outputIndex = outputLookup[this.cases[label]]; + if (outputIndex === undefined) { + outputLookup[this.cases[label]] = groupedByOutput.length; + groupedByOutput.push([ + this.cases[label], + [label] + ]); + } else { + groupedByOutput[outputIndex][1].push(label); + } + } + const coerceLabel = label => this.inputType.kind === 'number' ? Number(label) : label; + for (const [outputIndex, labels] of groupedByOutput) { + if (labels.length === 1) { + serialized.push(coerceLabel(labels[0])); + } else { + serialized.push(labels.map(coerceLabel)); + } + serialized.push(this.outputs[outputIndex].serialize()); + } + serialized.push(this.otherwise.serialize()); + return serialized; + } +} + +class Case { + constructor(type, branches, otherwise) { + this.type = type; + this.branches = branches; + this.otherwise = otherwise; + } + static parse(args, context) { + if (args.length < 4) + return context.error(`Expected at least 3 arguments, but found only ${ args.length - 1 }.`); + if (args.length % 2 !== 0) + return context.error(`Expected an odd number of arguments.`); + let outputType; + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } + const branches = []; + for (let i = 1; i < args.length - 1; i += 2) { + const test = context.parse(args[i], i, BooleanType); + if (!test) + return null; + const result = context.parse(args[i + 1], i + 1, outputType); + if (!result) + return null; + branches.push([ + test, + result + ]); + outputType = outputType || result.type; + } + const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); + if (!otherwise) + return null; + return new Case(outputType, branches, otherwise); + } + evaluate(ctx) { + for (const [test, expression] of this.branches) { + if (test.evaluate(ctx)) { + return expression.evaluate(ctx); + } + } + return this.otherwise.evaluate(ctx); + } + eachChild(fn) { + for (const [test, expression] of this.branches) { + fn(test); + fn(expression); + } + fn(this.otherwise); + } + outputDefined() { + return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined(); + } + serialize() { + const serialized = ['case']; + this.eachChild(child => { + serialized.push(child.serialize()); + }); + return serialized; + } +} + +class Slice { + constructor(type, input, beginIndex, endIndex) { + this.type = type; + this.input = input; + this.beginIndex = beginIndex; + this.endIndex = endIndex; + } + static parse(args, context) { + if (args.length <= 2 || args.length >= 5) { + return context.error(`Expected 3 or 4 arguments, but found ${ args.length - 1 } instead.`); + } + const input = context.parse(args[1], 1, ValueType); + const beginIndex = context.parse(args[2], 2, NumberType); + if (!input || !beginIndex) + return null; + if (!isValidType(input.type, [ + array(ValueType), + StringType, + ValueType + ])) { + return context.error(`Expected first argument to be of type array or string, but found ${ toString(input.type) } instead`); + } + if (args.length === 4) { + const endIndex = context.parse(args[3], 3, NumberType); + if (!endIndex) + return null; + return new Slice(input.type, input, beginIndex, endIndex); + } else { + return new Slice(input.type, input, beginIndex); + } + } + evaluate(ctx) { + const input = this.input.evaluate(ctx); + const beginIndex = this.beginIndex.evaluate(ctx); + if (!isValidNativeType(input, [ + 'string', + 'array' + ])) { + throw new RuntimeError(`Expected first argument to be of type array or string, but found ${ toString(typeOf(input)) } instead.`); + } + if (this.endIndex) { + const endIndex = this.endIndex.evaluate(ctx); + return input.slice(beginIndex, endIndex); + } + return input.slice(beginIndex); + } + eachChild(fn) { + fn(this.input); + fn(this.beginIndex); + if (this.endIndex) { + fn(this.endIndex); + } + } + outputDefined() { + return false; + } + serialize() { + if (this.endIndex != null && this.endIndex !== undefined) { + const endIndex = this.endIndex.serialize(); + return [ + 'slice', + this.input.serialize(), + this.beginIndex.serialize(), + endIndex + ]; + } + return [ + 'slice', + this.input.serialize(), + this.beginIndex.serialize() + ]; + } +} + +function isComparableType(op, type) { + if (op === '==' || op === '!=') { + return type.kind === 'boolean' || type.kind === 'string' || type.kind === 'number' || type.kind === 'null' || type.kind === 'value'; + } else { + return type.kind === 'string' || type.kind === 'number' || type.kind === 'value'; + } +} +function eq(ctx, a, b) { + return a === b; +} +function neq(ctx, a, b) { + return a !== b; +} +function lt(ctx, a, b) { + return a < b; +} +function gt(ctx, a, b) { + return a > b; +} +function lteq(ctx, a, b) { + return a <= b; +} +function gteq(ctx, a, b) { + return a >= b; +} +function eqCollate(ctx, a, b, c) { + return c.compare(a, b) === 0; +} +function neqCollate(ctx, a, b, c) { + return !eqCollate(ctx, a, b, c); +} +function ltCollate(ctx, a, b, c) { + return c.compare(a, b) < 0; +} +function gtCollate(ctx, a, b, c) { + return c.compare(a, b) > 0; +} +function lteqCollate(ctx, a, b, c) { + return c.compare(a, b) <= 0; +} +function gteqCollate(ctx, a, b, c) { + return c.compare(a, b) >= 0; +} +function makeComparison(op, compareBasic, compareWithCollator) { + const isOrderComparison = op !== '==' && op !== '!='; + return class Comparison { + constructor(lhs, rhs, collator) { + this.type = BooleanType; + this.lhs = lhs; + this.rhs = rhs; + this.collator = collator; + this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value'; + } + static parse(args, context) { + if (args.length !== 3 && args.length !== 4) + return context.error(`Expected two or three arguments.`); + const op = args[0]; + let lhs = context.parse(args[1], 1, ValueType); + if (!lhs) + return null; + if (!isComparableType(op, lhs.type)) { + return context.concat(1).error(`"${ op }" comparisons are not supported for type '${ toString(lhs.type) }'.`); + } + let rhs = context.parse(args[2], 2, ValueType); + if (!rhs) + return null; + if (!isComparableType(op, rhs.type)) { + return context.concat(2).error(`"${ op }" comparisons are not supported for type '${ toString(rhs.type) }'.`); + } + if (lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') { + return context.error(`Cannot compare types '${ toString(lhs.type) }' and '${ toString(rhs.type) }'.`); + } + if (isOrderComparison) { + if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') { + lhs = new Assertion(rhs.type, [lhs]); + } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') { + rhs = new Assertion(lhs.type, [rhs]); + } + } + let collator = null; + if (args.length === 4) { + if (lhs.type.kind !== 'string' && rhs.type.kind !== 'string' && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') { + return context.error(`Cannot use collator to compare non-string types.`); + } + collator = context.parse(args[3], 3, CollatorType); + if (!collator) + return null; + } + return new Comparison(lhs, rhs, collator); + } + evaluate(ctx) { + const lhs = this.lhs.evaluate(ctx); + const rhs = this.rhs.evaluate(ctx); + if (isOrderComparison && this.hasUntypedArgument) { + const lt = typeOf(lhs); + const rt = typeOf(rhs); + if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) { + throw new RuntimeError(`Expected arguments for "${ op }" to be (string, string) or (number, number), but found (${ lt.kind }, ${ rt.kind }) instead.`); + } + } + if (this.collator && !isOrderComparison && this.hasUntypedArgument) { + const lt = typeOf(lhs); + const rt = typeOf(rhs); + if (lt.kind !== 'string' || rt.kind !== 'string') { + return compareBasic(ctx, lhs, rhs); + } + } + return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs); + } + eachChild(fn) { + fn(this.lhs); + fn(this.rhs); + if (this.collator) { + fn(this.collator); + } + } + outputDefined() { + return true; + } + serialize() { + const serialized = [op]; + this.eachChild(child => { + serialized.push(child.serialize()); + }); + return serialized; + } + }; +} +const Equals = makeComparison('==', eq, eqCollate); +const NotEquals = makeComparison('!=', neq, neqCollate); +const LessThan = makeComparison('<', lt, ltCollate); +const GreaterThan = makeComparison('>', gt, gtCollate); +const LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); +const GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); + +class NumberFormat { + constructor(number, locale, currency, minFractionDigits, maxFractionDigits) { + this.type = StringType; + this.number = number; + this.locale = locale; + this.currency = currency; + this.minFractionDigits = minFractionDigits; + this.maxFractionDigits = maxFractionDigits; + } + static parse(args, context) { + if (args.length !== 3) + return context.error(`Expected two arguments.`); + const number = context.parse(args[1], 1, NumberType); + if (!number) + return null; + const options = args[2]; + if (typeof options !== 'object' || Array.isArray(options)) + return context.error(`NumberFormat options argument must be an object.`); + let locale = null; + if (options['locale']) { + locale = context.parse(options['locale'], 1, StringType); + if (!locale) + return null; + } + let currency = null; + if (options['currency']) { + currency = context.parse(options['currency'], 1, StringType); + if (!currency) + return null; + } + let minFractionDigits = null; + if (options['min-fraction-digits']) { + minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); + if (!minFractionDigits) + return null; + } + let maxFractionDigits = null; + if (options['max-fraction-digits']) { + maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); + if (!maxFractionDigits) + return null; + } + return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); + } + evaluate(ctx) { + return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], { + style: this.currency ? 'currency' : 'decimal', + currency: this.currency ? this.currency.evaluate(ctx) : undefined, + minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined, + maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined + }).format(this.number.evaluate(ctx)); + } + eachChild(fn) { + fn(this.number); + if (this.locale) { + fn(this.locale); + } + if (this.currency) { + fn(this.currency); + } + if (this.minFractionDigits) { + fn(this.minFractionDigits); + } + if (this.maxFractionDigits) { + fn(this.maxFractionDigits); + } + } + outputDefined() { + return false; + } + serialize() { + const options = {}; + if (this.locale) { + options['locale'] = this.locale.serialize(); + } + if (this.currency) { + options['currency'] = this.currency.serialize(); + } + if (this.minFractionDigits) { + options['min-fraction-digits'] = this.minFractionDigits.serialize(); + } + if (this.maxFractionDigits) { + options['max-fraction-digits'] = this.maxFractionDigits.serialize(); + } + return [ + 'number-format', + this.number.serialize(), + options + ]; + } +} + +class Length { + constructor(input) { + this.type = NumberType; + this.input = input; + } + static parse(args, context) { + if (args.length !== 2) + return context.error(`Expected 1 argument, but found ${ args.length - 1 } instead.`); + const input = context.parse(args[1], 1); + if (!input) + return null; + if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') + return context.error(`Expected argument of type string or array, but found ${ toString(input.type) } instead.`); + return new Length(input); + } + evaluate(ctx) { + const input = this.input.evaluate(ctx); + if (typeof input === 'string') { + return input.length; + } else if (Array.isArray(input)) { + return input.length; + } else { + throw new RuntimeError(`Expected value to be of type string or array, but found ${ toString(typeOf(input)) } instead.`); + } + } + eachChild(fn) { + fn(this.input); + } + outputDefined() { + return false; + } + serialize() { + const serialized = ['length']; + this.eachChild(child => { + serialized.push(child.serialize()); + }); + return serialized; + } +} + +const expressions = { + '==': Equals, + '!=': NotEquals, + '>': GreaterThan, + '<': LessThan, + '>=': GreaterThanOrEqual, + '<=': LessThanOrEqual, + 'array': Assertion, + 'at': At, + 'boolean': Assertion, + 'case': Case, + 'coalesce': Coalesce, + 'collator': CollatorExpression, + 'format': FormatExpression, + 'image': ImageExpression, + 'in': In, + 'index-of': IndexOf, + 'interpolate': Interpolate, + 'interpolate-hcl': Interpolate, + 'interpolate-lab': Interpolate, + 'length': Length, + 'let': Let, + 'literal': Literal, + 'match': Match, + 'number': Assertion, + 'number-format': NumberFormat, + 'object': Assertion, + 'slice': Slice, + 'step': Step, + 'string': Assertion, + 'to-boolean': Coercion, + 'to-color': Coercion, + 'to-number': Coercion, + 'to-string': Coercion, + 'var': Var, + 'within': Within +}; +function rgba(ctx, [r, g, b, a]) { + r = r.evaluate(ctx); + g = g.evaluate(ctx); + b = b.evaluate(ctx); + const alpha = a ? a.evaluate(ctx) : 1; + const error = validateRGBA(r, g, b, alpha); + if (error) + throw new RuntimeError(error); + return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha); +} +function has(key, obj) { + return key in obj; +} +function get(key, obj) { + const v = obj[key]; + return typeof v === 'undefined' ? null : v; +} +function binarySearch(v, a, i, j) { + while (i <= j) { + const m = i + j >> 1; + if (a[m] === v) + return true; + if (a[m] > v) + j = m - 1; + else + i = m + 1; + } + return false; +} +function varargs(type) { + return { type }; +} +CompoundExpression.register(expressions, { + 'error': [ + ErrorType, + [StringType], + (ctx, [v]) => { + throw new RuntimeError(v.evaluate(ctx)); + } + ], + 'typeof': [ + StringType, + [ValueType], + (ctx, [v]) => toString(typeOf(v.evaluate(ctx))) + ], + 'to-rgba': [ + array(NumberType, 4), + [ColorType], + (ctx, [v]) => { + return v.evaluate(ctx).toArray(); + } + ], + 'rgb': [ + ColorType, + [ + NumberType, + NumberType, + NumberType + ], + rgba + ], + 'rgba': [ + ColorType, + [ + NumberType, + NumberType, + NumberType, + NumberType + ], + rgba + ], + 'has': { + type: BooleanType, + overloads: [ + [ + [StringType], + (ctx, [key]) => has(key.evaluate(ctx), ctx.properties()) + ], + [ + [ + StringType, + ObjectType + ], + (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx)) + ] + ] + }, + 'get': { + type: ValueType, + overloads: [ + [ + [StringType], + (ctx, [key]) => get(key.evaluate(ctx), ctx.properties()) + ], + [ + [ + StringType, + ObjectType + ], + (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx)) + ] + ] + }, + 'feature-state': [ + ValueType, + [StringType], + (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {}) + ], + 'properties': [ + ObjectType, + [], + ctx => ctx.properties() + ], + 'geometry-type': [ + StringType, + [], + ctx => ctx.geometryType() + ], + 'id': [ + ValueType, + [], + ctx => ctx.id() + ], + 'zoom': [ + NumberType, + [], + ctx => ctx.globals.zoom + ], + 'heatmap-density': [ + NumberType, + [], + ctx => ctx.globals.heatmapDensity || 0 + ], + 'line-progress': [ + NumberType, + [], + ctx => ctx.globals.lineProgress || 0 + ], + 'sky-radial-progress': [ + NumberType, + [], + ctx => ctx.globals.skyRadialProgress || 0 + ], + 'accumulated': [ + ValueType, + [], + ctx => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated + ], + '+': [ + NumberType, + varargs(NumberType), + (ctx, args) => { + let result = 0; + for (const arg of args) { + result += arg.evaluate(ctx); + } + return result; + } + ], + '*': [ + NumberType, + varargs(NumberType), + (ctx, args) => { + let result = 1; + for (const arg of args) { + result *= arg.evaluate(ctx); + } + return result; + } + ], + '-': { + type: NumberType, + overloads: [ + [ + [ + NumberType, + NumberType + ], + (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx) + ], + [ + [NumberType], + (ctx, [a]) => -a.evaluate(ctx) + ] + ] + }, + '/': [ + NumberType, + [ + NumberType, + NumberType + ], + (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx) + ], + '%': [ + NumberType, + [ + NumberType, + NumberType + ], + (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx) + ], + 'ln2': [ + NumberType, + [], + () => Math.LN2 + ], + 'pi': [ + NumberType, + [], + () => Math.PI + ], + 'e': [ + NumberType, + [], + () => Math.E + ], + '^': [ + NumberType, + [ + NumberType, + NumberType + ], + (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx)) + ], + 'sqrt': [ + NumberType, + [NumberType], + (ctx, [x]) => Math.sqrt(x.evaluate(ctx)) + ], + 'log10': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10 + ], + 'ln': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) + ], + 'log2': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2 + ], + 'sin': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.sin(n.evaluate(ctx)) + ], + 'cos': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.cos(n.evaluate(ctx)) + ], + 'tan': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.tan(n.evaluate(ctx)) + ], + 'asin': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.asin(n.evaluate(ctx)) + ], + 'acos': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.acos(n.evaluate(ctx)) + ], + 'atan': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.atan(n.evaluate(ctx)) + ], + 'min': [ + NumberType, + varargs(NumberType), + (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx))) + ], + 'max': [ + NumberType, + varargs(NumberType), + (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx))) + ], + 'abs': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.abs(n.evaluate(ctx)) + ], + 'round': [ + NumberType, + [NumberType], + (ctx, [n]) => { + const v = n.evaluate(ctx); + return v < 0 ? -Math.round(-v) : Math.round(v); + } + ], + 'floor': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.floor(n.evaluate(ctx)) + ], + 'ceil': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.ceil(n.evaluate(ctx)) + ], + 'filter-==': [ + BooleanType, + [ + StringType, + ValueType + ], + (ctx, [k, v]) => ctx.properties()[k.value] === v.value + ], + 'filter-id-==': [ + BooleanType, + [ValueType], + (ctx, [v]) => ctx.id() === v.value + ], + 'filter-type-==': [ + BooleanType, + [StringType], + (ctx, [v]) => ctx.geometryType() === v.value + ], + 'filter-<': [ + BooleanType, + [ + StringType, + ValueType + ], + (ctx, [k, v]) => { + const a = ctx.properties()[k.value]; + const b = v.value; + return typeof a === typeof b && a < b; + } + ], + 'filter-id-<': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = v.value; + return typeof a === typeof b && a < b; + } + ], + 'filter->': [ + BooleanType, + [ + StringType, + ValueType + ], + (ctx, [k, v]) => { + const a = ctx.properties()[k.value]; + const b = v.value; + return typeof a === typeof b && a > b; + } + ], + 'filter-id->': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = v.value; + return typeof a === typeof b && a > b; + } + ], + 'filter-<=': [ + BooleanType, + [ + StringType, + ValueType + ], + (ctx, [k, v]) => { + const a = ctx.properties()[k.value]; + const b = v.value; + return typeof a === typeof b && a <= b; + } + ], + 'filter-id-<=': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = v.value; + return typeof a === typeof b && a <= b; + } + ], + 'filter->=': [ + BooleanType, + [ + StringType, + ValueType + ], + (ctx, [k, v]) => { + const a = ctx.properties()[k.value]; + const b = v.value; + return typeof a === typeof b && a >= b; + } + ], + 'filter-id->=': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = v.value; + return typeof a === typeof b && a >= b; + } + ], + 'filter-has': [ + BooleanType, + [ValueType], + (ctx, [k]) => k.value in ctx.properties() + ], + 'filter-has-id': [ + BooleanType, + [], + ctx => ctx.id() !== null && ctx.id() !== undefined + ], + 'filter-type-in': [ + BooleanType, + [array(StringType)], + (ctx, [v]) => v.value.indexOf(ctx.geometryType()) >= 0 + ], + 'filter-id-in': [ + BooleanType, + [array(ValueType)], + (ctx, [v]) => v.value.indexOf(ctx.id()) >= 0 + ], + 'filter-in-small': [ + BooleanType, + [ + StringType, + array(ValueType) + ], + (ctx, [k, v]) => v.value.indexOf(ctx.properties()[k.value]) >= 0 + ], + 'filter-in-large': [ + BooleanType, + [ + StringType, + array(ValueType) + ], + (ctx, [k, v]) => binarySearch(ctx.properties()[k.value], v.value, 0, v.value.length - 1) + ], + 'all': { + type: BooleanType, + overloads: [ + [ + [ + BooleanType, + BooleanType + ], + (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx) + ], + [ + varargs(BooleanType), + (ctx, args) => { + for (const arg of args) { + if (!arg.evaluate(ctx)) + return false; + } + return true; + } + ] + ] + }, + 'any': { + type: BooleanType, + overloads: [ + [ + [ + BooleanType, + BooleanType + ], + (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx) + ], + [ + varargs(BooleanType), + (ctx, args) => { + for (const arg of args) { + if (arg.evaluate(ctx)) + return true; + } + return false; + } + ] + ] + }, + '!': [ + BooleanType, + [BooleanType], + (ctx, [b]) => !b.evaluate(ctx) + ], + 'is-supported-script': [ + BooleanType, + [StringType], + (ctx, [s]) => { + const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; + if (isSupportedScript) { + return isSupportedScript(s.evaluate(ctx)); + } + return true; + } + ], + 'upcase': [ + StringType, + [StringType], + (ctx, [s]) => s.evaluate(ctx).toUpperCase() + ], + 'downcase': [ + StringType, + [StringType], + (ctx, [s]) => s.evaluate(ctx).toLowerCase() + ], + 'concat': [ + StringType, + varargs(ValueType), + (ctx, args) => args.map(arg => toString$1(arg.evaluate(ctx))).join('') + ], + 'resolved-locale': [ + StringType, + [CollatorType], + (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale() + ] +}); + +function success(value) { + return { + result: 'success', + value + }; +} +function error(value) { + return { + result: 'error', + value + }; +} + +function supportsPropertyExpression(spec) { + return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; +} +function supportsZoomExpression(spec) { + return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; +} +function supportsInterpolation(spec) { + return !!spec.expression && spec.expression.interpolated; +} + +function getType(val) { + if (val instanceof Number) { + return 'number'; + } else if (val instanceof String) { + return 'string'; + } else if (val instanceof Boolean) { + return 'boolean'; + } else if (Array.isArray(val)) { + return 'array'; + } else if (val === null) { + return 'null'; + } else { + return typeof val; + } +} + +function isFunction(value) { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} +function identityFunction(x) { + return x; +} +function createFunction(parameters, propertySpec) { + const isColor = propertySpec.type === 'color'; + const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; + const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; + const zoomDependent = zoomAndFeatureDependent || !featureDependent; + const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); + if (isColor) { + parameters = extend$1({}, parameters); + if (parameters.stops) { + parameters.stops = parameters.stops.map(stop => { + return [ + stop[0], + Color.parse(stop[1]) + ]; + }); + } + if (parameters.default) { + parameters.default = Color.parse(parameters.default); + } else { + parameters.default = Color.parse(propertySpec.default); + } + } + if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { + throw new Error(`Unknown color space: ${ parameters.colorSpace }`); + } + let innerFun; + let hashedStops; + let categoricalKeyType; + if (type === 'exponential') { + innerFun = evaluateExponentialFunction; + } else if (type === 'interval') { + innerFun = evaluateIntervalFunction; + } else if (type === 'categorical') { + innerFun = evaluateCategoricalFunction; + hashedStops = Object.create(null); + for (const stop of parameters.stops) { + hashedStops[stop[0]] = stop[1]; + } + categoricalKeyType = typeof parameters.stops[0][0]; + } else if (type === 'identity') { + innerFun = evaluateIdentityFunction; + } else { + throw new Error(`Unknown function type "${ type }"`); + } + if (zoomAndFeatureDependent) { + const featureFunctions = {}; + const zoomStops = []; + for (let s = 0; s < parameters.stops.length; s++) { + const stop = parameters.stops[s]; + const zoom = stop[0].zoom; + if (featureFunctions[zoom] === undefined) { + featureFunctions[zoom] = { + zoom, + type: parameters.type, + property: parameters.property, + default: parameters.default, + stops: [] + }; + zoomStops.push(zoom); + } + featureFunctions[zoom].stops.push([ + stop[0].value, + stop[1] + ]); + } + const featureFunctionStops = []; + for (const z of zoomStops) { + featureFunctionStops.push([ + featureFunctions[z].zoom, + createFunction(featureFunctions[z], propertySpec) + ]); + } + const interpolationType = { name: 'linear' }; + return { + kind: 'composite', + interpolationType, + interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), + zoomStops: featureFunctionStops.map(s => s[0]), + evaluate({zoom}, properties) { + return evaluateExponentialFunction({ + stops: featureFunctionStops, + base: parameters.base + }, propertySpec, zoom).evaluate(zoom, properties); + } + }; + } else if (zoomDependent) { + const interpolationType = type === 'exponential' ? { + name: 'exponential', + base: parameters.base !== undefined ? parameters.base : 1 + } : null; + return { + kind: 'camera', + interpolationType, + interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), + zoomStops: parameters.stops.map(s => s[0]), + evaluate: ({zoom}) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType) + }; + } else { + return { + kind: 'source', + evaluate(_, feature) { + const value = feature && feature.properties ? feature.properties[parameters.property] : undefined; + if (value === undefined) { + return coalesce(parameters.default, propertySpec.default); + } + return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType); + } + }; + } +} +function coalesce(a, b, c) { + if (a !== undefined) + return a; + if (b !== undefined) + return b; + if (c !== undefined) + return c; +} +function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { + const evaluated = typeof input === keyType ? hashedStops[input] : undefined; + return coalesce(evaluated, parameters.default, propertySpec.default); +} +function evaluateIntervalFunction(parameters, propertySpec, input) { + if (getType(input) !== 'number') + return coalesce(parameters.default, propertySpec.default); + const n = parameters.stops.length; + if (n === 1) + return parameters.stops[0][1]; + if (input <= parameters.stops[0][0]) + return parameters.stops[0][1]; + if (input >= parameters.stops[n - 1][0]) + return parameters.stops[n - 1][1]; + const index = findStopLessThanOrEqualTo(parameters.stops.map(stop => stop[0]), input); + return parameters.stops[index][1]; +} +function evaluateExponentialFunction(parameters, propertySpec, input) { + const base = parameters.base !== undefined ? parameters.base : 1; + if (getType(input) !== 'number') + return coalesce(parameters.default, propertySpec.default); + const n = parameters.stops.length; + if (n === 1) + return parameters.stops[0][1]; + if (input <= parameters.stops[0][0]) + return parameters.stops[0][1]; + if (input >= parameters.stops[n - 1][0]) + return parameters.stops[n - 1][1]; + const index = findStopLessThanOrEqualTo(parameters.stops.map(stop => stop[0]), input); + const t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]); + const outputLower = parameters.stops[index][1]; + const outputUpper = parameters.stops[index + 1][1]; + let interp = interpolate[propertySpec.type] || identityFunction; + if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { + const colorspace = colorSpaces[parameters.colorSpace]; + interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); + } + if (typeof outputLower.evaluate === 'function') { + return { + evaluate(...args) { + const evaluatedLower = outputLower.evaluate.apply(undefined, args); + const evaluatedUpper = outputUpper.evaluate.apply(undefined, args); + if (evaluatedLower === undefined || evaluatedUpper === undefined) { + return undefined; + } + return interp(evaluatedLower, evaluatedUpper, t); + } + }; + } + return interp(outputLower, outputUpper, t); +} +function evaluateIdentityFunction(parameters, propertySpec, input) { + if (propertySpec.type === 'color') { + input = Color.parse(input); + } else if (propertySpec.type === 'formatted') { + input = Formatted.fromString(input.toString()); + } else if (propertySpec.type === 'resolvedImage') { + input = ResolvedImage.fromString(input.toString()); + } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { + input = undefined; + } + return coalesce(input, parameters.default, propertySpec.default); +} +function interpolationFactor(input, base, lowerValue, upperValue) { + const difference = upperValue - lowerValue; + const progress = input - lowerValue; + if (difference === 0) { + return 0; + } else if (base === 1) { + return progress / difference; + } else { + return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); + } +} + +class StyleExpression { + constructor(expression, propertySpec) { + this.expression = expression; + this._warningHistory = {}; + this._evaluator = new EvaluationContext(); + this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null; + this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null; + } + evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) { + this._evaluator.globals = globals; + this._evaluator.feature = feature; + this._evaluator.featureState = featureState; + this._evaluator.canonical = canonical; + this._evaluator.availableImages = availableImages || null; + this._evaluator.formattedSection = formattedSection; + return this.expression.evaluate(this._evaluator); + } + evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) { + this._evaluator.globals = globals; + this._evaluator.feature = feature || null; + this._evaluator.featureState = featureState || null; + this._evaluator.canonical = canonical; + this._evaluator.availableImages = availableImages || null; + this._evaluator.formattedSection = formattedSection || null; + try { + const val = this.expression.evaluate(this._evaluator); + if (val === null || val === undefined || typeof val === 'number' && val !== val) { + return this._defaultValue; + } + if (this._enumValues && !(val in this._enumValues)) { + throw new RuntimeError(`Expected value to be one of ${ Object.keys(this._enumValues).map(v => JSON.stringify(v)).join(', ') }, but found ${ JSON.stringify(val) } instead.`); + } + return val; + } catch (e) { + if (!this._warningHistory[e.message]) { + this._warningHistory[e.message] = true; + if (typeof console !== 'undefined') { + console.warn(e.message); + } + } + return this._defaultValue; + } + } +} +function isExpression(expression) { + return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in expressions; +} +function createExpression(expression, propertySpec) { + const parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); + const parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? { typeAnnotation: 'coerce' } : undefined); + if (!parsed) { + return error(parser.errors); + } + return success(new StyleExpression(parsed, propertySpec)); +} +class ZoomConstantExpression { + constructor(kind, expression) { + this.kind = kind; + this._styleExpression = expression; + this.isStateDependent = kind !== 'constant' && !isStateConstant(expression.expression); + } + evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) { + return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); + } + evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) { + return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); + } +} +class ZoomDependentExpression { + constructor(kind, expression, zoomStops, interpolationType) { + this.kind = kind; + this.zoomStops = zoomStops; + this._styleExpression = expression; + this.isStateDependent = kind !== 'camera' && !isStateConstant(expression.expression); + this.interpolationType = interpolationType; + } + evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection) { + return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); + } + evaluate(globals, feature, featureState, canonical, availableImages, formattedSection) { + return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); + } + interpolationFactor(input, lower, upper) { + if (this.interpolationType) { + return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper); + } else { + return 0; + } + } +} +function createPropertyExpression(expression, propertySpec) { + expression = createExpression(expression, propertySpec); + if (expression.result === 'error') { + return expression; + } + const parsed = expression.value.expression; + const isFeatureConstant$1 = isFeatureConstant(parsed); + if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { + return error([new ParsingError('', 'data expressions not supported')]); + } + const isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']); + if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { + return error([new ParsingError('', 'zoom expressions not supported')]); + } + const zoomCurve = findZoomCurve(parsed); + if (!zoomCurve && !isZoomConstant) { + return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]); + } else if (zoomCurve instanceof ParsingError) { + return error([zoomCurve]); + } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) { + return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); + } + if (!zoomCurve) { + return success(isFeatureConstant$1 ? new ZoomConstantExpression('constant', expression.value) : new ZoomConstantExpression('source', expression.value)); + } + const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined; + return success(isFeatureConstant$1 ? new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) : new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType)); +} +class StylePropertyFunction { + constructor(parameters, specification) { + this._parameters = parameters; + this._specification = specification; + extend$1(this, createFunction(this._parameters, this._specification)); + } + static deserialize(serialized) { + return new StylePropertyFunction(serialized._parameters, serialized._specification); + } + static serialize(input) { + return { + _parameters: input._parameters, + _specification: input._specification + }; + } +} +function normalizePropertyExpression(value, specification) { + if (isFunction(value)) { + return new StylePropertyFunction(value, specification); + } else if (isExpression(value)) { + const expression = createPropertyExpression(value, specification); + if (expression.result === 'error') { + throw new Error(expression.value.map(err => `${ err.key }: ${ err.message }`).join(', ')); + } + return expression.value; + } else { + let constant = value; + if (typeof value === 'string' && specification.type === 'color') { + constant = Color.parse(value); + } + return { + kind: 'constant', + evaluate: () => constant + }; + } +} +function findZoomCurve(expression) { + let result = null; + if (expression instanceof Let) { + result = findZoomCurve(expression.result); + } else if (expression instanceof Coalesce) { + for (const arg of expression.args) { + result = findZoomCurve(arg); + if (result) { + break; + } + } + } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') { + result = expression; + } + if (result instanceof ParsingError) { + return result; + } + expression.eachChild(child => { + const childResult = findZoomCurve(child); + if (childResult instanceof ParsingError) { + result = childResult; + } else if (!result && childResult) { + result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'); + } else if (result && childResult && result !== childResult) { + result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'); + } + }); + return result; +} +function getExpectedType(spec) { + const types = { + color: ColorType, + string: StringType, + number: NumberType, + enum: StringType, + boolean: BooleanType, + formatted: FormattedType, + resolvedImage: ResolvedImageType + }; + if (spec.type === 'array') { + return array(types[spec.value] || ValueType, spec.length); + } + return types[spec.type]; +} +function getDefaultValue(spec) { + if (spec.type === 'color' && isFunction(spec.default)) { + return new Color(0, 0, 0, 0); + } else if (spec.type === 'color') { + return Color.parse(spec.default) || null; + } else if (spec.default === undefined) { + return null; + } else { + return spec.default; + } +} + +function validateObject(options) { + const key = options.key; + const object = options.value; + const elementSpecs = options.valueSpec || {}; + const elementValidators = options.objectElementValidators || {}; + const style = options.style; + const styleSpec = options.styleSpec; + let errors = []; + const type = getType(object); + if (type !== 'object') { + return [new ValidationError(key, object, `object expected, ${ type } found`)]; + } + for (const objectKey in object) { + const elementSpecKey = objectKey.split('.')[0]; + const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; + let validateElement; + if (elementValidators[elementSpecKey]) { + validateElement = elementValidators[elementSpecKey]; + } else if (elementSpecs[elementSpecKey]) { + validateElement = validate; + } else if (elementValidators['*']) { + validateElement = elementValidators['*']; + } else if (elementSpecs['*']) { + validateElement = validate; + } else { + errors.push(new ValidationError(key, object[objectKey], `unknown property "${ objectKey }"`)); + continue; + } + errors = errors.concat(validateElement({ + key: (key ? `${ key }.` : key) + objectKey, + value: object[objectKey], + valueSpec: elementSpec, + style, + styleSpec, + object, + objectKey + }, object)); + } + for (const elementSpecKey in elementSpecs) { + if (elementValidators[elementSpecKey]) { + continue; + } + if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) { + errors.push(new ValidationError(key, object, `missing required property "${ elementSpecKey }"`)); + } + } + return errors; +} + +function validateArray(options) { + const array = options.value; + const arraySpec = options.valueSpec; + const style = options.style; + const styleSpec = options.styleSpec; + const key = options.key; + const validateArrayElement = options.arrayElementValidator || validate; + if (getType(array) !== 'array') { + return [new ValidationError(key, array, `array expected, ${ getType(array) } found`)]; + } + if (arraySpec.length && array.length !== arraySpec.length) { + return [new ValidationError(key, array, `array length ${ arraySpec.length } expected, length ${ array.length } found`)]; + } + if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { + return [new ValidationError(key, array, `array length at least ${ arraySpec['min-length'] } expected, length ${ array.length } found`)]; + } + let arrayElementSpec = { + 'type': arraySpec.value, + 'values': arraySpec.values, + 'minimum': arraySpec.minimum, + 'maximum': arraySpec.maximum + }; + if (styleSpec.$version < 7) { + arrayElementSpec.function = arraySpec.function; + } + if (getType(arraySpec.value) === 'object') { + arrayElementSpec = arraySpec.value; + } + let errors = []; + for (let i = 0; i < array.length; i++) { + errors = errors.concat(validateArrayElement({ + array, + arrayIndex: i, + value: array[i], + valueSpec: arrayElementSpec, + style, + styleSpec, + key: `${ key }[${ i }]` + })); + } + return errors; +} + +function validateNumber(options) { + const key = options.key; + const value = options.value; + const valueSpec = options.valueSpec; + let type = getType(value); + if (type === 'number' && value !== value) { + type = 'NaN'; + } + if (type !== 'number') { + return [new ValidationError(key, value, `number expected, ${ type } found`)]; + } + if ('minimum' in valueSpec) { + let specMin = valueSpec.minimum; + if (getType(valueSpec.minimum) === 'array') { + const i = options.arrayIndex; + specMin = valueSpec.minimum[i]; + } + if (value < specMin) { + return [new ValidationError(key, value, `${ value } is less than the minimum value ${ specMin }`)]; + } + } + if ('maximum' in valueSpec) { + let specMax = valueSpec.maximum; + if (getType(valueSpec.maximum) === 'array') { + const i = options.arrayIndex; + specMax = valueSpec.maximum[i]; + } + if (value > specMax) { + return [new ValidationError(key, value, `${ value } is greater than the maximum value ${ specMax }`)]; + } + } + return []; +} + +function validateFunction(options) { + const functionValueSpec = options.valueSpec; + const functionType = unbundle(options.value.type); + let stopKeyType; + let stopDomainValues = {}; + let previousStopDomainValue; + let previousStopDomainZoom; + const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; + const isPropertyFunction = !isZoomFunction; + const isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object'; + const errors = validateObject({ + key: options.key, + value: options.value, + valueSpec: options.styleSpec.function, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + stops: validateFunctionStops, + default: validateFunctionDefault + } + }); + if (functionType === 'identity' && isZoomFunction) { + errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); + } + if (functionType !== 'identity' && !options.value.stops) { + errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); + } + if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); + } + if (options.styleSpec.$version >= 8) { + if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); + } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); + } + } + if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { + errors.push(new ValidationError(options.key, options.value, '"property" property is required')); + } + return errors; + function validateFunctionStops(options) { + if (functionType === 'identity') { + return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; + } + let errors = []; + const value = options.value; + errors = errors.concat(validateArray({ + key: options.key, + value, + valueSpec: options.valueSpec, + style: options.style, + styleSpec: options.styleSpec, + arrayElementValidator: validateFunctionStop + })); + if (getType(value) === 'array' && value.length === 0) { + errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); + } + return errors; + } + function validateFunctionStop(options) { + let errors = []; + const value = options.value; + const key = options.key; + if (getType(value) !== 'array') { + return [new ValidationError(key, value, `array expected, ${ getType(value) } found`)]; + } + if (value.length !== 2) { + return [new ValidationError(key, value, `array length 2 expected, length ${ value.length } found`)]; + } + if (isZoomAndPropertyFunction) { + if (getType(value[0]) !== 'object') { + return [new ValidationError(key, value, `object expected, ${ getType(value[0]) } found`)]; + } + if (value[0].zoom === undefined) { + return [new ValidationError(key, value, 'object stop key must have zoom')]; + } + if (value[0].value === undefined) { + return [new ValidationError(key, value, 'object stop key must have value')]; + } + if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { + return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; + } + if (unbundle(value[0].zoom) !== previousStopDomainZoom) { + previousStopDomainZoom = unbundle(value[0].zoom); + previousStopDomainValue = undefined; + stopDomainValues = {}; + } + errors = errors.concat(validateObject({ + key: `${ key }[0]`, + value: value[0], + valueSpec: { zoom: {} }, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + zoom: validateNumber, + value: validateStopDomainValue + } + })); + } else { + errors = errors.concat(validateStopDomainValue({ + key: `${ key }[0]`, + value: value[0], + valueSpec: {}, + style: options.style, + styleSpec: options.styleSpec + }, value)); + } + if (isExpression(deepUnbundle(value[1]))) { + return errors.concat([new ValidationError(`${ key }[1]`, value[1], 'expressions are not allowed in function stops.')]); + } + return errors.concat(validate({ + key: `${ key }[1]`, + value: value[1], + valueSpec: functionValueSpec, + style: options.style, + styleSpec: options.styleSpec + })); + } + function validateStopDomainValue(options, stop) { + const type = getType(options.value); + const value = unbundle(options.value); + const reportValue = options.value !== null ? options.value : stop; + if (!stopKeyType) { + stopKeyType = type; + } else if (type !== stopKeyType) { + return [new ValidationError(options.key, reportValue, `${ type } stop domain type must match previous stop domain type ${ stopKeyType }`)]; + } + if (type !== 'number' && type !== 'string' && type !== 'boolean') { + return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; + } + if (type !== 'number' && functionType !== 'categorical') { + let message = `number expected, ${ type } found`; + if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { + message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; + } + return [new ValidationError(options.key, reportValue, message)]; + } + if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { + return [new ValidationError(options.key, reportValue, `integer expected, found ${ value }`)]; + } + if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { + return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')]; + } else { + previousStopDomainValue = value; + } + if (functionType === 'categorical' && value in stopDomainValues) { + return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; + } else { + stopDomainValues[value] = true; + } + return []; + } + function validateFunctionDefault(options) { + return validate({ + key: options.key, + value: options.value, + valueSpec: functionValueSpec, + style: options.style, + styleSpec: options.styleSpec + }); + } +} + +function validateExpression(options) { + const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); + if (expression.result === 'error') { + return expression.value.map(error => { + return new ValidationError(`${ options.key }${ error.key }`, options.value, error.message); + }); + } + const expressionObj = expression.value.expression || expression.value._styleExpression.expression; + if (options.expressionContext === 'property' && options.propertyKey === 'text-font' && !expressionObj.outputDefined()) { + return [new ValidationError(options.key, options.value, `Invalid data expression for "${ options.propertyKey }". Output values must be contained as literals within the expression.`)]; + } + if (options.expressionContext === 'property' && options.propertyType === 'layout' && !isStateConstant(expressionObj)) { + return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')]; + } + if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) { + return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')]; + } + if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) { + if (!isGlobalPropertyConstant(expressionObj, [ + 'zoom', + 'feature-state' + ])) { + return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')]; + } + if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) { + return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')]; + } + } + return []; +} + +function validateBoolean(options) { + const value = options.value; + const key = options.key; + const type = getType(value); + if (type !== 'boolean') { + return [new ValidationError(key, value, `boolean expected, ${ type } found`)]; + } + return []; +} + +function validateColor(options) { + const key = options.key; + const value = options.value; + const type = getType(value); + if (type !== 'string') { + return [new ValidationError(key, value, `color expected, ${ type } found`)]; + } + if (csscolorparser_1(value) === null) { + return [new ValidationError(key, value, `color expected, "${ value }" found`)]; + } + return []; +} + +function validateEnum(options) { + const key = options.key; + const value = options.value; + const valueSpec = options.valueSpec; + const errors = []; + if (Array.isArray(valueSpec.values)) { + if (valueSpec.values.indexOf(unbundle(value)) === -1) { + errors.push(new ValidationError(key, value, `expected one of [${ valueSpec.values.join(', ') }], ${ JSON.stringify(value) } found`)); + } + } else { + if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { + errors.push(new ValidationError(key, value, `expected one of [${ Object.keys(valueSpec.values).join(', ') }], ${ JSON.stringify(value) } found`)); + } + } + return errors; +} + +function isExpressionFilter(filter) { + if (filter === true || filter === false) { + return true; + } + if (!Array.isArray(filter) || filter.length === 0) { + return false; + } + switch (filter[0]) { + case 'has': + return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; + case 'in': + return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2])); + case '!in': + case '!has': + case 'none': + return false; + case '==': + case '!=': + case '>': + case '>=': + case '<': + case '<=': + return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); + case 'any': + case 'all': + for (const f of filter.slice(1)) { + if (!isExpressionFilter(f) && typeof f !== 'boolean') { + return false; + } + } + return true; + default: + return true; + } +} +const filterSpec = { + 'type': 'boolean', + 'default': false, + 'transition': false, + 'property-type': 'data-driven', + 'expression': { + 'interpolated': false, + 'parameters': [ + 'zoom', + 'feature' + ] + } +}; +function createFilter(filter) { + if (filter === null || filter === undefined) { + return { + filter: () => true, + needGeometry: false + }; + } + if (!isExpressionFilter(filter)) { + filter = convertFilter(filter); + } + const compiled = createExpression(filter, filterSpec); + if (compiled.result === 'error') { + throw new Error(compiled.value.map(err => `${ err.key }: ${ err.message }`).join(', ')); + } else { + const needGeometry = geometryNeeded(filter); + return { + filter: (globalProperties, feature, canonical) => compiled.value.evaluate(globalProperties, feature, {}, canonical), + needGeometry + }; + } +} +function compare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} +function geometryNeeded(filter) { + if (!Array.isArray(filter)) + return false; + if (filter[0] === 'within') + return true; + for (let index = 1; index < filter.length; index++) { + if (geometryNeeded(filter[index])) + return true; + } + return false; +} +function convertFilter(filter) { + if (!filter) + return true; + const op = filter[0]; + if (filter.length <= 1) + return op !== 'any'; + const converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : op === 'within' ? filter : true; + return converted; +} +function convertComparisonOp(property, value, op) { + switch (property) { + case '$type': + return [ + `filter-type-${ op }`, + value + ]; + case '$id': + return [ + `filter-id-${ op }`, + value + ]; + default: + return [ + `filter-${ op }`, + property, + value + ]; + } +} +function convertDisjunctionOp(filters) { + return ['any'].concat(filters.map(convertFilter)); +} +function convertInOp(property, values) { + if (values.length === 0) { + return false; + } + switch (property) { + case '$type': + return [ + `filter-type-in`, + [ + 'literal', + values + ] + ]; + case '$id': + return [ + `filter-id-in`, + [ + 'literal', + values + ] + ]; + default: + if (values.length > 200 && !values.some(v => typeof v !== typeof values[0])) { + return [ + 'filter-in-large', + property, + [ + 'literal', + values.sort(compare) + ] + ]; + } else { + return [ + 'filter-in-small', + property, + [ + 'literal', + values + ] + ]; + } + } +} +function convertHasOp(property) { + switch (property) { + case '$type': + return true; + case '$id': + return [`filter-has-id`]; + default: + return [ + `filter-has`, + property + ]; + } +} +function convertNegation(filter) { + return [ + '!', + filter + ]; +} + +function validateFilter(options) { + if (isExpressionFilter(deepUnbundle(options.value))) { + return validateExpression(extend$1({}, options, { + expressionContext: 'filter', + valueSpec: { value: 'boolean' } + })); + } else { + return validateNonExpressionFilter(options); + } +} +function validateNonExpressionFilter(options) { + const value = options.value; + const key = options.key; + if (getType(value) !== 'array') { + return [new ValidationError(key, value, `array expected, ${ getType(value) } found`)]; + } + const styleSpec = options.styleSpec; + let type; + let errors = []; + if (value.length < 1) { + return [new ValidationError(key, value, 'filter array must have at least 1 element')]; + } + errors = errors.concat(validateEnum({ + key: `${ key }[0]`, + value: value[0], + valueSpec: styleSpec.filter_operator, + style: options.style, + styleSpec: options.styleSpec + })); + switch (unbundle(value[0])) { + case '<': + case '<=': + case '>': + case '>=': + if (value.length >= 2 && unbundle(value[1]) === '$type') { + errors.push(new ValidationError(key, value, `"$type" cannot be use with operator "${ value[0] }"`)); + } + case '==': + case '!=': + if (value.length !== 3) { + errors.push(new ValidationError(key, value, `filter array for operator "${ value[0] }" must have 3 elements`)); + } + case 'in': + case '!in': + if (value.length >= 2) { + type = getType(value[1]); + if (type !== 'string') { + errors.push(new ValidationError(`${ key }[1]`, value[1], `string expected, ${ type } found`)); + } + } + for (let i = 2; i < value.length; i++) { + type = getType(value[i]); + if (unbundle(value[1]) === '$type') { + errors = errors.concat(validateEnum({ + key: `${ key }[${ i }]`, + value: value[i], + valueSpec: styleSpec.geometry_type, + style: options.style, + styleSpec: options.styleSpec + })); + } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { + errors.push(new ValidationError(`${ key }[${ i }]`, value[i], `string, number, or boolean expected, ${ type } found`)); + } + } + break; + case 'any': + case 'all': + case 'none': + for (let i = 1; i < value.length; i++) { + errors = errors.concat(validateNonExpressionFilter({ + key: `${ key }[${ i }]`, + value: value[i], + style: options.style, + styleSpec: options.styleSpec + })); + } + break; + case 'has': + case '!has': + type = getType(value[1]); + if (value.length !== 2) { + errors.push(new ValidationError(key, value, `filter array for "${ value[0] }" operator must have 2 elements`)); + } else if (type !== 'string') { + errors.push(new ValidationError(`${ key }[1]`, value[1], `string expected, ${ type } found`)); + } + break; + case 'within': + type = getType(value[1]); + if (value.length !== 2) { + errors.push(new ValidationError(key, value, `filter array for "${ value[0] }" operator must have 2 elements`)); + } else if (type !== 'object') { + errors.push(new ValidationError(`${ key }[1]`, value[1], `object expected, ${ type } found`)); + } + break; + } + return errors; +} + +function validateProperty(options, propertyType) { + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; + const value = options.value; + const propertyKey = options.objectKey; + const layerSpec = styleSpec[`${ propertyType }_${ options.layerType }`]; + if (!layerSpec) + return []; + const transitionMatch = propertyKey.match(/^(.*)-transition$/); + if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { + return validate({ + key, + value, + valueSpec: styleSpec.transition, + style, + styleSpec + }); + } + const valueSpec = options.valueSpec || layerSpec[propertyKey]; + if (!valueSpec) { + return [new ValidationError(key, value, `unknown property "${ propertyKey }"`)]; + } + let tokenMatch; + if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) { + return [new ValidationError(key, value, `"${ propertyKey }" does not support interpolation syntax\n` + `Use an identity property function instead: \`{ "type": "identity", "property": ${ JSON.stringify(tokenMatch[1]) } }\`.`)]; + } + const errors = []; + if (options.layerType === 'symbol') { + if (propertyKey === 'text-field' && style && !style.glyphs) { + errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); + } + if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') { + errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); + } + } + return errors.concat(validate({ + key: options.key, + value, + valueSpec, + style, + styleSpec, + expressionContext: 'property', + propertyType, + propertyKey + })); +} + +function validatePaintProperty(options) { + return validateProperty(options, 'paint'); +} + +function validateLayoutProperty(options) { + return validateProperty(options, 'layout'); +} + +function validateLayer(options) { + let errors = []; + const layer = options.value; + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; + if (!layer.type && !layer.ref) { + errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); + } + let type = unbundle(layer.type); + const ref = unbundle(layer.ref); + if (layer.id) { + const layerId = unbundle(layer.id); + for (let i = 0; i < options.arrayIndex; i++) { + const otherLayer = style.layers[i]; + if (unbundle(otherLayer.id) === layerId) { + errors.push(new ValidationError(key, layer.id, `duplicate layer id "${ layer.id }", previously used at line ${ otherLayer.id.__line__ }`)); + } + } + } + if ('ref' in layer) { + [ + 'type', + 'source', + 'source-layer', + 'filter', + 'layout' + ].forEach(p => { + if (p in layer) { + errors.push(new ValidationError(key, layer[p], `"${ p }" is prohibited for ref layers`)); + } + }); + let parent; + style.layers.forEach(layer => { + if (unbundle(layer.id) === ref) + parent = layer; + }); + if (!parent) { + errors.push(new ValidationError(key, layer.ref, `ref layer "${ ref }" not found`)); + } else if (parent.ref) { + errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); + } else { + type = unbundle(parent.type); + } + } else if (!(type === 'background' || type === 'sky')) { + if (!layer.source) { + errors.push(new ValidationError(key, layer, 'missing required property "source"')); + } else { + const source = style.sources && style.sources[layer.source]; + const sourceType = source && unbundle(source.type); + if (!source) { + errors.push(new ValidationError(key, layer.source, `source "${ layer.source }" not found`)); + } else if (sourceType === 'vector' && type === 'raster') { + errors.push(new ValidationError(key, layer.source, `layer "${ layer.id }" requires a raster source`)); + } else if (sourceType === 'raster' && type !== 'raster') { + errors.push(new ValidationError(key, layer.source, `layer "${ layer.id }" requires a vector source`)); + } else if (sourceType === 'vector' && !layer['source-layer']) { + errors.push(new ValidationError(key, layer, `layer "${ layer.id }" must specify a "source-layer"`)); + } else if (sourceType === 'raster-dem' && type !== 'hillshade') { + errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.')); + } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && (sourceType !== 'geojson' || !source.lineMetrics)) { + errors.push(new ValidationError(key, layer, `layer "${ layer.id }" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`)); + } + } + } + errors = errors.concat(validateObject({ + key, + value: layer, + valueSpec: styleSpec.layer, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'() { + return []; + }, + type() { + return validate({ + key: `${ key }.type`, + value: layer.type, + valueSpec: styleSpec.layer.type, + style: options.style, + styleSpec: options.styleSpec, + object: layer, + objectKey: 'type' + }); + }, + filter: validateFilter, + layout(options) { + return validateObject({ + layer, + key: options.key, + value: options.value, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'(options) { + return validateLayoutProperty(extend$1({ layerType: type }, options)); + } + } + }); + }, + paint(options) { + return validateObject({ + layer, + key: options.key, + value: options.value, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'(options) { + return validatePaintProperty(extend$1({ layerType: type }, options)); + } + } + }); + } + } + })); + return errors; +} + +function validateString(options) { + const value = options.value; + const key = options.key; + const type = getType(value); + if (type !== 'string') { + return [new ValidationError(key, value, `string expected, ${ type } found`)]; + } + return []; +} + +const objectElementValidators = { promoteId: validatePromoteId }; +function validateSource(options) { + const value = options.value; + const key = options.key; + const styleSpec = options.styleSpec; + const style = options.style; + if (!value.type) { + return [new ValidationError(key, value, '"type" is required')]; + } + const type = unbundle(value.type); + let errors; + switch (type) { + case 'vector': + case 'raster': + case 'raster-dem': + errors = validateObject({ + key, + value, + valueSpec: styleSpec[`source_${ type.replace('-', '_') }`], + style: options.style, + styleSpec, + objectElementValidators + }); + return errors; + case 'geojson': + errors = validateObject({ + key, + value, + valueSpec: styleSpec.source_geojson, + style, + styleSpec, + objectElementValidators + }); + if (value.cluster) { + for (const prop in value.clusterProperties) { + const [operator, mapExpr] = value.clusterProperties[prop]; + const reduceExpr = typeof operator === 'string' ? [ + operator, + ['accumulated'], + [ + 'get', + prop + ] + ] : operator; + errors.push(...validateExpression({ + key: `${ key }.${ prop }.map`, + value: mapExpr, + expressionContext: 'cluster-map' + })); + errors.push(...validateExpression({ + key: `${ key }.${ prop }.reduce`, + value: reduceExpr, + expressionContext: 'cluster-reduce' + })); + } + } + return errors; + case 'video': + return validateObject({ + key, + value, + valueSpec: styleSpec.source_video, + style, + styleSpec + }); + case 'image': + return validateObject({ + key, + value, + valueSpec: styleSpec.source_image, + style, + styleSpec + }); + case 'canvas': + return [new ValidationError(key, null, `Please use runtime APIs to add canvas sources, rather than including them in stylesheets.`, 'source.canvas')]; + default: + return validateEnum({ + key: `${ key }.type`, + value: value.type, + valueSpec: { + values: [ + 'vector', + 'raster', + 'raster-dem', + 'geojson', + 'video', + 'image' + ] + }, + style, + styleSpec + }); + } +} +function validatePromoteId({key, value}) { + if (getType(value) === 'string') { + return validateString({ + key, + value + }); + } else { + const errors = []; + for (const prop in value) { + errors.push(...validateString({ + key: `${ key }.${ prop }`, + value: value[prop] + })); + } + return errors; + } +} + +function validateLight(options) { + const light = options.value; + const styleSpec = options.styleSpec; + const lightSpec = styleSpec.light; + const style = options.style; + let errors = []; + const rootType = getType(light); + if (light === undefined) { + return errors; + } else if (rootType !== 'object') { + errors = errors.concat([new ValidationError('light', light, `object expected, ${ rootType } found`)]); + return errors; + } + for (const key in light) { + const transitionMatch = key.match(/^(.*)-transition$/); + if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key, + value: light[key], + valueSpec: styleSpec.transition, + style, + styleSpec + })); + } else if (lightSpec[key]) { + errors = errors.concat(validate({ + key, + value: light[key], + valueSpec: lightSpec[key], + style, + styleSpec + })); + } else { + errors = errors.concat([new ValidationError(key, light[key], `unknown property "${ key }"`)]); + } + } + return errors; +} + +function validateTerrain(options) { + const terrain = options.value; + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; + const terrainSpec = styleSpec.terrain; + let errors = []; + const rootType = getType(terrain); + if (terrain === undefined) { + return errors; + } else if (rootType !== 'object') { + errors = errors.concat([new ValidationError('terrain', terrain, `object expected, ${ rootType } found`)]); + return errors; + } + for (const key in terrain) { + const transitionMatch = key.match(/^(.*)-transition$/); + if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key, + value: terrain[key], + valueSpec: styleSpec.transition, + style, + styleSpec + })); + } else if (terrainSpec[key]) { + errors = errors.concat(validate({ + key, + value: terrain[key], + valueSpec: terrainSpec[key], + style, + styleSpec + })); + } else { + errors = errors.concat([new ValidationError(key, terrain[key], `unknown property "${ key }"`)]); + } + } + if (!terrain.source) { + errors.push(new ValidationError(key, terrain, `terrain is missing required property "source"`)); + } else { + const source = style.sources && style.sources[terrain.source]; + const sourceType = source && unbundle(source.type); + if (!source) { + errors.push(new ValidationError(key, terrain.source, `source "${ terrain.source }" not found`)); + } else if (sourceType !== 'raster-dem') { + errors.push(new ValidationError(key, terrain.source, `terrain cannot be used with a source of type ${ sourceType }, it only be used with a "raster-dem" source type`)); + } + } + return errors; +} + +function validateFormatted(options) { + if (validateString(options).length === 0) { + return []; + } + return validateExpression(options); +} + +function validateImage(options) { + if (validateString(options).length === 0) { + return []; + } + return validateExpression(options); +} + +const VALIDATORS = { + '*'() { + return []; + }, + 'array': validateArray, + 'boolean': validateBoolean, + 'number': validateNumber, + 'color': validateColor, + 'constants': validateConstants, + 'enum': validateEnum, + 'filter': validateFilter, + 'function': validateFunction, + 'layer': validateLayer, + 'object': validateObject, + 'source': validateSource, + 'light': validateLight, + 'terrain': validateTerrain, + 'string': validateString, + 'formatted': validateFormatted, + 'resolvedImage': validateImage +}; +function validate(options) { + const value = options.value; + const valueSpec = options.valueSpec; + const styleSpec = options.styleSpec; + if (valueSpec.expression && isFunction(unbundle(value))) { + return validateFunction(options); + } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { + return validateExpression(options); + } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { + return VALIDATORS[valueSpec.type](options); + } else { + const valid = validateObject(extend$1({}, options, { valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec })); + return valid; + } +} + +function validateGlyphsURL (options) { + const value = options.value; + const key = options.key; + const errors = validateString(options); + if (errors.length) + return errors; + if (value.indexOf('{fontstack}') === -1) { + errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); + } + if (value.indexOf('{range}') === -1) { + errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); + } + return errors; +} + +function validateStyleMin(style, styleSpec = spec) { + let errors = []; + errors = errors.concat(validate({ + key: '', + value: style, + valueSpec: styleSpec.$root, + styleSpec, + style, + objectElementValidators: { + glyphs: validateGlyphsURL, + '*'() { + return []; + } + } + })); + if (style.constants) { + errors = errors.concat(validateConstants({ + key: 'constants', + value: style.constants, + style, + styleSpec + })); + } + return sortErrors(errors); +} +validateStyleMin.source = wrapCleanErrors(validateSource); +validateStyleMin.light = wrapCleanErrors(validateLight); +validateStyleMin.terrain = wrapCleanErrors(validateTerrain); +validateStyleMin.layer = wrapCleanErrors(validateLayer); +validateStyleMin.filter = wrapCleanErrors(validateFilter); +validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty); +validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty); +function sortErrors(errors) { + return [].concat(errors).sort((a, b) => { + return a.line - b.line; + }); +} +function wrapCleanErrors(inner) { + return function (...args) { + return sortErrors(inner.apply(this, args)); + }; +} + +const validateStyle = validateStyleMin; +const validateLight$1 = validateStyle.light; +const validatePaintProperty$1 = validateStyle.paintProperty; +const validateLayoutProperty$1 = validateStyle.layoutProperty; +function emitValidationErrors(emitter, errors) { + let hasErrors = false; + if (errors && errors.length) { + for (const error of errors) { + emitter.fire(new ErrorEvent(new Error(error.message))); + hasErrors = true; + } + } + return hasErrors; +} + +var gridIndex = GridIndex; +var NUM_PARAMS = 3; +function GridIndex(extent, n, padding) { + var cells = this.cells = []; + if (extent instanceof ArrayBuffer) { + this.arrayBuffer = extent; + var array = new Int32Array(this.arrayBuffer); + extent = array[0]; + n = array[1]; + padding = array[2]; + this.d = n + 2 * padding; + for (var k = 0; k < this.d * this.d; k++) { + var start = array[NUM_PARAMS + k]; + var end = array[NUM_PARAMS + k + 1]; + cells.push(start === end ? null : array.subarray(start, end)); + } + var keysOffset = array[NUM_PARAMS + cells.length]; + var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; + this.keys = array.subarray(keysOffset, bboxesOffset); + this.bboxes = array.subarray(bboxesOffset); + this.insert = this._insertReadonly; + } else { + this.d = n + 2 * padding; + for (var i = 0; i < this.d * this.d; i++) { + cells.push([]); + } + this.keys = []; + this.bboxes = []; + } + this.n = n; + this.extent = extent; + this.padding = padding; + this.scale = n / extent; + this.uid = 0; + var p = padding / n * extent; + this.min = -p; + this.max = extent + p; +} +GridIndex.prototype.insert = function (key, x1, y1, x2, y2) { + this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); + this.keys.push(key); + this.bboxes.push(x1); + this.bboxes.push(y1); + this.bboxes.push(x2); + this.bboxes.push(y2); +}; +GridIndex.prototype._insertReadonly = function () { + throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; +}; +GridIndex.prototype._insertCell = function (x1, y1, x2, y2, cellIndex, uid) { + this.cells[cellIndex].push(uid); +}; +GridIndex.prototype.query = function (x1, y1, x2, y2, intersectionTest) { + var min = this.min; + var max = this.max; + if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) { + return Array.prototype.slice.call(this.keys); + } else { + var result = []; + var seenUids = {}; + this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); + return result; + } +}; +GridIndex.prototype._queryCell = function (x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) { + var cell = this.cells[cellIndex]; + if (cell !== null) { + var keys = this.keys; + var bboxes = this.bboxes; + for (var u = 0; u < cell.length; u++) { + var uid = cell[u]; + if (seenUids[uid] === undefined) { + var offset = uid * 4; + if (intersectionTest ? intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) : x1 <= bboxes[offset + 2] && y1 <= bboxes[offset + 3] && x2 >= bboxes[offset + 0] && y2 >= bboxes[offset + 1]) { + seenUids[uid] = true; + result.push(keys[uid]); + } else { + seenUids[uid] = false; + } + } + } + } +}; +GridIndex.prototype._forEachCell = function (x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) { + var cx1 = this._convertToCellCoord(x1); + var cy1 = this._convertToCellCoord(y1); + var cx2 = this._convertToCellCoord(x2); + var cy2 = this._convertToCellCoord(y2); + for (var x = cx1; x <= cx2; x++) { + for (var y = cy1; y <= cy2; y++) { + var cellIndex = this.d * y + x; + if (intersectionTest && !intersectionTest(this._convertFromCellCoord(x), this._convertFromCellCoord(y), this._convertFromCellCoord(x + 1), this._convertFromCellCoord(y + 1))) + continue; + if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) + return; + } + } +}; +GridIndex.prototype._convertFromCellCoord = function (x) { + return (x - this.padding) / this.scale; +}; +GridIndex.prototype._convertToCellCoord = function (x) { + return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); +}; +GridIndex.prototype.toArrayBuffer = function () { + if (this.arrayBuffer) + return this.arrayBuffer; + var cells = this.cells; + var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1; + var totalCellLength = 0; + for (var i = 0; i < this.cells.length; i++) { + totalCellLength += this.cells[i].length; + } + var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); + array[0] = this.extent; + array[1] = this.n; + array[2] = this.padding; + var offset = metadataLength; + for (var k = 0; k < cells.length; k++) { + var cell = cells[k]; + array[NUM_PARAMS + k] = offset; + array.set(cell, offset); + offset += cell.length; + } + array[NUM_PARAMS + cells.length] = offset; + array.set(this.keys, offset); + offset += this.keys.length; + array[NUM_PARAMS + cells.length + 1] = offset; + array.set(this.bboxes, offset); + offset += this.bboxes.length; + return array.buffer; +}; + +const {ImageData, ImageBitmap} = window$1; +const registry = {}; +function register(name, klass, options = {}) { + Object.defineProperty(klass, '_classRegistryKey', { + value: name, + writeable: false + }); + registry[name] = { + klass, + omit: options.omit || [], + shallow: options.shallow || [] + }; +} +register('Object', Object); +gridIndex.serialize = function serialize(grid, transferables) { + const buffer = grid.toArrayBuffer(); + if (transferables) { + transferables.push(buffer); + } + return { buffer }; +}; +gridIndex.deserialize = function deserialize(serialized) { + return new gridIndex(serialized.buffer); +}; +register('Grid', gridIndex); +register('Color', Color); +register('Error', Error); +register('ResolvedImage', ResolvedImage); +register('StylePropertyFunction', StylePropertyFunction); +register('StyleExpression', StyleExpression, { omit: ['_evaluator'] }); +register('ZoomDependentExpression', ZoomDependentExpression); +register('ZoomConstantExpression', ZoomConstantExpression); +register('CompoundExpression', CompoundExpression, { omit: ['_evaluate'] }); +for (const name in expressions) { + if (expressions[name]._classRegistryKey) + continue; + register(`Expression_${ name }`, expressions[name]); +} +function isArrayBuffer(val) { + return val && typeof ArrayBuffer !== 'undefined' && (val instanceof ArrayBuffer || val.constructor && val.constructor.name === 'ArrayBuffer'); +} +function isImageBitmap(val) { + return ImageBitmap && val instanceof ImageBitmap; +} +function serialize(input, transferables) { + if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp) { + return input; + } + if (isArrayBuffer(input) || isImageBitmap(input)) { + if (transferables) { + transferables.push(input); + } + return input; + } + if (ArrayBuffer.isView(input)) { + const view = input; + if (transferables) { + transferables.push(view.buffer); + } + return view; + } + if (input instanceof ImageData) { + if (transferables) { + transferables.push(input.data.buffer); + } + return input; + } + if (Array.isArray(input)) { + const serialized = []; + for (const item of input) { + serialized.push(serialize(item, transferables)); + } + return serialized; + } + if (typeof input === 'object') { + const klass = input.constructor; + const name = klass._classRegistryKey; + if (!name) { + throw new Error(`can't serialize object of unregistered class`); + } + const properties = klass.serialize ? klass.serialize(input, transferables) : {}; + if (!klass.serialize) { + for (const key in input) { + if (!input.hasOwnProperty(key)) + continue; + if (registry[name].omit.indexOf(key) >= 0) + continue; + const property = input[key]; + properties[key] = registry[name].shallow.indexOf(key) >= 0 ? property : serialize(property, transferables); + } + if (input instanceof Error) { + properties.message = input.message; + } + } + if (properties.$name) { + throw new Error('$name property is reserved for worker serialization logic.'); + } + if (name !== 'Object') { + properties.$name = name; + } + return properties; + } + throw new Error(`can't serialize object of type ${ typeof input }`); +} +function deserialize(input) { + if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp || isArrayBuffer(input) || isImageBitmap(input) || ArrayBuffer.isView(input) || input instanceof ImageData) { + return input; + } + if (Array.isArray(input)) { + return input.map(deserialize); + } + if (typeof input === 'object') { + const name = input.$name || 'Object'; + const {klass} = registry[name]; + if (!klass) { + throw new Error(`can't deserialize unregistered class ${ name }`); + } + if (klass.deserialize) { + return klass.deserialize(input); + } + const result = Object.create(klass.prototype); + for (const key of Object.keys(input)) { + if (key === '$name') + continue; + const value = input[key]; + result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value); + } + return result; + } + throw new Error(`can't deserialize object of type ${ typeof input }`); +} + +class ZoomHistory { + constructor() { + this.first = true; + } + update(z, now) { + const floorZ = Math.floor(z); + if (this.first) { + this.first = false; + this.lastIntegerZoom = floorZ; + this.lastIntegerZoomTime = 0; + this.lastZoom = z; + this.lastFloorZoom = floorZ; + return true; + } + if (this.lastFloorZoom > floorZ) { + this.lastIntegerZoom = floorZ + 1; + this.lastIntegerZoomTime = now; + } else if (this.lastFloorZoom < floorZ) { + this.lastIntegerZoom = floorZ; + this.lastIntegerZoomTime = now; + } + if (z !== this.lastZoom) { + this.lastZoom = z; + this.lastFloorZoom = floorZ; + return true; + } + return false; + } +} + +const unicodeBlockLookup = { + 'Latin-1 Supplement': char => char >= 128 && char <= 255, + 'Arabic': char => char >= 1536 && char <= 1791, + 'Arabic Supplement': char => char >= 1872 && char <= 1919, + 'Arabic Extended-A': char => char >= 2208 && char <= 2303, + 'Hangul Jamo': char => char >= 4352 && char <= 4607, + 'Unified Canadian Aboriginal Syllabics': char => char >= 5120 && char <= 5759, + 'Khmer': char => char >= 6016 && char <= 6143, + 'Unified Canadian Aboriginal Syllabics Extended': char => char >= 6320 && char <= 6399, + 'General Punctuation': char => char >= 8192 && char <= 8303, + 'Letterlike Symbols': char => char >= 8448 && char <= 8527, + 'Number Forms': char => char >= 8528 && char <= 8591, + 'Miscellaneous Technical': char => char >= 8960 && char <= 9215, + 'Control Pictures': char => char >= 9216 && char <= 9279, + 'Optical Character Recognition': char => char >= 9280 && char <= 9311, + 'Enclosed Alphanumerics': char => char >= 9312 && char <= 9471, + 'Geometric Shapes': char => char >= 9632 && char <= 9727, + 'Miscellaneous Symbols': char => char >= 9728 && char <= 9983, + 'Miscellaneous Symbols and Arrows': char => char >= 11008 && char <= 11263, + 'CJK Radicals Supplement': char => char >= 11904 && char <= 12031, + 'Kangxi Radicals': char => char >= 12032 && char <= 12255, + 'Ideographic Description Characters': char => char >= 12272 && char <= 12287, + 'CJK Symbols and Punctuation': char => char >= 12288 && char <= 12351, + 'Hiragana': char => char >= 12352 && char <= 12447, + 'Katakana': char => char >= 12448 && char <= 12543, + 'Bopomofo': char => char >= 12544 && char <= 12591, + 'Hangul Compatibility Jamo': char => char >= 12592 && char <= 12687, + 'Kanbun': char => char >= 12688 && char <= 12703, + 'Bopomofo Extended': char => char >= 12704 && char <= 12735, + 'CJK Strokes': char => char >= 12736 && char <= 12783, + 'Katakana Phonetic Extensions': char => char >= 12784 && char <= 12799, + 'Enclosed CJK Letters and Months': char => char >= 12800 && char <= 13055, + 'CJK Compatibility': char => char >= 13056 && char <= 13311, + 'CJK Unified Ideographs Extension A': char => char >= 13312 && char <= 19903, + 'Yijing Hexagram Symbols': char => char >= 19904 && char <= 19967, + 'CJK Unified Ideographs': char => char >= 19968 && char <= 40959, + 'Yi Syllables': char => char >= 40960 && char <= 42127, + 'Yi Radicals': char => char >= 42128 && char <= 42191, + 'Hangul Jamo Extended-A': char => char >= 43360 && char <= 43391, + 'Hangul Syllables': char => char >= 44032 && char <= 55215, + 'Hangul Jamo Extended-B': char => char >= 55216 && char <= 55295, + 'Private Use Area': char => char >= 57344 && char <= 63743, + 'CJK Compatibility Ideographs': char => char >= 63744 && char <= 64255, + 'Arabic Presentation Forms-A': char => char >= 64336 && char <= 65023, + 'Vertical Forms': char => char >= 65040 && char <= 65055, + 'CJK Compatibility Forms': char => char >= 65072 && char <= 65103, + 'Small Form Variants': char => char >= 65104 && char <= 65135, + 'Arabic Presentation Forms-B': char => char >= 65136 && char <= 65279, + 'Halfwidth and Fullwidth Forms': char => char >= 65280 && char <= 65519 +}; + +function allowsVerticalWritingMode(chars) { + for (const char of chars) { + if (charHasUprightVerticalOrientation(char.charCodeAt(0))) + return true; + } + return false; +} +function allowsLetterSpacing(chars) { + for (const char of chars) { + if (!charAllowsLetterSpacing(char.charCodeAt(0))) + return false; + } + return true; +} +function charAllowsLetterSpacing(char) { + if (unicodeBlockLookup['Arabic'](char)) + return false; + if (unicodeBlockLookup['Arabic Supplement'](char)) + return false; + if (unicodeBlockLookup['Arabic Extended-A'](char)) + return false; + if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) + return false; + if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) + return false; + return true; +} +function charAllowsIdeographicBreaking(char) { + if (char < 11904) + return false; + if (unicodeBlockLookup['Bopomofo Extended'](char)) + return true; + if (unicodeBlockLookup['Bopomofo'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility'](char)) + return true; + if (unicodeBlockLookup['CJK Radicals Supplement'](char)) + return true; + if (unicodeBlockLookup['CJK Strokes'](char)) + return true; + if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) + return true; + if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) + return true; + if (unicodeBlockLookup['CJK Unified Ideographs'](char)) + return true; + if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) + return true; + if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) + return true; + if (unicodeBlockLookup['Hiragana'](char)) + return true; + if (unicodeBlockLookup['Ideographic Description Characters'](char)) + return true; + if (unicodeBlockLookup['Kangxi Radicals'](char)) + return true; + if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) + return true; + if (unicodeBlockLookup['Katakana'](char)) + return true; + if (unicodeBlockLookup['Vertical Forms'](char)) + return true; + if (unicodeBlockLookup['Yi Radicals'](char)) + return true; + if (unicodeBlockLookup['Yi Syllables'](char)) + return true; + return false; +} +function charHasUprightVerticalOrientation(char) { + if (char === 746 || char === 747) { + return true; + } + if (char < 4352) + return false; + if (unicodeBlockLookup['Bopomofo Extended'](char)) + return true; + if (unicodeBlockLookup['Bopomofo'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { + if (!(char >= 65097 && char <= 65103)) { + return true; + } + } + if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility'](char)) + return true; + if (unicodeBlockLookup['CJK Radicals Supplement'](char)) + return true; + if (unicodeBlockLookup['CJK Strokes'](char)) + return true; + if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { + if (!(char >= 12296 && char <= 12305) && !(char >= 12308 && char <= 12319) && char !== 12336) { + return true; + } + } + if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) + return true; + if (unicodeBlockLookup['CJK Unified Ideographs'](char)) + return true; + if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) + return true; + if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) + return true; + if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) + return true; + if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) + return true; + if (unicodeBlockLookup['Hangul Jamo'](char)) + return true; + if (unicodeBlockLookup['Hangul Syllables'](char)) + return true; + if (unicodeBlockLookup['Hiragana'](char)) + return true; + if (unicodeBlockLookup['Ideographic Description Characters'](char)) + return true; + if (unicodeBlockLookup['Kanbun'](char)) + return true; + if (unicodeBlockLookup['Kangxi Radicals'](char)) + return true; + if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) + return true; + if (unicodeBlockLookup['Katakana'](char)) { + if (char !== 12540) { + return true; + } + } + if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { + if (char !== 65288 && char !== 65289 && char !== 65293 && !(char >= 65306 && char <= 65310) && char !== 65339 && char !== 65341 && char !== 65343 && !(char >= 65371 && char <= 65503) && char !== 65507 && !(char >= 65512 && char <= 65519)) { + return true; + } + } + if (unicodeBlockLookup['Small Form Variants'](char)) { + if (!(char >= 65112 && char <= 65118) && !(char >= 65123 && char <= 65126)) { + return true; + } + } + if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) + return true; + if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) + return true; + if (unicodeBlockLookup['Vertical Forms'](char)) + return true; + if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) + return true; + if (unicodeBlockLookup['Yi Syllables'](char)) + return true; + if (unicodeBlockLookup['Yi Radicals'](char)) + return true; + return false; +} +function charHasNeutralVerticalOrientation(char) { + if (unicodeBlockLookup['Latin-1 Supplement'](char)) { + if (char === 167 || char === 169 || char === 174 || char === 177 || char === 188 || char === 189 || char === 190 || char === 215 || char === 247) { + return true; + } + } + if (unicodeBlockLookup['General Punctuation'](char)) { + if (char === 8214 || char === 8224 || char === 8225 || char === 8240 || char === 8241 || char === 8251 || char === 8252 || char === 8258 || char === 8263 || char === 8264 || char === 8265 || char === 8273) { + return true; + } + } + if (unicodeBlockLookup['Letterlike Symbols'](char)) + return true; + if (unicodeBlockLookup['Number Forms'](char)) + return true; + if (unicodeBlockLookup['Miscellaneous Technical'](char)) { + if (char >= 8960 && char <= 8967 || char >= 8972 && char <= 8991 || char >= 8996 && char <= 9000 || char === 9003 || char >= 9085 && char <= 9114 || char >= 9150 && char <= 9165 || char === 9167 || char >= 9169 && char <= 9179 || char >= 9186 && char <= 9215) { + return true; + } + } + if (unicodeBlockLookup['Control Pictures'](char) && char !== 9251) + return true; + if (unicodeBlockLookup['Optical Character Recognition'](char)) + return true; + if (unicodeBlockLookup['Enclosed Alphanumerics'](char)) + return true; + if (unicodeBlockLookup['Geometric Shapes'](char)) + return true; + if (unicodeBlockLookup['Miscellaneous Symbols'](char)) { + if (!(char >= 9754 && char <= 9759)) { + return true; + } + } + if (unicodeBlockLookup['Miscellaneous Symbols and Arrows'](char)) { + if (char >= 11026 && char <= 11055 || char >= 11088 && char <= 11097 || char >= 11192 && char <= 11243) { + return true; + } + } + if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) + return true; + if (unicodeBlockLookup['Katakana'](char)) + return true; + if (unicodeBlockLookup['Private Use Area'](char)) + return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) + return true; + if (unicodeBlockLookup['Small Form Variants'](char)) + return true; + if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) + return true; + if (char === 8734 || char === 8756 || char === 8757 || char >= 9984 && char <= 10087 || char >= 10102 && char <= 10131 || char === 65532 || char === 65533) { + return true; + } + return false; +} +function charHasRotatedVerticalOrientation(char) { + return !(charHasUprightVerticalOrientation(char) || charHasNeutralVerticalOrientation(char)); +} +function charInComplexShapingScript(char) { + return unicodeBlockLookup['Arabic'](char) || unicodeBlockLookup['Arabic Supplement'](char) || unicodeBlockLookup['Arabic Extended-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char); +} +function charInRTLScript(char) { + return char >= 1424 && char <= 2303 || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char); +} +function charInSupportedScript(char, canRenderRTL) { + if (!canRenderRTL && charInRTLScript(char)) { + return false; + } + if (char >= 2304 && char <= 3583 || char >= 3840 && char <= 4255 || unicodeBlockLookup['Khmer'](char)) { + return false; + } + return true; +} +function stringContainsRTLText(chars) { + for (const char of chars) { + if (charInRTLScript(char.charCodeAt(0))) { + return true; + } + } + return false; +} +function isStringInSupportedScript(chars, canRenderRTL) { + for (const char of chars) { + if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { + return false; + } + } + return true; +} + +const status = { + unavailable: 'unavailable', + deferred: 'deferred', + loading: 'loading', + loaded: 'loaded', + error: 'error' +}; +let _completionCallback = null; +let pluginStatus = status.unavailable; +let pluginURL = null; +const triggerPluginCompletionEvent = function (error) { + if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) { + pluginStatus = status.error; + } + if (_completionCallback) { + _completionCallback(error); + } +}; +function sendPluginStateToWorker() { + evented.fire(new Event('pluginStateChange', { + pluginStatus, + pluginURL + })); +} +const evented = new Evented(); +const getRTLTextPluginStatus = function () { + return pluginStatus; +}; +const registerForPluginStateChange = function (callback) { + callback({ + pluginStatus, + pluginURL + }); + evented.on('pluginStateChange', callback); + return callback; +}; +const setRTLTextPlugin = function (url, callback, deferred = false) { + if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) { + throw new Error('setRTLTextPlugin cannot be called multiple times.'); + } + pluginURL = exported.resolveURL(url); + pluginStatus = status.deferred; + _completionCallback = callback; + sendPluginStateToWorker(); + if (!deferred) { + downloadRTLTextPlugin(); + } +}; +const downloadRTLTextPlugin = function () { + if (pluginStatus !== status.deferred || !pluginURL) { + throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified'); + } + pluginStatus = status.loading; + sendPluginStateToWorker(); + if (pluginURL) { + getArrayBuffer({ url: pluginURL }, error => { + if (error) { + triggerPluginCompletionEvent(error); + } else { + pluginStatus = status.loaded; + sendPluginStateToWorker(); + } + }); + } +}; +const plugin = { + applyArabicShaping: null, + processBidirectionalText: null, + processStyledBidirectionalText: null, + isLoaded() { + return pluginStatus === status.loaded || plugin.applyArabicShaping != null; + }, + isLoading() { + return pluginStatus === status.loading; + }, + setState(state) { + pluginStatus = state.pluginStatus; + pluginURL = state.pluginURL; + }, + isParsed() { + return plugin.applyArabicShaping != null && plugin.processBidirectionalText != null && plugin.processStyledBidirectionalText != null; + }, + getPluginURL() { + return pluginURL; + } +}; +const lazyLoadRTLTextPlugin = function () { + if (!plugin.isLoading() && !plugin.isLoaded() && getRTLTextPluginStatus() === 'deferred') { + downloadRTLTextPlugin(); + } +}; + +class EvaluationParameters { + constructor(zoom, options) { + this.zoom = zoom; + if (options) { + this.now = options.now; + this.fadeDuration = options.fadeDuration; + this.zoomHistory = options.zoomHistory; + this.transition = options.transition; + } else { + this.now = 0; + this.fadeDuration = 0; + this.zoomHistory = new ZoomHistory(); + this.transition = {}; + } + } + isSupportedScript(str) { + return isStringInSupportedScript(str, plugin.isLoaded()); + } + crossFadingFactor() { + if (this.fadeDuration === 0) { + return 1; + } else { + return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); + } + } + getCrossfadeParameters() { + const z = this.zoom; + const fraction = z - Math.floor(z); + const t = this.crossFadingFactor(); + return z > this.zoomHistory.lastIntegerZoom ? { + fromScale: 2, + toScale: 1, + t: fraction + (1 - fraction) * t + } : { + fromScale: 0.5, + toScale: 1, + t: 1 - (1 - t) * fraction + }; + } +} + +class PropertyValue { + constructor(property, value) { + this.property = property; + this.value = value; + this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); + } + isDataDriven() { + return this.expression.kind === 'source' || this.expression.kind === 'composite'; + } + possiblyEvaluate(parameters, canonical, availableImages) { + return this.property.possiblyEvaluate(this, parameters, canonical, availableImages); + } +} +class TransitionablePropertyValue { + constructor(property) { + this.property = property; + this.value = new PropertyValue(property, undefined); + } + transitioned(parameters, prior) { + return new TransitioningPropertyValue(this.property, this.value, prior, extend({}, parameters.transition, this.transition), parameters.now); + } + untransitioned() { + return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); + } +} +class Transitionable { + constructor(properties) { + this._properties = properties; + this._values = Object.create(properties.defaultTransitionablePropertyValues); + } + getValue(name) { + return clone(this._values[name].value.value); + } + setValue(name, value) { + if (!this._values.hasOwnProperty(name)) { + this._values[name] = new TransitionablePropertyValue(this._values[name].property); + } + this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); + } + getTransition(name) { + return clone(this._values[name].transition); + } + setTransition(name, value) { + if (!this._values.hasOwnProperty(name)) { + this._values[name] = new TransitionablePropertyValue(this._values[name].property); + } + this._values[name].transition = clone(value) || undefined; + } + serialize() { + const result = {}; + for (const property of Object.keys(this._values)) { + const value = this.getValue(property); + if (value !== undefined) { + result[property] = value; + } + const transition = this.getTransition(property); + if (transition !== undefined) { + result[`${ property }-transition`] = transition; + } + } + return result; + } + transitioned(parameters, prior) { + const result = new Transitioning(this._properties); + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); + } + return result; + } + untransitioned() { + const result = new Transitioning(this._properties); + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].untransitioned(); + } + return result; + } +} +class TransitioningPropertyValue { + constructor(property, value, prior, transition, now) { + this.property = property; + this.value = value; + this.begin = now + transition.delay || 0; + this.end = this.begin + transition.duration || 0; + if (property.specification.transition && (transition.delay || transition.duration)) { + this.prior = prior; + } + } + possiblyEvaluate(parameters, canonical, availableImages) { + const now = parameters.now || 0; + const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages); + const prior = this.prior; + if (!prior) { + return finalValue; + } else if (now > this.end) { + this.prior = null; + return finalValue; + } else if (this.value.isDataDriven()) { + this.prior = null; + return finalValue; + } else if (now < this.begin) { + return prior.possiblyEvaluate(parameters, canonical, availableImages); + } else { + const t = (now - this.begin) / (this.end - this.begin); + return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t)); + } + } +} +class Transitioning { + constructor(properties) { + this._properties = properties; + this._values = Object.create(properties.defaultTransitioningPropertyValues); + } + possiblyEvaluate(parameters, canonical, availableImages) { + const result = new PossiblyEvaluated(this._properties); + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); + } + return result; + } + hasTransition() { + for (const property of Object.keys(this._values)) { + if (this._values[property].prior) { + return true; + } + } + return false; + } +} +class Layout { + constructor(properties) { + this._properties = properties; + this._values = Object.create(properties.defaultPropertyValues); + } + getValue(name) { + return clone(this._values[name].value); + } + setValue(name, value) { + this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); + } + serialize() { + const result = {}; + for (const property of Object.keys(this._values)) { + const value = this.getValue(property); + if (value !== undefined) { + result[property] = value; + } + } + return result; + } + possiblyEvaluate(parameters, canonical, availableImages) { + const result = new PossiblyEvaluated(this._properties); + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); + } + return result; + } +} +class PossiblyEvaluatedPropertyValue { + constructor(property, value, parameters) { + this.property = property; + this.value = value; + this.parameters = parameters; + } + isConstant() { + return this.value.kind === 'constant'; + } + constantOr(value) { + if (this.value.kind === 'constant') { + return this.value.value; + } else { + return value; + } + } + evaluate(feature, featureState, canonical, availableImages) { + return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages); + } +} +class PossiblyEvaluated { + constructor(properties) { + this._properties = properties; + this._values = Object.create(properties.defaultPossiblyEvaluatedValues); + } + get(name) { + return this._values[name]; + } +} +class DataConstantProperty { + constructor(specification) { + this.specification = specification; + } + possiblyEvaluate(value, parameters) { + return value.expression.evaluate(parameters); + } + interpolate(a, b, t) { + const interp = interpolate[this.specification.type]; + if (interp) { + return interp(a, b, t); + } else { + return a; + } + } +} +class DataDrivenProperty { + constructor(specification, overrides) { + this.specification = specification; + this.overrides = overrides; + } + possiblyEvaluate(value, parameters, canonical, availableImages) { + if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: value.expression.evaluate(parameters, null, {}, canonical, availableImages) + }, parameters); + } else { + return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); + } + } + interpolate(a, b, t) { + if (a.value.kind !== 'constant' || b.value.kind !== 'constant') { + return a; + } + if (a.value.value === undefined || b.value.value === undefined) { + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: undefined + }, a.parameters); + } + const interp = interpolate[this.specification.type]; + if (interp) { + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: interp(a.value.value, b.value.value, t) + }, a.parameters); + } else { + return a; + } + } + evaluate(value, parameters, feature, featureState, canonical, availableImages) { + if (value.kind === 'constant') { + return value.value; + } else { + return value.evaluate(parameters, feature, featureState, canonical, availableImages); + } + } +} +class CrossFadedDataDrivenProperty extends DataDrivenProperty { + possiblyEvaluate(value, parameters, canonical, availableImages) { + if (value.value === undefined) { + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: undefined + }, parameters); + } else if (value.expression.kind === 'constant') { + const evaluatedValue = value.expression.evaluate(parameters, null, {}, canonical, availableImages); + const isImageExpression = value.property.specification.type === 'resolvedImage'; + const constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue; + const constant = this._calculate(constantValue, constantValue, constantValue, parameters); + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: constant + }, parameters); + } else if (value.expression.kind === 'camera') { + const cameraVal = this._calculate(value.expression.evaluate({ zoom: parameters.zoom - 1 }), value.expression.evaluate({ zoom: parameters.zoom }), value.expression.evaluate({ zoom: parameters.zoom + 1 }), parameters); + return new PossiblyEvaluatedPropertyValue(this, { + kind: 'constant', + value: cameraVal + }, parameters); + } else { + return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); + } + } + evaluate(value, globals, feature, featureState, canonical, availableImages) { + if (value.kind === 'source') { + const constant = value.evaluate(globals, feature, featureState, canonical, availableImages); + return this._calculate(constant, constant, constant, globals); + } else if (value.kind === 'composite') { + return this._calculate(value.evaluate({ zoom: Math.floor(globals.zoom) - 1 }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) }, feature, featureState), value.evaluate({ zoom: Math.floor(globals.zoom) + 1 }, feature, featureState), globals); + } else { + return value.value; + } + } + _calculate(min, mid, max, parameters) { + const z = parameters.zoom; + return z > parameters.zoomHistory.lastIntegerZoom ? { + from: min, + to: mid + } : { + from: max, + to: mid + }; + } + interpolate(a) { + return a; + } +} +class CrossFadedProperty { + constructor(specification) { + this.specification = specification; + } + possiblyEvaluate(value, parameters, canonical, availableImages) { + if (value.value === undefined) { + return undefined; + } else if (value.expression.kind === 'constant') { + const constant = value.expression.evaluate(parameters, null, {}, canonical, availableImages); + return this._calculate(constant, constant, constant, parameters); + } else { + return this._calculate(value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1), parameters)), parameters); + } + } + _calculate(min, mid, max, parameters) { + const z = parameters.zoom; + return z > parameters.zoomHistory.lastIntegerZoom ? { + from: min, + to: mid + } : { + from: max, + to: mid + }; + } + interpolate(a) { + return a; + } +} +class ColorRampProperty { + constructor(specification) { + this.specification = specification; + } + possiblyEvaluate(value, parameters, canonical, availableImages) { + return !!value.expression.evaluate(parameters, null, {}, canonical, availableImages); + } + interpolate() { + return false; + } +} +class Properties { + constructor(properties) { + this.properties = properties; + this.defaultPropertyValues = {}; + this.defaultTransitionablePropertyValues = {}; + this.defaultTransitioningPropertyValues = {}; + this.defaultPossiblyEvaluatedValues = {}; + this.overridableProperties = []; + for (const property in properties) { + const prop = properties[property]; + if (prop.specification.overridable) { + this.overridableProperties.push(property); + } + const defaultPropertyValue = this.defaultPropertyValues[property] = new PropertyValue(prop, undefined); + const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = new TransitionablePropertyValue(prop); + this.defaultTransitioningPropertyValues[property] = defaultTransitionablePropertyValue.untransitioned(); + this.defaultPossiblyEvaluatedValues[property] = defaultPropertyValue.possiblyEvaluate({}); + } + } +} +register('DataDrivenProperty', DataDrivenProperty); +register('DataConstantProperty', DataConstantProperty); +register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty); +register('CrossFadedProperty', CrossFadedProperty); +register('ColorRampProperty', ColorRampProperty); + +function packUint8ToFloat(a, b) { + a = clamp(Math.floor(a), 0, 255); + b = clamp(Math.floor(b), 0, 255); + return 256 * a + b; +} + +const viewTypes = { + 'Int8': Int8Array, + 'Uint8': Uint8Array, + 'Int16': Int16Array, + 'Uint16': Uint16Array, + 'Int32': Int32Array, + 'Uint32': Uint32Array, + 'Float32': Float32Array +}; +class Struct { + constructor(structArray, index) { + this._structArray = structArray; + this._pos1 = index * this.size; + this._pos2 = this._pos1 / 2; + this._pos4 = this._pos1 / 4; + this._pos8 = this._pos1 / 8; + } +} +const DEFAULT_CAPACITY = 128; +const RESIZE_MULTIPLIER = 5; +class StructArray { + constructor() { + this.isTransferred = false; + this.capacity = -1; + this.resize(0); + } + static serialize(array, transferables) { + array._trim(); + if (transferables) { + array.isTransferred = true; + transferables.push(array.arrayBuffer); + } + return { + length: array.length, + arrayBuffer: array.arrayBuffer + }; + } + static deserialize(input) { + const structArray = Object.create(this.prototype); + structArray.arrayBuffer = input.arrayBuffer; + structArray.length = input.length; + structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; + structArray._refreshViews(); + return structArray; + } + _trim() { + if (this.length !== this.capacity) { + this.capacity = this.length; + this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); + this._refreshViews(); + } + } + clear() { + this.length = 0; + } + resize(n) { + this.reserve(n); + this.length = n; + } + reserve(n) { + if (n > this.capacity) { + this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); + this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); + const oldUint8Array = this.uint8; + this._refreshViews(); + if (oldUint8Array) + this.uint8.set(oldUint8Array); + } + } + _refreshViews() { + throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); + } +} +function createLayout(members, alignment = 1) { + let offset = 0; + let maxSize = 0; + const layoutMembers = members.map(member => { + const typeSize = sizeOf(member.type); + const memberOffset = offset = align(offset, Math.max(alignment, typeSize)); + const components = member.components || 1; + maxSize = Math.max(maxSize, typeSize); + offset += typeSize * components; + return { + name: member.name, + type: member.type, + components, + offset: memberOffset + }; + }); + const size = align(offset, Math.max(maxSize, alignment)); + return { + members: layoutMembers, + size, + alignment + }; +} +function sizeOf(type) { + return viewTypes[type].BYTES_PER_ELEMENT; +} +function align(offset, size) { + return Math.ceil(offset / size) * size; +} + +class StructArrayLayout2i4 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + emplaceBack(v0, v1) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + emplace(i, v0, v1) { + const o2 = i * 2; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + return i; + } +} +StructArrayLayout2i4.prototype.bytesPerElement = 4; +register('StructArrayLayout2i4', StructArrayLayout2i4); +class StructArrayLayout4i8 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + emplace(i, v0, v1, v2, v3) { + const o2 = i * 4; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.int16[o2 + 3] = v3; + return i; + } +} +StructArrayLayout4i8.prototype.bytesPerElement = 8; +register('StructArrayLayout4i8', StructArrayLayout4i8); +class StructArrayLayout2i4ub1f12 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6) { + const o2 = i * 6; + const o1 = i * 12; + const o4 = i * 3; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.uint8[o1 + 4] = v2; + this.uint8[o1 + 5] = v3; + this.uint8[o1 + 6] = v4; + this.uint8[o1 + 7] = v5; + this.float32[o4 + 2] = v6; + return i; + } +} +StructArrayLayout2i4ub1f12.prototype.bytesPerElement = 12; +register('StructArrayLayout2i4ub1f12', StructArrayLayout2i4ub1f12); +class StructArrayLayout2f8 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + emplace(i, v0, v1) { + const o4 = i * 2; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + return i; + } +} +StructArrayLayout2f8.prototype.bytesPerElement = 8; +register('StructArrayLayout2f8', StructArrayLayout2f8); +class StructArrayLayout10ui20 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) { + const o2 = i * 10; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + this.uint16[o2 + 3] = v3; + this.uint16[o2 + 4] = v4; + this.uint16[o2 + 5] = v5; + this.uint16[o2 + 6] = v6; + this.uint16[o2 + 7] = v7; + this.uint16[o2 + 8] = v8; + this.uint16[o2 + 9] = v9; + return i; + } +} +StructArrayLayout10ui20.prototype.bytesPerElement = 20; +register('StructArrayLayout10ui20', StructArrayLayout10ui20); +class StructArrayLayout4i4ui4i24 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) { + const o2 = i * 12; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.int16[o2 + 3] = v3; + this.uint16[o2 + 4] = v4; + this.uint16[o2 + 5] = v5; + this.uint16[o2 + 6] = v6; + this.uint16[o2 + 7] = v7; + this.int16[o2 + 8] = v8; + this.int16[o2 + 9] = v9; + this.int16[o2 + 10] = v10; + this.int16[o2 + 11] = v11; + return i; + } +} +StructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24; +register('StructArrayLayout4i4ui4i24', StructArrayLayout4i4ui4i24); +class StructArrayLayout3f12 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + emplace(i, v0, v1, v2) { + const o4 = i * 3; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + return i; + } +} +StructArrayLayout3f12.prototype.bytesPerElement = 12; +register('StructArrayLayout3f12', StructArrayLayout3f12); +class StructArrayLayout1ul4 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + } + emplaceBack(v0) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + emplace(i, v0) { + const o4 = i * 1; + this.uint32[o4 + 0] = v0; + return i; + } +} +StructArrayLayout1ul4.prototype.bytesPerElement = 4; +register('StructArrayLayout1ul4', StructArrayLayout1ul4); +class StructArrayLayout2i4f1i1ul2ui32 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) { + const o2 = i * 16; + const o4 = i * 8; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.float32[o4 + 1] = v2; + this.float32[o4 + 2] = v3; + this.float32[o4 + 3] = v4; + this.float32[o4 + 4] = v5; + this.int16[o2 + 10] = v6; + this.uint32[o4 + 6] = v7; + this.uint16[o2 + 14] = v8; + this.uint16[o2 + 15] = v9; + return i; + } +} +StructArrayLayout2i4f1i1ul2ui32.prototype.bytesPerElement = 32; +register('StructArrayLayout2i4f1i1ul2ui32', StructArrayLayout2i4f1i1ul2ui32); +class StructArrayLayout2i2i2i12 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5); + } + emplace(i, v0, v1, v2, v3, v4, v5) { + const o2 = i * 6; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.int16[o2 + 3] = v3; + this.int16[o2 + 4] = v4; + this.int16[o2 + 5] = v5; + return i; + } +} +StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12; +register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12); +class StructArrayLayout2f1f2i16 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4); + } + emplace(i, v0, v1, v2, v3, v4) { + const o4 = i * 4; + const o2 = i * 8; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + this.int16[o2 + 6] = v3; + this.int16[o2 + 7] = v4; + return i; + } +} +StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16; +register('StructArrayLayout2f1f2i16', StructArrayLayout2f1f2i16); +class StructArrayLayout2ub2f12 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + emplace(i, v0, v1, v2, v3) { + const o1 = i * 12; + const o4 = i * 3; + this.uint8[o1 + 0] = v0; + this.uint8[o1 + 1] = v1; + this.float32[o4 + 1] = v2; + this.float32[o4 + 2] = v3; + return i; + } +} +StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; +register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12); +class StructArrayLayout3ui6 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + emplace(i, v0, v1, v2) { + const o2 = i * 3; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + return i; + } +} +StructArrayLayout3ui6.prototype.bytesPerElement = 6; +register('StructArrayLayout3ui6', StructArrayLayout3ui6); +class StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) { + const o2 = i * 24; + const o4 = i * 12; + const o1 = i * 48; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + this.uint16[o2 + 3] = v3; + this.uint32[o4 + 2] = v4; + this.uint32[o4 + 3] = v5; + this.uint32[o4 + 4] = v6; + this.uint16[o2 + 10] = v7; + this.uint16[o2 + 11] = v8; + this.uint16[o2 + 12] = v9; + this.float32[o4 + 7] = v10; + this.float32[o4 + 8] = v11; + this.uint8[o1 + 36] = v12; + this.uint8[o1 + 37] = v13; + this.uint8[o1 + 38] = v14; + this.uint32[o4 + 10] = v15; + this.int16[o2 + 22] = v16; + return i; + } +} +StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.bytesPerElement = 48; +register('StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48', StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48); +class StructArrayLayout8i15ui1ul4f68 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); + } + emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) { + const o2 = i * 34; + const o4 = i * 17; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.int16[o2 + 3] = v3; + this.int16[o2 + 4] = v4; + this.int16[o2 + 5] = v5; + this.int16[o2 + 6] = v6; + this.int16[o2 + 7] = v7; + this.uint16[o2 + 8] = v8; + this.uint16[o2 + 9] = v9; + this.uint16[o2 + 10] = v10; + this.uint16[o2 + 11] = v11; + this.uint16[o2 + 12] = v12; + this.uint16[o2 + 13] = v13; + this.uint16[o2 + 14] = v14; + this.uint16[o2 + 15] = v15; + this.uint16[o2 + 16] = v16; + this.uint16[o2 + 17] = v17; + this.uint16[o2 + 18] = v18; + this.uint16[o2 + 19] = v19; + this.uint16[o2 + 20] = v20; + this.uint16[o2 + 21] = v21; + this.uint16[o2 + 22] = v22; + this.uint32[o4 + 12] = v23; + this.float32[o4 + 13] = v24; + this.float32[o4 + 14] = v25; + this.float32[o4 + 15] = v26; + this.float32[o4 + 16] = v27; + return i; + } +} +StructArrayLayout8i15ui1ul4f68.prototype.bytesPerElement = 68; +register('StructArrayLayout8i15ui1ul4f68', StructArrayLayout8i15ui1ul4f68); +class StructArrayLayout1f4 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + emplace(i, v0) { + const o4 = i * 1; + this.float32[o4 + 0] = v0; + return i; + } +} +StructArrayLayout1f4.prototype.bytesPerElement = 4; +register('StructArrayLayout1f4', StructArrayLayout1f4); +class StructArrayLayout3i6 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + emplace(i, v0, v1, v2) { + const o2 = i * 3; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + return i; + } +} +StructArrayLayout3i6.prototype.bytesPerElement = 6; +register('StructArrayLayout3i6', StructArrayLayout3i6); +class StructArrayLayout1ul3ui12 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + emplace(i, v0, v1, v2, v3) { + const o4 = i * 3; + const o2 = i * 6; + this.uint32[o4 + 0] = v0; + this.uint16[o2 + 2] = v1; + this.uint16[o2 + 3] = v2; + this.uint16[o2 + 4] = v3; + return i; + } +} +StructArrayLayout1ul3ui12.prototype.bytesPerElement = 12; +register('StructArrayLayout1ul3ui12', StructArrayLayout1ul3ui12); +class StructArrayLayout2ui4 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0, v1) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + emplace(i, v0, v1) { + const o2 = i * 2; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + return i; + } +} +StructArrayLayout2ui4.prototype.bytesPerElement = 4; +register('StructArrayLayout2ui4', StructArrayLayout2ui4); +class StructArrayLayout1ui2 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + emplaceBack(v0) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + emplace(i, v0) { + const o2 = i * 1; + this.uint16[o2 + 0] = v0; + return i; + } +} +StructArrayLayout1ui2.prototype.bytesPerElement = 2; +register('StructArrayLayout1ui2', StructArrayLayout1ui2); +class StructArrayLayout4f16 extends StructArray { + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + emplaceBack(v0, v1, v2, v3) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + emplace(i, v0, v1, v2, v3) { + const o4 = i * 4; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + this.float32[o4 + 3] = v3; + return i; + } +} +StructArrayLayout4f16.prototype.bytesPerElement = 16; +register('StructArrayLayout4f16', StructArrayLayout4f16); +class CollisionBoxStruct extends Struct { + get anchorPointX() { + return this._structArray.int16[this._pos2 + 0]; + } + get anchorPointY() { + return this._structArray.int16[this._pos2 + 1]; + } + get x1() { + return this._structArray.float32[this._pos4 + 1]; + } + get y1() { + return this._structArray.float32[this._pos4 + 2]; + } + get x2() { + return this._structArray.float32[this._pos4 + 3]; + } + get y2() { + return this._structArray.float32[this._pos4 + 4]; + } + get padding() { + return this._structArray.int16[this._pos2 + 10]; + } + get featureIndex() { + return this._structArray.uint32[this._pos4 + 6]; + } + get sourceLayerIndex() { + return this._structArray.uint16[this._pos2 + 14]; + } + get bucketIndex() { + return this._structArray.uint16[this._pos2 + 15]; + } + get anchorPoint() { + return new pointGeometry(this.anchorPointX, this.anchorPointY); + } +} +CollisionBoxStruct.prototype.size = 32; +class CollisionBoxArray extends StructArrayLayout2i4f1i1ul2ui32 { + get(index) { + return new CollisionBoxStruct(this, index); + } +} +register('CollisionBoxArray', CollisionBoxArray); +class PlacedSymbolStruct extends Struct { + get anchorX() { + return this._structArray.int16[this._pos2 + 0]; + } + get anchorY() { + return this._structArray.int16[this._pos2 + 1]; + } + get glyphStartIndex() { + return this._structArray.uint16[this._pos2 + 2]; + } + get numGlyphs() { + return this._structArray.uint16[this._pos2 + 3]; + } + get vertexStartIndex() { + return this._structArray.uint32[this._pos4 + 2]; + } + get lineStartIndex() { + return this._structArray.uint32[this._pos4 + 3]; + } + get lineLength() { + return this._structArray.uint32[this._pos4 + 4]; + } + get segment() { + return this._structArray.uint16[this._pos2 + 10]; + } + get lowerSize() { + return this._structArray.uint16[this._pos2 + 11]; + } + get upperSize() { + return this._structArray.uint16[this._pos2 + 12]; + } + get lineOffsetX() { + return this._structArray.float32[this._pos4 + 7]; + } + get lineOffsetY() { + return this._structArray.float32[this._pos4 + 8]; + } + get writingMode() { + return this._structArray.uint8[this._pos1 + 36]; + } + get placedOrientation() { + return this._structArray.uint8[this._pos1 + 37]; + } + set placedOrientation(x) { + this._structArray.uint8[this._pos1 + 37] = x; + } + get hidden() { + return this._structArray.uint8[this._pos1 + 38]; + } + set hidden(x) { + this._structArray.uint8[this._pos1 + 38] = x; + } + get crossTileID() { + return this._structArray.uint32[this._pos4 + 10]; + } + set crossTileID(x) { + this._structArray.uint32[this._pos4 + 10] = x; + } + get associatedIconIndex() { + return this._structArray.int16[this._pos2 + 22]; + } +} +PlacedSymbolStruct.prototype.size = 48; +class PlacedSymbolArray extends StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 { + get(index) { + return new PlacedSymbolStruct(this, index); + } +} +register('PlacedSymbolArray', PlacedSymbolArray); +class SymbolInstanceStruct extends Struct { + get anchorX() { + return this._structArray.int16[this._pos2 + 0]; + } + get anchorY() { + return this._structArray.int16[this._pos2 + 1]; + } + get rightJustifiedTextSymbolIndex() { + return this._structArray.int16[this._pos2 + 2]; + } + get centerJustifiedTextSymbolIndex() { + return this._structArray.int16[this._pos2 + 3]; + } + get leftJustifiedTextSymbolIndex() { + return this._structArray.int16[this._pos2 + 4]; + } + get verticalPlacedTextSymbolIndex() { + return this._structArray.int16[this._pos2 + 5]; + } + get placedIconSymbolIndex() { + return this._structArray.int16[this._pos2 + 6]; + } + get verticalPlacedIconSymbolIndex() { + return this._structArray.int16[this._pos2 + 7]; + } + get key() { + return this._structArray.uint16[this._pos2 + 8]; + } + get textBoxStartIndex() { + return this._structArray.uint16[this._pos2 + 9]; + } + get textBoxEndIndex() { + return this._structArray.uint16[this._pos2 + 10]; + } + get verticalTextBoxStartIndex() { + return this._structArray.uint16[this._pos2 + 11]; + } + get verticalTextBoxEndIndex() { + return this._structArray.uint16[this._pos2 + 12]; + } + get iconBoxStartIndex() { + return this._structArray.uint16[this._pos2 + 13]; + } + get iconBoxEndIndex() { + return this._structArray.uint16[this._pos2 + 14]; + } + get verticalIconBoxStartIndex() { + return this._structArray.uint16[this._pos2 + 15]; + } + get verticalIconBoxEndIndex() { + return this._structArray.uint16[this._pos2 + 16]; + } + get featureIndex() { + return this._structArray.uint16[this._pos2 + 17]; + } + get numHorizontalGlyphVertices() { + return this._structArray.uint16[this._pos2 + 18]; + } + get numVerticalGlyphVertices() { + return this._structArray.uint16[this._pos2 + 19]; + } + get numIconVertices() { + return this._structArray.uint16[this._pos2 + 20]; + } + get numVerticalIconVertices() { + return this._structArray.uint16[this._pos2 + 21]; + } + get useRuntimeCollisionCircles() { + return this._structArray.uint16[this._pos2 + 22]; + } + get crossTileID() { + return this._structArray.uint32[this._pos4 + 12]; + } + set crossTileID(x) { + this._structArray.uint32[this._pos4 + 12] = x; + } + get textBoxScale() { + return this._structArray.float32[this._pos4 + 13]; + } + get textOffset0() { + return this._structArray.float32[this._pos4 + 14]; + } + get textOffset1() { + return this._structArray.float32[this._pos4 + 15]; + } + get collisionCircleDiameter() { + return this._structArray.float32[this._pos4 + 16]; + } +} +SymbolInstanceStruct.prototype.size = 68; +class SymbolInstanceArray extends StructArrayLayout8i15ui1ul4f68 { + get(index) { + return new SymbolInstanceStruct(this, index); + } +} +register('SymbolInstanceArray', SymbolInstanceArray); +class GlyphOffsetArray extends StructArrayLayout1f4 { + getoffsetX(index) { + return this.float32[index * 1 + 0]; + } +} +register('GlyphOffsetArray', GlyphOffsetArray); +class SymbolLineVertexArray extends StructArrayLayout3i6 { + getx(index) { + return this.int16[index * 3 + 0]; + } + gety(index) { + return this.int16[index * 3 + 1]; + } + gettileUnitDistanceFromAnchor(index) { + return this.int16[index * 3 + 2]; + } +} +register('SymbolLineVertexArray', SymbolLineVertexArray); +class FeatureIndexStruct extends Struct { + get featureIndex() { + return this._structArray.uint32[this._pos4 + 0]; + } + get sourceLayerIndex() { + return this._structArray.uint16[this._pos2 + 2]; + } + get bucketIndex() { + return this._structArray.uint16[this._pos2 + 3]; + } + get layoutVertexArrayOffset() { + return this._structArray.uint16[this._pos2 + 4]; + } +} +FeatureIndexStruct.prototype.size = 12; +class FeatureIndexArray extends StructArrayLayout1ul3ui12 { + get(index) { + return new FeatureIndexStruct(this, index); + } +} +register('FeatureIndexArray', FeatureIndexArray); +class FillExtrusionCentroidStruct extends Struct { + get a_centroid_pos0() { + return this._structArray.uint16[this._pos2 + 0]; + } + get a_centroid_pos1() { + return this._structArray.uint16[this._pos2 + 1]; + } +} +FillExtrusionCentroidStruct.prototype.size = 4; +class FillExtrusionCentroidArray extends StructArrayLayout2ui4 { + get(index) { + return new FillExtrusionCentroidStruct(this, index); + } +} +register('FillExtrusionCentroidArray', FillExtrusionCentroidArray); + +const patternAttributes = createLayout([ + { + name: 'a_pattern_to', + components: 4, + type: 'Uint16' + }, + { + name: 'a_pattern_from', + components: 4, + type: 'Uint16' + }, + { + name: 'a_pixel_ratio_to', + components: 1, + type: 'Uint16' + }, + { + name: 'a_pixel_ratio_from', + components: 1, + type: 'Uint16' + } +]); + +var murmurhash3_gc = createCommonjsModule(function (module) { +function murmurhash3_32_gc(key, seed) { + var remainder, bytes, h1, h1b, c1, c2, k1, i; + remainder = key.length & 3; + bytes = key.length - remainder; + h1 = seed; + c1 = 3432918353; + c2 = 461845907; + i = 0; + while (i < bytes) { + k1 = key.charCodeAt(i) & 255 | (key.charCodeAt(++i) & 255) << 8 | (key.charCodeAt(++i) & 255) << 16 | (key.charCodeAt(++i) & 255) << 24; + ++i; + k1 = (k1 & 65535) * c1 + (((k1 >>> 16) * c1 & 65535) << 16) & 4294967295; + k1 = k1 << 15 | k1 >>> 17; + k1 = (k1 & 65535) * c2 + (((k1 >>> 16) * c2 & 65535) << 16) & 4294967295; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1b = (h1 & 65535) * 5 + (((h1 >>> 16) * 5 & 65535) << 16) & 4294967295; + h1 = (h1b & 65535) + 27492 + (((h1b >>> 16) + 58964 & 65535) << 16); + } + k1 = 0; + switch (remainder) { + case 3: + k1 ^= (key.charCodeAt(i + 2) & 255) << 16; + case 2: + k1 ^= (key.charCodeAt(i + 1) & 255) << 8; + case 1: + k1 ^= key.charCodeAt(i) & 255; + k1 = (k1 & 65535) * c1 + (((k1 >>> 16) * c1 & 65535) << 16) & 4294967295; + k1 = k1 << 15 | k1 >>> 17; + k1 = (k1 & 65535) * c2 + (((k1 >>> 16) * c2 & 65535) << 16) & 4294967295; + h1 ^= k1; + } + h1 ^= key.length; + h1 ^= h1 >>> 16; + h1 = (h1 & 65535) * 2246822507 + (((h1 >>> 16) * 2246822507 & 65535) << 16) & 4294967295; + h1 ^= h1 >>> 13; + h1 = (h1 & 65535) * 3266489909 + (((h1 >>> 16) * 3266489909 & 65535) << 16) & 4294967295; + h1 ^= h1 >>> 16; + return h1 >>> 0; +} +{ + module.exports = murmurhash3_32_gc; +} +}); + +var murmurhash2_gc = createCommonjsModule(function (module) { +function murmurhash2_32_gc(str, seed) { + var l = str.length, h = seed ^ l, i = 0, k; + while (l >= 4) { + k = str.charCodeAt(i) & 255 | (str.charCodeAt(++i) & 255) << 8 | (str.charCodeAt(++i) & 255) << 16 | (str.charCodeAt(++i) & 255) << 24; + k = (k & 65535) * 1540483477 + (((k >>> 16) * 1540483477 & 65535) << 16); + k ^= k >>> 24; + k = (k & 65535) * 1540483477 + (((k >>> 16) * 1540483477 & 65535) << 16); + h = (h & 65535) * 1540483477 + (((h >>> 16) * 1540483477 & 65535) << 16) ^ k; + l -= 4; + ++i; + } + switch (l) { + case 3: + h ^= (str.charCodeAt(i + 2) & 255) << 16; + case 2: + h ^= (str.charCodeAt(i + 1) & 255) << 8; + case 1: + h ^= str.charCodeAt(i) & 255; + h = (h & 65535) * 1540483477 + (((h >>> 16) * 1540483477 & 65535) << 16); + } + h ^= h >>> 13; + h = (h & 65535) * 1540483477 + (((h >>> 16) * 1540483477 & 65535) << 16); + h ^= h >>> 15; + return h >>> 0; +} +{ + module.exports = murmurhash2_32_gc; +} +}); + +var murmurhashJs = murmurhash3_gc; +var murmur3_1 = murmurhash3_gc; +var murmur2_1 = murmurhash2_gc; +murmurhashJs.murmur3 = murmur3_1; +murmurhashJs.murmur2 = murmur2_1; + +class FeaturePositionMap { + constructor() { + this.ids = []; + this.positions = []; + this.indexed = false; + } + add(id, index, start, end) { + this.ids.push(getNumericId(id)); + this.positions.push(index, start, end); + } + getPositions(id) { + const intId = getNumericId(id); + let i = 0; + let j = this.ids.length - 1; + while (i < j) { + const m = i + j >> 1; + if (this.ids[m] >= intId) { + j = m; + } else { + i = m + 1; + } + } + const positions = []; + while (this.ids[i] === intId) { + const index = this.positions[3 * i]; + const start = this.positions[3 * i + 1]; + const end = this.positions[3 * i + 2]; + positions.push({ + index, + start, + end + }); + i++; + } + return positions; + } + static serialize(map, transferables) { + const ids = new Float64Array(map.ids); + const positions = new Uint32Array(map.positions); + sort(ids, positions, 0, ids.length - 1); + if (transferables) { + transferables.push(ids.buffer, positions.buffer); + } + return { + ids, + positions + }; + } + static deserialize(obj) { + const map = new FeaturePositionMap(); + map.ids = obj.ids; + map.positions = obj.positions; + map.indexed = true; + return map; + } +} +function getNumericId(value) { + const numValue = +value; + if (!isNaN(numValue) && numValue <= MAX_SAFE_INTEGER) { + return numValue; + } + return murmurhashJs(String(value)); +} +function sort(ids, positions, left, right) { + while (left < right) { + const pivot = ids[left + right >> 1]; + let i = left - 1; + let j = right + 1; + while (true) { + do + i++; + while (ids[i] < pivot); + do + j--; + while (ids[j] > pivot); + if (i >= j) + break; + swap(ids, i, j); + swap(positions, 3 * i, 3 * j); + swap(positions, 3 * i + 1, 3 * j + 1); + swap(positions, 3 * i + 2, 3 * j + 2); + } + if (j - left < right - j) { + sort(ids, positions, left, j); + left = j + 1; + } else { + sort(ids, positions, j + 1, right); + right = j; + } + } +} +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} +register('FeaturePositionMap', FeaturePositionMap); + +class Uniform { + constructor(context, location) { + this.gl = context.gl; + this.location = location; + } +} +class Uniform1i extends Uniform { + constructor(context, location) { + super(context, location); + this.current = 0; + } + set(v) { + if (this.current !== v) { + this.current = v; + this.gl.uniform1i(this.location, v); + } + } +} +class Uniform1f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = 0; + } + set(v) { + if (this.current !== v) { + this.current = v; + this.gl.uniform1f(this.location, v); + } + } +} +class Uniform2f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = [ + 0, + 0 + ]; + } + set(v) { + if (v[0] !== this.current[0] || v[1] !== this.current[1]) { + this.current = v; + this.gl.uniform2f(this.location, v[0], v[1]); + } + } +} +class Uniform3f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = [ + 0, + 0, + 0 + ]; + } + set(v) { + if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) { + this.current = v; + this.gl.uniform3f(this.location, v[0], v[1], v[2]); + } + } +} +class Uniform4f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = [ + 0, + 0, + 0, + 0 + ]; + } + set(v) { + if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2] || v[3] !== this.current[3]) { + this.current = v; + this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]); + } + } +} +class UniformColor extends Uniform { + constructor(context, location) { + super(context, location); + this.current = Color.transparent; + } + set(v) { + if (v.r !== this.current.r || v.g !== this.current.g || v.b !== this.current.b || v.a !== this.current.a) { + this.current = v; + this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a); + } + } +} +const emptyMat4 = new Float32Array(16); +class UniformMatrix4f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = emptyMat4; + } + set(v) { + if (v[12] !== this.current[12] || v[0] !== this.current[0]) { + this.current = v; + this.gl.uniformMatrix4fv(this.location, false, v); + return; + } + for (let i = 1; i < 16; i++) { + if (v[i] !== this.current[i]) { + this.current = v; + this.gl.uniformMatrix4fv(this.location, false, v); + break; + } + } + } +} +const emptyMat3 = new Float32Array(9); +class UniformMatrix3f extends Uniform { + constructor(context, location) { + super(context, location); + this.current = emptyMat3; + } + set(v) { + for (let i = 0; i < 9; i++) { + if (v[i] !== this.current[i]) { + this.current = v; + this.gl.uniformMatrix3fv(this.location, false, v); + break; + } + } + } +} + +function packColor(color) { + return [ + packUint8ToFloat(255 * color.r, 255 * color.g), + packUint8ToFloat(255 * color.b, 255 * color.a) + ]; +} +class ConstantBinder { + constructor(value, names, type) { + this.value = value; + this.uniformNames = names.map(name => `u_${ name }`); + this.type = type; + } + setUniform(uniform, globals, currentValue) { + uniform.set(currentValue.constantOr(this.value)); + } + getBinding(context, location, _) { + return this.type === 'color' ? new UniformColor(context, location) : new Uniform1f(context, location); + } +} +class CrossFadedConstantBinder { + constructor(value, names) { + this.uniformNames = names.map(name => `u_${ name }`); + this.patternFrom = null; + this.patternTo = null; + this.pixelRatioFrom = 1; + this.pixelRatioTo = 1; + } + setConstantPatternPositions(posTo, posFrom) { + this.pixelRatioFrom = posFrom.pixelRatio; + this.pixelRatioTo = posTo.pixelRatio; + this.patternFrom = posFrom.tlbr; + this.patternTo = posTo.tlbr; + } + setUniform(uniform, globals, currentValue, uniformName) { + const pos = uniformName === 'u_pattern_to' ? this.patternTo : uniformName === 'u_pattern_from' ? this.patternFrom : uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo : uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null; + if (pos) + uniform.set(pos); + } + getBinding(context, location, name) { + return name.substr(0, 9) === 'u_pattern' ? new Uniform4f(context, location) : new Uniform1f(context, location); + } +} +class SourceExpressionBinder { + constructor(expression, names, type, PaintVertexArray) { + this.expression = expression; + this.type = type; + this.maxValue = 0; + this.paintVertexAttributes = names.map(name => ({ + name: `a_${ name }`, + type: 'Float32', + components: type === 'color' ? 2 : 1, + offset: 0 + })); + this.paintVertexArray = new PaintVertexArray(); + } + populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) { + const start = this.paintVertexArray.length; + const value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, [], formattedSection); + this.paintVertexArray.resize(newLength); + this._setPaintValue(start, newLength, value); + } + updatePaintArray(start, end, feature, featureState) { + const value = this.expression.evaluate({ zoom: 0 }, feature, featureState); + this._setPaintValue(start, end, value); + } + _setPaintValue(start, end, value) { + if (this.type === 'color') { + const color = packColor(value); + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, color[0], color[1]); + } + } else { + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, value); + } + this.maxValue = Math.max(this.maxValue, Math.abs(value)); + } + } + upload(context) { + if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } + } + } + destroy() { + if (this.paintVertexBuffer) { + this.paintVertexBuffer.destroy(); + } + } +} +class CompositeExpressionBinder { + constructor(expression, names, type, useIntegerZoom, zoom, PaintVertexArray) { + this.expression = expression; + this.uniformNames = names.map(name => `u_${ name }_t`); + this.type = type; + this.useIntegerZoom = useIntegerZoom; + this.zoom = zoom; + this.maxValue = 0; + this.paintVertexAttributes = names.map(name => ({ + name: `a_${ name }`, + type: 'Float32', + components: type === 'color' ? 4 : 2, + offset: 0 + })); + this.paintVertexArray = new PaintVertexArray(); + } + populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection) { + const min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, [], formattedSection); + const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, [], formattedSection); + const start = this.paintVertexArray.length; + this.paintVertexArray.resize(newLength); + this._setPaintValue(start, newLength, min, max); + } + updatePaintArray(start, end, feature, featureState) { + const min = this.expression.evaluate({ zoom: this.zoom }, feature, featureState); + const max = this.expression.evaluate({ zoom: this.zoom + 1 }, feature, featureState); + this._setPaintValue(start, end, min, max); + } + _setPaintValue(start, end, min, max) { + if (this.type === 'color') { + const minColor = packColor(min); + const maxColor = packColor(max); + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); + } + } else { + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, min, max); + } + this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max)); + } + } + upload(context) { + if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } + } + } + destroy() { + if (this.paintVertexBuffer) { + this.paintVertexBuffer.destroy(); + } + } + setUniform(uniform, globals) { + const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom; + const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1); + uniform.set(factor); + } + getBinding(context, location, _) { + return new Uniform1f(context, location); + } +} +class CrossFadedCompositeBinder { + constructor(expression, names, type, useIntegerZoom, zoom, PaintVertexArray, layerId) { + this.expression = expression; + this.type = type; + this.useIntegerZoom = useIntegerZoom; + this.zoom = zoom; + this.layerId = layerId; + for (let i = 0; i < names.length; ++i) { + } + this.zoomInPaintVertexArray = new PaintVertexArray(); + this.zoomOutPaintVertexArray = new PaintVertexArray(); + } + populatePaintArray(length, feature, imagePositions) { + const start = this.zoomInPaintVertexArray.length; + this.zoomInPaintVertexArray.resize(length); + this.zoomOutPaintVertexArray.resize(length); + this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions); + } + updatePaintArray(start, end, feature, featureState, imagePositions) { + this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions); + } + _setPaintValues(start, end, patterns, positions) { + if (!positions || !patterns) + return; + const {min, mid, max} = patterns; + const imageMin = positions[min]; + const imageMid = positions[mid]; + const imageMax = positions[max]; + if (!imageMin || !imageMid || !imageMax) + return; + for (let i = start; i < end; i++) { + this.zoomInPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1], imageMid.pixelRatio, imageMin.pixelRatio); + this.zoomOutPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1], imageMid.pixelRatio, imageMax.pixelRatio); + } + } + upload(context) { + if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) { + this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, patternAttributes.members, this.expression.isStateDependent); + this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, patternAttributes.members, this.expression.isStateDependent); + } + } + destroy() { + if (this.zoomOutPaintVertexBuffer) + this.zoomOutPaintVertexBuffer.destroy(); + if (this.zoomInPaintVertexBuffer) + this.zoomInPaintVertexBuffer.destroy(); + } +} +class ProgramConfiguration { + constructor(layer, zoom, filterProperties = () => true) { + this.binders = {}; + this._buffers = []; + const keys = []; + for (const property in layer.paint._values) { + if (!filterProperties(property)) + continue; + const value = layer.paint.get(property); + if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { + continue; + } + const names = paintAttributeNames(property, layer.type); + const expression = value.value; + const type = value.property.specification.type; + const useIntegerZoom = value.property.useIntegerZoom; + const propType = value.property.specification['property-type']; + const isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven'; + if (expression.kind === 'constant') { + this.binders[property] = isCrossFaded ? new CrossFadedConstantBinder(expression.value, names) : new ConstantBinder(expression.value, names, type); + keys.push(`/u_${ property }`); + } else if (expression.kind === 'source' || isCrossFaded) { + const StructArrayLayout = layoutType(property, type, 'source'); + this.binders[property] = isCrossFaded ? new CrossFadedCompositeBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) : new SourceExpressionBinder(expression, names, type, StructArrayLayout); + keys.push(`/a_${ property }`); + } else { + const StructArrayLayout = layoutType(property, type, 'composite'); + this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout); + keys.push(`/z_${ property }`); + } + } + this.cacheKey = keys.sort().join(''); + } + getMaxValue(property) { + const binder = this.binders[property]; + return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0; + } + populatePaintArrays(newLength, feature, imagePositions, canonical, formattedSection) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + binder.populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection); + } + } + setConstantPatternPositions(posTo, posFrom) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof CrossFadedConstantBinder) + binder.setConstantPatternPositions(posTo, posFrom); + } + } + updatePaintArrays(featureStates, featureMap, vtLayer, layer, imagePositions) { + let dirty = false; + for (const id in featureStates) { + const positions = featureMap.getPositions(id); + for (const pos of positions) { + const feature = vtLayer.feature(pos.index); + for (const property in this.binders) { + const binder = this.binders[property]; + if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) && binder.expression.isStateDependent === true) { + const value = layer.paint.get(property); + binder.expression = value.value; + binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions); + dirty = true; + } + } + } + } + return dirty; + } + defines() { + const result = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { + result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${ name }`)); + } + } + return result; + } + getBinderAttributes() { + const result = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) { + for (let i = 0; i < binder.paintVertexAttributes.length; i++) { + result.push(binder.paintVertexAttributes[i].name); + } + } else if (binder instanceof CrossFadedCompositeBinder) { + for (let i = 0; i < patternAttributes.members.length; i++) { + result.push(patternAttributes.members[i].name); + } + } + } + return result; + } + getBinderUniforms() { + const uniforms = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { + for (const uniformName of binder.uniformNames) { + uniforms.push(uniformName); + } + } + } + return uniforms; + } + getPaintVertexBuffers() { + return this._buffers; + } + getUniforms(context, locations) { + const uniforms = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { + for (const name of binder.uniformNames) { + if (locations[name]) { + const binding = binder.getBinding(context, locations[name], name); + uniforms.push({ + name, + property, + binding + }); + } + } + } + } + return uniforms; + } + setUniforms(context, binderUniforms, properties, globals) { + for (const {name, property, binding} of binderUniforms) { + this.binders[property].setUniform(binding, globals, properties.get(property), name); + } + } + updatePaintBuffers(crossfade) { + this._buffers = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (crossfade && binder instanceof CrossFadedCompositeBinder) { + const patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; + if (patternVertexBuffer) + this._buffers.push(patternVertexBuffer); + } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) { + this._buffers.push(binder.paintVertexBuffer); + } + } + } + upload(context) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + binder.upload(context); + } + this.updatePaintBuffers(); + } + destroy() { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + binder.destroy(); + } + } +} +class ProgramConfigurationSet { + constructor(layers, zoom, filterProperties = () => true) { + this.programConfigurations = {}; + for (const layer of layers) { + this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties); + } + this.needsUpload = false; + this._featureMap = new FeaturePositionMap(); + this._bufferOffset = 0; + } + populatePaintArrays(length, feature, index, imagePositions, canonical, formattedSection) { + for (const key in this.programConfigurations) { + this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, canonical, formattedSection); + } + if (feature.id !== undefined) { + this._featureMap.add(feature.id, index, this._bufferOffset, length); + } + this._bufferOffset = length; + this.needsUpload = true; + } + updatePaintArrays(featureStates, vtLayer, layers, imagePositions) { + for (const layer of layers) { + this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, imagePositions) || this.needsUpload; + } + } + get(layerId) { + return this.programConfigurations[layerId]; + } + upload(context) { + if (!this.needsUpload) + return; + for (const layerId in this.programConfigurations) { + this.programConfigurations[layerId].upload(context); + } + this.needsUpload = false; + } + destroy() { + for (const layerId in this.programConfigurations) { + this.programConfigurations[layerId].destroy(); + } + } +} +function paintAttributeNames(property, type) { + const attributeNameExceptions = { + 'text-opacity': ['opacity'], + 'icon-opacity': ['opacity'], + 'text-color': ['fill_color'], + 'icon-color': ['fill_color'], + 'text-halo-color': ['halo_color'], + 'icon-halo-color': ['halo_color'], + 'text-halo-blur': ['halo_blur'], + 'icon-halo-blur': ['halo_blur'], + 'text-halo-width': ['halo_width'], + 'icon-halo-width': ['halo_width'], + 'line-gap-width': ['gapwidth'], + 'line-pattern': [ + 'pattern_to', + 'pattern_from', + 'pixel_ratio_to', + 'pixel_ratio_from' + ], + 'fill-pattern': [ + 'pattern_to', + 'pattern_from', + 'pixel_ratio_to', + 'pixel_ratio_from' + ], + 'fill-extrusion-pattern': [ + 'pattern_to', + 'pattern_from', + 'pixel_ratio_to', + 'pixel_ratio_from' + ] + }; + return attributeNameExceptions[property] || [property.replace(`${ type }-`, '').replace(/-/g, '_')]; +} +function getLayoutException(property) { + const propertyExceptions = { + 'line-pattern': { + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + }, + 'fill-pattern': { + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + }, + 'fill-extrusion-pattern': { + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + } + }; + return propertyExceptions[property]; +} +function layoutType(property, type, binderType) { + const defaultLayouts = { + 'color': { + 'source': StructArrayLayout2f8, + 'composite': StructArrayLayout4f16 + }, + 'number': { + 'source': StructArrayLayout1f4, + 'composite': StructArrayLayout2f8 + } + }; + const layoutException = getLayoutException(property); + return layoutException && layoutException[binderType] || defaultLayouts[type][binderType]; +} +register('ConstantBinder', ConstantBinder); +register('CrossFadedConstantBinder', CrossFadedConstantBinder); +register('SourceExpressionBinder', SourceExpressionBinder); +register('CrossFadedCompositeBinder', CrossFadedCompositeBinder); +register('CompositeExpressionBinder', CompositeExpressionBinder); +register('ProgramConfiguration', ProgramConfiguration, { omit: ['_buffers'] }); +register('ProgramConfigurationSet', ProgramConfigurationSet); + +const TRANSITION_SUFFIX = '-transition'; +class StyleLayer extends Evented { + constructor(layer, properties) { + super(); + this.id = layer.id; + this.type = layer.type; + this._featureFilter = { + filter: () => true, + needGeometry: false + }; + if (layer.type === 'custom') + return; + layer = layer; + this.metadata = layer.metadata; + this.minzoom = layer.minzoom; + this.maxzoom = layer.maxzoom; + if (layer.type !== 'background' && layer.type !== 'sky') { + this.source = layer.source; + this.sourceLayer = layer['source-layer']; + this.filter = layer.filter; + } + if (properties.layout) { + this._unevaluatedLayout = new Layout(properties.layout); + } + if (properties.paint) { + this._transitionablePaint = new Transitionable(properties.paint); + for (const property in layer.paint) { + this.setPaintProperty(property, layer.paint[property], { validate: false }); + } + for (const property in layer.layout) { + this.setLayoutProperty(property, layer.layout[property], { validate: false }); + } + this._transitioningPaint = this._transitionablePaint.untransitioned(); + this.paint = new PossiblyEvaluated(properties.paint); + } + } + getCrossfadeParameters() { + return this._crossfadeParameters; + } + getLayoutProperty(name) { + if (name === 'visibility') { + return this.visibility; + } + return this._unevaluatedLayout.getValue(name); + } + setLayoutProperty(name, value, options = {}) { + if (value !== null && value !== undefined) { + const key = `layers.${ this.id }.layout.${ name }`; + if (this._validate(validateLayoutProperty$1, key, name, value, options)) { + return; + } + } + if (name === 'visibility') { + this.visibility = value; + return; + } + this._unevaluatedLayout.setValue(name, value); + } + getPaintProperty(name) { + if (endsWith(name, TRANSITION_SUFFIX)) { + return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); + } else { + return this._transitionablePaint.getValue(name); + } + } + setPaintProperty(name, value, options = {}) { + if (value !== null && value !== undefined) { + const key = `layers.${ this.id }.paint.${ name }`; + if (this._validate(validatePaintProperty$1, key, name, value, options)) { + return false; + } + } + if (endsWith(name, TRANSITION_SUFFIX)) { + this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value || undefined); + return false; + } else { + const transitionable = this._transitionablePaint._values[name]; + const isCrossFadedProperty = transitionable.property.specification['property-type'] === 'cross-faded-data-driven'; + const wasDataDriven = transitionable.value.isDataDriven(); + const oldValue = transitionable.value; + this._transitionablePaint.setValue(name, value); + this._handleSpecialPaintPropertyUpdate(name); + const newValue = this._transitionablePaint._values[name].value; + const isDataDriven = newValue.isDataDriven(); + return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue); + } + } + _handleSpecialPaintPropertyUpdate(_) { + } + getProgramIds() { + return null; + } + getProgramConfiguration(_) { + return null; + } + _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) { + return false; + } + isHidden(zoom) { + if (this.minzoom && zoom < this.minzoom) + return true; + if (this.maxzoom && zoom >= this.maxzoom) + return true; + return this.visibility === 'none'; + } + updateTransitions(parameters) { + this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); + } + hasTransition() { + return this._transitioningPaint.hasTransition(); + } + recalculate(parameters, availableImages) { + if (parameters.getCrossfadeParameters) { + this._crossfadeParameters = parameters.getCrossfadeParameters(); + } + if (this._unevaluatedLayout) { + this.layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages); + } + this.paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages); + } + serialize() { + const output = { + 'id': this.id, + 'type': this.type, + 'source': this.source, + 'source-layer': this.sourceLayer, + 'metadata': this.metadata, + 'minzoom': this.minzoom, + 'maxzoom': this.maxzoom, + 'filter': this.filter, + 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(), + 'paint': this._transitionablePaint && this._transitionablePaint.serialize() + }; + if (this.visibility) { + output.layout = output.layout || {}; + output.layout.visibility = this.visibility; + } + return filterObject(output, (value, key) => { + return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length); + }); + } + _validate(validate, key, name, value, options = {}) { + if (options && options.validate === false) { + return false; + } + return emitValidationErrors(this, validate.call(validateStyle, { + key, + layerType: this.type, + objectKey: name, + value, + styleSpec: spec, + style: { + glyphs: true, + sprite: true + } + })); + } + is3D() { + return false; + } + isSky() { + return false; + } + isTileClipped() { + return false; + } + hasOffscreenPass() { + return false; + } + resize() { + } + isStateDependent() { + for (const property in this.paint._values) { + const value = this.paint.get(property); + if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { + continue; + } + if ((value.value.kind === 'source' || value.value.kind === 'composite') && value.value.isStateDependent) { + return true; + } + } + return false; + } +} + +const layout$1 = createLayout([{ + name: 'a_pos', + components: 2, + type: 'Int16' + }], 4); +const {members, size, alignment} = layout$1; + +class SegmentVector { + constructor(segments = []) { + this.segments = segments; + } + prepareSegment(numVertices, layoutVertexArray, indexArray, sortKey) { + let segment = this.segments[this.segments.length - 1]; + if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) + warnOnce(`Max vertices per segment is ${ SegmentVector.MAX_VERTEX_ARRAY_LENGTH }: bucket requested ${ numVertices }`); + if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) { + segment = { + vertexOffset: layoutVertexArray.length, + primitiveOffset: indexArray.length, + vertexLength: 0, + primitiveLength: 0 + }; + if (sortKey !== undefined) + segment.sortKey = sortKey; + this.segments.push(segment); + } + return segment; + } + get() { + return this.segments; + } + destroy() { + for (const segment of this.segments) { + for (const k in segment.vaos) { + segment.vaos[k].destroy(); + } + } + } + static simpleSegment(vertexOffset, primitiveOffset, vertexLength, primitiveLength) { + return new SegmentVector([{ + vertexOffset, + primitiveOffset, + vertexLength, + primitiveLength, + vaos: {}, + sortKey: 0 + }]); + } +} +SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; +register('SegmentVector', SegmentVector); + +var EXTENT$1 = 8192; + +const BITS = 15; +const MAX = Math.pow(2, BITS - 1) - 1; +const MIN = -MAX - 1; +function loadGeometry(feature) { + const scale = EXTENT$1 / feature.extent; + const geometry = feature.loadGeometry(); + for (let r = 0; r < geometry.length; r++) { + const ring = geometry[r]; + for (let p = 0; p < ring.length; p++) { + const point = ring[p]; + const x = Math.round(point.x * scale); + const y = Math.round(point.y * scale); + point.x = clamp(x, MIN, MAX); + point.y = clamp(y, MIN, MAX); + if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) { + warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); + } + } + } + return geometry; +} + +function toEvaluationFeature(feature, needGeometry) { + return { + type: feature.type, + id: feature.id, + properties: feature.properties, + geometry: needGeometry ? loadGeometry(feature) : [] + }; +} + +function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { + layoutVertexArray.emplaceBack(x * 2 + (extrudeX + 1) / 2, y * 2 + (extrudeY + 1) / 2); +} +class CircleBucket { + constructor(options) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.hasPattern = false; + this.layoutVertexArray = new StructArrayLayout2i4(); + this.indexArray = new StructArrayLayout3ui6(); + this.segments = new SegmentVector(); + this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); + this.stateDependentLayerIds = this.layers.filter(l => l.isStateDependent()).map(l => l.id); + } + populate(features, options, canonical) { + const styleLayer = this.layers[0]; + const bucketFeatures = []; + let circleSortKey = null; + if (styleLayer.type === 'circle') { + circleSortKey = styleLayer.layout.get('circle-sort-key'); + } + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = this.layers[0]._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) + continue; + const sortKey = circleSortKey ? circleSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; + const bucketFeature = { + id, + properties: feature.properties, + type: feature.type, + sourceLayerIndex, + index, + geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature), + patterns: {}, + sortKey + }; + bucketFeatures.push(bucketFeature); + } + if (circleSortKey) { + bucketFeatures.sort((a, b) => { + return a.sortKey - b.sortKey; + }); + } + for (const bucketFeature of bucketFeatures) { + const {geometry, index, sourceLayerIndex} = bucketFeature; + const feature = features[index].feature; + this.addFeature(bucketFeature, geometry, index, canonical); + options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); + } + } + update(states, vtLayer, imagePositions) { + if (!this.stateDependentLayers.length) + return; + this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); + } + isEmpty() { + return this.layoutVertexArray.length === 0; + } + uploadPending() { + return !this.uploaded || this.programConfigurations.needsUpload; + } + upload(context) { + if (!this.uploaded) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members); + this.indexBuffer = context.createIndexBuffer(this.indexArray); + } + this.programConfigurations.upload(context); + this.uploaded = true; + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + } + addFeature(feature, geometry, index, canonical) { + for (const ring of geometry) { + for (const point of ring) { + const x = point.x; + const y = point.y; + if (x < 0 || x >= EXTENT$1 || y < 0 || y >= EXTENT$1) + continue; + const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey); + const index = segment.vertexLength; + addCircleVertex(this.layoutVertexArray, x, y, -1, -1); + addCircleVertex(this.layoutVertexArray, x, y, 1, -1); + addCircleVertex(this.layoutVertexArray, x, y, 1, 1); + addCircleVertex(this.layoutVertexArray, x, y, -1, 1); + this.indexArray.emplaceBack(index, index + 1, index + 2); + this.indexArray.emplaceBack(index, index + 3, index + 2); + segment.vertexLength += 4; + segment.primitiveLength += 2; + } + } + this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, canonical); + } +} +register('CircleBucket', CircleBucket, { omit: ['layers'] }); + +function polygonIntersectsPolygon(polygonA, polygonB) { + for (let i = 0; i < polygonA.length; i++) { + if (polygonContainsPoint(polygonB, polygonA[i])) + return true; + } + for (let i = 0; i < polygonB.length; i++) { + if (polygonContainsPoint(polygonA, polygonB[i])) + return true; + } + if (lineIntersectsLine(polygonA, polygonB)) + return true; + return false; +} +function polygonIntersectsBufferedPoint(polygon, point, radius) { + if (polygonContainsPoint(polygon, point)) + return true; + if (pointIntersectsBufferedLine(point, polygon, radius)) + return true; + return false; +} +function polygonIntersectsMultiPolygon(polygon, multiPolygon) { + if (polygon.length === 1) { + return multiPolygonContainsPoint(multiPolygon, polygon[0]); + } + for (let m = 0; m < multiPolygon.length; m++) { + const ring = multiPolygon[m]; + for (let n = 0; n < ring.length; n++) { + if (polygonContainsPoint(polygon, ring[n])) + return true; + } + } + for (let i = 0; i < polygon.length; i++) { + if (multiPolygonContainsPoint(multiPolygon, polygon[i])) + return true; + } + for (let k = 0; k < multiPolygon.length; k++) { + if (lineIntersectsLine(polygon, multiPolygon[k])) + return true; + } + return false; +} +function polygonIntersectsBufferedMultiLine(polygon, multiLine, radius) { + for (let i = 0; i < multiLine.length; i++) { + const line = multiLine[i]; + if (polygon.length >= 3) { + for (let k = 0; k < line.length; k++) { + if (polygonContainsPoint(polygon, line[k])) + return true; + } + } + if (lineIntersectsBufferedLine(polygon, line, radius)) + return true; + } + return false; +} +function lineIntersectsBufferedLine(lineA, lineB, radius) { + if (lineA.length > 1) { + if (lineIntersectsLine(lineA, lineB)) + return true; + for (let j = 0; j < lineB.length; j++) { + if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) + return true; + } + } + for (let k = 0; k < lineA.length; k++) { + if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) + return true; + } + return false; +} +function lineIntersectsLine(lineA, lineB) { + if (lineA.length === 0 || lineB.length === 0) + return false; + for (let i = 0; i < lineA.length - 1; i++) { + const a0 = lineA[i]; + const a1 = lineA[i + 1]; + for (let j = 0; j < lineB.length - 1; j++) { + const b0 = lineB[j]; + const b1 = lineB[j + 1]; + if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) + return true; + } + } + return false; +} +function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) { + return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); +} +function pointIntersectsBufferedLine(p, line, radius) { + const radiusSquared = radius * radius; + if (line.length === 1) + return p.distSqr(line[0]) < radiusSquared; + for (let i = 1; i < line.length; i++) { + const v = line[i - 1], w = line[i]; + if (distToSegmentSquared(p, v, w) < radiusSquared) + return true; + } + return false; +} +function distToSegmentSquared(p, v, w) { + const l2 = v.distSqr(w); + if (l2 === 0) + return p.distSqr(v); + const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; + if (t < 0) + return p.distSqr(v); + if (t > 1) + return p.distSqr(w); + return p.distSqr(w.sub(v)._mult(t)._add(v)); +} +function multiPolygonContainsPoint(rings, p) { + let c = false, ring, p1, p2; + for (let k = 0; k < rings.length; k++) { + ring = rings[k]; + for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + if (p1.y > p.y !== p2.y > p.y && p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x) { + c = !c; + } + } + } + return c; +} +function polygonContainsPoint(ring, p) { + let c = false; + for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) { + const p1 = ring[i]; + const p2 = ring[j]; + if (p1.y > p.y !== p2.y > p.y && p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x) { + c = !c; + } + } + return c; +} +function polygonIntersectsBox(ring, boxX1, boxY1, boxX2, boxY2) { + for (const p of ring) { + if (boxX1 <= p.x && boxY1 <= p.y && boxX2 >= p.x && boxY2 >= p.y) + return true; + } + const corners = [ + new pointGeometry(boxX1, boxY1), + new pointGeometry(boxX1, boxY2), + new pointGeometry(boxX2, boxY2), + new pointGeometry(boxX2, boxY1) + ]; + if (ring.length > 2) { + for (const corner of corners) { + if (polygonContainsPoint(ring, corner)) + return true; + } + } + for (let i = 0; i < ring.length - 1; i++) { + const p1 = ring[i]; + const p2 = ring[i + 1]; + if (edgeIntersectsBox(p1, p2, corners)) + return true; + } + return false; +} +function edgeIntersectsBox(e1, e2, corners) { + const tl = corners[0]; + const br = corners[2]; + if (e1.x < tl.x && e2.x < tl.x || e1.x > br.x && e2.x > br.x || e1.y < tl.y && e2.y < tl.y || e1.y > br.y && e2.y > br.y) + return false; + const dir = isCounterClockwise(e1, e2, corners[0]); + return dir !== isCounterClockwise(e1, e2, corners[1]) || dir !== isCounterClockwise(e1, e2, corners[2]) || dir !== isCounterClockwise(e1, e2, corners[3]); +} + +function getMaximumPaintValue(property, layer, bucket) { + const value = layer.paint.get(property).value; + if (value.kind === 'constant') { + return value.value; + } else { + return bucket.programConfigurations.get(layer.id).getMaxValue(property); + } +} +function translateDistance(translate) { + return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); +} +function translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) { + if (!translate[0] && !translate[1]) { + return queryGeometry; + } + const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); + if (translateAnchor === 'viewport') { + pt._rotate(-bearing); + } + const translated = []; + for (let i = 0; i < queryGeometry.length; i++) { + const point = queryGeometry[i]; + translated.push(point.sub(pt)); + } + return translated; +} +function tilespaceTranslate(translate, translateAnchor, bearing, pixelsToTileUnits) { + const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); + if (translateAnchor === 'viewport') { + pt._rotate(-bearing); + } + return pt; +} + +const layout$2 = new Properties({ 'circle-sort-key': new DataDrivenProperty(spec['layout_circle']['circle-sort-key']) }); +const paint$1 = new Properties({ + 'circle-radius': new DataDrivenProperty(spec['paint_circle']['circle-radius']), + 'circle-color': new DataDrivenProperty(spec['paint_circle']['circle-color']), + 'circle-blur': new DataDrivenProperty(spec['paint_circle']['circle-blur']), + 'circle-opacity': new DataDrivenProperty(spec['paint_circle']['circle-opacity']), + 'circle-translate': new DataConstantProperty(spec['paint_circle']['circle-translate']), + 'circle-translate-anchor': new DataConstantProperty(spec['paint_circle']['circle-translate-anchor']), + 'circle-pitch-scale': new DataConstantProperty(spec['paint_circle']['circle-pitch-scale']), + 'circle-pitch-alignment': new DataConstantProperty(spec['paint_circle']['circle-pitch-alignment']), + 'circle-stroke-width': new DataDrivenProperty(spec['paint_circle']['circle-stroke-width']), + 'circle-stroke-color': new DataDrivenProperty(spec['paint_circle']['circle-stroke-color']), + 'circle-stroke-opacity': new DataDrivenProperty(spec['paint_circle']['circle-stroke-opacity']) +}); +var properties = { + paint: paint$1, + layout: layout$2 +}; + +var EPSILON = 0.000001; +var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; +if (!Math.hypot) + Math.hypot = function () { + var y = 0, i = arguments.length; + while (i--) { + y += arguments[i] * arguments[i]; + } + return Math.sqrt(y); + }; + +function create() { + var out = new ARRAY_TYPE(4); + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + } + out[0] = 1; + out[3] = 1; + return out; +} +function rotate(out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; + var s = Math.sin(rad); + var c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + return out; +} + +function create$1() { + var out = new ARRAY_TYPE(9); + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + } + out[0] = 1; + out[4] = 1; + out[8] = 1; + return out; +} +function fromMat4(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; +} +function fromRotation(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = -s; + out[4] = c; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +} + +function create$2() { + var out = new ARRAY_TYPE(16); + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + } + out[0] = 1; + out[5] = 1; + out[10] = 1; + out[15] = 1; + return out; +} +function clone$1(a) { + var out = new ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} +function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +function invert(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; + var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; + var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (!det) { + return null; + } + det = 1 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; +} +function multiply(out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; + var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; + var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; + var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; +} +function translate$1(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a03; + out[4] = a10; + out[5] = a11; + out[6] = a12; + out[7] = a13; + out[8] = a20; + out[9] = a21; + out[10] = a22; + out[11] = a23; + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + return out; +} +function scale(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} +function rotateX(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + if (a !== out) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; +} +function rotateY(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + if (a !== out) { + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; +} +function rotateZ(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + if (a !== out) { + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; +} +function fromQuat(out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +function perspective(out, fovy, aspect, near, far) { + var f = 1 / Math.tan(fovy / 2), nf; + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = (far + near) * nf; + out[14] = 2 * far * near * nf; + } else { + out[10] = -1; + out[14] = -2 * near; + } + return out; +} +function ortho(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; +} +var mul = multiply; + +function create$3() { + var out = new ARRAY_TYPE(3); + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + return out; +} +function clone$2(a) { + var out = new ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +} +function length(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return Math.hypot(x, y, z); +} +function fromValues(x, y, z) { + var out = new ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; +} +function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +} +function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; +} +function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; +} +function multiply$1(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; +} +function divide(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; +} +function scale$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; +} +function scaleAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + return out; +} +function normalize(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var len = x * x + y * y + z * z; + if (len > 0) { + len = 1 / Math.sqrt(len); + } + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + return out; +} +function dot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} +function cross(out, a, b) { + var ax = a[0], ay = a[1], az = a[2]; + var bx = b[0], by = b[1], bz = b[2]; + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; +} +function transformMat4(out, a, m) { + var x = a[0], y = a[1], z = a[2]; + var w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; +} +function transformMat3(out, a, m) { + var x = a[0], y = a[1], z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; +} +function transformQuat(out, a, q) { + var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; + var x = a[0], y = a[1], z = a[2]; + var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; + var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; + var w2 = qw * 2; + uvx *= w2; + uvy *= w2; + uvz *= w2; + uuvx *= 2; + uuvy *= 2; + uuvz *= 2; + out[0] = x + uvx + uuvx; + out[1] = y + uvy + uuvy; + out[2] = z + uvz + uuvz; + return out; +} +function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; +} +var sub = subtract; +var mul$1 = multiply$1; +var div = divide; +var len = length; +var forEach = function () { + var vec = create$3(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + if (!stride) { + stride = 3; + } + if (!offset) { + offset = 0; + } + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + } + return a; + }; +}(); + +function create$4() { + var out = new ARRAY_TYPE(4); + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } + return out; +} +function multiply$2(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; +} +function scale$2(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; +} +function length$1(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return Math.hypot(x, y, z, w); +} +function normalize$1(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + var len = x * x + y * y + z * z + w * w; + if (len > 0) { + len = 1 / Math.sqrt(len); + } + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + return out; +} +function dot$1(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +} +function transformMat4$1(out, a, m) { + var x = a[0], y = a[1], z = a[2], w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; +} +function exactEquals$1(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; +} +var mul$2 = multiply$2; +var forEach$1 = function () { + var vec = create$4(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + if (!stride) { + stride = 4; + } + if (!offset) { + offset = 0; + } + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + vec[3] = a[i + 3]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + a[i + 3] = vec[3]; + } + return a; + }; +}(); + +function create$5() { + var out = new ARRAY_TYPE(4); + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + out[3] = 1; + return out; +} +function identity$1(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +} +function setAxisAngle(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; +} +function rotateX$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], ay = a[1], az = a[2], aw = a[3]; + var bx = Math.sin(rad), bw = Math.cos(rad); + out[0] = ax * bw + aw * bx; + out[1] = ay * bw + az * bx; + out[2] = az * bw - ay * bx; + out[3] = aw * bw - ax * bx; + return out; +} +function rotateY$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], ay = a[1], az = a[2], aw = a[3]; + var by = Math.sin(rad), bw = Math.cos(rad); + out[0] = ax * bw - az * by; + out[1] = ay * bw + aw * by; + out[2] = az * bw + ax * by; + out[3] = aw * bw - ay * by; + return out; +} +function rotateZ$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], ay = a[1], az = a[2], aw = a[3]; + var bz = Math.sin(rad), bw = Math.cos(rad); + out[0] = ax * bw + ay * bz; + out[1] = ay * bw - ax * bz; + out[2] = az * bw + aw * bz; + out[3] = aw * bw - az * bz; + return out; +} +function slerp(out, a, b, t) { + var ax = a[0], ay = a[1], az = a[2], aw = a[3]; + var bx = b[0], by = b[1], bz = b[2], bw = b[3]; + var omega, cosom, sinom, scale0, scale1; + cosom = ax * bx + ay * by + az * bz + aw * bw; + if (cosom < 0) { + cosom = -cosom; + bx = -bx; + by = -by; + bz = -bz; + bw = -bw; + } + if (1 - cosom > EPSILON) { + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + scale0 = 1 - t; + scale1 = t; + } + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + return out; +} +function conjugate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + return out; +} +function fromMat3(out, m) { + var fTrace = m[0] + m[4] + m[8]; + var fRoot; + if (fTrace > 0) { + fRoot = Math.sqrt(fTrace + 1); + out[3] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[0] = (m[5] - m[7]) * fRoot; + out[1] = (m[6] - m[2]) * fRoot; + out[2] = (m[1] - m[3]) * fRoot; + } else { + var i = 0; + if (m[4] > m[0]) + i = 1; + if (m[8] > m[i * 3 + i]) + i = 2; + var j = (i + 1) % 3; + var k = (i + 2) % 3; + fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; + out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; + out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; + } + return out; +} +var length$2 = length$1; +var normalize$2 = normalize$1; +var exactEquals$2 = exactEquals$1; +var rotationTo = function () { + var tmpvec3 = create$3(); + var xUnitVec3 = fromValues(1, 0, 0); + var yUnitVec3 = fromValues(0, 1, 0); + return function (out, a, b) { + var dot$1 = dot(a, b); + if (dot$1 < -0.999999) { + cross(tmpvec3, xUnitVec3, a); + if (len(tmpvec3) < 0.000001) + cross(tmpvec3, yUnitVec3, a); + normalize(tmpvec3, tmpvec3); + setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot$1 > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + cross(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot$1; + return normalize$2(out, out); + } + }; +}(); +var sqlerp = function () { + var temp1 = create$5(); + var temp2 = create$5(); + return function (out, a, b, c, d, t) { + slerp(temp1, a, d, t); + slerp(temp2, b, c, t); + slerp(out, temp1, temp2, 2 * t * (1 - t)); + return out; + }; +}(); +var setAxes = function () { + var matr = create$1(); + return function (out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + return normalize$2(out, fromMat3(out, matr)); + }; +}(); + +class Ray { + constructor(pos_, dir_) { + this.pos = pos_; + this.dir = dir_; + } + intersectsPlane(pt, normal, out) { + const D = dot(normal, this.dir); + if (Math.abs(D) < 0.000001) { + return false; + } + const t = dot(sub(create$3(), pt, this.pos), normal) / D; + const intersection = scaleAndAdd(create$3(), this.pos, this.dir, t); + copy(out, intersection); + return true; + } +} +class Frustum { + constructor(points_, planes_) { + this.points = points_; + this.planes = planes_; + } + static fromInvProjectionMatrix(invProj, worldSize, zoom) { + const clipSpaceCorners = [ + [ + -1, + 1, + -1, + 1 + ], + [ + 1, + 1, + -1, + 1 + ], + [ + 1, + -1, + -1, + 1 + ], + [ + -1, + -1, + -1, + 1 + ], + [ + -1, + 1, + 1, + 1 + ], + [ + 1, + 1, + 1, + 1 + ], + [ + 1, + -1, + 1, + 1 + ], + [ + -1, + -1, + 1, + 1 + ] + ]; + const scale = Math.pow(2, zoom); + const frustumCoords = clipSpaceCorners.map(v => { + const s = transformMat4$1([], v, invProj); + const k = 1 / s[3] / worldSize * scale; + return mul$2(s, s, [ + k, + k, + 1 / s[3], + k + ]); + }); + const frustumPlanePointIndices = [ + [ + 0, + 1, + 2 + ], + [ + 6, + 5, + 4 + ], + [ + 0, + 3, + 7 + ], + [ + 2, + 1, + 5 + ], + [ + 3, + 2, + 6 + ], + [ + 0, + 4, + 5 + ] + ]; + const frustumPlanes = frustumPlanePointIndices.map(p => { + const a = sub([], frustumCoords[p[0]], frustumCoords[p[1]]); + const b = sub([], frustumCoords[p[2]], frustumCoords[p[1]]); + const n = normalize([], cross([], a, b)); + const d = -dot(n, frustumCoords[p[1]]); + return n.concat(d); + }); + return new Frustum(frustumCoords, frustumPlanes); + } +} +class Aabb { + constructor(min_, max_) { + this.min = min_; + this.max = max_; + this.center = scale$1([], add([], this.min, this.max), 0.5); + } + quadrant(index) { + const split = [ + index % 2 === 0, + index < 2 + ]; + const qMin = clone$2(this.min); + const qMax = clone$2(this.max); + for (let axis = 0; axis < split.length; axis++) { + qMin[axis] = split[axis] ? this.min[axis] : this.center[axis]; + qMax[axis] = split[axis] ? this.center[axis] : this.max[axis]; + } + qMax[2] = this.max[2]; + return new Aabb(qMin, qMax); + } + distanceX(point) { + const pointOnAabb = Math.max(Math.min(this.max[0], point[0]), this.min[0]); + return pointOnAabb - point[0]; + } + distanceY(point) { + const pointOnAabb = Math.max(Math.min(this.max[1], point[1]), this.min[1]); + return pointOnAabb - point[1]; + } + distanceZ(point) { + const pointOnAabb = Math.max(Math.min(this.max[2], point[2]), this.min[2]); + return pointOnAabb - point[2]; + } + intersects(frustum) { + const aabbPoints = [ + [ + this.min[0], + this.min[1], + this.min[2], + 1 + ], + [ + this.max[0], + this.min[1], + this.min[2], + 1 + ], + [ + this.max[0], + this.max[1], + this.min[2], + 1 + ], + [ + this.min[0], + this.max[1], + this.min[2], + 1 + ], + [ + this.min[0], + this.min[1], + this.max[2], + 1 + ], + [ + this.max[0], + this.min[1], + this.max[2], + 1 + ], + [ + this.max[0], + this.max[1], + this.max[2], + 1 + ], + [ + this.min[0], + this.max[1], + this.max[2], + 1 + ] + ]; + let fullyInside = true; + for (let p = 0; p < frustum.planes.length; p++) { + const plane = frustum.planes[p]; + let pointsInside = 0; + for (let i = 0; i < aabbPoints.length; i++) { + pointsInside += dot$1(plane, aabbPoints[i]) >= 0; + } + if (pointsInside === 0) + return 0; + if (pointsInside !== aabbPoints.length) + fullyInside = false; + } + if (fullyInside) + return 2; + for (let axis = 0; axis < 3; axis++) { + let projMin = Number.MAX_VALUE; + let projMax = -Number.MAX_VALUE; + for (let p = 0; p < frustum.points.length; p++) { + const projectedPoint = frustum.points[p][axis] - this.min[axis]; + projMin = Math.min(projMin, projectedPoint); + projMax = Math.max(projMax, projectedPoint); + } + if (projMax < 0 || projMin > this.max[axis] - this.min[axis]) + return 0; + } + return 1; + } +} + +class CircleStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties); + } + createBucket(parameters) { + return new CircleBucket(parameters); + } + queryRadius(bucket) { + const circleBucket = bucket; + return getMaximumPaintValue('circle-radius', this, circleBucket) + getMaximumPaintValue('circle-stroke-width', this, circleBucket) + translateDistance(this.paint.get('circle-translate')); + } + queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelPosMatrix, elevationHelper) { + const alignWithMap = this.paint.get('circle-pitch-alignment') === 'map'; + if (alignWithMap && queryGeometry.queryGeometry.isAboveHorizon) + return false; + const translation = tilespaceTranslate(this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); + const radius = this.paint.get('circle-radius').evaluate(feature, featureState); + const stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState); + const size = radius + stroke; + const transformedSize = alignWithMap ? size * queryGeometry.pixelToTileUnitsFactor : size; + for (const ring of geometry) { + for (const point of ring) { + const translatedPoint = point.add(translation); + const z = elevationHelper && transform.elevation ? transform.elevation.exaggeration() * elevationHelper.getElevationAt(translatedPoint.x, translatedPoint.y, true) : 0; + const transformedPoint = alignWithMap ? translatedPoint : projectPoint(translatedPoint, z, pixelPosMatrix); + const transformedPolygon = alignWithMap ? queryGeometry.tilespaceRays.map(r => intersectAtHeight(r, z)) : queryGeometry.queryGeometry.screenGeometry; + let adjustedSize = transformedSize; + const projectedCenter = transformMat4$1([], [ + point.x, + point.y, + z, + 1 + ], pixelPosMatrix); + if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') { + adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance; + } else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') { + adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3]; + } + if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize)) + return true; + } + } + return false; + } + getProgramIds() { + return ['circle']; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } +} +function projectPoint(p, z, pixelPosMatrix) { + const point = transformMat4$1([], [ + p.x, + p.y, + z, + 1 + ], pixelPosMatrix); + return new pointGeometry(point[0] / point[3], point[1] / point[3]); +} +const origin = fromValues(0, 0, 0); +const up = fromValues(0, 0, 1); +function intersectAtHeight(r, z) { + const intersectionPt = create$3(); + origin[2] = z; + const intersects = r.intersectsPlane(origin, up, intersectionPt); + return new pointGeometry(intersectionPt[0], intersectionPt[1]); +} + +class HeatmapBucket extends CircleBucket { +} +register('HeatmapBucket', HeatmapBucket, { omit: ['layers'] }); + +function createImage(image, {width, height}, channels, data) { + if (!data) { + data = new Uint8Array(width * height * channels); + } else if (data instanceof Uint8ClampedArray) { + data = new Uint8Array(data.buffer); + } else if (data.length !== width * height * channels) { + throw new RangeError('mismatched image size'); + } + image.width = width; + image.height = height; + image.data = data; + return image; +} +function resizeImage(image, {width, height}, channels) { + if (width === image.width && height === image.height) { + return; + } + const newImage = createImage({}, { + width, + height + }, channels); + copyImage(image, newImage, { + x: 0, + y: 0 + }, { + x: 0, + y: 0 + }, { + width: Math.min(image.width, width), + height: Math.min(image.height, height) + }, channels); + image.width = width; + image.height = height; + image.data = newImage.data; +} +function copyImage(srcImg, dstImg, srcPt, dstPt, size, channels) { + if (size.width === 0 || size.height === 0) { + return dstImg; + } + if (size.width > srcImg.width || size.height > srcImg.height || srcPt.x > srcImg.width - size.width || srcPt.y > srcImg.height - size.height) { + throw new RangeError('out of range source coordinates for image copy'); + } + if (size.width > dstImg.width || size.height > dstImg.height || dstPt.x > dstImg.width - size.width || dstPt.y > dstImg.height - size.height) { + throw new RangeError('out of range destination coordinates for image copy'); + } + const srcData = srcImg.data; + const dstData = dstImg.data; + for (let y = 0; y < size.height; y++) { + const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels; + const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels; + for (let i = 0; i < size.width * channels; i++) { + dstData[dstOffset + i] = srcData[srcOffset + i]; + } + } + return dstImg; +} +class AlphaImage { + constructor(size, data) { + createImage(this, size, 1, data); + } + resize(size) { + resizeImage(this, size, 1); + } + clone() { + return new AlphaImage({ + width: this.width, + height: this.height + }, new Uint8Array(this.data)); + } + static copy(srcImg, dstImg, srcPt, dstPt, size) { + copyImage(srcImg, dstImg, srcPt, dstPt, size, 1); + } +} +class RGBAImage { + constructor(size, data) { + createImage(this, size, 4, data); + } + resize(size) { + resizeImage(this, size, 4); + } + replace(data, copy) { + if (copy) { + this.data.set(data); + } else if (data instanceof Uint8ClampedArray) { + this.data = new Uint8Array(data.buffer); + } else { + this.data = data; + } + } + clone() { + return new RGBAImage({ + width: this.width, + height: this.height + }, new Uint8Array(this.data)); + } + static copy(srcImg, dstImg, srcPt, dstPt, size) { + copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); + } +} +register('AlphaImage', AlphaImage); +register('RGBAImage', RGBAImage); + +const paint$2 = new Properties({ + 'heatmap-radius': new DataDrivenProperty(spec['paint_heatmap']['heatmap-radius']), + 'heatmap-weight': new DataDrivenProperty(spec['paint_heatmap']['heatmap-weight']), + 'heatmap-intensity': new DataConstantProperty(spec['paint_heatmap']['heatmap-intensity']), + 'heatmap-color': new ColorRampProperty(spec['paint_heatmap']['heatmap-color']), + 'heatmap-opacity': new DataConstantProperty(spec['paint_heatmap']['heatmap-opacity']) +}); +var properties$1 = { paint: paint$2 }; + +function renderColorRamp(params) { + const evaluationGlobals = {}; + const width = params.resolution || 256; + const height = params.clips ? params.clips.length : 1; + const image = params.image || new RGBAImage({ + width, + height + }); + const renderPixel = (stride, index, progress) => { + evaluationGlobals[params.evaluationKey] = progress; + const pxColor = params.expression.evaluate(evaluationGlobals); + image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a); + image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a); + image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a); + image.data[stride + index + 3] = Math.floor(pxColor.a * 255); + }; + if (!params.clips) { + for (let i = 0, j = 0; i < width; i++, j += 4) { + const progress = i / (width - 1); + renderPixel(0, j, progress); + } + } else { + for (let clip = 0, stride = 0; clip < height; ++clip, stride += width * 4) { + for (let i = 0, j = 0; i < width; i++, j += 4) { + const progress = i / (width - 1); + const {start, end} = params.clips[clip]; + const evaluationProgress = start * (1 - progress) + end * progress; + renderPixel(stride, j, evaluationProgress); + } + } + } + return image; +} + +class HeatmapStyleLayer extends StyleLayer { + createBucket(options) { + return new HeatmapBucket(options); + } + constructor(layer) { + super(layer, properties$1); + this._updateColorRamp(); + } + _handleSpecialPaintPropertyUpdate(name) { + if (name === 'heatmap-color') { + this._updateColorRamp(); + } + } + _updateColorRamp() { + const expression = this._transitionablePaint._values['heatmap-color'].value.expression; + this.colorRamp = renderColorRamp({ + expression, + evaluationKey: 'heatmapDensity', + image: this.colorRamp + }); + this.colorRampTexture = null; + } + resize() { + if (this.heatmapFbo) { + this.heatmapFbo.destroy(); + this.heatmapFbo = null; + } + } + queryRadius() { + return 0; + } + queryIntersectsFeature() { + return false; + } + hasOffscreenPass() { + return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; + } + getProgramIds() { + return [ + 'heatmap', + 'heatmapTexture' + ]; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } +} + +const paint$3 = new Properties({ + 'hillshade-illumination-direction': new DataConstantProperty(spec['paint_hillshade']['hillshade-illumination-direction']), + 'hillshade-illumination-anchor': new DataConstantProperty(spec['paint_hillshade']['hillshade-illumination-anchor']), + 'hillshade-exaggeration': new DataConstantProperty(spec['paint_hillshade']['hillshade-exaggeration']), + 'hillshade-shadow-color': new DataConstantProperty(spec['paint_hillshade']['hillshade-shadow-color']), + 'hillshade-highlight-color': new DataConstantProperty(spec['paint_hillshade']['hillshade-highlight-color']), + 'hillshade-accent-color': new DataConstantProperty(spec['paint_hillshade']['hillshade-accent-color']) +}); +var properties$2 = { paint: paint$3 }; + +class HillshadeStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$2); + } + hasOffscreenPass() { + return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; + } + getProgramIds() { + return [ + 'hillshade', + 'hillshadePrepare' + ]; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } +} + +const layout$3 = createLayout([{ + name: 'a_pos', + components: 2, + type: 'Int16' + }], 4); +const {members: members$1, size: size$1, alignment: alignment$1} = layout$3; + +var earcut_1 = earcut; +var default_1 = earcut; +function earcut(data, holeIndices, dim) { + dim = dim || 2; + var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = []; + if (!outerNode || outerNode.next === outerNode.prev) + return triangles; + var minX, minY, maxX, maxY, x, y, invSize; + if (hasHoles) + outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; + for (var i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) + minX = x; + if (y < minY) + minY = y; + if (x > maxX) + maxX = x; + if (y > maxY) + maxY = y; + } + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 1 / invSize : 0; + } + earcutLinked(outerNode, triangles, dim, minX, minY, invSize); + return triangles; +} +function linkedList(data, start, end, dim, clockwise) { + var i, last; + if (clockwise === signedArea(data, start, end, dim) > 0) { + for (i = start; i < end; i += dim) + last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) + last = insertNode(i, data[i], data[i + 1], last); + } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + return last; +} +function filterPoints(start, end) { + if (!start) + return start; + if (!end) + end = start; + var p = start, again; + do { + again = false; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) + break; + again = true; + } else { + p = p.next; + } + } while (again || p !== end); + return end; +} +function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) + return; + if (!pass && invSize) + indexCurve(ear, minX, minY, invSize); + var stop = ear, prev, next; + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + triangles.push(prev.i / dim); + triangles.push(ear.i / dim); + triangles.push(next.i / dim); + removeNode(ear); + ear = next.next; + stop = next.next; + continue; + } + ear = next; + if (ear === stop) { + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + } else if (pass === 1) { + ear = cureLocalIntersections(filterPoints(ear), triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize); + } + break; + } + } +} +function isEar(ear) { + var a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) + return false; + var p = ear.next.next; + while (p !== ear.prev) { + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) + return false; + p = p.next; + } + return true; +} +function isEarHashed(ear, minX, minY, invSize) { + var a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) + return false; + var minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x, minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y, maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x, maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y; + var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); + var p = ear.prevZ, n = ear.nextZ; + while (p && p.z >= minZ && n && n.z <= maxZ) { + if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) + return false; + p = p.prevZ; + if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) + return false; + n = n.nextZ; + } + while (p && p.z >= minZ) { + if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) + return false; + p = p.prevZ; + } + while (n && n.z <= maxZ) { + if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) + return false; + n = n.nextZ; + } + return true; +} +function cureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, b = p.next.next; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + triangles.push(a.i / dim); + triangles.push(p.i / dim); + triangles.push(b.i / dim); + removeNode(p); + removeNode(p.next); + p = start = b; + } + p = p.next; + } while (p !== start); + return filterPoints(p); +} +function splitEarcut(start, triangles, dim, minX, minY, invSize) { + var a = start; + do { + var b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + var c = splitPolygon(a, b); + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + earcutLinked(a, triangles, dim, minX, minY, invSize); + earcutLinked(c, triangles, dim, minX, minY, invSize); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} +function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], i, len, start, end, list; + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) + list.steiner = true; + queue.push(getLeftmost(list)); + } + queue.sort(compareX); + for (i = 0; i < queue.length; i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode.next); + } + return outerNode; +} +function compareX(a, b) { + return a.x - b.x; +} +function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + var b = splitPolygon(outerNode, hole); + filterPoints(outerNode, outerNode.next); + filterPoints(b, b.next); + } +} +function findHoleBridge(hole, outerNode) { + var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m; + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + if (x === hx) { + if (hy === p.y) + return p; + if (hy === p.next.y) + return p.next; + } + m = p.x < p.next.x ? p : p.next; + } + } + p = p.next; + } while (p !== outerNode); + if (!m) + return null; + if (hx === qx) + return m; + var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan; + p = m; + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + tan = Math.abs(hy - p.y) / (hx - p.x); + if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { + m = p; + tanMin = tan; + } + } + p = p.next; + } while (p !== stop); + return m; +} +function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; +} +function indexCurve(start, minX, minY, invSize) { + var p = start; + do { + if (p.z === null) + p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + p.prevZ.nextZ = null; + p.prevZ = null; + sortLinked(p); +} +function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + do { + p = list; + list = null; + tail = null; + numMerges = 0; + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) + break; + } + qSize = inSize; + while (pSize > 0 || qSize > 0 && q) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + if (tail) + tail.nextZ = e; + else + list = e; + e.prevZ = tail; + tail = e; + } + p = q; + } + tail.nextZ = null; + inSize *= 2; + } while (numMerges > 1); + return list; +} +function zOrder(x, y, minX, minY, invSize) { + x = 32767 * (x - minX) * invSize; + y = 32767 * (y - minY) * invSize; + x = (x | x << 8) & 16711935; + x = (x | x << 4) & 252645135; + x = (x | x << 2) & 858993459; + x = (x | x << 1) & 1431655765; + y = (y | y << 8) & 16711935; + y = (y | y << 4) & 252645135; + y = (y | y << 2) & 858993459; + y = (y | y << 1) & 1431655765; + return x | y << 1; +} +function getLeftmost(start) { + var p = start, leftmost = start; + do { + if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) + leftmost = p; + p = p.next; + } while (p !== start); + return leftmost; +} +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; +} +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); +} +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} +function intersects(p1, q1, p2, q2) { + var o1 = sign(area(p1, q1, p2)); + var o2 = sign(area(p1, q1, q2)); + var o3 = sign(area(p2, q2, p1)); + var o4 = sign(area(p2, q2, q1)); + if (o1 !== o2 && o3 !== o4) + return true; + if (o1 === 0 && onSegment(p1, p2, q1)) + return true; + if (o2 === 0 && onSegment(p1, q2, q1)) + return true; + if (o3 === 0 && onSegment(p2, p1, q2)) + return true; + if (o4 === 0 && onSegment(p2, q1, q2)) + return true; + return false; +} +function onSegment(p, q, r) { + return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); +} +function sign(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; +} +function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) + return true; + p = p.next; + } while (p !== a); + return false; +} +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} +function middleInside(a, b) { + var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; + do { + if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) + inside = !inside; + p = p.next; + } while (p !== a); + return inside; +} +function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; + a.next = b; + b.prev = a; + a2.next = an; + an.prev = a2; + b2.next = a2; + a2.prev = b2; + bp.next = b2; + b2.prev = bp; + return b2; +} +function insertNode(i, x, y, last) { + var p = new Node(i, x, y); + if (!last) { + p.prev = p; + p.next = p; + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + if (p.prevZ) + p.prevZ.nextZ = p.nextZ; + if (p.nextZ) + p.nextZ.prevZ = p.prevZ; +} +function Node(i, x, y) { + this.i = i; + this.x = x; + this.y = y; + this.prev = null; + this.next = null; + this.z = null; + this.prevZ = null; + this.nextZ = null; + this.steiner = false; +} +earcut.deviation = function (data, holeIndices, dim, triangles) { + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; + var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); + if (hasHoles) { + for (var i = 0, len = holeIndices.length; i < len; i++) { + var start = holeIndices[i] * dim; + var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + polygonArea -= Math.abs(signedArea(data, start, end, dim)); + } + } + var trianglesArea = 0; + for (i = 0; i < triangles.length; i += 3) { + var a = triangles[i] * dim; + var b = triangles[i + 1] * dim; + var c = triangles[i + 2] * dim; + trianglesArea += Math.abs((data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); + } + return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); +}; +function signedArea(data, start, end, dim) { + var sum = 0; + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} +earcut.flatten = function (data) { + var dim = data[0][0].length, result = { + vertices: [], + holes: [], + dimensions: dim + }, holeIndex = 0; + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + for (var d = 0; d < dim; d++) + result.vertices.push(data[i][j][d]); + } + if (i > 0) { + holeIndex += data[i - 1].length; + result.holes.push(holeIndex); + } + } + return result; +}; +earcut_1.default = default_1; + +function quickselect(arr, k, left, right, compare) { + quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare); +} +function quickselectStep(arr, k, left, right, compare) { + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselectStep(arr, k, newLeft, newRight, compare); + } + var t = arr[k]; + var i = left; + var j = right; + swap$1(arr, left, k); + if (compare(arr[right], t) > 0) + swap$1(arr, left, right); + while (i < j) { + swap$1(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) + i++; + while (compare(arr[j], t) > 0) + j--; + } + if (compare(arr[left], t) === 0) + swap$1(arr, left, j); + else { + j++; + swap$1(arr, j, right); + } + if (j <= k) + left = j + 1; + if (k <= j) + right = j - 1; + } +} +function swap$1(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +function classifyRings(rings, maxRings) { + const len = rings.length; + if (len <= 1) + return [rings]; + const polygons = []; + let polygon, ccw; + for (let i = 0; i < len; i++) { + const area = calculateSignedArea(rings[i]); + if (area === 0) + continue; + rings[i].area = Math.abs(area); + 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); + if (maxRings > 1) { + for (let j = 0; j < polygons.length; j++) { + if (polygons[j].length <= maxRings) + continue; + quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); + polygons[j] = polygons[j].slice(0, maxRings); + } + } + return polygons; +} +function compareAreas(a, b) { + return b.area - a.area; +} + +function hasPattern(type, layers, options) { + const patterns = options.patternDependencies; + let hasPattern = false; + for (const layer of layers) { + const patternProperty = layer.paint.get(`${ type }-pattern`); + if (!patternProperty.isConstant()) { + hasPattern = true; + } + const constantPattern = patternProperty.constantOr(null); + if (constantPattern) { + hasPattern = true; + patterns[constantPattern.to] = true; + patterns[constantPattern.from] = true; + } + } + return hasPattern; +} +function addPatternDependencies(type, layers, patternFeature, zoom, options) { + const patterns = options.patternDependencies; + for (const layer of layers) { + const patternProperty = layer.paint.get(`${ type }-pattern`); + const patternPropertyValue = patternProperty.value; + if (patternPropertyValue.kind !== 'constant') { + let min = patternPropertyValue.evaluate({ zoom: zoom - 1 }, patternFeature, {}, options.availableImages); + let mid = patternPropertyValue.evaluate({ zoom }, patternFeature, {}, options.availableImages); + let max = patternPropertyValue.evaluate({ zoom: zoom + 1 }, patternFeature, {}, options.availableImages); + min = min && min.name ? min.name : min; + mid = mid && mid.name ? mid.name : mid; + max = max && max.name ? max.name : max; + patterns[min] = true; + patterns[mid] = true; + patterns[max] = true; + patternFeature.patterns[layer.id] = { + min, + mid, + max + }; + } + } + return patternFeature; +} + +const EARCUT_MAX_RINGS = 500; +class FillBucket { + constructor(options) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.hasPattern = false; + this.patternFeatures = []; + this.layoutVertexArray = new StructArrayLayout2i4(); + this.indexArray = new StructArrayLayout3ui6(); + this.indexArray2 = new StructArrayLayout2ui4(); + this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); + this.segments = new SegmentVector(); + this.segments2 = new SegmentVector(); + this.stateDependentLayerIds = this.layers.filter(l => l.isStateDependent()).map(l => l.id); + } + populate(features, options, canonical) { + this.hasPattern = hasPattern('fill', this.layers, options); + const fillSortKey = this.layers[0].layout.get('fill-sort-key'); + const bucketFeatures = []; + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = this.layers[0]._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) + continue; + const sortKey = fillSortKey ? fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) : undefined; + const bucketFeature = { + id, + properties: feature.properties, + type: feature.type, + sourceLayerIndex, + index, + geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature), + patterns: {}, + sortKey + }; + bucketFeatures.push(bucketFeature); + } + if (fillSortKey) { + bucketFeatures.sort((a, b) => { + return a.sortKey - b.sortKey; + }); + } + for (const bucketFeature of bucketFeatures) { + const {geometry, index, sourceLayerIndex} = bucketFeature; + if (this.hasPattern) { + const patternFeature = addPatternDependencies('fill', this.layers, bucketFeature, this.zoom, options); + this.patternFeatures.push(patternFeature); + } else { + this.addFeature(bucketFeature, geometry, index, canonical, {}); + } + const feature = features[index].feature; + options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); + } + } + update(states, vtLayer, imagePositions) { + if (!this.stateDependentLayers.length) + return; + this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); + } + addFeatures(options, canonical, imagePositions) { + for (const feature of this.patternFeatures) { + this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions); + } + } + isEmpty() { + return this.layoutVertexArray.length === 0; + } + uploadPending() { + return !this.uploaded || this.programConfigurations.needsUpload; + } + upload(context) { + if (!this.uploaded) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1); + this.indexBuffer = context.createIndexBuffer(this.indexArray); + this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); + } + this.programConfigurations.upload(context); + this.uploaded = true; + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.indexBuffer2.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + this.segments2.destroy(); + } + addFeature(feature, geometry, index, canonical, imagePositions) { + for (const polygon of classifyRings(geometry, EARCUT_MAX_RINGS)) { + let numVertices = 0; + for (const ring of polygon) { + numVertices += ring.length; + } + const triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); + const triangleIndex = triangleSegment.vertexLength; + const flattened = []; + const holeIndices = []; + for (const ring of polygon) { + if (ring.length === 0) { + continue; + } + if (ring !== polygon[0]) { + holeIndices.push(flattened.length / 2); + } + const lineSegment = this.segments2.prepareSegment(ring.length, this.layoutVertexArray, this.indexArray2); + const lineIndex = lineSegment.vertexLength; + this.layoutVertexArray.emplaceBack(ring[0].x, ring[0].y); + this.indexArray2.emplaceBack(lineIndex + ring.length - 1, lineIndex); + flattened.push(ring[0].x); + flattened.push(ring[0].y); + for (let i = 1; i < ring.length; i++) { + this.layoutVertexArray.emplaceBack(ring[i].x, ring[i].y); + this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); + flattened.push(ring[i].x); + flattened.push(ring[i].y); + } + lineSegment.vertexLength += ring.length; + lineSegment.primitiveLength += ring.length; + } + const indices = earcut_1(flattened, holeIndices); + for (let i = 0; i < indices.length; i += 3) { + this.indexArray.emplaceBack(triangleIndex + indices[i], triangleIndex + indices[i + 1], triangleIndex + indices[i + 2]); + } + triangleSegment.vertexLength += numVertices; + triangleSegment.primitiveLength += indices.length / 3; + } + this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); + } +} +register('FillBucket', FillBucket, { + omit: [ + 'layers', + 'patternFeatures' + ] +}); + +const layout$4 = new Properties({ 'fill-sort-key': new DataDrivenProperty(spec['layout_fill']['fill-sort-key']) }); +const paint$4 = new Properties({ + 'fill-antialias': new DataConstantProperty(spec['paint_fill']['fill-antialias']), + 'fill-opacity': new DataDrivenProperty(spec['paint_fill']['fill-opacity']), + 'fill-color': new DataDrivenProperty(spec['paint_fill']['fill-color']), + 'fill-outline-color': new DataDrivenProperty(spec['paint_fill']['fill-outline-color']), + 'fill-translate': new DataConstantProperty(spec['paint_fill']['fill-translate']), + 'fill-translate-anchor': new DataConstantProperty(spec['paint_fill']['fill-translate-anchor']), + 'fill-pattern': new CrossFadedDataDrivenProperty(spec['paint_fill']['fill-pattern']) +}); +var properties$3 = { + paint: paint$4, + layout: layout$4 +}; + +class FillStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$3); + } + getProgramIds() { + const pattern = this.paint.get('fill-pattern'); + const image = pattern && pattern.constantOr(1); + const ids = [image ? 'fillPattern' : 'fill']; + if (this.paint.get('fill-antialias')) { + ids.push(image && !this.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'); + } + return ids; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } + recalculate(parameters, availableImages) { + super.recalculate(parameters, availableImages); + const outlineColor = this.paint._values['fill-outline-color']; + if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) { + this.paint._values['fill-outline-color'] = this.paint._values['fill-color']; + } + } + createBucket(parameters) { + return new FillBucket(parameters); + } + queryRadius() { + return translateDistance(this.paint.get('fill-translate')); + } + queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform) { + if (queryGeometry.queryGeometry.isAboveHorizon) + return false; + const translatedPolygon = translate(queryGeometry.tilespaceGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); + return polygonIntersectsMultiPolygon(translatedPolygon, geometry); + } + isTileClipped() { + return true; + } +} + +const fillExtrusionAttributes = createLayout([{ + name: 'a_pos_normal_ed', + components: 4, + type: 'Int16' + }]); +const centroidAttributes = createLayout([{ + name: 'a_centroid_pos', + components: 2, + type: 'Uint16' + }]); +const {members: members$2, size: size$2, alignment: alignment$2} = fillExtrusionAttributes; + +var vectortilefeature = VectorTileFeature; +function VectorTileFeature(pbf, end, extent, keys, values) { + this.properties = {}; + this.extent = extent; + this.type = 0; + 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.types = [ + 'Unknown', + 'Point', + 'LineString', + 'Polygon' +]; +VectorTileFeature.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 <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 7; + length = cmdLen >> 3; + } + length--; + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (cmd === 1) { + if (line) + lines.push(line); + line = []; + } + line.push(new pointGeometry(x, y)); + } else if (cmd === 7) { + if (line) { + line.push(line[0].clone()); + } + } else { + throw new Error('unknown command ' + cmd); + } + } + if (line) + lines.push(line); + return lines; +}; +VectorTileFeature.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 <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 7; + 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.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.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$1(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; +}; +function classifyRings$1(rings) { + var len = rings.length; + if (len <= 1) + return [rings]; + var polygons = [], polygon, ccw; + for (var i = 0; i < len; i++) { + var area = signedArea$1(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$1(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 vectortilelayer = VectorTileLayer; +function VectorTileLayer(pbf, end) { + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + 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; +} +VectorTileLayer.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(this._pbf, end, this.extent, this._keys, this._values); +}; + +var vectortile = VectorTile; +function VectorTile(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) + layers[layer.name] = layer; + } +} + +var VectorTile$1 = vectortile; +var VectorTileFeature$1 = vectortilefeature; +var VectorTileLayer$1 = vectortilelayer; + +var vectorTile = { + VectorTile: VectorTile$1, + VectorTileFeature: VectorTileFeature$1, + VectorTileLayer: VectorTileLayer$1 +}; + +const vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; +const EARCUT_MAX_RINGS$1 = 500; +const FACTOR = Math.pow(2, 13); +const ELEVATION_SCALE = 7.3; +function addVertex(vertexArray, x, y, nxRatio, nySign, normalUp, top, e) { + vertexArray.emplaceBack((x << 1) + top, (y << 1) + normalUp, (Math.floor(nxRatio * FACTOR) << 1) + nySign, Math.round(e)); +} +class PartMetadata { + constructor() { + this.acc = new pointGeometry(0, 0); + this.polyCount = []; + } + startRing(p) { + this.currentPolyCount = { + edges: 0, + top: 0 + }; + this.polyCount.push(this.currentPolyCount); + if (this.min) + return; + this.min = new pointGeometry(p.x, p.y); + this.max = new pointGeometry(p.x, p.y); + } + append(p, prev) { + this.currentPolyCount.edges++; + this.acc._add(p); + let checkBorders = !!this.borders; + const min = this.min, max = this.max; + if (p.x < min.x) { + min.x = p.x; + checkBorders = true; + } else if (p.x > max.x) { + max.x = p.x; + checkBorders = true; + } + if (p.y < min.y) { + min.y = p.y; + checkBorders = true; + } else if (p.y > max.y) { + max.y = p.y; + checkBorders = true; + } + if (((p.x === 0 || p.x === EXTENT$1) && p.x === prev.x) !== ((p.y === 0 || p.y === EXTENT$1) && p.y === prev.y)) { + this.processBorderOverlap(p, prev); + } + if (checkBorders) + this.checkBorderIntersection(p, prev); + } + checkBorderIntersection(p, prev) { + if (prev.x < 0 !== p.x < 0) { + this.addBorderIntersection(0, number(prev.y, p.y, (0 - prev.x) / (p.x - prev.x))); + } + if (prev.x > EXTENT$1 !== p.x > EXTENT$1) { + this.addBorderIntersection(1, number(prev.y, p.y, (EXTENT$1 - prev.x) / (p.x - prev.x))); + } + if (prev.y < 0 !== p.y < 0) { + this.addBorderIntersection(2, number(prev.x, p.x, (0 - prev.y) / (p.y - prev.y))); + } + if (prev.y > EXTENT$1 !== p.y > EXTENT$1) { + this.addBorderIntersection(3, number(prev.x, p.x, (EXTENT$1 - prev.y) / (p.y - prev.y))); + } + } + addBorderIntersection(index, i) { + if (!this.borders) { + this.borders = [ + [ + Number.MAX_VALUE, + -Number.MAX_VALUE + ], + [ + Number.MAX_VALUE, + -Number.MAX_VALUE + ], + [ + Number.MAX_VALUE, + -Number.MAX_VALUE + ], + [ + Number.MAX_VALUE, + -Number.MAX_VALUE + ] + ]; + } + const b = this.borders[index]; + if (i < b[0]) + b[0] = i; + if (i > b[1]) + b[1] = i; + } + processBorderOverlap(p, prev) { + if (p.x === prev.x) { + if (p.y === prev.y) + return; + const index = p.x === 0 ? 0 : 1; + this.addBorderIntersection(index, prev.y); + this.addBorderIntersection(index, p.y); + } else { + const index = p.y === 0 ? 2 : 3; + this.addBorderIntersection(index, prev.x); + this.addBorderIntersection(index, p.x); + } + } + centroid() { + const count = this.polyCount.reduce((acc, p) => acc + p.edges, 0); + return count !== 0 ? this.acc.div(count)._round() : new pointGeometry(0, 0); + } + span() { + return new pointGeometry(this.max.x - this.min.x, this.max.y - this.min.y); + } + intersectsCount() { + return this.borders.reduce((acc, p) => acc + +(p[0] !== Number.MAX_VALUE), 0); + } +} +class FillExtrusionBucket { + constructor(options) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.hasPattern = false; + this.layoutVertexArray = new StructArrayLayout4i8(); + this.centroidVertexArray = new FillExtrusionCentroidArray(); + this.indexArray = new StructArrayLayout3ui6(); + this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); + this.segments = new SegmentVector(); + this.stateDependentLayerIds = this.layers.filter(l => l.isStateDependent()).map(l => l.id); + this.enableTerrain = options.enableTerrain; + } + populate(features, options, canonical) { + this.features = []; + this.hasPattern = hasPattern('fill-extrusion', this.layers, options); + this.featuresOnBorder = []; + this.borders = [ + [], + [], + [], + [] + ]; + this.borderDone = [ + false, + false, + false, + false + ]; + this.tileToMeter = tileToMeter(canonical); + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = this.layers[0]._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) + continue; + const bucketFeature = { + id, + sourceLayerIndex, + index, + geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature), + properties: feature.properties, + type: feature.type, + patterns: {} + }; + const vertexArrayOffset = this.layoutVertexArray.length; + if (this.hasPattern) { + this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options)); + } else { + this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {}); + } + options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, vertexArrayOffset); + } + this.sortBorders(); + } + addFeatures(options, canonical, imagePositions) { + for (const feature of this.features) { + const {geometry} = feature; + this.addFeature(feature, geometry, feature.index, canonical, imagePositions); + } + this.sortBorders(); + } + update(states, vtLayer, imagePositions) { + if (!this.stateDependentLayers.length) + return; + this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); + } + isEmpty() { + return this.layoutVertexArray.length === 0; + } + uploadPending() { + return !this.uploaded || this.programConfigurations.needsUpload; + } + upload(context) { + if (!this.uploaded) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); + this.indexBuffer = context.createIndexBuffer(this.indexArray); + } + this.programConfigurations.upload(context); + this.uploaded = true; + } + uploadCentroid(context) { + if (this.centroidVertexArray.length === 0) + return; + if (!this.centroidVertexBuffer) { + this.centroidVertexBuffer = context.createVertexBuffer(this.centroidVertexArray, centroidAttributes.members, true); + } else if (this.needsCentroidUpdate) { + this.centroidVertexBuffer.updateData(this.centroidVertexArray); + } + this.needsCentroidUpdate = false; + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + if (this.centroidVertexBuffer) + this.centroidVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + } + addFeature(feature, geometry, index, canonical, imagePositions) { + const flatRoof = this.enableTerrain && feature.properties && feature.properties.hasOwnProperty('type') && feature.properties.hasOwnProperty('height') && vectorTileFeatureTypes[feature.type] === 'Polygon'; + const metadata = flatRoof ? new PartMetadata() : null; + for (const polygon of classifyRings(geometry, EARCUT_MAX_RINGS$1)) { + let numVertices = 0; + let segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); + if (polygon.length === 0 || isEntirelyOutside(polygon[0])) { + continue; + } + for (let i = 0; i < polygon.length; i++) { + const ring = polygon[i]; + if (ring.length === 0) { + continue; + } + numVertices += ring.length; + let edgeDistance = 0; + if (metadata) + metadata.startRing(ring[0]); + for (let p = 0; p < ring.length; p++) { + const p1 = ring[p]; + if (p >= 1) { + const p2 = ring[p - 1]; + if (!isBoundaryEdge(p1, p2)) { + if (metadata) + metadata.append(p1, p2); + if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { + segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); + } + const d = p1.sub(p2)._perp(); + const nxRatio = d.x / (Math.abs(d.x) + Math.abs(d.y)); + const nySign = d.y > 0 ? 1 : 0; + const dist = p2.dist(p1); + if (edgeDistance + dist > 32768) + edgeDistance = 0; + addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 0, edgeDistance); + addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 1, edgeDistance); + edgeDistance += dist; + addVertex(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 0, edgeDistance); + addVertex(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 1, edgeDistance); + const bottomRight = segment.vertexLength; + this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1); + this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); + segment.vertexLength += 4; + segment.primitiveLength += 2; + } + } + } + } + if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { + segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); + } + if (vectorTileFeatureTypes[feature.type] !== 'Polygon') + continue; + const flattened = []; + const holeIndices = []; + const triangleIndex = segment.vertexLength; + for (let i = 0; i < polygon.length; i++) { + const ring = polygon[i]; + if (ring.length === 0) { + continue; + } + if (ring !== polygon[0]) { + holeIndices.push(flattened.length / 2); + } + for (let i = 0; i < ring.length; i++) { + const p = ring[i]; + addVertex(this.layoutVertexArray, p.x, p.y, 0, 0, 1, 1, 0); + flattened.push(p.x); + flattened.push(p.y); + if (metadata) + metadata.currentPolyCount.top++; + } + } + const indices = earcut_1(flattened, holeIndices); + for (let j = 0; j < indices.length; j += 3) { + this.indexArray.emplaceBack(triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]); + } + segment.primitiveLength += indices.length / 3; + segment.vertexLength += numVertices; + } + if (metadata && metadata.polyCount.length > 0) { + if (metadata.borders) { + metadata.vertexArrayOffset = this.centroidVertexArray.length; + const borders = metadata.borders; + const index = this.featuresOnBorder.push(metadata) - 1; + for (let i = 0; i < 4; i++) { + if (borders[i][0] !== Number.MAX_VALUE) { + this.borders[i].push(index); + } + } + } + this.encodeCentroid(metadata.borders ? undefined : metadata.centroid(), metadata); + } + this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); + } + sortBorders() { + for (let i = 0; i < 4; i++) { + this.borders[i].sort((a, b) => this.featuresOnBorder[a].borders[i][0] - this.featuresOnBorder[b].borders[i][0]); + } + } + encodeCentroid(c, metadata, append = true) { + let x, y; + if (c) { + if (c.y !== 0) { + const span = metadata.span()._mult(this.tileToMeter); + x = (Math.max(c.x, 1) << 3) + Math.min(7, Math.round(span.x / 10)); + y = (Math.max(c.y, 1) << 3) + Math.min(7, Math.round(span.y / 10)); + } else { + x = Math.ceil(c.x * ELEVATION_SCALE); + y = 0; + } + } else { + x = 0; + y = +append; + } + let offset = append ? this.centroidVertexArray.length : metadata.vertexArrayOffset; + for (const polyInfo of metadata.polyCount) { + if (append) { + this.centroidVertexArray.resize(this.centroidVertexArray.length + polyInfo.edges * 4 + polyInfo.top); + } + for (let i = 0; i < polyInfo.edges * 2; i++) { + this.centroidVertexArray.emplace(offset++, 0, y); + this.centroidVertexArray.emplace(offset++, x, y); + } + for (let i = 0; i < polyInfo.top; i++) { + this.centroidVertexArray.emplace(offset++, x, y); + } + } + } +} +register('FillExtrusionBucket', FillExtrusionBucket, { + omit: [ + 'layers', + 'features' + ] +}); +register('PartMetadata', PartMetadata); +function isBoundaryEdge(p1, p2) { + return p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT$1) || p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT$1); +} +function isEntirelyOutside(ring) { + return ring.every(p => p.x <= 0) || ring.every(p => p.x >= EXTENT$1) || ring.every(p => p.y <= 0) || ring.every(p => p.y >= EXTENT$1); +} +function tileToMeter(canonical) { + const circumferenceAtEquator = 40075017; + const mercatorY = canonical.y / (1 << canonical.z); + const exp = Math.exp(Math.PI * (1 - 2 * mercatorY)); + return circumferenceAtEquator * 2 * exp / (exp * exp + 1) / EXTENT$1 / (1 << canonical.z); +} + +const paint$5 = new Properties({ + 'fill-extrusion-opacity': new DataConstantProperty(spec['paint_fill-extrusion']['fill-extrusion-opacity']), + 'fill-extrusion-color': new DataDrivenProperty(spec['paint_fill-extrusion']['fill-extrusion-color']), + 'fill-extrusion-translate': new DataConstantProperty(spec['paint_fill-extrusion']['fill-extrusion-translate']), + 'fill-extrusion-translate-anchor': new DataConstantProperty(spec['paint_fill-extrusion']['fill-extrusion-translate-anchor']), + 'fill-extrusion-pattern': new CrossFadedDataDrivenProperty(spec['paint_fill-extrusion']['fill-extrusion-pattern']), + 'fill-extrusion-height': new DataDrivenProperty(spec['paint_fill-extrusion']['fill-extrusion-height']), + 'fill-extrusion-base': new DataDrivenProperty(spec['paint_fill-extrusion']['fill-extrusion-base']), + 'fill-extrusion-vertical-gradient': new DataConstantProperty(spec['paint_fill-extrusion']['fill-extrusion-vertical-gradient']) +}); +var properties$4 = { paint: paint$5 }; + +class FillExtrusionStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$4); + } + createBucket(parameters) { + return new FillExtrusionBucket(parameters); + } + queryRadius() { + return translateDistance(this.paint.get('fill-extrusion-translate')); + } + is3D() { + return true; + } + getProgramIds() { + const patternProperty = this.paint.get('fill-extrusion-pattern'); + const image = patternProperty.constantOr(1); + return [image ? 'fillExtrusionPattern' : 'fillExtrusion']; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } + queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelPosMatrix, elevationHelper, layoutVertexArrayOffset) { + const translation = tilespaceTranslate(this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); + const height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState); + const base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState); + const centroid = [ + 0, + 0 + ]; + const terrainVisible = elevationHelper && transform.elevation; + const exaggeration = transform.elevation ? transform.elevation.exaggeration() : 1; + if (terrainVisible) { + const centroidVertexArray = queryGeometry.tile.getBucket(this).centroidVertexArray; + const centroidOffset = layoutVertexArrayOffset + 1; + if (centroidOffset < centroidVertexArray.length) { + const centroidVertexObject = centroidVertexArray.get(centroidOffset); + centroid[0] = centroidVertexObject.a_centroid_pos0; + centroid[1] = centroidVertexObject.a_centroid_pos1; + } + } + const isHidden = centroid[0] === 0 && centroid[1] === 1; + if (isHidden) + return false; + const demSampler = terrainVisible ? elevationHelper : null; + const projected = projectExtrusion(geometry, base, height, translation, pixelPosMatrix, demSampler, centroid, exaggeration, transform.center.lat); + const projectedBase = projected[0]; + const projectedTop = projected[1]; + const screenQuery = queryGeometry.queryGeometry; + const projectedQueryGeometry = screenQuery.isPointQuery() ? screenQuery.screenBounds : screenQuery.screenGeometry; + return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry); + } +} +function dot$2(a, b) { + return a.x * b.x + a.y * b.y; +} +function getIntersectionDistance(projectedQueryGeometry, projectedFace) { + if (projectedQueryGeometry.length === 1) { + let i = 0; + const a = projectedFace[i++]; + let b; + while (!b || a.equals(b)) { + b = projectedFace[i++]; + if (!b) + return Infinity; + } + for (; i < projectedFace.length; i++) { + const c = projectedFace[i]; + const p = projectedQueryGeometry[0]; + const ab = b.sub(a); + const ac = c.sub(a); + const ap = p.sub(a); + const dotABAB = dot$2(ab, ab); + const dotABAC = dot$2(ab, ac); + const dotACAC = dot$2(ac, ac); + const dotAPAB = dot$2(ap, ab); + const dotAPAC = dot$2(ap, ac); + const denom = dotABAB * dotACAC - dotABAC * dotABAC; + const v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom; + const w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom; + const u = 1 - v - w; + const distance = a.z * u + b.z * v + c.z * w; + if (isFinite(distance)) + return distance; + } + return Infinity; + } else { + let closestDistance = Infinity; + for (const p of projectedFace) { + closestDistance = Math.min(closestDistance, p.z); + } + return closestDistance; + } +} +function checkIntersection(projectedBase, projectedTop, projectedQueryGeometry) { + let closestDistance = Infinity; + if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) { + closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]); + } + for (let r = 0; r < projectedTop.length; r++) { + const ringTop = projectedTop[r]; + const ringBase = projectedBase[r]; + for (let p = 0; p < ringTop.length - 1; p++) { + const topA = ringTop[p]; + const topB = ringTop[p + 1]; + const baseA = ringBase[p]; + const baseB = ringBase[p + 1]; + const face = [ + topA, + topB, + baseB, + baseA, + topA + ]; + if (polygonIntersectsPolygon(projectedQueryGeometry, face)) { + closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face)); + } + } + } + return closestDistance === Infinity ? false : closestDistance; +} +function projectExtrusion(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat) { + if (demSampler) { + return projectExtrusion3D(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat); + } else { + return projectExtrusion2D(geometry, zBase, zTop, translation, m); + } +} +function projectExtrusion2D(geometry, zBase, zTop, translation, m) { + const projectedBase = []; + const projectedTop = []; + const baseXZ = m[8] * zBase; + const baseYZ = m[9] * zBase; + const baseZZ = m[10] * zBase; + const baseWZ = m[11] * zBase; + const topXZ = m[8] * zTop; + const topYZ = m[9] * zTop; + const topZZ = m[10] * zTop; + const topWZ = m[11] * zTop; + for (const r of geometry) { + const ringBase = []; + const ringTop = []; + for (const p of r) { + const x = p.x + translation.x; + const y = p.y + translation.y; + const sX = m[0] * x + m[4] * y + m[12]; + const sY = m[1] * x + m[5] * y + m[13]; + const sZ = m[2] * x + m[6] * y + m[14]; + const sW = m[3] * x + m[7] * y + m[15]; + const baseX = sX + baseXZ; + const baseY = sY + baseYZ; + const baseZ = sZ + baseZZ; + const baseW = sW + baseWZ; + const topX = sX + topXZ; + const topY = sY + topYZ; + const topZ = sZ + topZZ; + const topW = sW + topWZ; + const b = new pointGeometry(baseX / baseW, baseY / baseW); + b.z = baseZ / baseW; + ringBase.push(b); + const t = new pointGeometry(topX / topW, topY / topW); + t.z = topZ / topW; + ringTop.push(t); + } + projectedBase.push(ringBase); + projectedTop.push(ringTop); + } + return [ + projectedBase, + projectedTop + ]; +} +function projectExtrusion3D(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat) { + const projectedBase = []; + const projectedTop = []; + const v = [ + 0, + 0, + 0 + ]; + for (const r of geometry) { + const ringBase = []; + const ringTop = []; + for (const p of r) { + const x = p.x + translation.x; + const y = p.y + translation.y; + const heightOffset = getTerrainHeightOffset(x, y, zBase, zTop, demSampler, centroid, exaggeration, lat); + v[0] = x; + v[1] = y; + v[2] = heightOffset.base; + const base = toPoint(transformMat4(v, v, m)); + v[0] = x; + v[1] = y; + v[2] = heightOffset.top; + const top = toPoint(transformMat4(v, v, m)); + ringBase.push(base); + ringTop.push(top); + } + projectedBase.push(ringBase); + projectedTop.push(ringTop); + } + return [ + projectedBase, + projectedTop + ]; +} +function toPoint(v) { + const p = new pointGeometry(v[0], v[1]); + p.z = v[2]; + return p; +} +function getTerrainHeightOffset(x, y, zBase, zTop, demSampler, centroid, exaggeration, lat) { + const ele = exaggeration * demSampler.getElevationAt(x, y, true, true); + const flatRoof = centroid[0] !== 0; + const centroidElevation = flatRoof ? centroid[1] === 0 ? exaggeration * elevationFromUint16(centroid[0]) : exaggeration * flatElevation(demSampler, centroid, lat) : ele; + return { + base: ele + (zBase === 0) ? -1 : zBase, + top: flatRoof ? Math.max(centroidElevation + zTop, ele + zBase + 2) : ele + zTop + }; +} +function elevationFromUint16(n) { + return n / ELEVATION_SCALE; +} +function flatElevation(demSampler, centroid, lat) { + const posX = Math.floor(centroid[0] / 8); + const posY = Math.floor(centroid[1] / 8); + const spanX = 10 * (centroid[0] - posX * 8); + const spanY = 10 * (centroid[1] - posY * 8); + const z = demSampler.getElevationAt(posX, posY, true, true); + const meterToDEM = demSampler.getMeterToDEM(lat); + const wX = Math.floor(0.5 * (spanX * meterToDEM - 1)); + const wY = Math.floor(0.5 * (spanY * meterToDEM - 1)); + const posPx = demSampler.tileCoordToPixel(posX, posY); + const offsetX = 2 * wX + 1; + const offsetY = 2 * wY + 1; + const corners = fourSample(demSampler, posPx.x - wX, posPx.y - wY, offsetX, offsetY); + const diffX = Math.abs(corners[0] - corners[1]); + const diffY = Math.abs(corners[2] - corners[3]); + const diffZ = Math.abs(corners[0] - corners[2]); + const diffW = Math.abs(corners[1] - corners[3]); + const diffSumX = diffX + diffY; + const diffSumY = diffZ + diffW; + const slopeX = Math.min(0.25, meterToDEM * 0.5 * diffSumX / offsetX); + const slopeY = Math.min(0.25, meterToDEM * 0.5 * diffSumY / offsetY); + return z + Math.max(slopeX * spanX, slopeY * spanY); +} +function fourSample(demSampler, posX, posY, offsetX, offsetY) { + return [ + demSampler.getElevationAtPixel(posX, posY, true), + demSampler.getElevationAtPixel(posX + offsetY, posY, true), + demSampler.getElevationAtPixel(posX, posY + offsetY, true), + demSampler.getElevationAtPixel(posX + offsetX, posY + offsetY, true) + ]; +} + +const lineLayoutAttributes = createLayout([ + { + name: 'a_pos_normal', + components: 2, + type: 'Int16' + }, + { + name: 'a_data', + components: 4, + type: 'Uint8' + }, + { + name: 'a_linesofar', + components: 1, + type: 'Float32' + } +], 4); +const {members: members$3, size: size$3, alignment: alignment$3} = lineLayoutAttributes; + +const lineLayoutAttributesExt = createLayout([ + { + name: 'a_uv_x', + components: 1, + type: 'Float32' + }, + { + name: 'a_split_index', + components: 1, + type: 'Float32' + } +]); +const {members: members$4, size: size$4, alignment: alignment$4} = lineLayoutAttributesExt; + +const vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types; +const EXTRUDE_SCALE = 63; +const COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); +const SHARP_CORNER_OFFSET = 15; +const DEG_PER_TRIANGLE = 20; +class LineBucket { + constructor(options) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.hasPattern = false; + this.patternFeatures = []; + this.lineClipsArray = []; + this.gradients = {}; + this.layers.forEach(layer => { + this.gradients[layer.id] = {}; + }); + this.layoutVertexArray = new StructArrayLayout2i4ub1f12(); + this.layoutVertexArray2 = new StructArrayLayout2f8(); + this.indexArray = new StructArrayLayout3ui6(); + this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); + this.segments = new SegmentVector(); + this.maxLineLength = 0; + this.stateDependentLayerIds = this.layers.filter(l => l.isStateDependent()).map(l => l.id); + } + populate(features, options, canonical) { + this.hasPattern = hasPattern('line', this.layers, options); + const lineSortKey = this.layers[0].layout.get('line-sort-key'); + const bucketFeatures = []; + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = this.layers[0]._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) + continue; + const sortKey = lineSortKey ? lineSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; + const bucketFeature = { + id, + properties: feature.properties, + type: feature.type, + sourceLayerIndex, + index, + geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature), + patterns: {}, + sortKey + }; + bucketFeatures.push(bucketFeature); + } + if (lineSortKey) { + bucketFeatures.sort((a, b) => { + return a.sortKey - b.sortKey; + }); + } + for (const bucketFeature of bucketFeatures) { + const {geometry, index, sourceLayerIndex} = bucketFeature; + if (this.hasPattern) { + const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options); + this.patternFeatures.push(patternBucketFeature); + } else { + this.addFeature(bucketFeature, geometry, index, canonical, {}); + } + const feature = features[index].feature; + options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); + } + } + update(states, vtLayer, imagePositions) { + if (!this.stateDependentLayers.length) + return; + this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); + } + addFeatures(options, canonical, imagePositions) { + for (const feature of this.patternFeatures) { + this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions); + } + } + isEmpty() { + return this.layoutVertexArray.length === 0; + } + uploadPending() { + return !this.uploaded || this.programConfigurations.needsUpload; + } + upload(context) { + if (!this.uploaded) { + if (this.layoutVertexArray2.length !== 0) { + this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members$4); + } + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); + this.indexBuffer = context.createIndexBuffer(this.indexArray); + } + this.programConfigurations.upload(context); + this.uploaded = true; + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + } + lineFeatureClips(feature) { + if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) { + const start = +feature.properties['mapbox_clip_start']; + const end = +feature.properties['mapbox_clip_end']; + return { + start, + end + }; + } + } + addFeature(feature, geometry, index, canonical, imagePositions) { + const layout = this.layers[0].layout; + const join = layout.get('line-join').evaluate(feature, {}); + const cap = layout.get('line-cap'); + const miterLimit = layout.get('line-miter-limit'); + const roundLimit = layout.get('line-round-limit'); + this.lineClips = this.lineFeatureClips(feature); + for (const line of geometry) { + this.addLine(line, feature, join, cap, miterLimit, roundLimit); + } + this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); + } + addLine(vertices, feature, join, cap, miterLimit, roundLimit) { + this.distance = 0; + this.scaledDistance = 0; + this.totalDistance = 0; + this.lineSoFar = 0; + if (this.lineClips) { + this.lineClipsArray.push(this.lineClips); + for (let i = 0; i < vertices.length - 1; i++) { + this.totalDistance += vertices[i].dist(vertices[i + 1]); + } + this.updateScaledDistance(); + this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance); + } + const isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon'; + let len = vertices.length; + while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) { + len--; + } + let first = 0; + while (first < len - 1 && vertices[first].equals(vertices[first + 1])) { + first++; + } + if (len < (isPolygon ? 3 : 2)) + return; + if (join === 'bevel') + miterLimit = 1.05; + const sharpCornerOffset = this.overscaling <= 16 ? SHARP_CORNER_OFFSET * EXTENT$1 / (512 * this.overscaling) : 0; + const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray); + let currentVertex; + let prevVertex = undefined; + let nextVertex = undefined; + let prevNormal = undefined; + let nextNormal = undefined; + this.e1 = this.e2 = -1; + if (isPolygon) { + currentVertex = vertices[len - 2]; + nextNormal = vertices[first].sub(currentVertex)._unit()._perp(); + } + for (let i = first; i < len; i++) { + nextVertex = i === len - 1 ? isPolygon ? vertices[first + 1] : undefined : vertices[i + 1]; + if (nextVertex && vertices[i].equals(nextVertex)) + continue; + if (nextNormal) + prevNormal = nextNormal; + if (currentVertex) + prevVertex = currentVertex; + currentVertex = vertices[i]; + nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; + prevNormal = prevNormal || nextNormal; + let joinNormal = prevNormal.add(nextNormal); + if (joinNormal.x !== 0 || joinNormal.y !== 0) { + joinNormal._unit(); + } + const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y; + const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; + const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; + const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle); + const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; + const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0; + if (isSharpCorner && i > first) { + const prevSegmentLength = currentVertex.dist(prevVertex); + if (prevSegmentLength > 2 * sharpCornerOffset) { + const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); + this.updateDistance(prevVertex, newPrevVertex); + this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment); + prevVertex = newPrevVertex; + } + } + const middleVertex = prevVertex && nextVertex; + let currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap; + if (middleVertex && currentJoin === 'round') { + if (miterLength < roundLimit) { + currentJoin = 'miter'; + } else if (miterLength <= 2) { + currentJoin = 'fakeround'; + } + } + if (currentJoin === 'miter' && miterLength > miterLimit) { + currentJoin = 'bevel'; + } + if (currentJoin === 'bevel') { + if (miterLength > 2) + currentJoin = 'flipbevel'; + if (miterLength < miterLimit) + currentJoin = 'miter'; + } + if (prevVertex) + this.updateDistance(prevVertex, currentVertex); + if (currentJoin === 'miter') { + joinNormal._mult(miterLength); + this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); + } else if (currentJoin === 'flipbevel') { + if (miterLength > 100) { + joinNormal = nextNormal.mult(-1); + } else { + const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); + joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1)); + } + this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); + this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment); + } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { + const offset = -Math.sqrt(miterLength * miterLength - 1); + const offsetA = lineTurnsLeft ? offset : 0; + const offsetB = lineTurnsLeft ? 0 : offset; + if (prevVertex) { + this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment); + } + if (currentJoin === 'fakeround') { + const n = Math.round(approxAngle * 180 / Math.PI / DEG_PER_TRIANGLE); + for (let m = 1; m < n; m++) { + let t = m / n; + if (t !== 0.5) { + const t2 = t - 0.5; + const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519)); + const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638); + t = t + t * t2 * (t - 1) * (A * t2 * t2 + B); + } + const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1); + this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment); + } + } + if (nextVertex) { + this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment); + } + } else if (currentJoin === 'butt') { + this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); + } else if (currentJoin === 'square') { + const offset = prevVertex ? 1 : -1; + this.addCurrentVertex(currentVertex, joinNormal, offset, offset, segment); + } else if (currentJoin === 'round') { + if (prevVertex) { + this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment); + this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true); + } + if (nextVertex) { + this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true); + this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment); + } + } + if (isSharpCorner && i < len - 1) { + const nextSegmentLength = currentVertex.dist(nextVertex); + if (nextSegmentLength > 2 * sharpCornerOffset) { + const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); + this.updateDistance(currentVertex, newCurrentVertex); + this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment); + currentVertex = newCurrentVertex; + } + } + } + } + addCurrentVertex(p, normal, endLeft, endRight, segment, round = false) { + const leftX = normal.x + normal.y * endLeft; + const leftY = normal.y - normal.x * endLeft; + const rightX = -normal.x + normal.y * endRight; + const rightY = -normal.y - normal.x * endRight; + this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment); + this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment); + } + addHalfVertex({x, y}, extrudeX, extrudeY, round, up, dir, segment) { + this.layoutVertexArray.emplaceBack((x << 1) + (round ? 1 : 0), (y << 1) + (up ? 1 : 0), Math.round(EXTRUDE_SCALE * extrudeX) + 128, Math.round(EXTRUDE_SCALE * extrudeY) + 128, (dir === 0 ? 0 : dir < 0 ? -1 : 1) + 1, 0, this.lineSoFar); + if (this.lineClips) { + this.layoutVertexArray2.emplaceBack(this.scaledDistance, this.lineClipsArray.length); + } + const e = segment.vertexLength++; + if (this.e1 >= 0 && this.e2 >= 0) { + this.indexArray.emplaceBack(this.e1, this.e2, e); + segment.primitiveLength++; + } + if (up) { + this.e2 = e; + } else { + this.e1 = e; + } + } + updateScaledDistance() { + if (this.lineClips) { + const featureShare = this.lineClips.end - this.lineClips.start; + const totalFeatureLength = this.totalDistance / featureShare; + this.scaledDistance = this.distance / this.totalDistance; + this.lineSoFar = totalFeatureLength * this.lineClips.start + this.distance; + } else { + this.lineSoFar = this.distance; + } + } + updateDistance(prev, next) { + this.distance += prev.dist(next); + this.updateScaledDistance(); + } +} +register('LineBucket', LineBucket, { + omit: [ + 'layers', + 'patternFeatures' + ] +}); + +const layout$5 = new Properties({ + 'line-cap': new DataConstantProperty(spec['layout_line']['line-cap']), + 'line-join': new DataDrivenProperty(spec['layout_line']['line-join']), + 'line-miter-limit': new DataConstantProperty(spec['layout_line']['line-miter-limit']), + 'line-round-limit': new DataConstantProperty(spec['layout_line']['line-round-limit']), + 'line-sort-key': new DataDrivenProperty(spec['layout_line']['line-sort-key']) +}); +const paint$6 = new Properties({ + 'line-opacity': new DataDrivenProperty(spec['paint_line']['line-opacity']), + 'line-color': new DataDrivenProperty(spec['paint_line']['line-color']), + 'line-translate': new DataConstantProperty(spec['paint_line']['line-translate']), + 'line-translate-anchor': new DataConstantProperty(spec['paint_line']['line-translate-anchor']), + 'line-width': new DataDrivenProperty(spec['paint_line']['line-width']), + 'line-gap-width': new DataDrivenProperty(spec['paint_line']['line-gap-width']), + 'line-offset': new DataDrivenProperty(spec['paint_line']['line-offset']), + 'line-blur': new DataDrivenProperty(spec['paint_line']['line-blur']), + 'line-dasharray': new CrossFadedProperty(spec['paint_line']['line-dasharray']), + 'line-pattern': new CrossFadedDataDrivenProperty(spec['paint_line']['line-pattern']), + 'line-gradient': new ColorRampProperty(spec['paint_line']['line-gradient']) +}); +var properties$5 = { + paint: paint$6, + layout: layout$5 +}; + +class LineFloorwidthProperty extends DataDrivenProperty { + possiblyEvaluate(value, parameters) { + parameters = new EvaluationParameters(Math.floor(parameters.zoom), { + now: parameters.now, + fadeDuration: parameters.fadeDuration, + zoomHistory: parameters.zoomHistory, + transition: parameters.transition + }); + return super.possiblyEvaluate(value, parameters); + } + evaluate(value, globals, feature, featureState) { + globals = extend({}, globals, { zoom: Math.floor(globals.zoom) }); + return super.evaluate(value, globals, feature, featureState); + } +} +const lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification); +lineFloorwidthProperty.useIntegerZoom = true; +class LineStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$5); + this.gradientVersion = 0; + } + _handleSpecialPaintPropertyUpdate(name) { + if (name === 'line-gradient') { + const expression = this._transitionablePaint._values['line-gradient'].value.expression; + this.stepInterpolant = expression._styleExpression.expression instanceof Step; + this.gradientVersion = (this.gradientVersion + 1) % MAX_SAFE_INTEGER; + } + } + gradientExpression() { + return this._transitionablePaint._values['line-gradient'].value.expression; + } + recalculate(parameters, availableImages) { + super.recalculate(parameters, availableImages); + this.paint._values['line-floorwidth'] = lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); + } + createBucket(parameters) { + return new LineBucket(parameters); + } + getProgramIds() { + const dasharray = this.paint.get('line-dasharray'); + const patternProperty = this.paint.get('line-pattern'); + const image = patternProperty.constantOr(1); + const gradient = this.paint.get('line-gradient'); + const programId = image ? 'linePattern' : dasharray ? 'lineSDF' : gradient ? 'lineGradient' : 'line'; + return [programId]; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } + queryRadius(bucket) { + const lineBucket = bucket; + const width = getLineWidth(getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket)); + const offset = getMaximumPaintValue('line-offset', this, lineBucket); + return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate')); + } + queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform) { + if (queryGeometry.queryGeometry.isAboveHorizon) + return false; + const translatedPolygon = translate(queryGeometry.tilespaceGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); + const halfWidth = queryGeometry.pixelToTileUnitsFactor / 2 * getLineWidth(this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState)); + const lineOffset = this.paint.get('line-offset').evaluate(feature, featureState); + if (lineOffset) { + geometry = offsetLine(geometry, lineOffset * queryGeometry.pixelToTileUnitsFactor); + } + return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); + } + isTileClipped() { + return true; + } +} +function getLineWidth(lineWidth, lineGapWidth) { + if (lineGapWidth > 0) { + return lineGapWidth + 2 * lineWidth; + } else { + return lineWidth; + } +} +function offsetLine(rings, offset) { + const newRings = []; + const zero = new pointGeometry(0, 0); + for (let k = 0; k < rings.length; k++) { + const ring = rings[k]; + const newRing = []; + for (let i = 0; i < ring.length; i++) { + const a = ring[i - 1]; + const b = ring[i]; + const c = ring[i + 1]; + const aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); + const bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); + const extrude = aToB._add(bToC)._unit(); + const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; + extrude._mult(1 / cosHalfAngle); + newRing.push(extrude._mult(offset)._add(b)); + } + newRings.push(newRing); + } + return newRings; +} + +const symbolLayoutAttributes = createLayout([ + { + name: 'a_pos_offset', + components: 4, + type: 'Int16' + }, + { + name: 'a_data', + components: 4, + type: 'Uint16' + }, + { + name: 'a_pixeloffset', + components: 4, + type: 'Int16' + } +], 4); +const dynamicLayoutAttributes = createLayout([{ + name: 'a_projected_pos', + components: 3, + type: 'Float32' + }], 4); +const placementOpacityAttributes = createLayout([{ + name: 'a_fade_opacity', + components: 1, + type: 'Uint32' + }], 4); +const collisionVertexAttributes = createLayout([ + { + name: 'a_placed', + components: 2, + type: 'Uint8' + }, + { + name: 'a_shift', + components: 2, + type: 'Float32' + } +]); +const collisionVertexAttributesExt = createLayout([ + { + name: 'a_size_scale', + components: 1, + type: 'Float32' + }, + { + name: 'a_padding', + components: 2, + type: 'Float32' + } +]); +const collisionBox = createLayout([ + { + type: 'Int16', + name: 'anchorPointX' + }, + { + type: 'Int16', + name: 'anchorPointY' + }, + { + type: 'Float32', + name: 'x1' + }, + { + type: 'Float32', + name: 'y1' + }, + { + type: 'Float32', + name: 'x2' + }, + { + type: 'Float32', + name: 'y2' + }, + { + type: 'Int16', + name: 'padding' + }, + { + type: 'Uint32', + name: 'featureIndex' + }, + { + type: 'Uint16', + name: 'sourceLayerIndex' + }, + { + type: 'Uint16', + name: 'bucketIndex' + } +]); +const collisionBoxLayout = createLayout([ + { + name: 'a_pos', + components: 2, + type: 'Int16' + }, + { + name: 'a_anchor_pos', + components: 2, + type: 'Int16' + }, + { + name: 'a_extrude', + components: 2, + type: 'Int16' + } +], 4); +const collisionCircleLayout = createLayout([ + { + name: 'a_pos_2f', + components: 2, + type: 'Float32' + }, + { + name: 'a_radius', + components: 1, + type: 'Float32' + }, + { + name: 'a_flags', + components: 2, + type: 'Int16' + } +], 4); +const quadTriangle = createLayout([{ + name: 'triangle', + components: 3, + type: 'Uint16' + }]); +const placement = createLayout([ + { + type: 'Int16', + name: 'anchorX' + }, + { + type: 'Int16', + name: 'anchorY' + }, + { + type: 'Uint16', + name: 'glyphStartIndex' + }, + { + type: 'Uint16', + name: 'numGlyphs' + }, + { + type: 'Uint32', + name: 'vertexStartIndex' + }, + { + type: 'Uint32', + name: 'lineStartIndex' + }, + { + type: 'Uint32', + name: 'lineLength' + }, + { + type: 'Uint16', + name: 'segment' + }, + { + type: 'Uint16', + name: 'lowerSize' + }, + { + type: 'Uint16', + name: 'upperSize' + }, + { + type: 'Float32', + name: 'lineOffsetX' + }, + { + type: 'Float32', + name: 'lineOffsetY' + }, + { + type: 'Uint8', + name: 'writingMode' + }, + { + type: 'Uint8', + name: 'placedOrientation' + }, + { + type: 'Uint8', + name: 'hidden' + }, + { + type: 'Uint32', + name: 'crossTileID' + }, + { + type: 'Int16', + name: 'associatedIconIndex' + } +]); +const symbolInstance = createLayout([ + { + type: 'Int16', + name: 'anchorX' + }, + { + type: 'Int16', + name: 'anchorY' + }, + { + type: 'Int16', + name: 'rightJustifiedTextSymbolIndex' + }, + { + type: 'Int16', + name: 'centerJustifiedTextSymbolIndex' + }, + { + type: 'Int16', + name: 'leftJustifiedTextSymbolIndex' + }, + { + type: 'Int16', + name: 'verticalPlacedTextSymbolIndex' + }, + { + type: 'Int16', + name: 'placedIconSymbolIndex' + }, + { + type: 'Int16', + name: 'verticalPlacedIconSymbolIndex' + }, + { + type: 'Uint16', + name: 'key' + }, + { + type: 'Uint16', + name: 'textBoxStartIndex' + }, + { + type: 'Uint16', + name: 'textBoxEndIndex' + }, + { + type: 'Uint16', + name: 'verticalTextBoxStartIndex' + }, + { + type: 'Uint16', + name: 'verticalTextBoxEndIndex' + }, + { + type: 'Uint16', + name: 'iconBoxStartIndex' + }, + { + type: 'Uint16', + name: 'iconBoxEndIndex' + }, + { + type: 'Uint16', + name: 'verticalIconBoxStartIndex' + }, + { + type: 'Uint16', + name: 'verticalIconBoxEndIndex' + }, + { + type: 'Uint16', + name: 'featureIndex' + }, + { + type: 'Uint16', + name: 'numHorizontalGlyphVertices' + }, + { + type: 'Uint16', + name: 'numVerticalGlyphVertices' + }, + { + type: 'Uint16', + name: 'numIconVertices' + }, + { + type: 'Uint16', + name: 'numVerticalIconVertices' + }, + { + type: 'Uint16', + name: 'useRuntimeCollisionCircles' + }, + { + type: 'Uint32', + name: 'crossTileID' + }, + { + type: 'Float32', + name: 'textBoxScale' + }, + { + type: 'Float32', + components: 2, + name: 'textOffset' + }, + { + type: 'Float32', + name: 'collisionCircleDiameter' + } +]); +const glyphOffset = createLayout([{ + type: 'Float32', + name: 'offsetX' + }]); +const lineVertex = createLayout([ + { + type: 'Int16', + name: 'x' + }, + { + type: 'Int16', + name: 'y' + }, + { + type: 'Int16', + name: 'tileUnitDistanceFromAnchor' + } +]); + +var ONE_EM = 24; + +const SIZE_PACK_FACTOR = 128; +function getSizeData(tileZoom, value) { + const {expression} = value; + if (expression.kind === 'constant') { + const layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1)); + return { + kind: 'constant', + layoutSize + }; + } else if (expression.kind === 'source') { + return { kind: 'source' }; + } else { + const {zoomStops, interpolationType} = expression; + let lower = 0; + while (lower < zoomStops.length && zoomStops[lower] <= tileZoom) + lower++; + lower = Math.max(0, lower - 1); + let upper = lower; + while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1) + upper++; + upper = Math.min(zoomStops.length - 1, upper); + const minZoom = zoomStops[lower]; + const maxZoom = zoomStops[upper]; + if (expression.kind === 'composite') { + return { + kind: 'composite', + minZoom, + maxZoom, + interpolationType + }; + } + const minSize = expression.evaluate(new EvaluationParameters(minZoom)); + const maxSize = expression.evaluate(new EvaluationParameters(maxZoom)); + return { + kind: 'camera', + minZoom, + maxZoom, + minSize, + maxSize, + interpolationType + }; + } +} +function evaluateSizeForFeature(sizeData, {uSize, uSizeT}, {lowerSize, upperSize}) { + if (sizeData.kind === 'source') { + return lowerSize / SIZE_PACK_FACTOR; + } else if (sizeData.kind === 'composite') { + return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT); + } + return uSize; +} +function evaluateSizeForZoom(sizeData, zoom) { + let uSizeT = 0; + let uSize = 0; + if (sizeData.kind === 'constant') { + uSize = sizeData.layoutSize; + } else if (sizeData.kind !== 'source') { + const {interpolationType, minZoom, maxZoom} = sizeData; + const t = !interpolationType ? 0 : clamp(Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1); + if (sizeData.kind === 'camera') { + uSize = number(sizeData.minSize, sizeData.maxSize, t); + } else { + uSizeT = t; + } + } + return { + uSizeT, + uSize + }; +} + +var symbolSize = /*#__PURE__*/Object.freeze({ +__proto__: null, +getSizeData: getSizeData, +evaluateSizeForFeature: evaluateSizeForFeature, +evaluateSizeForZoom: evaluateSizeForZoom, +SIZE_PACK_FACTOR: SIZE_PACK_FACTOR +}); + +function transformText(text, layer, feature) { + const transform = layer.layout.get('text-transform').evaluate(feature, {}); + if (transform === 'uppercase') { + text = text.toLocaleUpperCase(); + } else if (transform === 'lowercase') { + text = text.toLocaleLowerCase(); + } + if (plugin.applyArabicShaping) { + text = plugin.applyArabicShaping(text); + } + return text; +} +function transformText$1 (text, layer, feature) { + text.sections.forEach(section => { + section.text = transformText(section.text, layer, feature); + }); + return text; +} + +function mergeLines (features) { + const leftIndex = {}; + const rightIndex = {}; + const mergedFeatures = []; + let mergedIndex = 0; + function add(k) { + mergedFeatures.push(features[k]); + mergedIndex++; + } + function mergeFromRight(leftKey, rightKey, geom) { + const i = rightIndex[leftKey]; + delete rightIndex[leftKey]; + rightIndex[rightKey] = i; + mergedFeatures[i].geometry[0].pop(); + mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); + return i; + } + function mergeFromLeft(leftKey, rightKey, geom) { + const i = leftIndex[rightKey]; + delete leftIndex[rightKey]; + leftIndex[leftKey] = i; + mergedFeatures[i].geometry[0].shift(); + mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); + return i; + } + function getKey(text, geom, onRight) { + const point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; + return `${ text }:${ point.x }:${ point.y }`; + } + for (let k = 0; k < features.length; k++) { + const feature = features[k]; + const geom = feature.geometry; + const text = feature.text ? feature.text.toString() : null; + if (!text) { + add(k); + continue; + } + const leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); + if (leftKey in rightIndex && rightKey in leftIndex && rightIndex[leftKey] !== leftIndex[rightKey]) { + const j = mergeFromLeft(leftKey, rightKey, geom); + const i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); + delete leftIndex[leftKey]; + delete rightIndex[rightKey]; + rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; + mergedFeatures[j].geometry = null; + } else if (leftKey in rightIndex) { + mergeFromRight(leftKey, rightKey, geom); + } else if (rightKey in leftIndex) { + mergeFromLeft(leftKey, rightKey, geom); + } else { + add(k); + leftIndex[leftKey] = mergedIndex - 1; + rightIndex[rightKey] = mergedIndex - 1; + } + } + return mergedFeatures.filter(f => f.geometry); +} + +const verticalizedCharacterMap = { + '!': '\uFE15', + '#': '\uFF03', + '$': '\uFF04', + '%': '\uFF05', + '&': '\uFF06', + '(': '\uFE35', + ')': '\uFE36', + '*': '\uFF0A', + '+': '\uFF0B', + ',': '\uFE10', + '-': '\uFE32', + '.': '\u30FB', + '/': '\uFF0F', + ':': '\uFE13', + ';': '\uFE14', + '<': '\uFE3F', + '=': '\uFF1D', + '>': '\uFE40', + '?': '\uFE16', + '@': '\uFF20', + '[': '\uFE47', + '\\': '\uFF3C', + ']': '\uFE48', + '^': '\uFF3E', + '_': '︳', + '`': '\uFF40', + '{': '\uFE37', + '|': '\u2015', + '}': '\uFE38', + '~': '\uFF5E', + '\xA2': '\uFFE0', + '\xA3': '\uFFE1', + '\xA5': '\uFFE5', + '\xA6': '\uFFE4', + '\xAC': '\uFFE2', + '\xAF': '\uFFE3', + '\u2013': '\uFE32', + '\u2014': '\uFE31', + '\u2018': '\uFE43', + '\u2019': '\uFE44', + '\u201C': '\uFE41', + '\u201D': '\uFE42', + '\u2026': '\uFE19', + '\u2027': '\u30FB', + '\u20A9': '\uFFE6', + '\u3001': '\uFE11', + '\u3002': '\uFE12', + '\u3008': '\uFE3F', + '\u3009': '\uFE40', + '\u300A': '\uFE3D', + '\u300B': '\uFE3E', + '\u300C': '\uFE41', + '\u300D': '\uFE42', + '\u300E': '\uFE43', + '\u300F': '\uFE44', + '\u3010': '\uFE3B', + '\u3011': '\uFE3C', + '\u3014': '\uFE39', + '\u3015': '\uFE3A', + '\u3016': '\uFE17', + '\u3017': '\uFE18', + '\uFF01': '\uFE15', + '\uFF08': '\uFE35', + '\uFF09': '\uFE36', + '\uFF0C': '\uFE10', + '\uFF0D': '\uFE32', + '\uFF0E': '\u30FB', + '\uFF1A': '\uFE13', + '\uFF1B': '\uFE14', + '\uFF1C': '\uFE3F', + '\uFF1E': '\uFE40', + '\uFF1F': '\uFE16', + '\uFF3B': '\uFE47', + '\uFF3D': '\uFE48', + '_': '︳', + '\uFF5B': '\uFE37', + '\uFF5C': '\u2015', + '\uFF5D': '\uFE38', + '\uFF5F': '\uFE35', + '\uFF60': '\uFE36', + '\uFF61': '\uFE12', + '\uFF62': '\uFE41', + '\uFF63': '\uFE42' +}; +function verticalizePunctuation(input) { + let output = ''; + for (let i = 0; i < input.length; i++) { + const nextCharCode = input.charCodeAt(i + 1) || null; + const prevCharCode = input.charCodeAt(i - 1) || null; + const canReplacePunctuation = (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) && (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]); + if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) { + output += verticalizedCharacterMap[input[i]]; + } else { + output += input[i]; + } + } + return output; +} + +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 & 255, i += d, m /= 256, mLen -= 8) { + } + e = e << mLen | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) { + } + buffer[offset + i - d] |= s * 128; +}; + +var ieee754 = { + read: read, + write: write +}; + +var pbf = Pbf; + +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; +Pbf.Fixed64 = 1; +Pbf.Bytes = 2; +Pbf.Fixed32 = 5; +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; +var TEXT_DECODER_MIN_LENGTH = 12; +var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8'); +Pbf.prototype = { + destroy: function () { + this.buf = null; + }, + readFields: function (readField, result, end) { + end = end || this.length; + while (this.pos < end) { + var val = this.readVarint(), tag = val >> 3, startPos = this.pos; + this.type = val & 7; + readField(tag, result, this); + if (this.pos === startPos) + this.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; + }, + 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 & 127; + if (b < 128) + return val; + b = buf[this.pos++]; + val |= (b & 127) << 7; + if (b < 128) + return val; + b = buf[this.pos++]; + val |= (b & 127) << 14; + if (b < 128) + return val; + b = buf[this.pos++]; + val |= (b & 127) << 21; + if (b < 128) + return val; + b = buf[this.pos]; + val |= (b & 15) << 28; + return readVarintRemainder(val, isSigned, this); + }, + readVarint64: function () { + return this.readVarint(true); + }, + readSVarint: function () { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; + }, + readBoolean: function () { + return Boolean(this.readVarint()); + }, + readString: function () { + var end = this.readVarint() + this.pos; + var pos = this.pos; + this.pos = end; + if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) { + return readUtf8TextDecoder(this.buf, pos, end); + } + return readUtf8(this.buf, pos, end); + }, + readBytes: function () { + var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + readPackedVarint: function (arr, isSigned) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readVarint(isSigned)); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readVarint(isSigned)); + return arr; + }, + readPackedSVarint: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readSVarint()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readBoolean()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readFloat()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readDouble()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readSFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function (arr) { + if (this.type !== Pbf.Bytes) + return arr.push(this.readSFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) + arr.push(this.readSFixed64()); + return arr; + }, + skip: function (val) { + var type = val & 7; + if (type === Pbf.Varint) + while (this.buf[this.pos++] > 127) { + } + 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); + }, + 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 > 268435455 || val < 0) { + writeBigVarint(val, this); + return; + } + this.realloc(4); + this.buf[this.pos++] = val & 127 | (val > 127 ? 128 : 0); + if (val <= 127) + return; + this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0); + if (val <= 127) + return; + this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0); + if (val <= 127) + return; + this.buf[this.pos++] = val >>> 7 & 127; + }, + 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++; + var startPos = this.pos; + this.pos = writeUtf8(this.buf, str, this.pos); + var len = this.pos - startPos; + if (len >= 128) + makeRoomForExtraLength(startPos, len, this); + 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 len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) + this.buf[this.pos++] = buffer[i]; + }, + writeRawMessage: function (fn, obj) { + this.pos++; + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + if (len >= 128) + makeRoomForExtraLength(startPos, len, this); + 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) { + if (arr.length) + this.writeMessage(tag, writePackedVarint, arr); + }, + writePackedSVarint: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedSVarint, arr); + }, + writePackedBoolean: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedBoolean, arr); + }, + writePackedFloat: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedFloat, arr); + }, + writePackedDouble: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedDouble, arr); + }, + writePackedFixed32: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedFixed32, arr); + }, + writePackedSFixed32: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedSFixed32, arr); + }, + writePackedFixed64: function (tag, arr) { + if (arr.length) + this.writeMessage(tag, writePackedFixed64, arr); + }, + writePackedSFixed64: function (tag, arr) { + if (arr.length) + 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 & 112) >> 4; + if (b < 128) + return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 127) << 3; + if (b < 128) + return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 127) << 10; + if (b < 128) + return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 127) << 17; + if (b < 128) + return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 127) << 24; + if (b < 128) + return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 1) << 31; + if (b < 128) + 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 * 4294967296 + (low >>> 0); + } + return (high >>> 0) * 4294967296 + (low >>> 0); +} +function writeBigVarint(val, pbf) { + var low, high; + if (val >= 0) { + low = val % 4294967296 | 0; + high = val / 4294967296 | 0; + } else { + low = ~(-val % 4294967296); + high = ~(-val / 4294967296); + if (low ^ 4294967295) { + low = low + 1 | 0; + } else { + low = 0; + high = high + 1 | 0; + } + } + if (val >= 18446744073709552000 || val < -18446744073709552000) { + 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 & 127 | 128; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 127 | 128; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 127 | 128; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 127 | 128; + low >>>= 7; + pbf.buf[pbf.pos] = low & 127; +} +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 7) << 4; + pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 128 : 0); + if (!high) + return; + pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0); + if (!high) + return; + pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0); + if (!high) + return; + pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0); + if (!high) + return; + pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0); + if (!high) + return; + pbf.buf[pbf.pos++] = high & 127; +} +function makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = len <= 16383 ? 1 : len <= 2097151 ? 2 : len <= 268435455 ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); + 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]); +} +function readUInt32(buf, pos) { + return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 16777216; +} +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; + var bytesPerSequence = b0 > 239 ? 4 : b0 > 223 ? 3 : b0 > 191 ? 2 : 1; + if (i + bytesPerSequence > end) + break; + var b1, b2, b3; + if (bytesPerSequence === 1) { + if (b0 < 128) { + c = b0; + } + } else if (bytesPerSequence === 2) { + b1 = buf[i + 1]; + if ((b1 & 192) === 128) { + c = (b0 & 31) << 6 | b1 & 63; + if (c <= 127) { + c = null; + } + } + } else if (bytesPerSequence === 3) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + if ((b1 & 192) === 128 && (b2 & 192) === 128) { + c = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; + if (c <= 2047 || c >= 55296 && c <= 57343) { + c = null; + } + } + } else if (bytesPerSequence === 4) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + b3 = buf[i + 3]; + if ((b1 & 192) === 128 && (b2 & 192) === 128 && (b3 & 192) === 128) { + c = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; + if (c <= 65535 || c >= 1114112) { + c = null; + } + } + } + if (c === null) { + c = 65533; + bytesPerSequence = 1; + } else if (c > 65535) { + c -= 65536; + str += String.fromCharCode(c >>> 10 & 1023 | 55296); + c = 56320 | c & 1023; + } + str += String.fromCharCode(c); + i += bytesPerSequence; + } + return str; +} +function readUtf8TextDecoder(buf, pos, end) { + return utf8TextDecoder.decode(buf.subarray(pos, end)); +} +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); + if (c > 55295 && c < 57344) { + if (lead) { + if (c < 56320) { + buf[pos++] = 239; + buf[pos++] = 191; + buf[pos++] = 189; + lead = c; + continue; + } else { + c = lead - 55296 << 10 | c - 56320 | 65536; + lead = null; + } + } else { + if (c > 56319 || i + 1 === str.length) { + buf[pos++] = 239; + buf[pos++] = 191; + buf[pos++] = 189; + } else { + lead = c; + } + continue; + } + } else if (lead) { + buf[pos++] = 239; + buf[pos++] = 191; + buf[pos++] = 189; + lead = null; + } + if (c < 128) { + buf[pos++] = c; + } else { + if (c < 2048) { + buf[pos++] = c >> 6 | 192; + } else { + if (c < 65536) { + buf[pos++] = c >> 12 | 224; + } else { + buf[pos++] = c >> 18 | 240; + buf[pos++] = c >> 12 & 63 | 128; + } + buf[pos++] = c >> 6 & 63 | 128; + } + buf[pos++] = c & 63 | 128; + } + } + return pos; +} + +const border = 3; +function readFontstacks(tag, glyphs, pbf) { + if (tag === 1) { + pbf.readMessage(readFontstack, glyphs); + } +} +function readFontstack(tag, glyphs, pbf) { + if (tag === 3) { + const {id, bitmap, width, height, left, top, advance} = pbf.readMessage(readGlyph, {}); + glyphs.push({ + id, + bitmap: new AlphaImage({ + width: width + 2 * border, + height: height + 2 * border + }, bitmap), + metrics: { + width, + height, + left, + top, + advance + } + }); + } +} +function readGlyph(tag, glyph, pbf) { + if (tag === 1) + glyph.id = pbf.readVarint(); + else if (tag === 2) + glyph.bitmap = pbf.readBytes(); + else if (tag === 3) + glyph.width = pbf.readVarint(); + else if (tag === 4) + glyph.height = pbf.readVarint(); + else if (tag === 5) + glyph.left = pbf.readSVarint(); + else if (tag === 6) + glyph.top = pbf.readSVarint(); + else if (tag === 7) + glyph.advance = pbf.readVarint(); +} +function parseGlyphPBF (data) { + return new pbf(data).readFields(readFontstacks, []); +} +const GLYPH_PBF_BORDER = border; + +function potpack(boxes) { + + // calculate total box area and maximum box width + let area = 0; + let maxWidth = 0; + + for (const box of boxes) { + area += box.w * box.h; + maxWidth = Math.max(maxWidth, box.w); + } + + // sort the boxes for insertion by height, descending + boxes.sort((a, b) => b.h - a.h); + + // aim for a squarish resulting container, + // slightly adjusted for sub-100% space utilization + const startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth); + + // start with a single empty space, unbounded at the bottom + const spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}]; + + let width = 0; + let height = 0; + + for (const box of boxes) { + // look through spaces backwards so that we check smaller spaces first + for (let i = spaces.length - 1; i >= 0; i--) { + const space = spaces[i]; + + // look for empty spaces that can accommodate the current box + if (box.w > space.w || box.h > space.h) continue; + + // found the space; add the box to its top-left corner + // |-------|-------| + // | box | | + // |_______| | + // | space | + // |_______________| + box.x = space.x; + box.y = space.y; + + height = Math.max(height, box.y + box.h); + width = Math.max(width, box.x + box.w); + + if (box.w === space.w && box.h === space.h) { + // space matches the box exactly; remove it + const last = spaces.pop(); + if (i < spaces.length) spaces[i] = last; + + } else if (box.h === space.h) { + // space matches the box height; update it accordingly + // |-------|---------------| + // | box | updated space | + // |_______|_______________| + space.x += box.w; + space.w -= box.w; + + } else if (box.w === space.w) { + // space matches the box width; update it accordingly + // |---------------| + // | box | + // |_______________| + // | updated space | + // |_______________| + space.y += box.h; + space.h -= box.h; + + } else { + // otherwise the box splits the space into two spaces + // |-------|-----------| + // | box | new space | + // |_______|___________| + // | updated space | + // |___________________| + spaces.push({ + x: space.x + box.w, + y: space.y, + w: space.w - box.w, + h: box.h + }); + space.y += box.h; + space.h -= box.h; + } + break; + } + } + + return { + w: width, // container width + h: height, // container height + fill: (area / (width * height)) || 0 // space utilization + }; +} + +const IMAGE_PADDING = 1; +class ImagePosition { + constructor(paddedRect, {pixelRatio, version, stretchX, stretchY, content}) { + this.paddedRect = paddedRect; + this.pixelRatio = pixelRatio; + this.stretchX = stretchX; + this.stretchY = stretchY; + this.content = content; + this.version = version; + } + get tl() { + return [ + this.paddedRect.x + IMAGE_PADDING, + this.paddedRect.y + IMAGE_PADDING + ]; + } + get br() { + return [ + this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING, + this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING + ]; + } + get tlbr() { + return this.tl.concat(this.br); + } + get displaySize() { + return [ + (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio, + (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio + ]; + } +} +class ImageAtlas { + constructor(icons, patterns) { + const iconPositions = {}, patternPositions = {}; + this.haveRenderCallbacks = []; + const bins = []; + this.addImages(icons, iconPositions, bins); + this.addImages(patterns, patternPositions, bins); + const {w, h} = potpack(bins); + const image = new RGBAImage({ + width: w || 1, + height: h || 1 + }); + for (const id in icons) { + const src = icons[id]; + const bin = iconPositions[id].paddedRect; + RGBAImage.copy(src.data, image, { + x: 0, + y: 0 + }, { + x: bin.x + IMAGE_PADDING, + y: bin.y + IMAGE_PADDING + }, src.data); + } + for (const id in patterns) { + const src = patterns[id]; + const bin = patternPositions[id].paddedRect; + const x = bin.x + IMAGE_PADDING, y = bin.y + IMAGE_PADDING, w = src.data.width, h = src.data.height; + RGBAImage.copy(src.data, image, { + x: 0, + y: 0 + }, { + x, + y + }, src.data); + RGBAImage.copy(src.data, image, { + x: 0, + y: h - 1 + }, { + x, + y: y - 1 + }, { + width: w, + height: 1 + }); + RGBAImage.copy(src.data, image, { + x: 0, + y: 0 + }, { + x, + y: y + h + }, { + width: w, + height: 1 + }); + RGBAImage.copy(src.data, image, { + x: w - 1, + y: 0 + }, { + x: x - 1, + y + }, { + width: 1, + height: h + }); + RGBAImage.copy(src.data, image, { + x: 0, + y: 0 + }, { + x: x + w, + y + }, { + width: 1, + height: h + }); + } + this.image = image; + this.iconPositions = iconPositions; + this.patternPositions = patternPositions; + } + addImages(images, positions, bins) { + for (const id in images) { + const src = images[id]; + const bin = { + x: 0, + y: 0, + w: src.data.width + 2 * IMAGE_PADDING, + h: src.data.height + 2 * IMAGE_PADDING + }; + bins.push(bin); + positions[id] = new ImagePosition(bin, src); + if (src.hasRenderCallback) { + this.haveRenderCallbacks.push(id); + } + } + } + patchUpdatedImages(imageManager, texture) { + imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks); + for (const name in imageManager.updatedImages) { + this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture); + this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture); + } + } + patchUpdatedImage(position, image, texture) { + if (!position || !image) + return; + if (position.version === image.version) + return; + position.version = image.version; + const [x, y] = position.tl; + texture.update(image.data, undefined, { + x, + y + }); + } +} +register('ImagePosition', ImagePosition); +register('ImageAtlas', ImageAtlas); + +const WritingMode = { + horizontal: 1, + vertical: 2, + horizontalOnly: 3 +}; +const SHAPING_DEFAULT_OFFSET = -17; +function isEmpty(positionedLines) { + for (const line of positionedLines) { + if (line.positionedGlyphs.length !== 0) { + return false; + } + } + return true; +} +const PUAbegin = 57344; +const PUAend = 63743; +class SectionOptions { + constructor() { + this.scale = 1; + this.fontStack = ''; + this.imageName = null; + } + static forText(scale, fontStack) { + const textOptions = new SectionOptions(); + textOptions.scale = scale || 1; + textOptions.fontStack = fontStack; + return textOptions; + } + static forImage(imageName) { + const imageOptions = new SectionOptions(); + imageOptions.imageName = imageName; + return imageOptions; + } +} +class TaggedString { + constructor() { + this.text = ''; + this.sectionIndex = []; + this.sections = []; + this.imageSectionID = null; + } + static fromFeature(text, defaultFontStack) { + const result = new TaggedString(); + for (let i = 0; i < text.sections.length; i++) { + const section = text.sections[i]; + if (!section.image) { + result.addTextSection(section, defaultFontStack); + } else { + result.addImageSection(section); + } + } + return result; + } + length() { + return this.text.length; + } + getSection(index) { + return this.sections[this.sectionIndex[index]]; + } + getSectionIndex(index) { + return this.sectionIndex[index]; + } + getCharCode(index) { + return this.text.charCodeAt(index); + } + verticalizePunctuation() { + this.text = verticalizePunctuation(this.text); + } + trim() { + let beginningWhitespace = 0; + for (let i = 0; i < this.text.length && whitespace[this.text.charCodeAt(i)]; i++) { + beginningWhitespace++; + } + let trailingWhitespace = this.text.length; + for (let i = this.text.length - 1; i >= 0 && i >= beginningWhitespace && whitespace[this.text.charCodeAt(i)]; i--) { + trailingWhitespace--; + } + this.text = this.text.substring(beginningWhitespace, trailingWhitespace); + this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace); + } + substring(start, end) { + const substring = new TaggedString(); + substring.text = this.text.substring(start, end); + substring.sectionIndex = this.sectionIndex.slice(start, end); + substring.sections = this.sections; + return substring; + } + toString() { + return this.text; + } + getMaxScale() { + return this.sectionIndex.reduce((max, index) => Math.max(max, this.sections[index].scale), 0); + } + addTextSection(section, defaultFontStack) { + this.text += section.text; + this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack)); + const index = this.sections.length - 1; + for (let i = 0; i < section.text.length; ++i) { + this.sectionIndex.push(index); + } + } + addImageSection(section) { + const imageName = section.image ? section.image.name : ''; + if (imageName.length === 0) { + warnOnce(`Can't add FormattedSection with an empty image.`); + return; + } + const nextImageSectionCharCode = this.getNextImageSectionCharCode(); + if (!nextImageSectionCharCode) { + warnOnce(`Reached maximum number of images ${ PUAend - PUAbegin + 2 }`); + return; + } + this.text += String.fromCharCode(nextImageSectionCharCode); + this.sections.push(SectionOptions.forImage(imageName)); + this.sectionIndex.push(this.sections.length - 1); + } + getNextImageSectionCharCode() { + if (!this.imageSectionID) { + this.imageSectionID = PUAbegin; + return this.imageSectionID; + } + if (this.imageSectionID >= PUAend) + return null; + return ++this.imageSectionID; + } +} +function breakLines(input, lineBreakPoints) { + const lines = []; + const text = input.text; + let start = 0; + for (const lineBreak of lineBreakPoints) { + lines.push(input.substring(start, lineBreak)); + start = lineBreak; + } + if (start < text.length) { + lines.push(input.substring(start, text.length)); + } + return lines; +} +function shapeText(text, glyphMap, glyphPositions, imagePositions, defaultFontStack, maxWidth, lineHeight, textAnchor, textJustify, spacing, translate, writingMode, allowVerticalPlacement, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom) { + const logicalInput = TaggedString.fromFeature(text, defaultFontStack); + if (writingMode === WritingMode.vertical) { + logicalInput.verticalizePunctuation(); + } + let lines; + const {processBidirectionalText, processStyledBidirectionalText} = plugin; + if (processBidirectionalText && logicalInput.sections.length === 1) { + lines = []; + const untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); + for (const line of untaggedLines) { + const taggedLine = new TaggedString(); + taggedLine.text = line; + taggedLine.sections = logicalInput.sections; + for (let i = 0; i < line.length; i++) { + taggedLine.sectionIndex.push(0); + } + lines.push(taggedLine); + } + } else if (processStyledBidirectionalText) { + lines = []; + const processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); + for (const line of processedLines) { + const taggedLine = new TaggedString(); + taggedLine.text = line[0]; + taggedLine.sectionIndex = line[1]; + taggedLine.sections = logicalInput.sections; + lines.push(taggedLine); + } + } else { + lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); + } + const positionedLines = []; + const shaping = { + positionedLines, + text: logicalInput.toString(), + top: translate[1], + bottom: translate[1], + left: translate[0], + right: translate[0], + writingMode, + iconsInText: false, + verticalizable: false + }; + shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom); + if (isEmpty(positionedLines)) + return false; + return shaping; +} +const whitespace = { + [9]: true, + [10]: true, + [11]: true, + [12]: true, + [13]: true, + [32]: true +}; +const breakable = { + [10]: true, + [32]: true, + [38]: true, + [40]: true, + [41]: true, + [43]: true, + [45]: true, + [47]: true, + [173]: true, + [183]: true, + [8203]: true, + [8208]: true, + [8211]: true, + [8231]: true +}; +function getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize) { + if (!section.imageName) { + const positions = glyphMap[section.fontStack]; + const glyph = positions && positions[codePoint]; + if (!glyph) + return 0; + return glyph.metrics.advance * section.scale + spacing; + } else { + const imagePosition = imagePositions[section.imageName]; + if (!imagePosition) + return 0; + return imagePosition.displaySize[0] * section.scale * ONE_EM / layoutTextSize + spacing; + } +} +function determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize) { + let totalWidth = 0; + for (let index = 0; index < logicalInput.length(); index++) { + const section = logicalInput.getSection(index); + totalWidth += getGlyphAdvance(logicalInput.getCharCode(index), section, glyphMap, imagePositions, spacing, layoutTextSize); + } + const lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); + return totalWidth / lineCount; +} +function calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) { + const raggedness = Math.pow(lineWidth - targetWidth, 2); + if (isLastBreak) { + if (lineWidth < targetWidth) { + return raggedness / 2; + } else { + return raggedness * 2; + } + } + return raggedness + Math.abs(penalty) * penalty; +} +function calculatePenalty(codePoint, nextCodePoint, penalizableIdeographicBreak) { + let penalty = 0; + if (codePoint === 10) { + penalty -= 10000; + } + if (penalizableIdeographicBreak) { + penalty += 150; + } + if (codePoint === 40 || codePoint === 65288) { + penalty += 50; + } + if (nextCodePoint === 41 || nextCodePoint === 65289) { + penalty += 50; + } + return penalty; +} +function evaluateBreak(breakIndex, breakX, targetWidth, potentialBreaks, penalty, isLastBreak) { + let bestPriorBreak = null; + let bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); + for (const potentialBreak of potentialBreaks) { + const lineWidth = breakX - potentialBreak.x; + const breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; + if (breakBadness <= bestBreakBadness) { + bestPriorBreak = potentialBreak; + bestBreakBadness = breakBadness; + } + } + return { + index: breakIndex, + x: breakX, + priorBreak: bestPriorBreak, + badness: bestBreakBadness + }; +} +function leastBadBreaks(lastLineBreak) { + if (!lastLineBreak) { + return []; + } + return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); +} +function determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize) { + if (symbolPlacement !== 'point') + return []; + if (!logicalInput) + return []; + const potentialLineBreaks = []; + const targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize); + const hasServerSuggestedBreakpoints = logicalInput.text.indexOf('\u200B') >= 0; + let currentX = 0; + for (let i = 0; i < logicalInput.length(); i++) { + const section = logicalInput.getSection(i); + const codePoint = logicalInput.getCharCode(i); + if (!whitespace[codePoint]) + currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize); + if (i < logicalInput.length() - 1) { + const ideographicBreak = charAllowsIdeographicBreaking(codePoint); + if (breakable[codePoint] || ideographicBreak || section.imageName) { + potentialLineBreaks.push(evaluateBreak(i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints), false)); + } + } + } + return leastBadBreaks(evaluateBreak(logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true)); +} +function getAnchorAlignment(anchor) { + let horizontalAlign = 0.5, verticalAlign = 0.5; + switch (anchor) { + case 'right': + case 'top-right': + case 'bottom-right': + horizontalAlign = 1; + break; + case 'left': + case 'top-left': + case 'bottom-left': + horizontalAlign = 0; + break; + } + switch (anchor) { + case 'bottom': + case 'bottom-right': + case 'bottom-left': + verticalAlign = 1; + break; + case 'top': + case 'top-right': + case 'top-left': + verticalAlign = 0; + break; + } + return { + horizontalAlign, + verticalAlign + }; +} +function shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom) { + let x = 0; + let y = SHAPING_DEFAULT_OFFSET; + let maxLineLength = 0; + let maxLineHeight = 0; + const justify = textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; + let lineIndex = 0; + for (const line of lines) { + line.trim(); + const lineMaxScale = line.getMaxScale(); + const maxLineOffset = (lineMaxScale - 1) * ONE_EM; + const positionedLine = { + positionedGlyphs: [], + lineOffset: 0 + }; + shaping.positionedLines[lineIndex] = positionedLine; + const positionedGlyphs = positionedLine.positionedGlyphs; + let lineOffset = 0; + if (!line.length()) { + y += lineHeight; + ++lineIndex; + continue; + } + for (let i = 0; i < line.length(); i++) { + const section = line.getSection(i); + const sectionIndex = line.getSectionIndex(i); + const codePoint = line.getCharCode(i); + let baselineOffset = 0; + let metrics = null; + let rect = null; + let imageName = null; + let verticalAdvance = ONE_EM; + const vertical = !(writingMode === WritingMode.horizontal || !allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint) || allowVerticalPlacement && (whitespace[codePoint] || charInComplexShapingScript(codePoint))); + if (!section.imageName) { + const positions = glyphPositions[section.fontStack]; + const glyphPosition = positions && positions[codePoint]; + if (glyphPosition && glyphPosition.rect) { + rect = glyphPosition.rect; + metrics = glyphPosition.metrics; + } else { + const glyphs = glyphMap[section.fontStack]; + const glyph = glyphs && glyphs[codePoint]; + if (!glyph) + continue; + metrics = glyph.metrics; + } + baselineOffset = (lineMaxScale - section.scale) * ONE_EM; + } else { + const imagePosition = imagePositions[section.imageName]; + if (!imagePosition) + continue; + imageName = section.imageName; + shaping.iconsInText = shaping.iconsInText || true; + rect = imagePosition.paddedRect; + const size = imagePosition.displaySize; + section.scale = section.scale * ONE_EM / layoutTextSizeThisZoom; + metrics = { + width: size[0], + height: size[1], + left: IMAGE_PADDING, + top: -GLYPH_PBF_BORDER, + advance: vertical ? size[1] : size[0], + localGlyph: false + }; + const imageOffset = ONE_EM - size[1] * section.scale; + baselineOffset = maxLineOffset + imageOffset; + verticalAdvance = metrics.advance; + const offset = vertical ? size[0] * section.scale - ONE_EM * lineMaxScale : size[1] * section.scale - ONE_EM * lineMaxScale; + if (offset > 0 && offset > lineOffset) { + lineOffset = offset; + } + } + if (!vertical) { + positionedGlyphs.push({ + glyph: codePoint, + imageName, + x, + y: y + baselineOffset, + vertical, + scale: section.scale, + localGlyph: metrics.localGlyph, + fontStack: section.fontStack, + sectionIndex, + metrics, + rect + }); + x += metrics.advance * section.scale + spacing; + } else { + shaping.verticalizable = true; + positionedGlyphs.push({ + glyph: codePoint, + imageName, + x, + y: y + baselineOffset, + vertical, + scale: section.scale, + localGlyph: metrics.localGlyph, + fontStack: section.fontStack, + sectionIndex, + metrics, + rect + }); + x += verticalAdvance * section.scale + spacing; + } + } + if (positionedGlyphs.length !== 0) { + const lineLength = x - spacing; + maxLineLength = Math.max(lineLength, maxLineLength); + justifyLine(positionedGlyphs, 0, positionedGlyphs.length - 1, justify, lineOffset); + } + x = 0; + const currentLineHeight = lineHeight * lineMaxScale + lineOffset; + positionedLine.lineOffset = Math.max(lineOffset, maxLineOffset); + y += currentLineHeight; + maxLineHeight = Math.max(currentLineHeight, maxLineHeight); + ++lineIndex; + } + const height = y - SHAPING_DEFAULT_OFFSET; + const {horizontalAlign, verticalAlign} = getAnchorAlignment(textAnchor); + align$1(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, height, lines.length); + shaping.top += -verticalAlign * height; + shaping.bottom = shaping.top + height; + shaping.left += -horizontalAlign * maxLineLength; + shaping.right = shaping.left + maxLineLength; +} +function justifyLine(positionedGlyphs, start, end, justify, lineOffset) { + if (!justify && !lineOffset) + return; + const lastPositionedGlyph = positionedGlyphs[end]; + const lastAdvance = lastPositionedGlyph.metrics.advance * lastPositionedGlyph.scale; + const lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; + for (let j = start; j <= end; j++) { + positionedGlyphs[j].x -= lineIndent; + positionedGlyphs[j].y += lineOffset; + } +} +function align$1(positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, blockHeight, lineCount) { + const shiftX = (justify - horizontalAlign) * maxLineLength; + let shiftY = 0; + if (maxLineHeight !== lineHeight) { + shiftY = -blockHeight * verticalAlign - SHAPING_DEFAULT_OFFSET; + } else { + shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; + } + for (const line of positionedLines) { + for (const positionedGlyph of line.positionedGlyphs) { + positionedGlyph.x += shiftX; + positionedGlyph.y += shiftY; + } + } +} +function shapeIcon(image, iconOffset, iconAnchor) { + const {horizontalAlign, verticalAlign} = getAnchorAlignment(iconAnchor); + const dx = iconOffset[0]; + const dy = iconOffset[1]; + const x1 = dx - image.displaySize[0] * horizontalAlign; + const x2 = x1 + image.displaySize[0]; + const y1 = dy - image.displaySize[1] * verticalAlign; + const y2 = y1 + image.displaySize[1]; + return { + image, + top: y1, + bottom: y2, + left: x1, + right: x2 + }; +} +function fitIconToText(shapedIcon, shapedText, textFit, padding, iconOffset, fontScale) { + const image = shapedIcon.image; + let collisionPadding; + if (image.content) { + const content = image.content; + const pixelRatio = image.pixelRatio || 1; + collisionPadding = [ + content[0] / pixelRatio, + content[1] / pixelRatio, + image.displaySize[0] - content[2] / pixelRatio, + image.displaySize[1] - content[3] / pixelRatio + ]; + } + const textLeft = shapedText.left * fontScale; + const textRight = shapedText.right * fontScale; + let top, right, bottom, left; + if (textFit === 'width' || textFit === 'both') { + left = iconOffset[0] + textLeft - padding[3]; + right = iconOffset[0] + textRight + padding[1]; + } else { + left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2; + right = left + image.displaySize[0]; + } + const textTop = shapedText.top * fontScale; + const textBottom = shapedText.bottom * fontScale; + if (textFit === 'height' || textFit === 'both') { + top = iconOffset[1] + textTop - padding[0]; + bottom = iconOffset[1] + textBottom + padding[2]; + } else { + top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2; + bottom = top + image.displaySize[1]; + } + return { + image, + top, + right, + bottom, + left, + collisionPadding + }; +} + +class Anchor extends pointGeometry { + constructor(x, y, angle, segment) { + super(x, y); + this.angle = angle; + if (segment !== undefined) { + this.segment = segment; + } + } + clone() { + return new Anchor(this.x, this.y, this.angle, this.segment); + } +} +register('Anchor', Anchor); + +function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) { + if (anchor.segment === undefined) + return true; + let p = anchor; + let index = anchor.segment + 1; + let anchorDistance = 0; + while (anchorDistance > -labelLength / 2) { + index--; + if (index < 0) + return false; + anchorDistance -= line[index].dist(p); + p = line[index]; + } + anchorDistance += line[index].dist(line[index + 1]); + index++; + const recentCorners = []; + let recentAngleDelta = 0; + while (anchorDistance < labelLength / 2) { + const prev = line[index - 1]; + const current = line[index]; + const next = line[index + 1]; + if (!next) + return false; + let angleDelta = prev.angleTo(current) - current.angleTo(next); + angleDelta = Math.abs((angleDelta + 3 * Math.PI) % (Math.PI * 2) - Math.PI); + recentCorners.push({ + distance: anchorDistance, + angleDelta + }); + recentAngleDelta += angleDelta; + while (anchorDistance - recentCorners[0].distance > windowSize) { + recentAngleDelta -= recentCorners.shift().angleDelta; + } + if (recentAngleDelta > maxAngle) + return false; + index++; + anchorDistance += current.dist(next); + } + return true; +} + +function getLineLength(line) { + let lineLength = 0; + for (let k = 0; k < line.length - 1; k++) { + lineLength += line[k].dist(line[k + 1]); + } + return lineLength; +} +function getAngleWindowSize(shapedText, glyphSize, boxScale) { + return shapedText ? 3 / 5 * glyphSize * boxScale : 0; +} +function getShapedLabelLength(shapedText, shapedIcon) { + return Math.max(shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0); +} +function getCenterAnchor(line, maxAngle, shapedText, shapedIcon, glyphSize, boxScale) { + const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); + const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale; + let prevDistance = 0; + const centerDistance = getLineLength(line) / 2; + for (let i = 0; i < line.length - 1; i++) { + const a = line[i], b = line[i + 1]; + const segmentDistance = a.dist(b); + if (prevDistance + segmentDistance > centerDistance) { + const t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t); + const anchor = new Anchor(x, y, b.angleTo(a), i); + anchor._round(); + if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { + return anchor; + } else { + return; + } + } + prevDistance += segmentDistance; + } +} +function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) { + const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); + const shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon); + const labelLength = shapedLabelLength * boxScale; + const isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; + if (spacing - labelLength < spacing / 4) { + spacing = labelLength + spacing / 4; + } + const fixedExtraOffset = glyphSize * 2; + const offset = !isLineContinued ? (shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling % spacing : spacing / 2 * overscaling % spacing; + return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); +} +function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { + const halfLabelLength = labelLength / 2; + const lineLength = getLineLength(line); + let distance = 0, markedDistance = offset - spacing; + let anchors = []; + for (let i = 0; i < line.length - 1; i++) { + const a = line[i], b = line[i + 1]; + const segmentDist = a.dist(b), angle = b.angleTo(a); + while (markedDistance + spacing < distance + segmentDist) { + markedDistance += spacing; + const t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t); + if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && markedDistance - halfLabelLength >= 0 && markedDistance + halfLabelLength <= lineLength) { + const anchor = new Anchor(x, y, angle, i); + anchor._round(); + if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { + anchors.push(anchor); + } + } + } + distance += segmentDist; + } + if (!placeAtMiddle && !anchors.length && !isLineContinued) { + anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); + } + return anchors; +} + +function clipLine(lines, x1, y1, x2, y2) { + const clippedLines = []; + for (let l = 0; l < lines.length; l++) { + const line = lines[l]; + let clippedLine; + for (let i = 0; i < line.length - 1; i++) { + let p0 = line[i]; + let p1 = line[i + 1]; + if (p0.x < x1 && p1.x < x1) { + continue; + } else if (p0.x < x1) { + p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); + } else if (p1.x < x1) { + p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); + } + if (p0.y < y1 && p1.y < y1) { + continue; + } else if (p0.y < y1) { + p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); + } else if (p1.y < y1) { + p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); + } + if (p0.x >= x2 && p1.x >= x2) { + continue; + } else if (p0.x >= x2) { + p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); + } else if (p1.x >= x2) { + p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); + } + if (p0.y >= y2 && p1.y >= y2) { + continue; + } else if (p0.y >= y2) { + p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); + } else if (p1.y >= y2) { + p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); + } + if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { + clippedLine = [p0]; + clippedLines.push(clippedLine); + } + clippedLine.push(p1); + } + } + return clippedLines; +} + +function loadGlyphRange (fontstack, range, urlTemplate, requestManager, callback) { + const begin = range * 256; + const end = begin + 255; + const request = requestManager.transformRequest(requestManager.normalizeGlyphsURL(urlTemplate).replace('{fontstack}', fontstack).replace('{range}', `${ begin }-${ end }`), ResourceType.Glyphs); + getArrayBuffer(request, (err, data) => { + if (err) { + callback(err); + } else if (data) { + const glyphs = {}; + for (const glyph of parseGlyphPBF(data)) { + glyphs[glyph.id] = glyph; + } + callback(null, glyphs); + } + }); +} + +var tinySdf = TinySDF; +var default_1$1 = TinySDF; +var INF = 100000000000000000000; +function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) { + this.fontSize = fontSize || 24; + this.buffer = buffer === undefined ? 3 : buffer; + this.cutoff = cutoff || 0.25; + this.fontFamily = fontFamily || 'sans-serif'; + this.fontWeight = fontWeight || 'normal'; + this.radius = radius || 8; + var size = this.size = this.fontSize + this.buffer * 2; + var gridSize = size + this.buffer * 2; + this.canvas = document.createElement('canvas'); + this.canvas.width = this.canvas.height = size; + this.ctx = this.canvas.getContext('2d'); + this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily; + this.ctx.textBaseline = 'middle'; + this.ctx.textAlign = 'left'; + this.ctx.fillStyle = 'black'; + this.gridOuter = new Float64Array(gridSize * gridSize); + this.gridInner = new Float64Array(gridSize * gridSize); + this.f = new Float64Array(size); + this.z = new Float64Array(size + 1); + this.v = new Uint16Array(size); + this.middle = Math.round(size / 2 * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1)); +} +function prepareGrids(imgData, width, height, glyphWidth, glyphHeight, gridOuter, gridInner) { + gridOuter.fill(INF, 0, width * height); + gridInner.fill(0, 0, width * height); + var offset = (width - glyphWidth) / 2; + for (var y = 0; y < glyphHeight; y++) { + for (var x = 0; x < glyphWidth; x++) { + var j = (y + offset) * width + x + offset; + var a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; + if (a === 1) { + gridOuter[j] = 0; + gridInner[j] = INF; + } else if (a === 0) { + gridOuter[j] = INF; + gridInner[j] = 0; + } else { + var b = Math.max(0, 0.5 - a); + var c = Math.max(0, a - 0.5); + gridOuter[j] = b * b; + gridInner[j] = c * c; + } + } + } +} +function extractAlpha(alphaChannel, width, height, gridOuter, gridInner, radius, cutoff) { + for (var i = 0; i < width * height; i++) { + var d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]); + alphaChannel[i] = Math.round(255 - 255 * (d / radius + cutoff)); + } +} +TinySDF.prototype._draw = function (char, getMetrics) { + var textMetrics = this.ctx.measureText(char); + var advance = textMetrics.width; + var doubleBuffer = 2 * this.buffer; + var width, glyphWidth, height, glyphHeight, top; + var imgTop, imgLeft; + if (getMetrics && textMetrics.actualBoundingBoxLeft !== undefined) { + top = Math.floor(textMetrics.actualBoundingBoxAscent) - this.middle; + imgTop = Math.max(0, this.middle - Math.ceil(textMetrics.actualBoundingBoxAscent)); + imgLeft = this.buffer; + glyphWidth = Math.min(this.size, Math.ceil(textMetrics.actualBoundingBoxRight - textMetrics.actualBoundingBoxLeft)); + glyphHeight = Math.min(this.size - imgTop, Math.ceil(textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent)); + width = glyphWidth + doubleBuffer; + height = glyphHeight + doubleBuffer; + } else { + width = glyphWidth = this.size; + height = glyphHeight = this.size; + top = 0; + imgTop = imgLeft = 0; + } + var imgData; + if (glyphWidth && glyphHeight) { + this.ctx.clearRect(imgLeft, imgTop, glyphWidth, glyphHeight); + this.ctx.fillText(char, this.buffer, this.middle); + imgData = this.ctx.getImageData(imgLeft, imgTop, glyphWidth, glyphHeight); + } + var alphaChannel = new Uint8ClampedArray(width * height); + prepareGrids(imgData, width, height, glyphWidth, glyphHeight, this.gridOuter, this.gridInner); + edt(this.gridOuter, width, height, this.f, this.v, this.z); + edt(this.gridInner, width, height, this.f, this.v, this.z); + extractAlpha(alphaChannel, width, height, this.gridOuter, this.gridInner, this.radius, this.cutoff); + return { + data: alphaChannel, + metrics: { + width: glyphWidth, + height: glyphHeight, + sdfWidth: width, + sdfHeight: height, + top: top, + left: 0, + advance: advance, + fontAscent: textMetrics.fontBoundingBoxAscent + } + }; +}; +TinySDF.prototype.draw = function (char) { + return this._draw(char, false).data; +}; +TinySDF.prototype.drawWithMetrics = function (char) { + return this._draw(char, true); +}; +function edt(data, width, height, f, v, z) { + for (var x = 0; x < width; x++) + edt1d(data, x, width, height, f, v, z); + for (var y = 0; y < height; y++) + edt1d(data, y * width, 1, width, f, v, z); +} +function edt1d(grid, offset, stride, length, f, v, z) { + var q, k, s, r; + v[0] = 0; + z[0] = -INF; + z[1] = INF; + for (q = 0; q < length; q++) + f[q] = grid[offset + q * stride]; + for (q = 1, k = 0, s = 0; q < length; q++) { + do { + r = v[k]; + s = (f[q] - f[r] + q * q - r * r) / (q - r) / 2; + } while (s <= z[k] && --k > -1); + k++; + v[k] = q; + z[k] = s; + z[k + 1] = INF; + } + for (q = 0, k = 0; q < length; q++) { + while (z[k + 1] < q) + k++; + r = v[k]; + grid[offset + q * stride] = f[r] + (q - r) * (q - r); + } +} +tinySdf.default = default_1$1; + +const SDF_SCALE = 2; +const LocalGlyphMode = { + none: 0, + ideographs: 1, + all: 2 +}; +class GlyphManager { + constructor(requestManager, localGlyphMode, localFontFamily) { + this.requestManager = requestManager; + this.localGlyphMode = localGlyphMode; + this.localFontFamily = localFontFamily; + this.entries = {}; + this.localGlyphs = { + '200': {}, + '400': {}, + '500': {}, + '900': {} + }; + } + setURL(url) { + this.url = url; + } + getGlyphs(glyphs, callback) { + const all = []; + for (const stack in glyphs) { + for (const id of glyphs[stack]) { + all.push({ + stack, + id + }); + } + } + asyncAll(all, ({stack, id}, callback) => { + let entry = this.entries[stack]; + if (!entry) { + entry = this.entries[stack] = { + glyphs: {}, + requests: {}, + ranges: {} + }; + } + let glyph = entry.glyphs[id]; + if (glyph !== undefined) { + callback(null, { + stack, + id, + glyph + }); + return; + } + glyph = this._tinySDF(entry, stack, id); + if (glyph) { + entry.glyphs[id] = glyph; + callback(null, { + stack, + id, + glyph + }); + return; + } + const range = Math.floor(id / 256); + if (range * 256 > 65535) { + callback(new Error('glyphs > 65535 not supported')); + return; + } + if (entry.ranges[range]) { + callback(null, { + stack, + id, + glyph + }); + return; + } + let requests = entry.requests[range]; + if (!requests) { + requests = entry.requests[range] = []; + GlyphManager.loadGlyphRange(stack, range, this.url, this.requestManager, (err, response) => { + if (response) { + for (const id in response) { + if (!this._doesCharSupportLocalGlyph(+id)) { + entry.glyphs[+id] = response[+id]; + } + } + entry.ranges[range] = true; + } + for (const cb of requests) { + cb(err, response); + } + delete entry.requests[range]; + }); + } + requests.push((err, result) => { + if (err) { + callback(err); + } else if (result) { + callback(null, { + stack, + id, + glyph: result[id] || null + }); + } + }); + }, (err, glyphs) => { + if (err) { + callback(err); + } else if (glyphs) { + const result = {}; + for (const {stack, id, glyph} of glyphs) { + (result[stack] || (result[stack] = {}))[id] = glyph && { + id: glyph.id, + bitmap: glyph.bitmap.clone(), + metrics: glyph.metrics + }; + } + callback(null, result); + } + }); + } + _doesCharSupportLocalGlyph(id) { + if (this.localGlyphMode === LocalGlyphMode.none) { + return false; + } else if (this.localGlyphMode === LocalGlyphMode.all) { + return !!this.localFontFamily; + } else { + return !!this.localFontFamily && (unicodeBlockLookup['CJK Unified Ideographs'](id) || unicodeBlockLookup['Hangul Syllables'](id) || unicodeBlockLookup['Hiragana'](id) || unicodeBlockLookup['Katakana'](id)); + } + } + _tinySDF(entry, stack, id) { + const family = this.localFontFamily; + if (!family) { + return; + } + if (!this._doesCharSupportLocalGlyph(id)) { + return; + } + let tinySDF = entry.tinySDF; + if (!tinySDF) { + let fontWeight = '400'; + if (/bold/i.test(stack)) { + fontWeight = '900'; + } else if (/medium/i.test(stack)) { + fontWeight = '500'; + } else if (/light/i.test(stack)) { + fontWeight = '200'; + } + tinySDF = entry.tinySDF = new GlyphManager.TinySDF(24 * SDF_SCALE, 3 * SDF_SCALE, 8 * SDF_SCALE, 0.25, family, fontWeight); + } + if (this.localGlyphs[tinySDF.fontWeight][id]) { + return this.localGlyphs[tinySDF.fontWeight][id]; + } + const {data, metrics} = tinySDF.drawWithMetrics(String.fromCharCode(id)); + const {fontAscent, sdfWidth, sdfHeight, width, height, left, top, advance} = metrics; + const ascent = fontAscent ? fontAscent / SDF_SCALE : 17; + const baselineAdjustment = ascent - 9; + const glyph = this.localGlyphs[tinySDF.fontWeight][id] = { + id, + bitmap: new AlphaImage({ + width: sdfWidth, + height: sdfHeight + }, data), + metrics: { + width: width / SDF_SCALE, + height: height / SDF_SCALE, + left: left / SDF_SCALE, + top: top / SDF_SCALE - baselineAdjustment, + advance: advance / SDF_SCALE, + localGlyph: true + } + }; + return glyph; + } +} +GlyphManager.loadGlyphRange = loadGlyphRange; +GlyphManager.TinySDF = tinySdf; + +const border$1 = IMAGE_PADDING; +function getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit) { + const quads = []; + const image = shapedIcon.image; + const pixelRatio = image.pixelRatio; + const imageWidth = image.paddedRect.w - 2 * border$1; + const imageHeight = image.paddedRect.h - 2 * border$1; + const iconWidth = shapedIcon.right - shapedIcon.left; + const iconHeight = shapedIcon.bottom - shapedIcon.top; + const stretchX = image.stretchX || [[ + 0, + imageWidth + ]]; + const stretchY = image.stretchY || [[ + 0, + imageHeight + ]]; + const reduceRanges = (sum, range) => sum + range[1] - range[0]; + const stretchWidth = stretchX.reduce(reduceRanges, 0); + const stretchHeight = stretchY.reduce(reduceRanges, 0); + const fixedWidth = imageWidth - stretchWidth; + const fixedHeight = imageHeight - stretchHeight; + let stretchOffsetX = 0; + let stretchContentWidth = stretchWidth; + let stretchOffsetY = 0; + let stretchContentHeight = stretchHeight; + let fixedOffsetX = 0; + let fixedContentWidth = fixedWidth; + let fixedOffsetY = 0; + let fixedContentHeight = fixedHeight; + if (image.content && hasIconTextFit) { + const content = image.content; + stretchOffsetX = sumWithinRange(stretchX, 0, content[0]); + stretchOffsetY = sumWithinRange(stretchY, 0, content[1]); + stretchContentWidth = sumWithinRange(stretchX, content[0], content[2]); + stretchContentHeight = sumWithinRange(stretchY, content[1], content[3]); + fixedOffsetX = content[0] - stretchOffsetX; + fixedOffsetY = content[1] - stretchOffsetY; + fixedContentWidth = content[2] - content[0] - stretchContentWidth; + fixedContentHeight = content[3] - content[1] - stretchContentHeight; + } + const makeBox = (left, top, right, bottom) => { + const leftEm = getEmOffset(left.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left); + const leftPx = getPxOffset(left.fixed - fixedOffsetX, fixedContentWidth, left.stretch, stretchWidth); + const topEm = getEmOffset(top.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top); + const topPx = getPxOffset(top.fixed - fixedOffsetY, fixedContentHeight, top.stretch, stretchHeight); + const rightEm = getEmOffset(right.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left); + const rightPx = getPxOffset(right.fixed - fixedOffsetX, fixedContentWidth, right.stretch, stretchWidth); + const bottomEm = getEmOffset(bottom.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top); + const bottomPx = getPxOffset(bottom.fixed - fixedOffsetY, fixedContentHeight, bottom.stretch, stretchHeight); + const tl = new pointGeometry(leftEm, topEm); + const tr = new pointGeometry(rightEm, topEm); + const br = new pointGeometry(rightEm, bottomEm); + const bl = new pointGeometry(leftEm, bottomEm); + const pixelOffsetTL = new pointGeometry(leftPx / pixelRatio, topPx / pixelRatio); + const pixelOffsetBR = new pointGeometry(rightPx / pixelRatio, bottomPx / pixelRatio); + const angle = iconRotate * Math.PI / 180; + if (angle) { + const sin = Math.sin(angle), cos = Math.cos(angle), matrix = [ + cos, + -sin, + sin, + cos + ]; + tl._matMult(matrix); + tr._matMult(matrix); + bl._matMult(matrix); + br._matMult(matrix); + } + const x1 = left.stretch + left.fixed; + const x2 = right.stretch + right.fixed; + const y1 = top.stretch + top.fixed; + const y2 = bottom.stretch + bottom.fixed; + const subRect = { + x: image.paddedRect.x + border$1 + x1, + y: image.paddedRect.y + border$1 + y1, + w: x2 - x1, + h: y2 - y1 + }; + const minFontScaleX = fixedContentWidth / pixelRatio / iconWidth; + const minFontScaleY = fixedContentHeight / pixelRatio / iconHeight; + return { + tl, + tr, + bl, + br, + tex: subRect, + writingMode: undefined, + glyphOffset: [ + 0, + 0 + ], + sectionIndex: 0, + pixelOffsetTL, + pixelOffsetBR, + minFontScaleX, + minFontScaleY, + isSDF: isSDFIcon + }; + }; + if (!hasIconTextFit || !image.stretchX && !image.stretchY) { + quads.push(makeBox({ + fixed: 0, + stretch: -1 + }, { + fixed: 0, + stretch: -1 + }, { + fixed: 0, + stretch: imageWidth + 1 + }, { + fixed: 0, + stretch: imageHeight + 1 + })); + } else { + const xCuts = stretchZonesToCuts(stretchX, fixedWidth, stretchWidth); + const yCuts = stretchZonesToCuts(stretchY, fixedHeight, stretchHeight); + for (let xi = 0; xi < xCuts.length - 1; xi++) { + const x1 = xCuts[xi]; + const x2 = xCuts[xi + 1]; + for (let yi = 0; yi < yCuts.length - 1; yi++) { + const y1 = yCuts[yi]; + const y2 = yCuts[yi + 1]; + quads.push(makeBox(x1, y1, x2, y2)); + } + } + } + return quads; +} +function sumWithinRange(ranges, min, max) { + let sum = 0; + for (const range of ranges) { + sum += Math.max(min, Math.min(max, range[1])) - Math.max(min, Math.min(max, range[0])); + } + return sum; +} +function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) { + const cuts = [{ + fixed: -border$1, + stretch: 0 + }]; + for (const [c1, c2] of stretchZones) { + const last = cuts[cuts.length - 1]; + cuts.push({ + fixed: c1 - last.stretch, + stretch: last.stretch + }); + cuts.push({ + fixed: c1 - last.stretch, + stretch: last.stretch + (c2 - c1) + }); + } + cuts.push({ + fixed: fixedSize + border$1, + stretch: stretchSize + }); + return cuts; +} +function getEmOffset(stretchOffset, stretchSize, iconSize, iconOffset) { + return stretchOffset / stretchSize * iconSize + iconOffset; +} +function getPxOffset(fixedOffset, fixedSize, stretchOffset, stretchSize) { + return fixedOffset - fixedSize * stretchOffset / stretchSize; +} +function getGlyphQuads(anchor, shaping, textOffset, layer, alongLine, feature, imageMap, allowVerticalPlacement) { + const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180; + const quads = []; + for (const line of shaping.positionedLines) { + for (const positionedGlyph of line.positionedGlyphs) { + if (!positionedGlyph.rect) + continue; + const textureRect = positionedGlyph.rect || {}; + const glyphPadding = 1; + let rectBuffer = GLYPH_PBF_BORDER + glyphPadding; + let isSDF = true; + let pixelRatio = 1; + let lineOffset = 0; + const rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical; + const halfAdvance = positionedGlyph.metrics.advance * positionedGlyph.scale / 2; + if (allowVerticalPlacement && shaping.verticalizable) { + const scaledGlyphOffset = (positionedGlyph.scale - 1) * ONE_EM; + const imageOffset = (ONE_EM - positionedGlyph.metrics.width * positionedGlyph.scale) / 2; + lineOffset = line.lineOffset / 2 - (positionedGlyph.imageName ? -imageOffset : scaledGlyphOffset); + } + if (positionedGlyph.imageName) { + const image = imageMap[positionedGlyph.imageName]; + isSDF = image.sdf; + pixelRatio = image.pixelRatio; + rectBuffer = IMAGE_PADDING / pixelRatio; + } + const glyphOffset = alongLine ? [ + positionedGlyph.x + halfAdvance, + positionedGlyph.y + ] : [ + 0, + 0 + ]; + let builtInOffset = alongLine ? [ + 0, + 0 + ] : [ + positionedGlyph.x + halfAdvance + textOffset[0], + positionedGlyph.y + textOffset[1] - lineOffset + ]; + let verticalizedLabelOffset = [ + 0, + 0 + ]; + if (rotateVerticalGlyph) { + verticalizedLabelOffset = builtInOffset; + builtInOffset = [ + 0, + 0 + ]; + } + const x1 = (positionedGlyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0]; + const y1 = (-positionedGlyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1]; + const x2 = x1 + textureRect.w * positionedGlyph.scale / (pixelRatio * (positionedGlyph.localGlyph ? SDF_SCALE : 1)); + const y2 = y1 + textureRect.h * positionedGlyph.scale / (pixelRatio * (positionedGlyph.localGlyph ? SDF_SCALE : 1)); + const tl = new pointGeometry(x1, y1); + const tr = new pointGeometry(x2, y1); + const bl = new pointGeometry(x1, y2); + const br = new pointGeometry(x2, y2); + if (rotateVerticalGlyph) { + const center = new pointGeometry(-halfAdvance, halfAdvance - SHAPING_DEFAULT_OFFSET); + const verticalRotation = -Math.PI / 2; + const xHalfWidthOffsetCorrection = ONE_EM / 2 - halfAdvance; + const yImageOffsetCorrection = positionedGlyph.imageName ? xHalfWidthOffsetCorrection : 0; + const halfWidthOffsetCorrection = new pointGeometry(5 - SHAPING_DEFAULT_OFFSET - xHalfWidthOffsetCorrection, -yImageOffsetCorrection); + const verticalOffsetCorrection = new pointGeometry(...verticalizedLabelOffset); + tl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); + tr._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); + bl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); + br._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); + } + if (textRotate) { + const sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [ + cos, + -sin, + sin, + cos + ]; + tl._matMult(matrix); + tr._matMult(matrix); + bl._matMult(matrix); + br._matMult(matrix); + } + const pixelOffsetTL = new pointGeometry(0, 0); + const pixelOffsetBR = new pointGeometry(0, 0); + const minFontScaleX = 0; + const minFontScaleY = 0; + quads.push({ + tl, + tr, + bl, + br, + tex: textureRect, + writingMode: shaping.writingMode, + glyphOffset, + sectionIndex: positionedGlyph.sectionIndex, + isSDF, + pixelOffsetTL, + pixelOffsetBR, + minFontScaleX, + minFontScaleY + }); + } + } + return quads; +} + +class TinyQueue { + constructor(data = [], compare = defaultCompare$1) { + this.data = data; + this.length = this.data.length; + this.compare = compare; + if (this.length > 0) { + for (let i = (this.length >> 1) - 1; i >= 0; i--) + this._down(i); + } + } + push(item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + } + pop() { + if (this.length === 0) + return undefined; + const top = this.data[0]; + const bottom = this.data.pop(); + this.length--; + if (this.length > 0) { + this.data[0] = bottom; + this._down(0); + } + return top; + } + peek() { + return this.data[0]; + } + _up(pos) { + const {data, compare} = this; + const item = data[pos]; + while (pos > 0) { + const parent = pos - 1 >> 1; + const current = data[parent]; + if (compare(item, current) >= 0) + break; + data[pos] = current; + pos = parent; + } + data[pos] = item; + } + _down(pos) { + const {data, compare} = this; + const halfLength = this.length >> 1; + const item = data[pos]; + while (pos < halfLength) { + let left = (pos << 1) + 1; + let best = data[left]; + const right = left + 1; + if (right < this.length && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) + break; + data[pos] = best; + pos = left; + } + data[pos] = item; + } +} +function defaultCompare$1(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +function findPoleOfInaccessibility (polygonRings, precision = 1, debug = false) { + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + const outerRing = polygonRings[0]; + for (let i = 0; i < outerRing.length; i++) { + const p = outerRing[i]; + if (!i || p.x < minX) + minX = p.x; + if (!i || p.y < minY) + minY = p.y; + if (!i || p.x > maxX) + maxX = p.x; + if (!i || p.y > maxY) + maxY = p.y; + } + const width = maxX - minX; + const height = maxY - minY; + const cellSize = Math.min(width, height); + let h = cellSize / 2; + const cellQueue = new TinyQueue([], compareMax); + if (cellSize === 0) + return new pointGeometry(minX, minY); + for (let x = minX; x < maxX; x += cellSize) { + for (let y = minY; y < maxY; y += cellSize) { + cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); + } + } + let bestCell = getCentroidCell(polygonRings); + let numProbes = cellQueue.length; + while (cellQueue.length) { + const cell = cellQueue.pop(); + if (cell.d > bestCell.d || !bestCell.d) { + bestCell = cell; + if (debug) + console.log('found best %d after %d probes', Math.round(10000 * cell.d) / 10000, numProbes); + } + if (cell.max - bestCell.d <= precision) + continue; + h = cell.h / 2; + cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); + numProbes += 4; + } + if (debug) { + console.log(`num probes: ${ numProbes }`); + console.log(`best distance: ${ bestCell.d }`); + } + return bestCell.p; +} +function compareMax(a, b) { + return b.max - a.max; +} +function Cell(x, y, h, polygon) { + this.p = new pointGeometry(x, y); + this.h = h; + this.d = pointToPolygonDist(this.p, polygon); + this.max = this.d + this.h * Math.SQRT2; +} +function pointToPolygonDist(p, polygon) { + let inside = false; + let minDistSq = Infinity; + for (let k = 0; k < polygon.length; k++) { + const ring = polygon[k]; + for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + const a = ring[i]; + const b = ring[j]; + if (a.y > p.y !== b.y > p.y && p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x) + inside = !inside; + minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); + } + } + return (inside ? 1 : -1) * Math.sqrt(minDistSq); +} +function getCentroidCell(polygon) { + let area = 0; + let x = 0; + let y = 0; + const points = polygon[0]; + for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) { + const a = points[i]; + const b = points[j]; + const f = a.x * b.y - b.x * a.y; + x += (a.x + b.x) * f; + y += (a.y + b.y) * f; + area += f * 3; + } + return new Cell(x / area, y / area, 0, polygon); +} + +const baselineOffset = 7; +const INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY; +function evaluateVariableOffset(anchor, offset) { + function fromRadialOffset(anchor, radialOffset) { + let x = 0, y = 0; + if (radialOffset < 0) + radialOffset = 0; + const hypotenuse = radialOffset / Math.sqrt(2); + switch (anchor) { + case 'top-right': + case 'top-left': + y = hypotenuse - baselineOffset; + break; + case 'bottom-right': + case 'bottom-left': + y = -hypotenuse + baselineOffset; + break; + case 'bottom': + y = -radialOffset + baselineOffset; + break; + case 'top': + y = radialOffset - baselineOffset; + break; + } + switch (anchor) { + case 'top-right': + case 'bottom-right': + x = -hypotenuse; + break; + case 'top-left': + case 'bottom-left': + x = hypotenuse; + break; + case 'left': + x = radialOffset; + break; + case 'right': + x = -radialOffset; + break; + } + return [ + x, + y + ]; + } + function fromTextOffset(anchor, offsetX, offsetY) { + let x = 0, y = 0; + offsetX = Math.abs(offsetX); + offsetY = Math.abs(offsetY); + switch (anchor) { + case 'top-right': + case 'top-left': + case 'top': + y = offsetY - baselineOffset; + break; + case 'bottom-right': + case 'bottom-left': + case 'bottom': + y = -offsetY + baselineOffset; + break; + } + switch (anchor) { + case 'top-right': + case 'bottom-right': + case 'right': + x = -offsetX; + break; + case 'top-left': + case 'bottom-left': + case 'left': + x = offsetX; + break; + } + return [ + x, + y + ]; + } + return offset[1] !== INVALID_TEXT_OFFSET ? fromTextOffset(anchor, offset[0], offset[1]) : fromRadialOffset(anchor, offset[0]); +} +function performSymbolLayout(bucket, glyphMap, glyphPositions, imageMap, imagePositions, showCollisionBoxes, canonical, tileZoom) { + bucket.createArrays(); + const tileSize = 512 * bucket.overscaling; + bucket.tilePixelRatio = EXTENT$1 / tileSize; + bucket.compareText = {}; + bucket.iconsNeedLinear = false; + const layout = bucket.layers[0].layout; + const unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values; + const sizes = {}; + if (bucket.textSizeData.kind === 'composite') { + const {minZoom, maxZoom} = bucket.textSizeData; + sizes.compositeTextSizes = [ + unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical), + unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical) + ]; + } + if (bucket.iconSizeData.kind === 'composite') { + const {minZoom, maxZoom} = bucket.iconSizeData; + sizes.compositeIconSizes = [ + unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical), + unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical) + ]; + } + sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(tileZoom + 1), canonical); + sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(tileZoom + 1), canonical); + sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18), canonical); + const lineHeight = layout.get('text-line-height') * ONE_EM; + const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; + const keepUpright = layout.get('text-keep-upright'); + const textSize = layout.get('text-size'); + for (const feature of bucket.features) { + const fontstack = layout.get('text-font').evaluate(feature, {}, canonical).join(','); + const layoutTextSizeThisZoom = textSize.evaluate(feature, {}, canonical); + const layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}, canonical); + const layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}, canonical); + const shapedTextOrientations = { + horizontal: {}, + vertical: undefined + }; + const text = feature.text; + let textOffset = [ + 0, + 0 + ]; + if (text) { + const unformattedText = text.toString(); + const spacing = layout.get('text-letter-spacing').evaluate(feature, {}, canonical) * ONE_EM; + const spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0; + const textAnchor = layout.get('text-anchor').evaluate(feature, {}, canonical); + const variableTextAnchor = layout.get('text-variable-anchor'); + if (!variableTextAnchor) { + const radialOffset = layout.get('text-radial-offset').evaluate(feature, {}, canonical); + if (radialOffset) { + textOffset = evaluateVariableOffset(textAnchor, [ + radialOffset * ONE_EM, + INVALID_TEXT_OFFSET + ]); + } else { + textOffset = layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM); + } + } + let textJustify = textAlongLine ? 'center' : layout.get('text-justify').evaluate(feature, {}, canonical); + const symbolPlacement = layout.get('symbol-placement'); + const maxWidth = symbolPlacement === 'point' ? layout.get('text-max-width').evaluate(feature, {}, canonical) * ONE_EM : 0; + const addVerticalShapingForPointLabelIfNeeded = () => { + if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) { + shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, 'left', spacingIfAllowed, textOffset, WritingMode.vertical, true, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); + } + }; + if (!textAlongLine && variableTextAnchor) { + const justifications = textJustify === 'auto' ? variableTextAnchor.map(a => getAnchorJustification(a)) : [textJustify]; + let singleLine = false; + for (let i = 0; i < justifications.length; i++) { + const justification = justifications[i]; + if (shapedTextOrientations.horizontal[justification]) + continue; + if (singleLine) { + shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0]; + } else { + const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); + if (shaping) { + shapedTextOrientations.horizontal[justification] = shaping; + singleLine = shaping.positionedLines.length === 1; + } + } + } + addVerticalShapingForPointLabelIfNeeded(); + } else { + if (textJustify === 'auto') { + textJustify = getAnchorJustification(textAnchor); + } + const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); + if (shaping) + shapedTextOrientations.horizontal[textJustify] = shaping; + addVerticalShapingForPointLabelIfNeeded(); + if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) { + shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.vertical, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); + } + } + } + let shapedIcon; + let isSDFIcon = false; + if (feature.icon && feature.icon.name) { + const image = imageMap[feature.icon.name]; + if (image) { + shapedIcon = shapeIcon(imagePositions[feature.icon.name], layout.get('icon-offset').evaluate(feature, {}, canonical), layout.get('icon-anchor').evaluate(feature, {}, canonical)); + isSDFIcon = image.sdf; + if (bucket.sdfIcons === undefined) { + bucket.sdfIcons = image.sdf; + } else if (bucket.sdfIcons !== image.sdf) { + warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); + } + if (image.pixelRatio !== bucket.pixelRatio) { + bucket.iconsNeedLinear = true; + } else if (layout.get('icon-rotate').constantOr(1) !== 0) { + bucket.iconsNeedLinear = true; + } + } + } + const shapedText = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical; + bucket.iconsInText = shapedText ? shapedText.iconsInText : false; + if (shapedText || shapedIcon) { + addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical); + } + } + if (showCollisionBoxes) { + bucket.generateCollisionDebugBuffers(tileZoom, bucket.collisionBoxArray); + } +} +function getAnchorJustification(anchor) { + switch (anchor) { + case 'right': + case 'top-right': + case 'bottom-right': + return 'right'; + case 'left': + case 'top-left': + case 'bottom-left': + return 'left'; + } + return 'center'; +} +function addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical) { + let textMaxSize = sizes.textMaxSize.evaluate(feature, {}, canonical); + if (textMaxSize === undefined) { + textMaxSize = layoutTextSize; + } + const layout = bucket.layers[0].layout; + const iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical); + const defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal); + const glyphSize = ONE_EM, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = degToRad(layout.get('text-max-angle')), textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2; + const iconTextFit = layout.get('icon-text-fit'); + let verticallyShapedIcon; + if (shapedIcon && iconTextFit !== 'none') { + if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) { + verticallyShapedIcon = fitIconToText(shapedIcon, shapedTextOrientations.vertical, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale); + } + if (defaultHorizontalShaping) { + shapedIcon = fitIconToText(shapedIcon, defaultHorizontalShaping, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale); + } + } + const addSymbolAtAnchor = (line, anchor) => { + if (anchor.x < 0 || anchor.x >= EXTENT$1 || anchor.y < 0 || anchor.y >= EXTENT$1) { + return; + } + addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize); + }; + if (symbolPlacement === 'line') { + for (const line of clipLine(feature.geometry, 0, 0, EXTENT$1, EXTENT$1)) { + const anchors = getAnchors(line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT$1); + for (const anchor of anchors) { + const shapedText = defaultHorizontalShaping; + if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) { + addSymbolAtAnchor(line, anchor); + } + } + } + } else if (symbolPlacement === 'line-center') { + for (const line of feature.geometry) { + if (line.length > 1) { + const anchor = getCenterAnchor(line, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale); + if (anchor) { + addSymbolAtAnchor(line, anchor); + } + } + } + } else if (feature.type === 'Polygon') { + for (const polygon of classifyRings(feature.geometry, 0)) { + const poi = findPoleOfInaccessibility(polygon, 16); + addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0)); + } + } else if (feature.type === 'LineString') { + for (const line of feature.geometry) { + addSymbolAtAnchor(line, new Anchor(line[0].x, line[0].y, 0)); + } + } else if (feature.type === 'Point') { + for (const points of feature.geometry) { + for (const point of points) { + addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0)); + } + } + } +} +const MAX_GLYPH_ICON_SIZE = 255; +const MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR; +function addTextVertices(bucket, anchor, shapedText, imageMap, layer, textAlongLine, feature, textOffset, lineArray, writingMode, placementTypes, placedTextSymbolIndices, placedIconIndex, sizes, canonical) { + const glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement); + const sizeData = bucket.textSizeData; + let textSizeData = null; + if (sizeData.kind === 'source') { + textSizeData = [SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {}, canonical)]; + if (textSizeData[0] > MAX_PACKED_SIZE) { + warnOnce(`${ bucket.layerIds[0] }: Value for "text-size" is >= ${ MAX_GLYPH_ICON_SIZE }. Reduce your "text-size".`); + } + } else if (sizeData.kind === 'composite') { + textSizeData = [ + SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}, canonical), + SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}, canonical) + ]; + if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) { + warnOnce(`${ bucket.layerIds[0] }: Value for "text-size" is >= ${ MAX_GLYPH_ICON_SIZE }. Reduce your "text-size".`); + } + } + bucket.addSymbols(bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength, placedIconIndex, canonical); + for (const placementType of placementTypes) { + placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1; + } + return glyphQuads.length * 4; +} +function getDefaultHorizontalShaping(horizontalShaping) { + for (const justification in horizontalShaping) { + return horizontalShaping[justification]; + } + return null; +} +function evaluateBoxCollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, rotate) { + let y1 = shaped.top; + let y2 = shaped.bottom; + let x1 = shaped.left; + let x2 = shaped.right; + const collisionPadding = shaped.collisionPadding; + if (collisionPadding) { + x1 -= collisionPadding[0]; + y1 -= collisionPadding[1]; + x2 += collisionPadding[2]; + y2 += collisionPadding[3]; + } + if (rotate) { + const tl = new pointGeometry(x1, y1); + const tr = new pointGeometry(x2, y1); + const bl = new pointGeometry(x1, y2); + const br = new pointGeometry(x2, y2); + const rotateRadians = degToRad(rotate); + tl._rotate(rotateRadians); + tr._rotate(rotateRadians); + bl._rotate(rotateRadians); + br._rotate(rotateRadians); + x1 = Math.min(tl.x, tr.x, bl.x, br.x); + x2 = Math.max(tl.x, tr.x, bl.x, br.x); + y1 = Math.min(tl.y, tr.y, bl.y, br.y); + y2 = Math.max(tl.y, tr.y, bl.y, br.y); + } + collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, padding, featureIndex, sourceLayerIndex, bucketIndex); + return collisionBoxArray.length - 1; +} +function evaluateCircleCollisionFeature(shaped) { + if (shaped.collisionPadding) { + shaped.top -= shaped.collisionPadding[1]; + shaped.bottom += shaped.collisionPadding[3]; + } + const height = shaped.bottom - shaped.top; + return height > 0 ? Math.max(10, height) : null; +} +function addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, layer, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize) { + const lineArray = bucket.addToLineVertexArray(anchor, line); + let textBoxIndex, iconBoxIndex, verticalTextBoxIndex, verticalIconBoxIndex; + let textCircle, verticalTextCircle, verticalIconCircle; + let numIconVertices = 0; + let numVerticalIconVertices = 0; + let numHorizontalGlyphVertices = 0; + let numVerticalGlyphVertices = 0; + let placedIconSymbolIndex = -1; + let verticalPlacedIconSymbolIndex = -1; + const placedTextSymbolIndices = {}; + let key = murmurhashJs(''); + let textOffset0 = 0; + let textOffset1 = 0; + if (layer._unevaluatedLayout.getValue('text-radial-offset') === undefined) { + [textOffset0, textOffset1] = layer.layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM); + } else { + textOffset0 = layer.layout.get('text-radial-offset').evaluate(feature, {}, canonical) * ONE_EM; + textOffset1 = INVALID_TEXT_OFFSET; + } + if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) { + const verticalShaping = shapedTextOrientations.vertical; + if (textAlongLine) { + verticalTextCircle = evaluateCircleCollisionFeature(verticalShaping); + if (verticallyShapedIcon) { + verticalIconCircle = evaluateCircleCollisionFeature(verticallyShapedIcon); + } + } else { + const textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); + const verticalTextRotation = textRotation + 90; + verticalTextBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textBoxScale, textPadding, verticalTextRotation); + if (verticallyShapedIcon) { + verticalIconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconBoxScale, iconPadding, verticalTextRotation); + } + } + } + if (shapedIcon) { + const iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {}, canonical); + const hasIconTextFit = layer.layout.get('icon-text-fit') !== 'none'; + const iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit); + const verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined; + iconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconRotate); + numIconVertices = iconQuads.length * 4; + const sizeData = bucket.iconSizeData; + let iconSizeData = null; + if (sizeData.kind === 'source') { + iconSizeData = [SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {}, canonical)]; + if (iconSizeData[0] > MAX_PACKED_SIZE) { + warnOnce(`${ bucket.layerIds[0] }: Value for "icon-size" is >= ${ MAX_GLYPH_ICON_SIZE }. Reduce your "icon-size".`); + } + } else if (sizeData.kind === 'composite') { + iconSizeData = [ + SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}, canonical), + SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}, canonical) + ]; + if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) { + warnOnce(`${ bucket.layerIds[0] }: Value for "icon-size" is >= ${ MAX_GLYPH_ICON_SIZE }. Reduce your "icon-size".`); + } + } + bucket.addSymbols(bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, false, anchor, lineArray.lineStartIndex, lineArray.lineLength, -1, canonical); + placedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1; + if (verticalIconQuads) { + numVerticalIconVertices = verticalIconQuads.length * 4; + bucket.addSymbols(bucket.icon, verticalIconQuads, iconSizeData, iconOffset, iconAlongLine, feature, WritingMode.vertical, anchor, lineArray.lineStartIndex, lineArray.lineLength, -1, canonical); + verticalPlacedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1; + } + } + for (const justification in shapedTextOrientations.horizontal) { + const shaping = shapedTextOrientations.horizontal[justification]; + if (!textBoxIndex) { + key = murmurhashJs(shaping.text); + if (textAlongLine) { + textCircle = evaluateCircleCollisionFeature(shaping); + } else { + const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); + textBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textRotate); + } + } + const singleLine = shaping.positionedLines.length === 1; + numHorizontalGlyphVertices += addTextVertices(bucket, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, singleLine ? Object.keys(shapedTextOrientations.horizontal) : [justification], placedTextSymbolIndices, placedIconSymbolIndex, sizes, canonical); + if (singleLine) { + break; + } + } + if (shapedTextOrientations.vertical) { + numVerticalGlyphVertices += addTextVertices(bucket, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices, verticalPlacedIconSymbolIndex, sizes, canonical); + } + let collisionCircleDiameter = -1; + const getCollisionCircleHeight = (diameter, prevHeight) => { + return diameter ? Math.max(diameter, prevHeight) : prevHeight; + }; + collisionCircleDiameter = getCollisionCircleHeight(textCircle, collisionCircleDiameter); + collisionCircleDiameter = getCollisionCircleHeight(verticalTextCircle, collisionCircleDiameter); + collisionCircleDiameter = getCollisionCircleHeight(verticalIconCircle, collisionCircleDiameter); + const useRuntimeCollisionCircles = collisionCircleDiameter > -1 ? 1 : 0; + if (useRuntimeCollisionCircles) + collisionCircleDiameter *= layoutTextSize / ONE_EM; + if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) + warnOnce('Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907'); + if (feature.sortKey !== undefined) { + bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey); + } + bucket.symbolInstances.emplaceBack(anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, placedIconSymbolIndex, verticalPlacedIconSymbolIndex, key, textBoxIndex !== undefined ? textBoxIndex : bucket.collisionBoxArray.length, textBoxIndex !== undefined ? textBoxIndex + 1 : bucket.collisionBoxArray.length, verticalTextBoxIndex !== undefined ? verticalTextBoxIndex : bucket.collisionBoxArray.length, verticalTextBoxIndex !== undefined ? verticalTextBoxIndex + 1 : bucket.collisionBoxArray.length, iconBoxIndex !== undefined ? iconBoxIndex : bucket.collisionBoxArray.length, iconBoxIndex !== undefined ? iconBoxIndex + 1 : bucket.collisionBoxArray.length, verticalIconBoxIndex ? verticalIconBoxIndex : bucket.collisionBoxArray.length, verticalIconBoxIndex ? verticalIconBoxIndex + 1 : bucket.collisionBoxArray.length, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, numVerticalIconVertices, useRuntimeCollisionCircles, 0, textBoxScale, textOffset0, textOffset1, collisionCircleDiameter); +} +function anchorIsTooClose(bucket, text, repeatDistance, anchor) { + const compareText = bucket.compareText; + if (!(text in compareText)) { + compareText[text] = []; + } else { + const otherAnchors = compareText[text]; + for (let k = otherAnchors.length - 1; k >= 0; k--) { + if (anchor.dist(otherAnchors[k]) < repeatDistance) { + return true; + } + } + } + compareText[text].push(anchor); + return false; +} + +const vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; +const shaderOpacityAttributes = [{ + name: 'a_fade_opacity', + components: 1, + type: 'Uint8', + offset: 0 + }]; +function addVertex$1(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, isSDF, pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) { + const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0; + const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0; + array.emplaceBack(anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32), tx, ty, (aSizeX << 1) + (isSDF ? 1 : 0), aSizeY, pixelOffsetX * 16, pixelOffsetY * 16, minFontScaleX * 256, minFontScaleY * 256); +} +function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) { + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); + dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); +} +function containsRTLText(formattedText) { + for (const section of formattedText.sections) { + if (stringContainsRTLText(section.text)) { + return true; + } + } + return false; +} +class SymbolBuffers { + constructor(programConfigurations) { + this.layoutVertexArray = new StructArrayLayout4i4ui4i24(); + this.indexArray = new StructArrayLayout3ui6(); + this.programConfigurations = programConfigurations; + this.segments = new SegmentVector(); + this.dynamicLayoutVertexArray = new StructArrayLayout3f12(); + this.opacityVertexArray = new StructArrayLayout1ul4(); + this.placedSymbolArray = new PlacedSymbolArray(); + } + isEmpty() { + return this.layoutVertexArray.length === 0 && this.indexArray.length === 0 && this.dynamicLayoutVertexArray.length === 0 && this.opacityVertexArray.length === 0; + } + upload(context, dynamicIndexBuffer, upload, update) { + if (this.isEmpty()) { + return; + } + if (upload) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); + this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); + this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true); + this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true); + this.opacityVertexBuffer.itemSize = 1; + } + if (upload || update) { + this.programConfigurations.upload(context); + } + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + this.dynamicLayoutVertexBuffer.destroy(); + this.opacityVertexBuffer.destroy(); + } +} +register('SymbolBuffers', SymbolBuffers); +class CollisionBuffers { + constructor(LayoutArray, layoutAttributes, IndexArray) { + this.layoutVertexArray = new LayoutArray(); + this.layoutAttributes = layoutAttributes; + this.indexArray = new IndexArray(); + this.segments = new SegmentVector(); + this.collisionVertexArray = new StructArrayLayout2ub2f12(); + this.collisionVertexArrayExt = new StructArrayLayout3f12(); + } + upload(context) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes); + this.indexBuffer = context.createIndexBuffer(this.indexArray); + this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true); + this.collisionVertexBufferExt = context.createVertexBuffer(this.collisionVertexArrayExt, collisionVertexAttributesExt.members, true); + } + destroy() { + if (!this.layoutVertexBuffer) + return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.segments.destroy(); + this.collisionVertexBuffer.destroy(); + this.collisionVertexBufferExt.destroy(); + } +} +register('CollisionBuffers', CollisionBuffers); +class SymbolBucket { + constructor(options) { + this.collisionBoxArray = options.collisionBoxArray; + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.pixelRatio = options.pixelRatio; + this.sourceLayerIndex = options.sourceLayerIndex; + this.hasPattern = false; + this.hasRTLText = false; + this.sortKeyRanges = []; + this.collisionCircleArray = []; + this.placementInvProjMatrix = identity([]); + this.placementViewportMatrix = identity([]); + const layer = this.layers[0]; + const unevaluatedLayoutValues = layer._unevaluatedLayout._values; + this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); + this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); + const layout = this.layers[0].layout; + const sortKey = layout.get('symbol-sort-key'); + const zOrder = layout.get('symbol-z-order'); + this.canOverlap = layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || layout.get('text-ignore-placement') || layout.get('icon-ignore-placement'); + this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; + const zOrderByViewportY = zOrder === 'viewport-y' || zOrder === 'auto' && !this.sortFeaturesByKey; + this.sortFeaturesByY = zOrderByViewportY && this.canOverlap; + if (layout.get('symbol-placement') === 'point') { + this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]); + } + this.stateDependentLayerIds = this.layers.filter(l => l.isStateDependent()).map(l => l.id); + this.sourceID = options.sourceID; + } + createArrays() { + this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^text/.test(property))); + this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^icon/.test(property))); + this.glyphOffsetArray = new GlyphOffsetArray(); + this.lineVertexArray = new SymbolLineVertexArray(); + this.symbolInstances = new SymbolInstanceArray(); + } + calculateGlyphDependencies(text, stack, textAlongLine, allowVerticalPlacement, doesAllowVerticalWritingMode) { + for (let i = 0; i < text.length; i++) { + stack[text.charCodeAt(i)] = true; + if ((textAlongLine || allowVerticalPlacement) && doesAllowVerticalWritingMode) { + const verticalChar = verticalizedCharacterMap[text.charAt(i)]; + if (verticalChar) { + stack[verticalChar.charCodeAt(0)] = true; + } + } + } + } + populate(features, options, canonical) { + const layer = this.layers[0]; + const layout = layer.layout; + const textFont = layout.get('text-font'); + const textField = layout.get('text-field'); + const iconImage = layout.get('icon-image'); + const hasText = (textField.value.kind !== 'constant' || textField.value.value instanceof Formatted && !textField.value.value.isEmpty() || textField.value.value.toString().length > 0) && (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); + const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0; + const symbolSortKey = layout.get('symbol-sort-key'); + this.features = []; + if (!hasText && !hasIcon) { + return; + } + const icons = options.iconDependencies; + const stacks = options.glyphDependencies; + const availableImages = options.availableImages; + const globalProperties = new EvaluationParameters(this.zoom); + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = layer._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) { + continue; + } + if (!needGeometry) + evaluationFeature.geometry = loadGeometry(feature); + let text; + if (hasText) { + const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages); + const formattedText = Formatted.factory(resolvedTokens); + if (containsRTLText(formattedText)) { + this.hasRTLText = true; + } + if (!this.hasRTLText || getRTLTextPluginStatus() === 'unavailable' || this.hasRTLText && plugin.isParsed()) { + text = transformText$1(formattedText, layer, evaluationFeature); + } + } + let icon; + if (hasIcon) { + const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages); + if (resolvedTokens instanceof ResolvedImage) { + icon = resolvedTokens; + } else { + icon = ResolvedImage.fromString(resolvedTokens); + } + } + if (!text && !icon) { + continue; + } + const sortKey = this.sortFeaturesByKey ? symbolSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; + const symbolFeature = { + id, + text, + icon, + index, + sourceLayerIndex, + geometry: evaluationFeature.geometry, + properties: feature.properties, + type: vectorTileFeatureTypes$2[feature.type], + sortKey + }; + this.features.push(symbolFeature); + if (icon) { + icons[icon.name] = true; + } + if (text) { + const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(','); + const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; + this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0; + for (const section of text.sections) { + if (!section.image) { + const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); + const sectionFont = section.fontStack || fontStack; + const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; + this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); + } else { + icons[section.image.name] = true; + } + } + } + } + if (layout.get('symbol-placement') === 'line') { + this.features = mergeLines(this.features); + } + if (this.sortFeaturesByKey) { + this.features.sort((a, b) => { + return a.sortKey - b.sortKey; + }); + } + } + update(states, vtLayer, imagePositions) { + if (!this.stateDependentLayers.length) + return; + this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); + this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); + } + isEmpty() { + return this.symbolInstances.length === 0 && !this.hasRTLText; + } + uploadPending() { + return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; + } + upload(context) { + if (!this.uploaded && this.hasDebugData()) { + this.textCollisionBox.upload(context); + this.iconCollisionBox.upload(context); + } + this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload); + this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload); + this.uploaded = true; + } + destroyDebugData() { + this.textCollisionBox.destroy(); + this.iconCollisionBox.destroy(); + } + destroy() { + this.text.destroy(); + this.icon.destroy(); + if (this.hasDebugData()) { + this.destroyDebugData(); + } + } + addToLineVertexArray(anchor, line) { + const lineStartIndex = this.lineVertexArray.length; + if (anchor.segment !== undefined) { + let sumForwardLength = anchor.dist(line[anchor.segment + 1]); + let sumBackwardLength = anchor.dist(line[anchor.segment]); + const vertices = {}; + for (let i = anchor.segment + 1; i < line.length; i++) { + vertices[i] = { + x: line[i].x, + y: line[i].y, + tileUnitDistanceFromAnchor: sumForwardLength + }; + if (i < line.length - 1) { + sumForwardLength += line[i + 1].dist(line[i]); + } + } + for (let i = anchor.segment || 0; i >= 0; i--) { + vertices[i] = { + x: line[i].x, + y: line[i].y, + tileUnitDistanceFromAnchor: sumBackwardLength + }; + if (i > 0) { + sumBackwardLength += line[i - 1].dist(line[i]); + } + } + for (let i = 0; i < line.length; i++) { + const vertex = vertices[i]; + this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); + } + } + return { + lineStartIndex, + lineLength: this.lineVertexArray.length - lineStartIndex + }; + } + addSymbols(arrays, quads, sizeVertex, lineOffset, alongLine, feature, writingMode, labelAnchor, lineStartIndex, lineLength, associatedIconIndex, canonical) { + const indexArray = arrays.indexArray; + const layoutVertexArray = arrays.layoutVertexArray; + const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined); + const glyphOffsetArrayStart = this.glyphOffsetArray.length; + const vertexStartIndex = segment.vertexLength; + const angle = this.allowVerticalPlacement && writingMode === WritingMode.vertical ? Math.PI / 2 : 0; + const sections = feature.text && feature.text.sections; + for (let i = 0; i < quads.length; i++) { + const {tl, tr, bl, br, tex, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex} = quads[i]; + const index = segment.vertexLength; + const y = glyphOffset[1]; + addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); + addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); + addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); + addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); + addDynamicAttributes(arrays.dynamicLayoutVertexArray, labelAnchor, angle); + indexArray.emplaceBack(index, index + 1, index + 2); + indexArray.emplaceBack(index + 1, index + 2, index + 3); + segment.vertexLength += 4; + segment.primitiveLength += 2; + this.glyphOffsetArray.emplaceBack(glyphOffset[0]); + if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) { + arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, canonical, sections && sections[sectionIndex]); + } + } + arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, labelAnchor.segment, sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode, 0, false, 0, associatedIconIndex); + } + _commitLayoutVertex(array, point, anchorX, anchorY, extrude) { + array.emplaceBack(point.x, point.y, anchorX, anchorY, Math.round(extrude.x), Math.round(extrude.y)); + } + _addCollisionDebugVertices(box, scale, arrays, boxAnchorPoint, symbolInstance) { + const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); + const index = segment.vertexLength; + const anchorX = symbolInstance.anchorX; + const anchorY = symbolInstance.anchorY; + for (let i = 0; i < 4; i++) { + arrays.collisionVertexArray.emplaceBack(0, 0, 0, 0); + } + arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, -box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, -box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, box.padding); + this._commitLayoutVertex(arrays.layoutVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(box.x1, box.y1)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(box.x2, box.y1)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(box.x2, box.y2)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(box.x1, box.y2)); + segment.vertexLength += 4; + const indexArray = arrays.indexArray; + indexArray.emplaceBack(index, index + 1); + indexArray.emplaceBack(index + 1, index + 2); + indexArray.emplaceBack(index + 2, index + 3); + indexArray.emplaceBack(index + 3, index); + segment.primitiveLength += 4; + } + _addTextDebugCollisionBoxes(size, zoom, collisionBoxArray, startIndex, endIndex, instance) { + for (let b = startIndex; b < endIndex; b++) { + const box = collisionBoxArray.get(b); + const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); + this._addCollisionDebugVertices(box, scale, this.textCollisionBox, box.anchorPoint, instance); + } + } + _addIconDebugCollisionBoxes(size, zoom, collisionBoxArray, startIndex, endIndex, instance) { + for (let b = startIndex; b < endIndex; b++) { + const box = collisionBoxArray.get(b); + const scale = this.getSymbolInstanceIconSize(size, zoom, b); + this._addCollisionDebugVertices(box, scale, this.iconCollisionBox, box.anchorPoint, instance); + } + } + generateCollisionDebugBuffers(zoom, collisionBoxArray) { + if (this.hasDebugData()) { + this.destroyDebugData(); + } + this.textCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); + this.iconCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); + const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); + const textSize = evaluateSizeForZoom(this.textSizeData, zoom); + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); + this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); + this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance); + this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance); + } + } + getSymbolInstanceTextSize(textSize, instance, zoom, boxIndex) { + const symbolIndex = instance.rightJustifiedTextSymbolIndex >= 0 ? instance.rightJustifiedTextSymbolIndex : instance.centerJustifiedTextSymbolIndex >= 0 ? instance.centerJustifiedTextSymbolIndex : instance.leftJustifiedTextSymbolIndex >= 0 ? instance.leftJustifiedTextSymbolIndex : instance.verticalPlacedTextSymbolIndex >= 0 ? instance.verticalPlacedTextSymbolIndex : boxIndex; + const symbol = this.text.placedSymbolArray.get(symbolIndex); + const featureSize = evaluateSizeForFeature(this.textSizeData, textSize, symbol) / ONE_EM; + return this.tilePixelRatio * featureSize; + } + getSymbolInstanceIconSize(iconSize, zoom, index) { + const symbol = this.icon.placedSymbolArray.get(index); + const featureSize = evaluateSizeForFeature(this.iconSizeData, iconSize, symbol); + return this.tilePixelRatio * featureSize; + } + _commitDebugCollisionVertexUpdate(array, scale, padding) { + array.emplaceBack(scale, -padding, -padding); + array.emplaceBack(scale, padding, -padding); + array.emplaceBack(scale, padding, padding); + array.emplaceBack(scale, -padding, padding); + } + _updateTextDebugCollisionBoxes(size, zoom, collisionBoxArray, startIndex, endIndex, instance) { + for (let b = startIndex; b < endIndex; b++) { + const box = collisionBoxArray.get(b); + const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); + const array = this.textCollisionBox.collisionVertexArrayExt; + this._commitDebugCollisionVertexUpdate(array, scale, box.padding); + } + } + _updateIconDebugCollisionBoxes(size, zoom, collisionBoxArray, startIndex, endIndex) { + for (let b = startIndex; b < endIndex; b++) { + const box = collisionBoxArray.get(b); + const scale = this.getSymbolInstanceIconSize(size, zoom, b); + const array = this.iconCollisionBox.collisionVertexArrayExt; + this._commitDebugCollisionVertexUpdate(array, scale, box.padding); + } + } + updateCollisionDebugBuffers(zoom, collisionBoxArray) { + if (!this.hasDebugData()) { + return; + } + if (this.hasTextCollisionBoxData()) + this.textCollisionBox.collisionVertexArrayExt.clear(); + if (this.hasIconCollisionBoxData()) + this.iconCollisionBox.collisionVertexArrayExt.clear(); + const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); + const textSize = evaluateSizeForZoom(this.textSizeData, zoom); + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); + this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); + this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex); + this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex); + } + if (this.hasTextCollisionBoxData() && this.textCollisionBox.collisionVertexBufferExt) { + this.textCollisionBox.collisionVertexBufferExt.updateData(this.textCollisionBox.collisionVertexArrayExt); + } + if (this.hasIconCollisionBoxData() && this.iconCollisionBox.collisionVertexBufferExt) { + this.iconCollisionBox.collisionVertexBufferExt.updateData(this.iconCollisionBox.collisionVertexArrayExt); + } + } + _deserializeCollisionBoxesForSymbol(collisionBoxArray, textStartIndex, textEndIndex, verticalTextStartIndex, verticalTextEndIndex, iconStartIndex, iconEndIndex, verticalIconStartIndex, verticalIconEndIndex) { + const collisionArrays = {}; + for (let k = textStartIndex; k < textEndIndex; k++) { + const box = collisionBoxArray.get(k); + collisionArrays.textBox = { + x1: box.x1, + y1: box.y1, + x2: box.x2, + y2: box.y2, + padding: box.padding, + anchorPointX: box.anchorPointX, + anchorPointY: box.anchorPointY + }; + collisionArrays.textFeatureIndex = box.featureIndex; + break; + } + for (let k = verticalTextStartIndex; k < verticalTextEndIndex; k++) { + const box = collisionBoxArray.get(k); + collisionArrays.verticalTextBox = { + x1: box.x1, + y1: box.y1, + x2: box.x2, + y2: box.y2, + padding: box.padding, + anchorPointX: box.anchorPointX, + anchorPointY: box.anchorPointY + }; + collisionArrays.verticalTextFeatureIndex = box.featureIndex; + break; + } + for (let k = iconStartIndex; k < iconEndIndex; k++) { + const box = collisionBoxArray.get(k); + collisionArrays.iconBox = { + x1: box.x1, + y1: box.y1, + x2: box.x2, + y2: box.y2, + padding: box.padding, + anchorPointX: box.anchorPointX, + anchorPointY: box.anchorPointY + }; + collisionArrays.iconFeatureIndex = box.featureIndex; + break; + } + for (let k = verticalIconStartIndex; k < verticalIconEndIndex; k++) { + const box = collisionBoxArray.get(k); + collisionArrays.verticalIconBox = { + x1: box.x1, + y1: box.y1, + x2: box.x2, + y2: box.y2, + padding: box.padding, + anchorPointX: box.anchorPointX, + anchorPointY: box.anchorPointY + }; + collisionArrays.verticalIconFeatureIndex = box.featureIndex; + break; + } + return collisionArrays; + } + deserializeCollisionBoxes(collisionBoxArray) { + this.collisionArrays = []; + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex)); + } + } + hasTextData() { + return this.text.segments.get().length > 0; + } + hasIconData() { + return this.icon.segments.get().length > 0; + } + hasDebugData() { + return this.textCollisionBox && this.iconCollisionBox; + } + hasTextCollisionBoxData() { + return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0; + } + hasIconCollisionBoxData() { + return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0; + } + addIndicesForPlacedSymbol(iconOrText, placedSymbolIndex) { + const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex); + const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; + for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { + iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); + iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); + } + } + getSortedSymbolIndexes(angle) { + if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) { + return this.symbolInstanceIndexes; + } + const sin = Math.sin(angle); + const cos = Math.cos(angle); + const rotatedYs = []; + const featureIndexes = []; + const result = []; + for (let i = 0; i < this.symbolInstances.length; ++i) { + result.push(i); + const symbolInstance = this.symbolInstances.get(i); + rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0); + featureIndexes.push(symbolInstance.featureIndex); + } + result.sort((aIndex, bIndex) => { + return rotatedYs[aIndex] - rotatedYs[bIndex] || featureIndexes[bIndex] - featureIndexes[aIndex]; + }); + return result; + } + addToSortKeyRanges(symbolInstanceIndex, sortKey) { + const last = this.sortKeyRanges[this.sortKeyRanges.length - 1]; + if (last && last.sortKey === sortKey) { + last.symbolInstanceEnd = symbolInstanceIndex + 1; + } else { + this.sortKeyRanges.push({ + sortKey, + symbolInstanceStart: symbolInstanceIndex, + symbolInstanceEnd: symbolInstanceIndex + 1 + }); + } + } + sortFeatures(angle) { + if (!this.sortFeaturesByY) + return; + if (this.sortedAngle === angle) + return; + if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) + return; + this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle); + this.sortedAngle = angle; + this.text.indexArray.clear(); + this.icon.indexArray.clear(); + this.featureSortOrder = []; + for (const i of this.symbolInstanceIndexes) { + const symbolInstance = this.symbolInstances.get(i); + this.featureSortOrder.push(symbolInstance.featureIndex); + [ + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.leftJustifiedTextSymbolIndex + ].forEach((index, i, array) => { + if (index >= 0 && array.indexOf(index) === i) { + this.addIndicesForPlacedSymbol(this.text, index); + } + }); + if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex); + } + if (symbolInstance.placedIconSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex); + } + if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex); + } + } + if (this.text.indexBuffer) + this.text.indexBuffer.updateData(this.text.indexArray); + if (this.icon.indexBuffer) + this.icon.indexBuffer.updateData(this.icon.indexArray); + } +} +register('SymbolBucket', SymbolBucket, { + omit: [ + 'layers', + 'collisionBoxArray', + 'features', + 'compareText' + ] +}); +SymbolBucket.MAX_GLYPHS = 65535; +SymbolBucket.addDynamicAttributes = addDynamicAttributes; + +function resolveTokens(properties, text) { + return text.replace(/{([^{}]+)}/g, (match, key) => { + return key in properties ? String(properties[key]) : ''; + }); +} + +const layout$6 = new Properties({ + 'symbol-placement': new DataConstantProperty(spec['layout_symbol']['symbol-placement']), + 'symbol-spacing': new DataConstantProperty(spec['layout_symbol']['symbol-spacing']), + 'symbol-avoid-edges': new DataConstantProperty(spec['layout_symbol']['symbol-avoid-edges']), + 'symbol-sort-key': new DataDrivenProperty(spec['layout_symbol']['symbol-sort-key']), + 'symbol-z-order': new DataConstantProperty(spec['layout_symbol']['symbol-z-order']), + 'icon-allow-overlap': new DataConstantProperty(spec['layout_symbol']['icon-allow-overlap']), + 'icon-ignore-placement': new DataConstantProperty(spec['layout_symbol']['icon-ignore-placement']), + 'icon-optional': new DataConstantProperty(spec['layout_symbol']['icon-optional']), + 'icon-rotation-alignment': new DataConstantProperty(spec['layout_symbol']['icon-rotation-alignment']), + 'icon-size': new DataDrivenProperty(spec['layout_symbol']['icon-size']), + 'icon-text-fit': new DataConstantProperty(spec['layout_symbol']['icon-text-fit']), + 'icon-text-fit-padding': new DataConstantProperty(spec['layout_symbol']['icon-text-fit-padding']), + 'icon-image': new DataDrivenProperty(spec['layout_symbol']['icon-image']), + 'icon-rotate': new DataDrivenProperty(spec['layout_symbol']['icon-rotate']), + 'icon-padding': new DataConstantProperty(spec['layout_symbol']['icon-padding']), + 'icon-keep-upright': new DataConstantProperty(spec['layout_symbol']['icon-keep-upright']), + 'icon-offset': new DataDrivenProperty(spec['layout_symbol']['icon-offset']), + 'icon-anchor': new DataDrivenProperty(spec['layout_symbol']['icon-anchor']), + 'icon-pitch-alignment': new DataConstantProperty(spec['layout_symbol']['icon-pitch-alignment']), + 'text-pitch-alignment': new DataConstantProperty(spec['layout_symbol']['text-pitch-alignment']), + 'text-rotation-alignment': new DataConstantProperty(spec['layout_symbol']['text-rotation-alignment']), + 'text-field': new DataDrivenProperty(spec['layout_symbol']['text-field']), + 'text-font': new DataDrivenProperty(spec['layout_symbol']['text-font']), + 'text-size': new DataDrivenProperty(spec['layout_symbol']['text-size']), + 'text-max-width': new DataDrivenProperty(spec['layout_symbol']['text-max-width']), + 'text-line-height': new DataConstantProperty(spec['layout_symbol']['text-line-height']), + 'text-letter-spacing': new DataDrivenProperty(spec['layout_symbol']['text-letter-spacing']), + 'text-justify': new DataDrivenProperty(spec['layout_symbol']['text-justify']), + 'text-radial-offset': new DataDrivenProperty(spec['layout_symbol']['text-radial-offset']), + 'text-variable-anchor': new DataConstantProperty(spec['layout_symbol']['text-variable-anchor']), + 'text-anchor': new DataDrivenProperty(spec['layout_symbol']['text-anchor']), + 'text-max-angle': new DataConstantProperty(spec['layout_symbol']['text-max-angle']), + 'text-writing-mode': new DataConstantProperty(spec['layout_symbol']['text-writing-mode']), + 'text-rotate': new DataDrivenProperty(spec['layout_symbol']['text-rotate']), + 'text-padding': new DataConstantProperty(spec['layout_symbol']['text-padding']), + 'text-keep-upright': new DataConstantProperty(spec['layout_symbol']['text-keep-upright']), + 'text-transform': new DataDrivenProperty(spec['layout_symbol']['text-transform']), + 'text-offset': new DataDrivenProperty(spec['layout_symbol']['text-offset']), + 'text-allow-overlap': new DataConstantProperty(spec['layout_symbol']['text-allow-overlap']), + 'text-ignore-placement': new DataConstantProperty(spec['layout_symbol']['text-ignore-placement']), + 'text-optional': new DataConstantProperty(spec['layout_symbol']['text-optional']) +}); +const paint$7 = new Properties({ + 'icon-opacity': new DataDrivenProperty(spec['paint_symbol']['icon-opacity']), + 'icon-color': new DataDrivenProperty(spec['paint_symbol']['icon-color']), + 'icon-halo-color': new DataDrivenProperty(spec['paint_symbol']['icon-halo-color']), + 'icon-halo-width': new DataDrivenProperty(spec['paint_symbol']['icon-halo-width']), + 'icon-halo-blur': new DataDrivenProperty(spec['paint_symbol']['icon-halo-blur']), + 'icon-translate': new DataConstantProperty(spec['paint_symbol']['icon-translate']), + 'icon-translate-anchor': new DataConstantProperty(spec['paint_symbol']['icon-translate-anchor']), + 'text-opacity': new DataDrivenProperty(spec['paint_symbol']['text-opacity']), + 'text-color': new DataDrivenProperty(spec['paint_symbol']['text-color'], { + runtimeType: ColorType, + getOverride: o => o.textColor, + hasOverride: o => !!o.textColor + }), + 'text-halo-color': new DataDrivenProperty(spec['paint_symbol']['text-halo-color']), + 'text-halo-width': new DataDrivenProperty(spec['paint_symbol']['text-halo-width']), + 'text-halo-blur': new DataDrivenProperty(spec['paint_symbol']['text-halo-blur']), + 'text-translate': new DataConstantProperty(spec['paint_symbol']['text-translate']), + 'text-translate-anchor': new DataConstantProperty(spec['paint_symbol']['text-translate-anchor']) +}); +var properties$6 = { + paint: paint$7, + layout: layout$6 +}; + +class FormatSectionOverride { + constructor(defaultValue) { + this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType; + this.defaultValue = defaultValue; + } + evaluate(ctx) { + if (ctx.formattedSection) { + const overrides = this.defaultValue.property.overrides; + if (overrides && overrides.hasOverride(ctx.formattedSection)) { + return overrides.getOverride(ctx.formattedSection); + } + } + if (ctx.feature && ctx.featureState) { + return this.defaultValue.evaluate(ctx.feature, ctx.featureState); + } + return this.defaultValue.property.specification.default; + } + eachChild(fn) { + if (!this.defaultValue.isConstant()) { + const expr = this.defaultValue.value; + fn(expr._styleExpression.expression); + } + } + outputDefined() { + return false; + } + serialize() { + return null; + } +} +register('FormatSectionOverride', FormatSectionOverride, { omit: ['defaultValue'] }); + +class SymbolStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$6); + } + recalculate(parameters, availableImages) { + super.recalculate(parameters, availableImages); + if (this.layout.get('icon-rotation-alignment') === 'auto') { + if (this.layout.get('symbol-placement') !== 'point') { + this.layout._values['icon-rotation-alignment'] = 'map'; + } else { + this.layout._values['icon-rotation-alignment'] = 'viewport'; + } + } + if (this.layout.get('text-rotation-alignment') === 'auto') { + if (this.layout.get('symbol-placement') !== 'point') { + this.layout._values['text-rotation-alignment'] = 'map'; + } else { + this.layout._values['text-rotation-alignment'] = 'viewport'; + } + } + if (this.layout.get('text-pitch-alignment') === 'auto') { + this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment'); + } + if (this.layout.get('icon-pitch-alignment') === 'auto') { + this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment'); + } + if (this.layout.get('symbol-placement') === 'point') { + const writingModes = this.layout.get('text-writing-mode'); + if (writingModes) { + const deduped = []; + for (const m of writingModes) { + if (deduped.indexOf(m) < 0) + deduped.push(m); + } + this.layout._values['text-writing-mode'] = deduped; + } else { + this.layout._values['text-writing-mode'] = ['horizontal']; + } + } + this._setPaintOverrides(); + } + getValueAndResolveTokens(name, feature, canonical, availableImages) { + const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages); + const unevaluated = this._unevaluatedLayout._values[name]; + if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) { + return resolveTokens(feature.properties, value); + } + return value; + } + createBucket(parameters) { + return new SymbolBucket(parameters); + } + queryRadius() { + return 0; + } + queryIntersectsFeature() { + return false; + } + _setPaintOverrides() { + for (const overridable of properties$6.paint.overridableProperties) { + if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) { + continue; + } + const overriden = this.paint.get(overridable); + const override = new FormatSectionOverride(overriden); + const styleExpression = new StyleExpression(override, overriden.property.specification); + let expression = null; + if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') { + expression = new ZoomConstantExpression('source', styleExpression); + } else { + expression = new ZoomDependentExpression('composite', styleExpression, overriden.value.zoomStops, overriden.value._interpolationType); + } + this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, expression, overriden.parameters); + } + } + _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) { + if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) { + return false; + } + return SymbolStyleLayer.hasPaintOverride(this.layout, name); + } + static hasPaintOverride(layout, propertyName) { + const textField = layout.get('text-field'); + const property = properties$6.paint.properties[propertyName]; + let hasOverrides = false; + const checkSections = sections => { + for (const section of sections) { + if (property.overrides && property.overrides.hasOverride(section)) { + hasOverrides = true; + return; + } + } + }; + if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) { + checkSections(textField.value.value.sections); + } else if (textField.value.kind === 'source') { + const checkExpression = expression => { + if (hasOverrides) + return; + if (expression instanceof Literal && typeOf(expression.value) === FormattedType) { + const formatted = expression.value; + checkSections(formatted.sections); + } else if (expression instanceof FormatExpression) { + checkSections(expression.sections); + } else { + expression.eachChild(checkExpression); + } + }; + const expr = textField.value; + if (expr._styleExpression) { + checkExpression(expr._styleExpression.expression); + } + } + return hasOverrides; + } + getProgramConfiguration(zoom) { + return new ProgramConfiguration(this, zoom); + } +} + +const paint$8 = new Properties({ + 'background-color': new DataConstantProperty(spec['paint_background']['background-color']), + 'background-pattern': new CrossFadedProperty(spec['paint_background']['background-pattern']), + 'background-opacity': new DataConstantProperty(spec['paint_background']['background-opacity']) +}); +var properties$7 = { paint: paint$8 }; + +class BackgroundStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$7); + } + getProgramIds() { + const image = this.paint.get('background-pattern'); + return [image ? 'backgroundPattern' : 'background']; + } +} + +const paint$9 = new Properties({ + 'raster-opacity': new DataConstantProperty(spec['paint_raster']['raster-opacity']), + 'raster-hue-rotate': new DataConstantProperty(spec['paint_raster']['raster-hue-rotate']), + 'raster-brightness-min': new DataConstantProperty(spec['paint_raster']['raster-brightness-min']), + 'raster-brightness-max': new DataConstantProperty(spec['paint_raster']['raster-brightness-max']), + 'raster-saturation': new DataConstantProperty(spec['paint_raster']['raster-saturation']), + 'raster-contrast': new DataConstantProperty(spec['paint_raster']['raster-contrast']), + 'raster-resampling': new DataConstantProperty(spec['paint_raster']['raster-resampling']), + 'raster-fade-duration': new DataConstantProperty(spec['paint_raster']['raster-fade-duration']) +}); +var properties$8 = { paint: paint$9 }; + +class RasterStyleLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$8); + } + getProgramIds() { + return ['raster']; + } +} + +function validateCustomStyleLayer(layerObject) { + const errors = []; + const id = layerObject.id; + if (id === undefined) { + errors.push({ message: `layers.${ id }: missing required property "id"` }); + } + if (layerObject.render === undefined) { + errors.push({ message: `layers.${ id }: missing required method "render"` }); + } + if (layerObject.renderingMode && layerObject.renderingMode !== '2d' && layerObject.renderingMode !== '3d') { + errors.push({ message: `layers.${ id }: property "renderingMode" must be either "2d" or "3d"` }); + } + return errors; +} +class CustomStyleLayer extends StyleLayer { + constructor(implementation) { + super(implementation, {}); + this.implementation = implementation; + } + is3D() { + return this.implementation.renderingMode === '3d'; + } + hasOffscreenPass() { + return this.implementation.prerender !== undefined; + } + recalculate() { + } + updateTransitions() { + } + hasTransition() { + } + serialize() { + } + onAdd(map) { + if (this.implementation.onAdd) { + this.implementation.onAdd(map, map.painter.context.gl); + } + } + onRemove(map) { + if (this.implementation.onRemove) { + this.implementation.onRemove(map, map.painter.context.gl); + } + } +} + +const paint$a = new Properties({ + 'sky-type': new DataConstantProperty(spec['paint_sky']['sky-type']), + 'sky-atmosphere-sun': new DataConstantProperty(spec['paint_sky']['sky-atmosphere-sun']), + 'sky-atmosphere-sun-intensity': new DataConstantProperty(spec['paint_sky']['sky-atmosphere-sun-intensity']), + 'sky-gradient-center': new DataConstantProperty(spec['paint_sky']['sky-gradient-center']), + 'sky-gradient-radius': new DataConstantProperty(spec['paint_sky']['sky-gradient-radius']), + 'sky-gradient': new ColorRampProperty(spec['paint_sky']['sky-gradient']), + 'sky-atmosphere-halo-color': new DataConstantProperty(spec['paint_sky']['sky-atmosphere-halo-color']), + 'sky-atmosphere-color': new DataConstantProperty(spec['paint_sky']['sky-atmosphere-color']), + 'sky-opacity': new DataConstantProperty(spec['paint_sky']['sky-opacity']) +}); +var properties$9 = { paint: paint$a }; + +function getCelestialDirection(azimuth, altitude, leftHanded) { + const up = fromValues(0, 0, 1); + const rotation = identity$1(create$5()); + rotateY$1(rotation, rotation, leftHanded ? -degToRad(azimuth) + Math.PI : degToRad(azimuth)); + rotateX$1(rotation, rotation, -degToRad(altitude)); + transformQuat(up, up, rotation); + return normalize(up, up); +} +class SkyLayer extends StyleLayer { + constructor(layer) { + super(layer, properties$9); + this._updateColorRamp(); + } + _handleSpecialPaintPropertyUpdate(name) { + if (name === 'sky-gradient') { + this._updateColorRamp(); + } else if (name === 'sky-atmosphere-sun' || name === 'sky-atmosphere-halo-color' || name === 'sky-atmosphere-color' || name === 'sky-atmosphere-sun-intensity') { + this._skyboxInvalidated = true; + } + } + _updateColorRamp() { + const expression = this._transitionablePaint._values['sky-gradient'].value.expression; + this.colorRamp = renderColorRamp({ + expression, + evaluationKey: 'skyRadialProgress' + }); + if (this.colorRampTexture) { + this.colorRampTexture.destroy(); + this.colorRampTexture = null; + } + } + needsSkyboxCapture(painter) { + if (!!this._skyboxInvalidated || !this.skyboxTexture || !this.skyboxGeometry) { + return true; + } + if (!this.paint.get('sky-atmosphere-sun')) { + const lightPosition = painter.style.light.properties.get('position'); + return this._lightPosition.azimuthal !== lightPosition.azimuthal || this._lightPosition.polar !== lightPosition.polar; + } + } + getCenter(painter, leftHanded) { + const type = this.paint.get('sky-type'); + if (type === 'atmosphere') { + const sunPosition = this.paint.get('sky-atmosphere-sun'); + const useLightPosition = !sunPosition; + const light = painter.style.light; + const lightPosition = light.properties.get('position'); + if (useLightPosition && light.properties.get('anchor') === 'viewport') { + warnOnce('The sun direction is attached to a light with viewport anchor, lighting may behave unexpectedly.'); + } + return useLightPosition ? getCelestialDirection(lightPosition.azimuthal, -lightPosition.polar + 90, leftHanded) : getCelestialDirection(sunPosition[0], -sunPosition[1] + 90, leftHanded); + } else if (type === 'gradient') { + const direction = this.paint.get('sky-gradient-center'); + return getCelestialDirection(direction[0], -direction[1] + 90, leftHanded); + } + } + is3D() { + return false; + } + isSky() { + return true; + } + markSkyboxValid(painter) { + this._skyboxInvalidated = false; + this._lightPosition = painter.style.light.properties.get('position'); + } + hasOffscreenPass() { + return true; + } + getProgramIds() { + const type = this.paint.get('sky-type'); + if (type === 'atmosphere') { + return [ + 'skyboxCapture', + 'skybox' + ]; + } else if (type === 'gradient') { + return ['skyboxGradient']; + } + return null; + } +} + +const subclasses = { + circle: CircleStyleLayer, + heatmap: HeatmapStyleLayer, + hillshade: HillshadeStyleLayer, + fill: FillStyleLayer, + 'fill-extrusion': FillExtrusionStyleLayer, + line: LineStyleLayer, + symbol: SymbolStyleLayer, + background: BackgroundStyleLayer, + raster: RasterStyleLayer, + sky: SkyLayer +}; +function createStyleLayer(layer) { + if (layer.type === 'custom') { + return new CustomStyleLayer(layer); + } else { + return new subclasses[layer.type](layer); + } +} + +const {HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData: ImageData$1, ImageBitmap: ImageBitmap$1} = window$1; +class Texture { + constructor(context, image, format, options) { + this.context = context; + this.format = format; + this.texture = context.gl.createTexture(); + this.update(image, options); + } + update(image, options, position) { + const {width, height} = image; + const resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position; + const {context} = this; + const {gl} = context; + this.useMipmap = Boolean(options && options.useMipmap); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + context.pixelStoreUnpackFlipY.set(false); + context.pixelStoreUnpack.set(1); + context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); + if (resize) { + this.size = [ + width, + height + ]; + if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || ImageBitmap$1 && image instanceof ImageBitmap$1) { + gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image); + } else { + gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data); + } + } else { + const {x, y} = position || { + x: 0, + y: 0 + }; + if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || ImageBitmap$1 && image instanceof ImageBitmap$1) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); + } else { + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data); + } + } + if (this.useMipmap && this.isSizePowerOfTwo()) { + gl.generateMipmap(gl.TEXTURE_2D); + } + } + bind(filter, wrap, minFilter) { + const {context} = this; + const {gl} = context; + gl.bindTexture(gl.TEXTURE_2D, this.texture); + if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) { + minFilter = gl.LINEAR; + } + if (filter !== this.filter) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter); + this.filter = filter; + } + if (wrap !== this.wrap) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap); + this.wrap = wrap; + } + } + isSizePowerOfTwo() { + return this.size[0] === this.size[1] && Math.log(this.size[0]) / Math.LN2 % 1 === 0; + } + destroy() { + const {gl} = this.context; + gl.deleteTexture(this.texture); + this.texture = null; + } +} + +class ThrottledInvoker { + constructor(callback) { + this._callback = callback; + this._triggered = false; + if (typeof MessageChannel !== 'undefined') { + this._channel = new MessageChannel(); + this._channel.port2.onmessage = () => { + this._triggered = false; + this._callback(); + }; + } + } + trigger() { + if (!this._triggered) { + this._triggered = true; + if (this._channel) { + this._channel.port1.postMessage(true); + } else { + setTimeout(() => { + this._triggered = false; + this._callback(); + }, 0); + } + } + } + remove() { + delete this._channel; + this._callback = () => { + }; + } +} + +const performance = window$1.performance; +class RequestPerformance { + constructor(request) { + this._marks = { + start: [ + request.url, + 'start' + ].join('#'), + end: [ + request.url, + 'end' + ].join('#'), + measure: request.url.toString() + }; + performance.mark(this._marks.start); + } + finish() { + performance.mark(this._marks.end); + let resourceTimingData = performance.getEntriesByName(this._marks.measure); + if (resourceTimingData.length === 0) { + performance.measure(this._marks.measure, this._marks.start, this._marks.end); + resourceTimingData = performance.getEntriesByName(this._marks.measure); + performance.clearMarks(this._marks.start); + performance.clearMarks(this._marks.end); + performance.clearMeasures(this._marks.measure); + } + return resourceTimingData; + } +} + +class Scheduler { + constructor() { + this.tasks = {}; + this.taskQueue = []; + bindAll(['process'], this); + this.invoker = new ThrottledInvoker(this.process); + this.nextId = 0; + } + add(fn, metadata) { + const id = this.nextId++; + this.tasks[id] = { + fn, + metadata, + priority: getPriority(metadata), + id + }; + this.taskQueue.push(id); + this.invoker.trigger(); + return { + cancel: () => { + delete this.tasks[id]; + } + }; + } + process() { + const m = isWorker() ? void 0 : undefined; + try { + this.taskQueue = this.taskQueue.filter(id => !!this.tasks[id]); + if (!this.taskQueue.length) { + return; + } + const id = this.pick(); + if (id === null) + return; + const task = this.tasks[id]; + delete this.tasks[id]; + if (this.taskQueue.length) { + this.invoker.trigger(); + } + if (!task) { + return; + } + task.fn(); + } finally { + } + } + pick() { + let minIndex = null; + let minPriority = Infinity; + for (let i = 0; i < this.taskQueue.length; i++) { + const id = this.taskQueue[i]; + const task = this.tasks[id]; + if (task.priority < minPriority) { + minPriority = task.priority; + minIndex = i; + } + } + if (minIndex === null) + return null; + const id = this.taskQueue[minIndex]; + this.taskQueue.splice(minIndex, 1); + return id; + } + remove() { + this.invoker.remove(); + } +} +function getPriority({type, isSymbolTile, zoom}) { + zoom = zoom || 0; + if (type === 'message') + return 0; + if (type === 'maybePrepare' && !isSymbolTile) + return 100 - zoom; + if (type === 'parseTile' && !isSymbolTile) + return 200 - zoom; + if (type === 'parseTile' && isSymbolTile) + return 300 - zoom; + if (type === 'maybePrepare' && isSymbolTile) + return 400 - zoom; + return 500; +} + +class Actor { + constructor(target, parent, mapId) { + this.target = target; + this.parent = parent; + this.mapId = mapId; + this.callbacks = {}; + this.cancelCallbacks = {}; + bindAll(['receive'], this); + this.target.addEventListener('message', this.receive, false); + this.globalScope = isWorker() ? target : window$1; + this.scheduler = new Scheduler(); + } + send(type, data, callback, targetMapId, mustQueue = false, callbackMetadata) { + const id = Math.round(Math.random() * 1000000000000000000).toString(36).substring(0, 10); + if (callback) { + callback.metadata = callbackMetadata; + this.callbacks[id] = callback; + } + const buffers = isSafari(this.globalScope) ? undefined : []; + this.target.postMessage({ + id, + type, + hasCallback: !!callback, + targetMapId, + mustQueue, + sourceMapId: this.mapId, + data: serialize(data, buffers) + }, buffers); + return { + cancel: () => { + if (callback) { + delete this.callbacks[id]; + } + this.target.postMessage({ + id, + type: '', + targetMapId, + sourceMapId: this.mapId + }); + } + }; + } + receive(message) { + const data = message.data, id = data.id; + if (!id) { + return; + } + if (data.targetMapId && this.mapId !== data.targetMapId) { + return; + } + if (data.type === '') { + const cancel = this.cancelCallbacks[id]; + delete this.cancelCallbacks[id]; + if (cancel) { + cancel.cancel(); + } + } else { + if (isWorker() || data.mustQueue) { + const callback = this.callbacks[id]; + const metadata = callback && callback.metadata || { type: 'message' }; + this.cancelCallbacks[id] = this.scheduler.add(() => this.processTask(id, data), metadata); + } else { + this.processTask(id, data); + } + } + } + processTask(id, task) { + if (task.type === '') { + const callback = this.callbacks[id]; + delete this.callbacks[id]; + if (callback) { + if (task.error) { + callback(deserialize(task.error)); + } else { + callback(null, deserialize(task.data)); + } + } + } else { + const buffers = isSafari(this.globalScope) ? undefined : []; + const done = task.hasCallback ? (err, data) => { + delete this.cancelCallbacks[id]; + this.target.postMessage({ + id, + type: '', + sourceMapId: this.mapId, + error: err ? serialize(err) : null, + data: serialize(data, buffers) + }, buffers); + } : _ => { + }; + const params = deserialize(task.data); + if (this.parent[task.type]) { + this.parent[task.type](task.sourceMapId, params, done); + } else if (this.parent.getWorkerSource) { + const keys = task.type.split('.'); + const scope = this.parent.getWorkerSource(task.sourceMapId, keys[0], params.source); + scope[keys[1]](params, done); + } else { + done(new Error(`Could not find function ${ task.type }`)); + } + } + } + remove() { + this.scheduler.remove(); + this.target.removeEventListener('message', this.receive, false); + } +} + +class LngLatBounds { + constructor(sw, ne) { + if (!sw) ; else if (ne) { + this.setSouthWest(sw).setNorthEast(ne); + } else if (sw.length === 4) { + this.setSouthWest([ + sw[0], + sw[1] + ]).setNorthEast([ + sw[2], + sw[3] + ]); + } else { + this.setSouthWest(sw[0]).setNorthEast(sw[1]); + } + } + setNorthEast(ne) { + this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); + return this; + } + setSouthWest(sw) { + this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); + return this; + } + extend(obj) { + const sw = this._sw, ne = this._ne; + let sw2, ne2; + if (obj instanceof LngLat) { + sw2 = obj; + ne2 = obj; + } else if (obj instanceof LngLatBounds) { + sw2 = obj._sw; + ne2 = obj._ne; + if (!sw2 || !ne2) + return this; + } else { + if (Array.isArray(obj)) { + if (obj.length === 4 || obj.every(Array.isArray)) { + const lngLatBoundsObj = obj; + return this.extend(LngLatBounds.convert(lngLatBoundsObj)); + } else { + const lngLatObj = obj; + return this.extend(LngLat.convert(lngLatObj)); + } + } + return this; + } + if (!sw && !ne) { + this._sw = new LngLat(sw2.lng, sw2.lat); + this._ne = new LngLat(ne2.lng, ne2.lat); + } else { + sw.lng = Math.min(sw2.lng, sw.lng); + sw.lat = Math.min(sw2.lat, sw.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + } + return this; + } + getCenter() { + return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); + } + getSouthWest() { + return this._sw; + } + getNorthEast() { + return this._ne; + } + getNorthWest() { + return new LngLat(this.getWest(), this.getNorth()); + } + getSouthEast() { + return new LngLat(this.getEast(), this.getSouth()); + } + getWest() { + return this._sw.lng; + } + getSouth() { + return this._sw.lat; + } + getEast() { + return this._ne.lng; + } + getNorth() { + return this._ne.lat; + } + toArray() { + return [ + this._sw.toArray(), + this._ne.toArray() + ]; + } + toString() { + return `LngLatBounds(${ this._sw.toString() }, ${ this._ne.toString() })`; + } + isEmpty() { + return !(this._sw && this._ne); + } + contains(lnglat) { + const {lng, lat} = LngLat.convert(lnglat); + const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat; + let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng; + if (this._sw.lng > this._ne.lng) { + containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng; + } + return containsLatitude && containsLongitude; + } + static convert(input) { + if (!input || input instanceof LngLatBounds) + return input; + return new LngLatBounds(input); + } +} + +const earthRadius = 6371008.8; +class LngLat { + constructor(lng, lat) { + if (isNaN(lng) || isNaN(lat)) { + throw new Error(`Invalid LngLat object: (${ lng }, ${ lat })`); + } + this.lng = +lng; + this.lat = +lat; + if (this.lat > 90 || this.lat < -90) { + throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); + } + } + wrap() { + return new LngLat(wrap(this.lng, -180, 180), this.lat); + } + toArray() { + return [ + this.lng, + this.lat + ]; + } + toString() { + return `LngLat(${ this.lng }, ${ this.lat })`; + } + distanceTo(lngLat) { + const rad = Math.PI / 180; + const lat1 = this.lat * rad; + const lat2 = lngLat.lat * rad; + const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad); + const maxMeters = earthRadius * Math.acos(Math.min(a, 1)); + return maxMeters; + } + toBounds(radius = 0) { + const earthCircumferenceInMetersAtEquator = 40075017; + const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos(Math.PI / 180 * this.lat); + return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); + } + static convert(input) { + if (input instanceof LngLat) { + return input; + } + if (Array.isArray(input) && (input.length === 2 || input.length === 3)) { + return new LngLat(Number(input[0]), Number(input[1])); + } + if (!Array.isArray(input) && typeof input === 'object' && input !== null) { + return new LngLat(Number('lng' in input ? input.lng : input.lon), Number(input.lat)); + } + throw new Error('`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]'); + } +} + +const earthCircumfrence = 2 * Math.PI * earthRadius; +function circumferenceAtLatitude(latitude) { + return earthCircumfrence * Math.cos(latitude * Math.PI / 180); +} +function mercatorXfromLng$1(lng) { + return (180 + lng) / 360; +} +function mercatorYfromLat$1(lat) { + return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))) / 360; +} +function mercatorZfromAltitude(altitude, lat) { + return altitude / circumferenceAtLatitude(lat); +} +function lngFromMercatorX(x) { + return x * 360 - 180; +} +function latFromMercatorY(y) { + const y2 = 180 - y * 360; + return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; +} +function altitudeFromMercatorZ(z, y) { + return z * circumferenceAtLatitude(latFromMercatorY(y)); +} +function mercatorScale(lat) { + return 1 / Math.cos(lat * Math.PI / 180); +} +class MercatorCoordinate { + constructor(x, y, z = 0) { + this.x = +x; + this.y = +y; + this.z = +z; + } + static fromLngLat(lngLatLike, altitude = 0) { + const lngLat = LngLat.convert(lngLatLike); + return new MercatorCoordinate(mercatorXfromLng$1(lngLat.lng), mercatorYfromLat$1(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat)); + } + toLngLat() { + return new LngLat(lngFromMercatorX(this.x), latFromMercatorY(this.y)); + } + toAltitude() { + return altitudeFromMercatorZ(this.z, this.y); + } + meterInMercatorCoordinateUnits() { + return 1 / earthCircumfrence * mercatorScale(latFromMercatorY(this.y)); + } +} + +/** + * getTileBBox + * + * @param {Number} x Tile coordinate x + * @param {Number} y Tile coordinate y + * @param {Number} z Tile zoom + * @returns {String} String of the bounding box + */ +function getTileBBox(x, y, z) { + // for Google/OSM tile scheme we need to alter the y + y = (Math.pow(2, z) - y - 1); + + var min = getMercCoords(x * 256, y * 256, z), + max = getMercCoords((x + 1) * 256, (y + 1) * 256, z); + + return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1]; +} + + +/** + * getMercCoords + * + * @param {Number} x Pixel coordinate x + * @param {Number} y Pixel coordinate y + * @param {Number} z Tile zoom + * @returns {Array} [x, y] + */ +function getMercCoords(x, y, z) { + var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z), + merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0), + merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0); + + return [merc_x, merc_y]; +} + +class CanonicalTileID { + constructor(z, x, y) { + this.z = z; + this.x = x; + this.y = y; + this.key = calculateKey(0, z, z, x, y); + } + equals(id) { + return this.z === id.z && this.x === id.x && this.y === id.y; + } + url(urls, scheme) { + const bbox = getTileBBox(this.x, this.y, this.z); + const quadkey = getQuadkey(this.z, this.x, this.y); + return urls[(this.x + this.y) % urls.length].replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)).replace('{z}', String(this.z)).replace('{x}', String(this.x)).replace('{y}', String(scheme === 'tms' ? Math.pow(2, this.z) - this.y - 1 : this.y)).replace('{quadkey}', quadkey).replace('{bbox-epsg-3857}', bbox); + } + getTilePoint(coord) { + const tilesAtZoom = Math.pow(2, this.z); + return new pointGeometry((coord.x * tilesAtZoom - this.x) * EXTENT$1, (coord.y * tilesAtZoom - this.y) * EXTENT$1); + } + getTileVec3(coord) { + const tilesAtZoom = Math.pow(2, this.z); + const x = (coord.x * tilesAtZoom - this.x) * EXTENT$1; + const y = (coord.y * tilesAtZoom - this.y) * EXTENT$1; + return fromValues(x, y, altitudeFromMercatorZ(coord.z, coord.y)); + } + toString() { + return `${ this.z }/${ this.x }/${ this.y }`; + } +} +class UnwrappedTileID { + constructor(wrap, canonical) { + this.wrap = wrap; + this.canonical = canonical; + this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y); + } +} +class OverscaledTileID { + constructor(overscaledZ, wrap, z, x, y) { + this.overscaledZ = overscaledZ; + this.wrap = wrap; + this.canonical = new CanonicalTileID(z, +x, +y); + this.key = wrap === 0 && overscaledZ === z ? this.canonical.key : calculateKey(wrap, overscaledZ, z, x, y); + } + equals(id) { + return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); + } + scaledTo(targetZ) { + const zDifference = this.canonical.z - targetZ; + if (targetZ > this.canonical.z) { + return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y); + } else { + return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); + } + } + calculateScaledKey(targetZ, withWrap = true) { + if (this.overscaledZ === targetZ && withWrap) + return this.key; + if (targetZ > this.canonical.z) { + return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y); + } else { + const zDifference = this.canonical.z - targetZ; + return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); + } + } + isChildOf(parent) { + if (parent.wrap !== this.wrap) { + return false; + } + const zDifference = this.canonical.z - parent.canonical.z; + return parent.overscaledZ === 0 || parent.overscaledZ < this.overscaledZ && parent.canonical.x === this.canonical.x >> zDifference && parent.canonical.y === this.canonical.y >> zDifference; + } + children(sourceMaxZoom) { + if (this.overscaledZ >= sourceMaxZoom) { + return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)]; + } + const z = this.canonical.z + 1; + const x = this.canonical.x * 2; + const y = this.canonical.y * 2; + return [ + new OverscaledTileID(z, this.wrap, z, x, y), + new OverscaledTileID(z, this.wrap, z, x + 1, y), + new OverscaledTileID(z, this.wrap, z, x, y + 1), + new OverscaledTileID(z, this.wrap, z, x + 1, y + 1) + ]; + } + isLessThan(rhs) { + if (this.wrap < rhs.wrap) + return true; + if (this.wrap > rhs.wrap) + return false; + if (this.overscaledZ < rhs.overscaledZ) + return true; + if (this.overscaledZ > rhs.overscaledZ) + return false; + if (this.canonical.x < rhs.canonical.x) + return true; + if (this.canonical.x > rhs.canonical.x) + return false; + if (this.canonical.y < rhs.canonical.y) + return true; + return false; + } + wrapped() { + return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); + } + unwrapTo(wrap) { + return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y); + } + overscaleFactor() { + return Math.pow(2, this.overscaledZ - this.canonical.z); + } + toUnwrapped() { + return new UnwrappedTileID(this.wrap, this.canonical); + } + toString() { + return `${ this.overscaledZ }/${ this.canonical.x }/${ this.canonical.y }`; + } + getTilePoint(coord) { + return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y)); + } + getTileVec3(coord) { + return this.canonical.getTileVec3(new MercatorCoordinate(coord.x - this.wrap, coord.y, coord.z)); + } +} +function calculateKey(wrap, overscaledZ, z, x, y) { + const dim = 1 << Math.min(z, 22); + let xy = dim * (y % dim) + x % dim; + if (wrap && z < 22) { + const bitsAvailable = 2 * (22 - z); + xy += dim * dim * ((wrap < 0 ? -2 * wrap - 1 : 2 * wrap) % (1 << bitsAvailable)); + } + const key = (xy * 32 + z) * 16 + (overscaledZ - z); + return key; +} +function getQuadkey(z, x, y) { + let quadkey = '', mask; + for (let i = z; i > 0; i--) { + mask = 1 << i - 1; + quadkey += (x & mask ? 1 : 0) + (y & mask ? 2 : 0); + } + return quadkey; +} +register('CanonicalTileID', CanonicalTileID); +register('OverscaledTileID', OverscaledTileID, { omit: ['posMatrix'] }); + +class DictionaryCoder { + constructor(strings) { + this._stringToNumber = {}; + this._numberToString = []; + for (let i = 0; i < strings.length; i++) { + const string = strings[i]; + this._stringToNumber[string] = i; + this._numberToString[i] = string; + } + } + encode(string) { + return this._stringToNumber[string]; + } + decode(n) { + return this._numberToString[n]; + } +} + +class Feature { + constructor(vectorTileFeature, z, x, y, id) { + this.type = 'Feature'; + this._vectorTileFeature = vectorTileFeature; + vectorTileFeature._z = z; + vectorTileFeature._x = x; + vectorTileFeature._y = y; + this.properties = vectorTileFeature.properties; + this.id = id; + } + get geometry() { + if (this._geometry === undefined) { + this._geometry = this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x, this._vectorTileFeature._y, this._vectorTileFeature._z).geometry; + } + return this._geometry; + } + set geometry(g) { + this._geometry = g; + } + toJSON() { + const json = { geometry: this.geometry }; + for (const i in this) { + if (i === '_geometry' || i === '_vectorTileFeature') + continue; + json[i] = this[i]; + } + return json; + } +} + +function deserialize$1(input, style) { + const output = {}; + if (!style) + return output; + for (const bucket of input) { + const layers = bucket.layerIds.map(id => style.getLayer(id)).filter(Boolean); + if (layers.length === 0) { + continue; + } + bucket.layers = layers; + if (bucket.stateDependentLayerIds) { + bucket.stateDependentLayers = bucket.stateDependentLayerIds.map(lId => layers.filter(l => l.id === lId)[0]); + } + for (const layer of layers) { + output[layer.id] = bucket; + } + } + return output; +} + +var posAttributes = createLayout([{ + name: 'a_pos', + type: 'Int16', + components: 2 + }]); + +const CLOCK_SKEW_RETRY_TIMEOUT = 30000; +class Tile { + constructor(tileID, size, tileZoom) { + this.tileID = tileID; + this.uid = uniqueId(); + this.uses = 0; + this.tileSize = size; + this.tileZoom = tileZoom; + this.buckets = {}; + this.expirationTime = null; + this.queryPadding = 0; + this.hasSymbolBuckets = false; + this.hasRTLText = false; + this.dependencies = {}; + this.expiredRequestCount = 0; + this.state = 'loading'; + } + registerFadeDuration(duration) { + const fadeEndTime = duration + this.timeAdded; + if (fadeEndTime < exported.now()) + return; + if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) + return; + this.fadeEndTime = fadeEndTime; + } + wasRequested() { + return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; + } + loadVectorData(data, painter, justReloaded) { + if (this.hasData()) { + this.unloadVectorData(); + } + this.state = 'loaded'; + if (!data) { + this.collisionBoxArray = new CollisionBoxArray(); + return; + } + if (data.featureIndex) { + this.latestFeatureIndex = data.featureIndex; + if (data.rawTileData) { + this.latestRawTileData = data.rawTileData; + this.latestFeatureIndex.rawTileData = data.rawTileData; + } else if (this.latestRawTileData) { + this.latestFeatureIndex.rawTileData = this.latestRawTileData; + } + } + this.collisionBoxArray = data.collisionBoxArray; + this.buckets = deserialize$1(data.buckets, painter.style); + this.hasSymbolBuckets = false; + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket instanceof SymbolBucket) { + this.hasSymbolBuckets = true; + if (justReloaded) { + bucket.justReloaded = true; + } else { + break; + } + } + } + this.hasRTLText = false; + if (this.hasSymbolBuckets) { + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket instanceof SymbolBucket) { + if (bucket.hasRTLText) { + this.hasRTLText = true; + lazyLoadRTLTextPlugin(); + break; + } + } + } + } + this.queryPadding = 0; + for (const id in this.buckets) { + const bucket = this.buckets[id]; + this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket)); + } + if (data.imageAtlas) { + this.imageAtlas = data.imageAtlas; + } + if (data.glyphAtlasImage) { + this.glyphAtlasImage = data.glyphAtlasImage; + } + } + unloadVectorData() { + for (const id in this.buckets) { + this.buckets[id].destroy(); + } + this.buckets = {}; + if (this.imageAtlasTexture) { + this.imageAtlasTexture.destroy(); + } + if (this.imageAtlas) { + this.imageAtlas = null; + } + if (this.glyphAtlasTexture) { + this.glyphAtlasTexture.destroy(); + } + this.latestFeatureIndex = null; + this.state = 'unloaded'; + } + getBucket(layer) { + return this.buckets[layer.id]; + } + upload(context) { + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket.uploadPending()) { + bucket.upload(context); + } + } + const gl = context.gl; + if (this.imageAtlas && !this.imageAtlas.uploaded) { + this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); + this.imageAtlas.uploaded = true; + } + if (this.glyphAtlasImage) { + this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); + this.glyphAtlasImage = null; + } + } + prepare(imageManager) { + if (this.imageAtlas) { + this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); + } + } + queryRenderedFeatures(layers, serializedLayers, sourceFeatureState, tileResult, params, transform, pixelPosMatrix, visualizeQueryGeometry) { + if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) + return {}; + return this.latestFeatureIndex.query({ + tileResult, + pixelPosMatrix, + transform, + params + }, layers, serializedLayers, sourceFeatureState); + } + querySourceFeatures(result, params) { + const featureIndex = this.latestFeatureIndex; + if (!featureIndex || !featureIndex.rawTileData) + return; + const vtLayers = featureIndex.loadVTLayers(); + const sourceLayer = params ? params.sourceLayer : ''; + const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; + if (!layer) + return; + const filter = createFilter(params && params.filter); + const {z, x, y} = this.tileID.canonical; + const coord = { + z, + x, + y + }; + for (let i = 0; i < layer.length; i++) { + const feature = layer.feature(i); + if (filter.needGeometry) { + const evaluationFeature = toEvaluationFeature(feature, true); + if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) + continue; + } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { + continue; + } + const id = featureIndex.getId(feature, sourceLayer); + const geojsonFeature = new Feature(feature, z, x, y, id); + geojsonFeature.tile = coord; + result.push(geojsonFeature); + } + } + hasData() { + return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; + } + patternsLoaded() { + return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; + } + setExpiryData(data) { + const prior = this.expirationTime; + if (data.cacheControl) { + const parsedCC = parseCacheControl(data.cacheControl); + if (parsedCC['max-age']) + this.expirationTime = Date.now() + parsedCC['max-age'] * 1000; + } else if (data.expires) { + this.expirationTime = new Date(data.expires).getTime(); + } + if (this.expirationTime) { + const now = Date.now(); + let isExpired = false; + if (this.expirationTime > now) { + isExpired = false; + } else if (!prior) { + isExpired = true; + } else if (this.expirationTime < prior) { + isExpired = true; + } else { + const delta = this.expirationTime - prior; + if (!delta) { + isExpired = true; + } else { + this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT); + } + } + if (isExpired) { + this.expiredRequestCount++; + this.state = 'expired'; + } else { + this.expiredRequestCount = 0; + } + } + } + getExpiryTimeout() { + if (this.expirationTime) { + if (this.expiredRequestCount) { + return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31)); + } else { + return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1); + } + } + } + setFeatureState(states, painter) { + if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData || Object.keys(states).length === 0) { + return; + } + const vtLayers = this.latestFeatureIndex.loadVTLayers(); + for (const id in this.buckets) { + if (!painter.style.hasLayer(id)) + continue; + const bucket = this.buckets[id]; + const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; + const sourceLayer = vtLayers[sourceLayerId]; + const sourceLayerStates = states[sourceLayerId]; + if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) + continue; + bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {}); + const layer = painter && painter.style && painter.style.getLayer(id); + if (layer) { + this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket)); + } + } + } + holdingForFade() { + return this.symbolFadeHoldUntil !== undefined; + } + symbolFadeFinished() { + return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported.now(); + } + clearFadeHold() { + this.symbolFadeHoldUntil = undefined; + } + setHoldDuration(duration) { + this.symbolFadeHoldUntil = exported.now() + duration; + } + setDependencies(namespace, dependencies) { + const index = {}; + for (const dep of dependencies) { + index[dep] = true; + } + this.dependencies[namespace] = index; + } + hasDependency(namespaces, keys) { + for (const namespace of namespaces) { + const dependencies = this.dependencies[namespace]; + if (dependencies) { + for (const key of keys) { + if (dependencies[key]) { + return true; + } + } + } + } + return false; + } + clearQueryDebugViz() { + } +} + +class SourceFeatureState { + constructor() { + this.state = {}; + this.stateChanges = {}; + this.deletedStates = {}; + } + updateState(sourceLayer, featureId, newState) { + const feature = String(featureId); + this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; + this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; + extend(this.stateChanges[sourceLayer][feature], newState); + if (this.deletedStates[sourceLayer] === null) { + this.deletedStates[sourceLayer] = {}; + for (const ft in this.state[sourceLayer]) { + if (ft !== feature) + this.deletedStates[sourceLayer][ft] = null; + } + } else { + const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; + if (featureDeletionQueued) { + this.deletedStates[sourceLayer][feature] = {}; + for (const prop in this.state[sourceLayer][feature]) { + if (!newState[prop]) + this.deletedStates[sourceLayer][feature][prop] = null; + } + } else { + for (const key in newState) { + const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; + if (deletionInQueue) + delete this.deletedStates[sourceLayer][feature][key]; + } + } + } + } + removeFeatureState(sourceLayer, featureId, key) { + const sourceLayerDeleted = this.deletedStates[sourceLayer] === null; + if (sourceLayerDeleted) + return; + const feature = String(featureId); + this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; + if (key && featureId !== undefined) { + if (this.deletedStates[sourceLayer][feature] !== null) { + this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; + this.deletedStates[sourceLayer][feature][key] = null; + } + } else if (featureId !== undefined) { + const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature]; + if (updateInQueue) { + this.deletedStates[sourceLayer][feature] = {}; + for (key in this.stateChanges[sourceLayer][feature]) + this.deletedStates[sourceLayer][feature][key] = null; + } else { + this.deletedStates[sourceLayer][feature] = null; + } + } else { + this.deletedStates[sourceLayer] = null; + } + } + getState(sourceLayer, featureId) { + const feature = String(featureId); + const base = this.state[sourceLayer] || {}; + const changes = this.stateChanges[sourceLayer] || {}; + const reconciledState = extend({}, base[feature], changes[feature]); + if (this.deletedStates[sourceLayer] === null) + return {}; + else if (this.deletedStates[sourceLayer]) { + const featureDeletions = this.deletedStates[sourceLayer][featureId]; + if (featureDeletions === null) + return {}; + for (const prop in featureDeletions) + delete reconciledState[prop]; + } + return reconciledState; + } + initializeTileState(tile, painter) { + tile.setFeatureState(this.state, painter); + } + coalesceChanges(tiles, painter) { + const featuresChanged = {}; + for (const sourceLayer in this.stateChanges) { + this.state[sourceLayer] = this.state[sourceLayer] || {}; + const layerStates = {}; + for (const feature in this.stateChanges[sourceLayer]) { + if (!this.state[sourceLayer][feature]) + this.state[sourceLayer][feature] = {}; + extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); + layerStates[feature] = this.state[sourceLayer][feature]; + } + featuresChanged[sourceLayer] = layerStates; + } + for (const sourceLayer in this.deletedStates) { + this.state[sourceLayer] = this.state[sourceLayer] || {}; + const layerStates = {}; + if (this.deletedStates[sourceLayer] === null) { + for (const ft in this.state[sourceLayer]) { + layerStates[ft] = {}; + this.state[sourceLayer][ft] = {}; + } + } else { + for (const feature in this.deletedStates[sourceLayer]) { + const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null; + if (deleteWholeFeatureState) + this.state[sourceLayer][feature] = {}; + else { + for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) { + delete this.state[sourceLayer][feature][key]; + } + } + layerStates[feature] = this.state[sourceLayer][feature]; + } + } + featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {}; + extend(featuresChanged[sourceLayer], layerStates); + } + this.stateChanges = {}; + this.deletedStates = {}; + if (Object.keys(featuresChanged).length === 0) + return; + for (const id in tiles) { + const tile = tiles[id]; + tile.setFeatureState(featuresChanged, painter); + } + } +} + +class MipLevel { + constructor(size_) { + this.size = size_; + this.minimums = []; + this.maximums = []; + this.leaves = []; + } + getElevation(x, y) { + const idx = this.toIdx(x, y); + return { + min: this.minimums[idx], + max: this.maximums[idx] + }; + } + isLeaf(x, y) { + return this.leaves[this.toIdx(x, y)]; + } + toIdx(x, y) { + return y * this.size + x; + } +} +function aabbRayIntersect(min, max, pos, dir) { + let tMin = 0; + let tMax = Number.MAX_VALUE; + const epsilon = 1e-15; + for (let i = 0; i < 3; i++) { + if (Math.abs(dir[i]) < epsilon) { + if (pos[i] < min[i] || pos[i] > max[i]) + return null; + } else { + const ood = 1 / dir[i]; + let t1 = (min[i] - pos[i]) * ood; + let t2 = (max[i] - pos[i]) * ood; + if (t1 > t2) { + const temp = t1; + t1 = t2; + t2 = temp; + } + if (t1 > tMin) + tMin = t1; + if (t2 < tMax) + tMax = t2; + if (tMin > tMax) + return null; + } + } + return tMin; +} +function triangleRayIntersect(ax, ay, az, bx, by, bz, cx, cy, cz, pos, dir) { + const abX = bx - ax; + const abY = by - ay; + const abZ = bz - az; + const acX = cx - ax; + const acY = cy - ay; + const acZ = cz - az; + const pvecX = dir[1] * acZ - dir[2] * acY; + const pvecY = dir[2] * acX - dir[0] * acZ; + const pvecZ = dir[0] * acY - dir[1] * acX; + const det = abX * pvecX + abY * pvecY + abZ * pvecZ; + if (Math.abs(det) < 1e-15) + return null; + const invDet = 1 / det; + const tvecX = pos[0] - ax; + const tvecY = pos[1] - ay; + const tvecZ = pos[2] - az; + const u = (tvecX * pvecX + tvecY * pvecY + tvecZ * pvecZ) * invDet; + if (u < 0 || u > 1) + return null; + const qvecX = tvecY * abZ - tvecZ * abY; + const qvecY = tvecZ * abX - tvecX * abZ; + const qvecZ = tvecX * abY - tvecY * abX; + const v = (dir[0] * qvecX + dir[1] * qvecY + dir[2] * qvecZ) * invDet; + if (v < 0 || u + v > 1) + return null; + return (acX * qvecX + acY * qvecY + acZ * qvecZ) * invDet; +} +function frac(v, lo, hi) { + return (v - lo) / (hi - lo); +} +function decodeBounds(x, y, depth, boundsMinx, boundsMiny, boundsMaxx, boundsMaxy, outMin, outMax) { + const scale = 1 << depth; + const rangex = boundsMaxx - boundsMinx; + const rangey = boundsMaxy - boundsMiny; + const minX = (x + 0) / scale * rangex + boundsMinx; + const maxX = (x + 1) / scale * rangex + boundsMinx; + const minY = (y + 0) / scale * rangey + boundsMiny; + const maxY = (y + 1) / scale * rangey + boundsMiny; + outMin[0] = minX; + outMin[1] = minY; + outMax[0] = maxX; + outMax[1] = maxY; +} +const aabbSkirtPadding = 100; +class DemMinMaxQuadTree { + constructor(dem_) { + this.maximums = []; + this.minimums = []; + this.leaves = []; + this.childOffsets = []; + this.nodeCount = 0; + this.dem = dem_; + this._siblingOffset = [ + [ + 0, + 0 + ], + [ + 1, + 0 + ], + [ + 0, + 1 + ], + [ + 1, + 1 + ] + ]; + if (!this.dem) + return; + const mips = buildDemMipmap(this.dem); + const maxLvl = mips.length - 1; + const rootMip = mips[maxLvl]; + const min = rootMip.minimums; + const max = rootMip.maximums; + const leaves = rootMip.leaves; + this._addNode(min[0], max[0], leaves[0]); + this._construct(mips, 0, 0, maxLvl, 0); + } + raycastRoot(minx, miny, maxx, maxy, p, d, exaggeration = 1) { + const min = [ + minx, + miny, + -aabbSkirtPadding + ]; + const max = [ + maxx, + maxy, + this.maximums[0] * exaggeration + ]; + return aabbRayIntersect(min, max, p, d); + } + raycast(rootMinx, rootMiny, rootMaxx, rootMaxy, p, d, exaggeration = 1) { + if (!this.nodeCount) + return null; + const t = this.raycastRoot(rootMinx, rootMiny, rootMaxx, rootMaxy, p, d, exaggeration); + if (t == null) + return null; + const tHits = []; + const sortedHits = []; + const boundsMin = []; + const boundsMax = []; + const stack = [{ + idx: 0, + t, + nodex: 0, + nodey: 0, + depth: 0 + }]; + while (stack.length > 0) { + const {idx, t, nodex, nodey, depth} = stack.pop(); + if (this.leaves[idx]) { + decodeBounds(nodex, nodey, depth, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); + const scale = 1 << depth; + const minxUv = (nodex + 0) / scale; + const maxxUv = (nodex + 1) / scale; + const minyUv = (nodey + 0) / scale; + const maxyUv = (nodey + 1) / scale; + const az = sampleElevation(minxUv, minyUv, this.dem) * exaggeration; + const bz = sampleElevation(maxxUv, minyUv, this.dem) * exaggeration; + const cz = sampleElevation(maxxUv, maxyUv, this.dem) * exaggeration; + const dz = sampleElevation(minxUv, maxyUv, this.dem) * exaggeration; + const t0 = triangleRayIntersect(boundsMin[0], boundsMin[1], az, boundsMax[0], boundsMin[1], bz, boundsMax[0], boundsMax[1], cz, p, d); + const t1 = triangleRayIntersect(boundsMax[0], boundsMax[1], cz, boundsMin[0], boundsMax[1], dz, boundsMin[0], boundsMin[1], az, p, d); + const tMin = Math.min(t0 !== null ? t0 : Number.MAX_VALUE, t1 !== null ? t1 : Number.MAX_VALUE); + if (tMin === Number.MAX_VALUE) { + const hitPos = scaleAndAdd([], p, d, t); + const fracx = frac(hitPos[0], boundsMin[0], boundsMax[0]); + const fracy = frac(hitPos[1], boundsMin[1], boundsMax[1]); + if (bilinearLerp(az, bz, dz, cz, fracx, fracy) >= hitPos[2]) + return t; + } else { + return tMin; + } + continue; + } + let hitCount = 0; + for (let i = 0; i < this._siblingOffset.length; i++) { + const childNodeX = (nodex << 1) + this._siblingOffset[i][0]; + const childNodeY = (nodey << 1) + this._siblingOffset[i][1]; + decodeBounds(childNodeX, childNodeY, depth + 1, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); + boundsMin[2] = -aabbSkirtPadding; + boundsMax[2] = this.maximums[this.childOffsets[idx] + i] * exaggeration; + const result = aabbRayIntersect(boundsMin, boundsMax, p, d); + if (result != null) { + const tHit = result; + tHits[i] = tHit; + let added = false; + for (let j = 0; j < hitCount && !added; j++) { + if (tHit >= tHits[sortedHits[j]]) { + sortedHits.splice(j, 0, i); + added = true; + } + } + if (!added) + sortedHits[hitCount] = i; + hitCount++; + } + } + for (let i = 0; i < hitCount; i++) { + const hitIdx = sortedHits[i]; + stack.push({ + idx: this.childOffsets[idx] + hitIdx, + t: tHits[hitIdx], + nodex: (nodex << 1) + this._siblingOffset[hitIdx][0], + nodey: (nodey << 1) + this._siblingOffset[hitIdx][1], + depth: depth + 1 + }); + } + } + return null; + } + _addNode(min, max, leaf) { + this.minimums.push(min); + this.maximums.push(max); + this.leaves.push(leaf); + this.childOffsets.push(0); + return this.nodeCount++; + } + _construct(mips, x, y, lvl, parentIdx) { + if (mips[lvl].isLeaf(x, y) === 1) { + return; + } + if (!this.childOffsets[parentIdx]) + this.childOffsets[parentIdx] = this.nodeCount; + const childLvl = lvl - 1; + const childMip = mips[childLvl]; + let leafMask = 0; + let firstNodeIdx; + for (let i = 0; i < this._siblingOffset.length; i++) { + const childX = x * 2 + this._siblingOffset[i][0]; + const childY = y * 2 + this._siblingOffset[i][1]; + const elevation = childMip.getElevation(childX, childY); + const leaf = childMip.isLeaf(childX, childY); + const nodeIdx = this._addNode(elevation.min, elevation.max, leaf); + if (leaf) + leafMask |= 1 << i; + if (!firstNodeIdx) + firstNodeIdx = nodeIdx; + } + for (let i = 0; i < this._siblingOffset.length; i++) { + if (!(leafMask & 1 << i)) { + this._construct(mips, x * 2 + this._siblingOffset[i][0], y * 2 + this._siblingOffset[i][1], childLvl, firstNodeIdx + i); + } + } + } +} +function bilinearLerp(p00, p10, p01, p11, x, y) { + return number(number(p00, p01, y), number(p10, p11, y), x); +} +function sampleElevation(fx, fy, dem) { + const demSize = dem.dim; + const x = clamp(fx * demSize - 0.5, 0, demSize - 1); + const y = clamp(fy * demSize - 0.5, 0, demSize - 1); + const ixMin = Math.floor(x); + const iyMin = Math.floor(y); + const ixMax = Math.min(ixMin + 1, demSize - 1); + const iyMax = Math.min(iyMin + 1, demSize - 1); + const e00 = dem.get(ixMin, iyMin); + const e10 = dem.get(ixMax, iyMin); + const e01 = dem.get(ixMin, iyMax); + const e11 = dem.get(ixMax, iyMax); + return bilinearLerp(e00, e10, e01, e11, x - ixMin, y - iyMin); +} +function buildDemMipmap(dem) { + const demSize = dem.dim; + const elevationDiffThreshold = 5; + const texelSizeOfMip0 = 8; + const levelCount = Math.ceil(Math.log2(demSize / texelSizeOfMip0)); + const mips = []; + let blockCount = Math.ceil(Math.pow(2, levelCount)); + const blockSize = 1 / blockCount; + const blockSamples = (x, y, size, exclusive, outBounds) => { + const padding = exclusive ? 1 : 0; + const minx = x * size; + const maxx = (x + 1) * size - padding; + const miny = y * size; + const maxy = (y + 1) * size - padding; + outBounds[0] = minx; + outBounds[1] = miny; + outBounds[2] = maxx; + outBounds[3] = maxy; + }; + let mip = new MipLevel(blockCount); + const blockBounds = []; + for (let idx = 0; idx < blockCount * blockCount; idx++) { + const y = Math.floor(idx / blockCount); + const x = idx % blockCount; + blockSamples(x, y, blockSize, false, blockBounds); + const e0 = sampleElevation(blockBounds[0], blockBounds[1], dem); + const e1 = sampleElevation(blockBounds[2], blockBounds[1], dem); + const e2 = sampleElevation(blockBounds[2], blockBounds[3], dem); + const e3 = sampleElevation(blockBounds[0], blockBounds[3], dem); + mip.minimums.push(Math.min(e0, e1, e2, e3)); + mip.maximums.push(Math.max(e0, e1, e2, e3)); + mip.leaves.push(1); + } + mips.push(mip); + for (blockCount /= 2; blockCount >= 1; blockCount /= 2) { + const prevMip = mips[mips.length - 1]; + mip = new MipLevel(blockCount); + for (let idx = 0; idx < blockCount * blockCount; idx++) { + const y = Math.floor(idx / blockCount); + const x = idx % blockCount; + blockSamples(x, y, 2, true, blockBounds); + const e0 = prevMip.getElevation(blockBounds[0], blockBounds[1]); + const e1 = prevMip.getElevation(blockBounds[2], blockBounds[1]); + const e2 = prevMip.getElevation(blockBounds[2], blockBounds[3]); + const e3 = prevMip.getElevation(blockBounds[0], blockBounds[3]); + const l0 = prevMip.isLeaf(blockBounds[0], blockBounds[1]); + const l1 = prevMip.isLeaf(blockBounds[2], blockBounds[1]); + const l2 = prevMip.isLeaf(blockBounds[2], blockBounds[3]); + const l3 = prevMip.isLeaf(blockBounds[0], blockBounds[3]); + const minElevation = Math.min(e0.min, e1.min, e2.min, e3.min); + const maxElevation = Math.max(e0.max, e1.max, e2.max, e3.max); + const canConcatenate = l0 && l1 && l2 && l3; + mip.maximums.push(maxElevation); + mip.minimums.push(minElevation); + if (maxElevation - minElevation <= elevationDiffThreshold && canConcatenate) { + mip.leaves.push(1); + } else { + mip.leaves.push(0); + } + } + mips.push(mip); + } + return mips; +} + +const unpackVectors = { + mapbox: [ + 6553.6, + 25.6, + 0.1, + 10000 + ], + terrarium: [ + 256, + 1, + 1 / 256, + 32768 + ] +}; +class DEMData { + get tree() { + if (!this._tree) + this._buildQuadTree(); + return this._tree; + } + constructor(uid, data, encoding, borderReady = false, buildQuadTree = false) { + this.uid = uid; + if (data.height !== data.width) + throw new RangeError('DEM tiles must be square'); + if (encoding && encoding !== 'mapbox' && encoding !== 'terrarium') + return warnOnce(`"${ encoding }" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`); + this.stride = data.height; + const dim = this.dim = data.height - 2; + this.data = new Uint32Array(data.data.buffer); + this.encoding = encoding || 'mapbox'; + this.borderReady = borderReady; + if (borderReady) + return; + for (let x = 0; x < dim; x++) { + this.data[this._idx(-1, x)] = this.data[this._idx(0, x)]; + this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)]; + this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)]; + this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)]; + } + this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)]; + this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)]; + this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)]; + this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)]; + if (buildQuadTree) + this._buildQuadTree(); + } + _buildQuadTree() { + this._tree = new DemMinMaxQuadTree(this); + } + get(x, y, clampToEdge = false) { + const pixels = new Uint8Array(this.data.buffer); + if (clampToEdge) { + x = clamp(x, -1, this.dim); + y = clamp(y, -1, this.dim); + } + const index = this._idx(x, y) * 4; + const unpack = this.encoding === 'terrarium' ? this._unpackTerrarium : this._unpackMapbox; + return unpack(pixels[index], pixels[index + 1], pixels[index + 2]); + } + static getUnpackVector(encoding) { + return unpackVectors[encoding]; + } + get unpackVector() { + return unpackVectors[this.encoding]; + } + _idx(x, y) { + if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) + throw new RangeError('out of range source coordinates for DEM data'); + return (y + 1) * this.stride + (x + 1); + } + _unpackMapbox(r, g, b) { + return (r * 256 * 256 + g * 256 + b) / 10 - 10000; + } + _unpackTerrarium(r, g, b) { + return r * 256 + g + b / 256 - 32768; + } + static pack(altitude, encoding) { + const color = [ + 0, + 0, + 0, + 0 + ]; + const vector = DEMData.getUnpackVector(encoding); + let v = Math.floor((altitude + vector[3]) / vector[2]); + color[2] = v % 256; + v = Math.floor(v / 256); + color[1] = v % 256; + v = Math.floor(v / 256); + color[0] = v; + return color; + } + getPixels() { + return new RGBAImage({ + width: this.stride, + height: this.stride + }, new Uint8Array(this.data.buffer)); + } + backfillBorder(borderTile, dx, dy) { + if (this.dim !== borderTile.dim) + throw new Error('dem dimension mismatch'); + let xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim; + switch (dx) { + case -1: + xMin = xMax - 1; + break; + case 1: + xMax = xMin + 1; + break; + } + switch (dy) { + case -1: + yMin = yMax - 1; + break; + case 1: + yMax = yMin + 1; + break; + } + const ox = -dx * this.dim; + const oy = -dy * this.dim; + for (let y = yMin; y < yMax; y++) { + for (let x = xMin; x < xMax; x++) { + this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)]; + } + } + } + onDeserialize() { + if (this._tree) + this._tree.dem = this; + } +} +register('DEMData', DEMData); +register('DemMinMaxQuadTree', DemMinMaxQuadTree, { omit: ['dem'] }); + +class TileCache { + constructor(max, onRemove) { + this.max = max; + this.onRemove = onRemove; + this.reset(); + } + reset() { + for (const key in this.data) { + for (const removedData of this.data[key]) { + if (removedData.timeout) + clearTimeout(removedData.timeout); + this.onRemove(removedData.value); + } + } + this.data = {}; + this.order = []; + return this; + } + add(tileID, data, expiryTimeout) { + const key = tileID.wrapped().key; + if (this.data[key] === undefined) { + this.data[key] = []; + } + const dataWrapper = { + value: data, + timeout: undefined + }; + if (expiryTimeout !== undefined) { + dataWrapper.timeout = setTimeout(() => { + this.remove(tileID, dataWrapper); + }, expiryTimeout); + } + this.data[key].push(dataWrapper); + this.order.push(key); + if (this.order.length > this.max) { + const removedData = this._getAndRemoveByKey(this.order[0]); + if (removedData) + this.onRemove(removedData); + } + return this; + } + has(tileID) { + return tileID.wrapped().key in this.data; + } + getAndRemove(tileID) { + if (!this.has(tileID)) { + return null; + } + return this._getAndRemoveByKey(tileID.wrapped().key); + } + _getAndRemoveByKey(key) { + const data = this.data[key].shift(); + if (data.timeout) + clearTimeout(data.timeout); + if (this.data[key].length === 0) { + delete this.data[key]; + } + this.order.splice(this.order.indexOf(key), 1); + return data.value; + } + getByKey(key) { + const data = this.data[key]; + return data ? data[0].value : null; + } + get(tileID) { + if (!this.has(tileID)) { + return null; + } + const data = this.data[tileID.wrapped().key][0]; + return data.value; + } + remove(tileID, value) { + if (!this.has(tileID)) { + return this; + } + const key = tileID.wrapped().key; + const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); + const data = this.data[key][dataIndex]; + this.data[key].splice(dataIndex, 1); + if (data.timeout) + clearTimeout(data.timeout); + if (this.data[key].length === 0) { + delete this.data[key]; + } + this.onRemove(data.value); + this.order.splice(this.order.indexOf(key), 1); + return this; + } + setMaxSize(max) { + this.max = max; + while (this.order.length > this.max) { + const removedData = this._getAndRemoveByKey(this.order[0]); + if (removedData) + this.onRemove(removedData); + } + return this; + } + filter(filterFn) { + const removed = []; + for (const key in this.data) { + for (const entry of this.data[key]) { + if (!filterFn(entry.value)) { + removed.push(entry); + } + } + } + for (const r of removed) { + this.remove(r.value.tileID, r); + } + } +} + +class IndexBuffer { + constructor(context, array, dynamicDraw) { + this.context = context; + const gl = context.gl; + this.buffer = gl.createBuffer(); + this.dynamicDraw = Boolean(dynamicDraw); + this.context.unbindVAO(); + context.bindElementBuffer.set(this.buffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); + if (!this.dynamicDraw) { + delete array.arrayBuffer; + } + } + bind() { + this.context.bindElementBuffer.set(this.buffer); + } + updateData(array) { + const gl = this.context.gl; + this.context.unbindVAO(); + this.bind(); + gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); + } + destroy() { + const gl = this.context.gl; + if (this.buffer) { + gl.deleteBuffer(this.buffer); + delete this.buffer; + } + } +} + +const AttributeType = { + Int8: 'BYTE', + Uint8: 'UNSIGNED_BYTE', + Int16: 'SHORT', + Uint16: 'UNSIGNED_SHORT', + Int32: 'INT', + Uint32: 'UNSIGNED_INT', + Float32: 'FLOAT' +}; +class VertexBuffer { + constructor(context, array, attributes, dynamicDraw) { + this.length = array.length; + this.attributes = attributes; + this.itemSize = array.bytesPerElement; + this.dynamicDraw = dynamicDraw; + this.context = context; + const gl = context.gl; + this.buffer = gl.createBuffer(); + context.bindVertexBuffer.set(this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); + if (!this.dynamicDraw) { + delete array.arrayBuffer; + } + } + bind() { + this.context.bindVertexBuffer.set(this.buffer); + } + updateData(array) { + const gl = this.context.gl; + this.bind(); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); + } + enableAttributes(gl, program) { + for (let j = 0; j < this.attributes.length; j++) { + const member = this.attributes[j]; + const attribIndex = program.attributes[member.name]; + if (attribIndex !== undefined) { + gl.enableVertexAttribArray(attribIndex); + } + } + } + setVertexAttribPointers(gl, program, vertexOffset) { + for (let j = 0; j < this.attributes.length; j++) { + const member = this.attributes[j]; + const attribIndex = program.attributes[member.name]; + if (attribIndex !== undefined) { + gl.vertexAttribPointer(attribIndex, member.components, gl[AttributeType[member.type]], false, this.itemSize, member.offset + this.itemSize * (vertexOffset || 0)); + } + } + } + destroy() { + const gl = this.context.gl; + if (this.buffer) { + gl.deleteBuffer(this.buffer); + delete this.buffer; + } + } +} + +class BaseValue { + constructor(context) { + this.gl = context.gl; + this.default = this.getDefault(); + this.current = this.default; + this.dirty = false; + } + get() { + return this.current; + } + set(value) { + } + getDefault() { + return this.default; + } + setDefault() { + this.set(this.default); + } +} +class ClearColor extends BaseValue { + getDefault() { + return Color.transparent; + } + set(v) { + const c = this.current; + if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) + return; + this.gl.clearColor(v.r, v.g, v.b, v.a); + this.current = v; + this.dirty = false; + } +} +class ClearDepth extends BaseValue { + getDefault() { + return 1; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.clearDepth(v); + this.current = v; + this.dirty = false; + } +} +class ClearStencil extends BaseValue { + getDefault() { + return 0; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.clearStencil(v); + this.current = v; + this.dirty = false; + } +} +class ColorMask extends BaseValue { + getDefault() { + return [ + true, + true, + true, + true + ]; + } + set(v) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) + return; + this.gl.colorMask(v[0], v[1], v[2], v[3]); + this.current = v; + this.dirty = false; + } +} +class DepthMask extends BaseValue { + getDefault() { + return true; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.depthMask(v); + this.current = v; + this.dirty = false; + } +} +class StencilMask extends BaseValue { + getDefault() { + return 255; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.stencilMask(v); + this.current = v; + this.dirty = false; + } +} +class StencilFunc extends BaseValue { + getDefault() { + return { + func: this.gl.ALWAYS, + ref: 0, + mask: 255 + }; + } + set(v) { + const c = this.current; + if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) + return; + this.gl.stencilFunc(v.func, v.ref, v.mask); + this.current = v; + this.dirty = false; + } +} +class StencilOp extends BaseValue { + getDefault() { + const gl = this.gl; + return [ + gl.KEEP, + gl.KEEP, + gl.KEEP + ]; + } + set(v) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) + return; + this.gl.stencilOp(v[0], v[1], v[2]); + this.current = v; + this.dirty = false; + } +} +class StencilTest extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + if (v) { + gl.enable(gl.STENCIL_TEST); + } else { + gl.disable(gl.STENCIL_TEST); + } + this.current = v; + this.dirty = false; + } +} +class DepthRange extends BaseValue { + getDefault() { + return [ + 0, + 1 + ]; + } + set(v) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && !this.dirty) + return; + this.gl.depthRange(v[0], v[1]); + this.current = v; + this.dirty = false; + } +} +class DepthTest extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + if (v) { + gl.enable(gl.DEPTH_TEST); + } else { + gl.disable(gl.DEPTH_TEST); + } + this.current = v; + this.dirty = false; + } +} +class DepthFunc extends BaseValue { + getDefault() { + return this.gl.LESS; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.depthFunc(v); + this.current = v; + this.dirty = false; + } +} +class Blend extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + if (v) { + gl.enable(gl.BLEND); + } else { + gl.disable(gl.BLEND); + } + this.current = v; + this.dirty = false; + } +} +class BlendFunc extends BaseValue { + getDefault() { + const gl = this.gl; + return [ + gl.ONE, + gl.ZERO + ]; + } + set(v) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && !this.dirty) + return; + this.gl.blendFunc(v[0], v[1]); + this.current = v; + this.dirty = false; + } +} +class BlendColor extends BaseValue { + getDefault() { + return Color.transparent; + } + set(v) { + const c = this.current; + if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) + return; + this.gl.blendColor(v.r, v.g, v.b, v.a); + this.current = v; + this.dirty = false; + } +} +class BlendEquation extends BaseValue { + getDefault() { + return this.gl.FUNC_ADD; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.blendEquation(v); + this.current = v; + this.dirty = false; + } +} +class CullFace extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + if (v) { + gl.enable(gl.CULL_FACE); + } else { + gl.disable(gl.CULL_FACE); + } + this.current = v; + this.dirty = false; + } +} +class CullFaceSide extends BaseValue { + getDefault() { + return this.gl.BACK; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.cullFace(v); + this.current = v; + this.dirty = false; + } +} +class FrontFace extends BaseValue { + getDefault() { + return this.gl.CCW; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.frontFace(v); + this.current = v; + this.dirty = false; + } +} +class Program extends BaseValue { + getDefault() { + return null; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.useProgram(v); + this.current = v; + this.dirty = false; + } +} +class ActiveTextureUnit extends BaseValue { + getDefault() { + return this.gl.TEXTURE0; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.gl.activeTexture(v); + this.current = v; + this.dirty = false; + } +} +class Viewport extends BaseValue { + getDefault() { + const gl = this.gl; + return [ + 0, + 0, + gl.drawingBufferWidth, + gl.drawingBufferHeight + ]; + } + set(v) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) + return; + this.gl.viewport(v[0], v[1], v[2], v[3]); + this.current = v; + this.dirty = false; + } +} +class BindFramebuffer extends BaseValue { + getDefault() { + return null; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.bindFramebuffer(gl.FRAMEBUFFER, v); + this.current = v; + this.dirty = false; + } +} +class BindRenderbuffer extends BaseValue { + getDefault() { + return null; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.bindRenderbuffer(gl.RENDERBUFFER, v); + this.current = v; + this.dirty = false; + } +} +class BindTexture extends BaseValue { + getDefault() { + return null; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.bindTexture(gl.TEXTURE_2D, v); + this.current = v; + this.dirty = false; + } +} +class BindVertexBuffer extends BaseValue { + getDefault() { + return null; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.bindBuffer(gl.ARRAY_BUFFER, v); + this.current = v; + this.dirty = false; + } +} +class BindElementBuffer extends BaseValue { + getDefault() { + return null; + } + set(v) { + const gl = this.gl; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); + this.current = v; + this.dirty = false; + } +} +class BindVertexArrayOES extends BaseValue { + constructor(context) { + super(context); + this.vao = context.extVertexArrayObject; + } + getDefault() { + return null; + } + set(v) { + if (!this.vao || v === this.current && !this.dirty) + return; + this.vao.bindVertexArrayOES(v); + this.current = v; + this.dirty = false; + } +} +class PixelStoreUnpack extends BaseValue { + getDefault() { + return 4; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); + this.current = v; + this.dirty = false; + } +} +class PixelStoreUnpackPremultiplyAlpha extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, v); + this.current = v; + this.dirty = false; + } +} +class PixelStoreUnpackFlipY extends BaseValue { + getDefault() { + return false; + } + set(v) { + if (v === this.current && !this.dirty) + return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, v); + this.current = v; + this.dirty = false; + } +} +class FramebufferAttachment extends BaseValue { + constructor(context, parent) { + super(context); + this.context = context; + this.parent = parent; + } + getDefault() { + return null; + } +} +class ColorAttachment extends FramebufferAttachment { + setDirty() { + this.dirty = true; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.context.bindFramebuffer.set(this.parent); + const gl = this.gl; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); + this.current = v; + this.dirty = false; + } +} +class DepthAttachment extends FramebufferAttachment { + attachment() { + return this.gl.DEPTH_ATTACHMENT; + } + set(v) { + if (v === this.current && !this.dirty) + return; + this.context.bindFramebuffer.set(this.parent); + const gl = this.gl; + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, this.attachment(), gl.RENDERBUFFER, v); + this.current = v; + this.dirty = false; + } +} +class DepthStencilAttachment extends DepthAttachment { + attachment() { + return this.gl.DEPTH_STENCIL_ATTACHMENT; + } +} + +class Framebuffer { + constructor(context, width, height, hasDepth) { + this.context = context; + this.width = width; + this.height = height; + const gl = context.gl; + const fbo = this.framebuffer = gl.createFramebuffer(); + this.colorAttachment = new ColorAttachment(context, fbo); + if (hasDepth) { + this.depthAttachment = new DepthAttachment(context, fbo); + } + } + destroy() { + const gl = this.context.gl; + const texture = this.colorAttachment.get(); + if (texture) + gl.deleteTexture(texture); + if (this.depthAttachment) { + const renderbuffer = this.depthAttachment.get(); + if (renderbuffer) + gl.deleteRenderbuffer(renderbuffer); + } + gl.deleteFramebuffer(this.framebuffer); + } +} + +const ALWAYS = 519; +class DepthMode { + constructor(depthFunc, depthMask, depthRange) { + this.func = depthFunc; + this.mask = depthMask; + this.range = depthRange; + } +} +DepthMode.ReadOnly = false; +DepthMode.ReadWrite = true; +DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [ + 0, + 1 +]); + +const ALWAYS$1 = 519; +const KEEP = 7680; +class StencilMode { + constructor(test, ref, mask, fail, depthFail, pass) { + this.test = test; + this.ref = ref; + this.mask = mask; + this.fail = fail; + this.depthFail = depthFail; + this.pass = pass; + } +} +StencilMode.disabled = new StencilMode({ + func: ALWAYS$1, + mask: 0 +}, 0, 0, KEEP, KEEP, KEEP); + +const ZERO = 0; +const ONE = 1; +const ONE_MINUS_SRC_ALPHA = 771; +class ColorMode { + constructor(blendFunction, blendColor, mask) { + this.blendFunction = blendFunction; + this.blendColor = blendColor; + this.mask = mask; + } +} +ColorMode.Replace = [ + ONE, + ZERO +]; +ColorMode.disabled = new ColorMode(ColorMode.Replace, Color.transparent, [ + false, + false, + false, + false +]); +ColorMode.unblended = new ColorMode(ColorMode.Replace, Color.transparent, [ + true, + true, + true, + true +]); +ColorMode.alphaBlended = new ColorMode([ + ONE, + ONE_MINUS_SRC_ALPHA +], Color.transparent, [ + true, + true, + true, + true +]); + +const BACK = 1029; +const FRONT = 1028; +const CCW = 2305; +const CW = 2304; +class CullFaceMode { + constructor(enable, mode, frontFace) { + this.enable = enable; + this.mode = mode; + this.frontFace = frontFace; + } +} +CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); +CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); +CullFaceMode.backCW = new CullFaceMode(true, BACK, CW); +CullFaceMode.frontCW = new CullFaceMode(true, FRONT, CW); +CullFaceMode.frontCCW = new CullFaceMode(true, FRONT, CCW); + +class Context { + constructor(gl) { + this.gl = gl; + this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); + this.clearColor = new ClearColor(this); + this.clearDepth = new ClearDepth(this); + this.clearStencil = new ClearStencil(this); + this.colorMask = new ColorMask(this); + this.depthMask = new DepthMask(this); + this.stencilMask = new StencilMask(this); + this.stencilFunc = new StencilFunc(this); + this.stencilOp = new StencilOp(this); + this.stencilTest = new StencilTest(this); + this.depthRange = new DepthRange(this); + this.depthTest = new DepthTest(this); + this.depthFunc = new DepthFunc(this); + this.blend = new Blend(this); + this.blendFunc = new BlendFunc(this); + this.blendColor = new BlendColor(this); + this.blendEquation = new BlendEquation(this); + this.cullFace = new CullFace(this); + this.cullFaceSide = new CullFaceSide(this); + this.frontFace = new FrontFace(this); + this.program = new Program(this); + this.activeTexture = new ActiveTextureUnit(this); + this.viewport = new Viewport(this); + this.bindFramebuffer = new BindFramebuffer(this); + this.bindRenderbuffer = new BindRenderbuffer(this); + this.bindTexture = new BindTexture(this); + this.bindVertexBuffer = new BindVertexBuffer(this); + this.bindElementBuffer = new BindElementBuffer(this); + this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this); + this.pixelStoreUnpack = new PixelStoreUnpack(this); + this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this); + this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this); + this.extTextureFilterAnisotropic = gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic'); + if (this.extTextureFilterAnisotropic) { + this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } + this.extTextureFilterAnisotropicForceOff = false; + this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); + if (this.extTextureHalfFloat) { + gl.getExtension('OES_texture_half_float_linear'); + this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float'); + } + this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query'); + this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + } + setDefault() { + this.unbindVAO(); + this.clearColor.setDefault(); + this.clearDepth.setDefault(); + this.clearStencil.setDefault(); + this.colorMask.setDefault(); + this.depthMask.setDefault(); + this.stencilMask.setDefault(); + this.stencilFunc.setDefault(); + this.stencilOp.setDefault(); + this.stencilTest.setDefault(); + this.depthRange.setDefault(); + this.depthTest.setDefault(); + this.depthFunc.setDefault(); + this.blend.setDefault(); + this.blendFunc.setDefault(); + this.blendColor.setDefault(); + this.blendEquation.setDefault(); + this.cullFace.setDefault(); + this.cullFaceSide.setDefault(); + this.frontFace.setDefault(); + this.program.setDefault(); + this.activeTexture.setDefault(); + this.bindFramebuffer.setDefault(); + this.pixelStoreUnpack.setDefault(); + this.pixelStoreUnpackPremultiplyAlpha.setDefault(); + this.pixelStoreUnpackFlipY.setDefault(); + } + setDirty() { + this.clearColor.dirty = true; + this.clearDepth.dirty = true; + this.clearStencil.dirty = true; + this.colorMask.dirty = true; + this.depthMask.dirty = true; + this.stencilMask.dirty = true; + this.stencilFunc.dirty = true; + this.stencilOp.dirty = true; + this.stencilTest.dirty = true; + this.depthRange.dirty = true; + this.depthTest.dirty = true; + this.depthFunc.dirty = true; + this.blend.dirty = true; + this.blendFunc.dirty = true; + this.blendColor.dirty = true; + this.blendEquation.dirty = true; + this.cullFace.dirty = true; + this.cullFaceSide.dirty = true; + this.frontFace.dirty = true; + this.program.dirty = true; + this.activeTexture.dirty = true; + this.viewport.dirty = true; + this.bindFramebuffer.dirty = true; + this.bindRenderbuffer.dirty = true; + this.bindTexture.dirty = true; + this.bindVertexBuffer.dirty = true; + this.bindElementBuffer.dirty = true; + if (this.extVertexArrayObject) { + this.bindVertexArrayOES.dirty = true; + } + this.pixelStoreUnpack.dirty = true; + this.pixelStoreUnpackPremultiplyAlpha.dirty = true; + this.pixelStoreUnpackFlipY.dirty = true; + } + createIndexBuffer(array, dynamicDraw) { + return new IndexBuffer(this, array, dynamicDraw); + } + createVertexBuffer(array, attributes, dynamicDraw) { + return new VertexBuffer(this, array, attributes, dynamicDraw); + } + createRenderbuffer(storageFormat, width, height) { + const gl = this.gl; + const rbo = gl.createRenderbuffer(); + this.bindRenderbuffer.set(rbo); + gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); + this.bindRenderbuffer.set(null); + return rbo; + } + createFramebuffer(width, height, hasDepth) { + return new Framebuffer(this, width, height, hasDepth); + } + clear({color, depth, stencil}) { + const gl = this.gl; + let mask = 0; + if (color) { + mask |= gl.COLOR_BUFFER_BIT; + this.clearColor.set(color); + this.colorMask.set([ + true, + true, + true, + true + ]); + } + if (typeof depth !== 'undefined') { + mask |= gl.DEPTH_BUFFER_BIT; + this.depthRange.set([ + 0, + 1 + ]); + this.clearDepth.set(depth); + this.depthMask.set(true); + } + if (typeof stencil !== 'undefined') { + mask |= gl.STENCIL_BUFFER_BIT; + this.clearStencil.set(stencil); + this.stencilMask.set(255); + } + gl.clear(mask); + } + setCullFace(cullFaceMode) { + if (cullFaceMode.enable === false) { + this.cullFace.set(false); + } else { + this.cullFace.set(true); + this.cullFaceSide.set(cullFaceMode.mode); + this.frontFace.set(cullFaceMode.frontFace); + } + } + setDepthMode(depthMode) { + if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { + this.depthTest.set(false); + } else { + this.depthTest.set(true); + this.depthFunc.set(depthMode.func); + this.depthMask.set(depthMode.mask); + this.depthRange.set(depthMode.range); + } + } + setStencilMode(stencilMode) { + if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) { + this.stencilTest.set(false); + } else { + this.stencilTest.set(true); + this.stencilMask.set(stencilMode.mask); + this.stencilOp.set([ + stencilMode.fail, + stencilMode.depthFail, + stencilMode.pass + ]); + this.stencilFunc.set({ + func: stencilMode.test.func, + ref: stencilMode.ref, + mask: stencilMode.test.mask + }); + } + } + setColorMode(colorMode) { + if (deepEqual(colorMode.blendFunction, ColorMode.Replace)) { + this.blend.set(false); + } else { + this.blend.set(true); + this.blendFunc.set(colorMode.blendFunction); + this.blendColor.set(colorMode.blendColor); + } + this.colorMask.set(colorMode.mask); + } + unbindVAO() { + if (this.extVertexArrayObject) { + this.bindVertexArrayOES.set(null); + } + } +} + +class SourceCache extends Evented { + constructor(id, source, onlySymbols) { + super(); + this.id = id; + this._onlySymbols = onlySymbols; + source.on('data', e => { + if (e.dataType === 'source' && e.sourceDataType === 'metadata') + this._sourceLoaded = true; + if (this._sourceLoaded && !this._paused && e.dataType === 'source' && e.sourceDataType === 'content') { + this.reload(); + if (this.transform) { + this.update(this.transform); + } + } + }); + source.on('error', () => { + this._sourceErrored = true; + }); + this._source = source; + this._tiles = {}; + this._cache = new TileCache(0, this._unloadTile.bind(this)); + this._timers = {}; + this._cacheTimers = {}; + this._maxTileCacheSize = null; + this._loadedParentTiles = {}; + this._coveredTiles = {}; + this._state = new SourceFeatureState(); + } + onAdd(map) { + this.map = map; + this._maxTileCacheSize = map ? map._maxTileCacheSize : null; + } + loaded() { + if (this._sourceErrored) { + return true; + } + if (!this._sourceLoaded) { + return false; + } + if (!this._source.loaded()) { + return false; + } + for (const t in this._tiles) { + const tile = this._tiles[t]; + if (tile.state !== 'loaded' && tile.state !== 'errored') + return false; + } + return true; + } + getSource() { + return this._source; + } + pause() { + this._paused = true; + } + resume() { + if (!this._paused) + return; + const shouldReload = this._shouldReloadOnResume; + this._paused = false; + this._shouldReloadOnResume = false; + if (shouldReload) + this.reload(); + if (this.transform) + this.update(this.transform); + } + _loadTile(tile, callback) { + tile.isSymbolTile = this._onlySymbols; + return this._source.loadTile(tile, callback); + } + _unloadTile(tile) { + if (this._source.unloadTile) + return this._source.unloadTile(tile, () => { + }); + } + _abortTile(tile) { + if (this._source.abortTile) + return this._source.abortTile(tile, () => { + }); + } + serialize() { + return this._source.serialize(); + } + prepare(context) { + if (this._source.prepare) { + this._source.prepare(); + } + this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); + for (const i in this._tiles) { + const tile = this._tiles[i]; + tile.upload(context); + tile.prepare(this.map.style.imageManager); + } + } + getIds() { + return values(this._tiles).map(tile => tile.tileID).sort(compareTileId).map(id => id.key); + } + getRenderableIds(symbolLayer) { + const renderables = []; + for (const id in this._tiles) { + if (this._isIdRenderable(+id, symbolLayer)) + renderables.push(this._tiles[id]); + } + if (symbolLayer) { + return renderables.sort((a_, b_) => { + const a = a_.tileID; + const b = b_.tileID; + const rotatedA = new pointGeometry(a.canonical.x, a.canonical.y)._rotate(this.transform.angle); + const rotatedB = new pointGeometry(b.canonical.x, b.canonical.y)._rotate(this.transform.angle); + return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; + }).map(tile => tile.tileID.key); + } + return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key); + } + hasRenderableParent(tileID) { + const parentTile = this.findLoadedParent(tileID, 0); + if (parentTile) { + return this._isIdRenderable(parentTile.tileID.key); + } + return false; + } + _isIdRenderable(id, symbolLayer) { + return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); + } + reload() { + if (this._paused) { + this._shouldReloadOnResume = true; + return; + } + this._cache.reset(); + for (const i in this._tiles) { + if (this._tiles[i].state !== 'errored') + this._reloadTile(+i, 'reloading'); + } + } + _reloadTile(id, state) { + const tile = this._tiles[id]; + if (!tile) + return; + if (tile.state !== 'loading') { + tile.state = state; + } + this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); + } + _tileLoaded(tile, id, previousState, err) { + if (err) { + tile.state = 'errored'; + if (err.status !== 404) + this._source.fire(new ErrorEvent(err, { tile })); + else + this.update(this.transform); + return; + } + tile.timeAdded = exported.now(); + if (previousState === 'expired') + tile.refreshedUponExpiration = true; + this._setTileReloadTimer(id, tile); + if (this.getSource().type === 'raster-dem' && tile.dem) + this._backfillDEM(tile); + this._state.initializeTileState(tile, this.map ? this.map.painter : null); + this._source.fire(new Event('data', { + dataType: 'source', + tile, + coord: tile.tileID, + 'sourceCacheId': this.id + })); + } + _backfillDEM(tile) { + const renderables = this.getRenderableIds(); + for (let i = 0; i < renderables.length; i++) { + const borderId = renderables[i]; + if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { + const borderTile = this.getTileByID(borderId); + fillBorder(tile, borderTile); + fillBorder(borderTile, tile); + } + } + function fillBorder(tile, borderTile) { + if (!tile.dem || tile.dem.borderReady) + return; + tile.needsHillshadePrepare = true; + tile.needsDEMTextureUpload = true; + let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; + const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; + const dim = Math.pow(2, tile.tileID.canonical.z); + const borderId = borderTile.tileID.key; + if (dx === 0 && dy === 0) + return; + if (Math.abs(dy) > 1) { + return; + } + if (Math.abs(dx) > 1) { + if (Math.abs(dx + dim) === 1) { + dx += dim; + } else if (Math.abs(dx - dim) === 1) { + dx -= dim; + } + } + if (!borderTile.dem || !tile.dem) + return; + tile.dem.backfillBorder(borderTile.dem, dx, dy); + if (tile.neighboringTiles && tile.neighboringTiles[borderId]) + tile.neighboringTiles[borderId].backfilled = true; + } + } + getTile(tileID) { + return this.getTileByID(tileID.key); + } + getTileByID(id) { + return this._tiles[id]; + } + _retainLoadedChildren(idealTiles, zoom, maxCoveringZoom, retain) { + for (const id in this._tiles) { + let tile = this._tiles[id]; + if (retain[id] || !tile.hasData() || tile.tileID.overscaledZ <= zoom || tile.tileID.overscaledZ > maxCoveringZoom) + continue; + let topmostLoadedID = tile.tileID; + while (tile && tile.tileID.overscaledZ > zoom + 1) { + const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); + tile = this._tiles[parentID.key]; + if (tile && tile.hasData()) { + topmostLoadedID = parentID; + } + } + let tileID = topmostLoadedID; + while (tileID.overscaledZ > zoom) { + tileID = tileID.scaledTo(tileID.overscaledZ - 1); + if (idealTiles[tileID.key]) { + retain[topmostLoadedID.key] = topmostLoadedID; + break; + } + } + } + } + findLoadedParent(tileID, minCoveringZoom) { + if (tileID.key in this._loadedParentTiles) { + const parent = this._loadedParentTiles[tileID.key]; + if (parent && parent.tileID.overscaledZ >= minCoveringZoom) { + return parent; + } else { + return null; + } + } + for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { + const parentTileID = tileID.scaledTo(z); + const tile = this._getLoadedTile(parentTileID); + if (tile) { + return tile; + } + } + } + _getLoadedTile(tileID) { + const tile = this._tiles[tileID.key]; + if (tile && tile.hasData()) { + return tile; + } + const cachedTile = this._cache.getByKey(this._source.reparseOverscaled ? tileID.wrapped().key : tileID.canonical.key); + return cachedTile; + } + updateCacheSize(transform, tileSize) { + tileSize = tileSize || this._source.tileSize; + const widthInTiles = Math.ceil(transform.width / tileSize) + 1; + const heightInTiles = Math.ceil(transform.height / tileSize) + 1; + const approxTilesInView = widthInTiles * heightInTiles; + const commonZoomRange = 5; + const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); + const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; + this._cache.setMaxSize(maxSize); + } + handleWrapJump(lng) { + const prevLng = this._prevLng === undefined ? lng : this._prevLng; + const lngDifference = lng - prevLng; + const worldDifference = lngDifference / 360; + const wrapDelta = Math.round(worldDifference); + this._prevLng = lng; + if (wrapDelta) { + const tiles = {}; + for (const key in this._tiles) { + const tile = this._tiles[key]; + tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); + tiles[tile.tileID.key] = tile; + } + this._tiles = tiles; + for (const id in this._timers) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } + for (const id in this._tiles) { + const tile = this._tiles[id]; + this._setTileReloadTimer(+id, tile); + } + } + } + update(transform, tileSize, updateForTerrain) { + this.transform = transform; + if (!this._sourceLoaded || this._paused || this.transform.freezeTileCoverage) { + return; + } + if (this.usedForTerrain && !updateForTerrain) { + return; + } + this.updateCacheSize(transform, tileSize); + this.handleWrapJump(this.transform.center.lng); + this._coveredTiles = {}; + let idealTileIDs; + if (!this.used && !this.usedForTerrain) { + idealTileIDs = []; + } else if (this._source.tileID) { + idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID).map(unwrapped => new OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y)); + } else { + idealTileIDs = transform.coveringTiles({ + tileSize: tileSize || this._source.tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom && !updateForTerrain, + reparseOverscaled: this._source.reparseOverscaled, + useElevationData: !!this.transform.elevation && !this.usedForTerrain + }); + if (this._source.hasTile) { + idealTileIDs = idealTileIDs.filter(coord => this._source.hasTile(coord)); + } + } + const retain = this._updateRetainedTiles(idealTileIDs); + if (isRasterType(this._source.type) && idealTileIDs.length !== 0) { + const parentsForFading = {}; + const fadingTiles = {}; + const ids = Object.keys(retain); + for (const id of ids) { + const tileID = retain[id]; + const tile = this._tiles[id]; + if (!tile || tile.fadeEndTime && tile.fadeEndTime <= exported.now()) + continue; + const parentTile = this.findLoadedParent(tileID, Math.max(tileID.overscaledZ - SourceCache.maxOverzooming, this._source.minzoom)); + if (parentTile) { + this._addTile(parentTile.tileID); + parentsForFading[parentTile.tileID.key] = parentTile.tileID; + } + fadingTiles[id] = tileID; + } + const minZoom = idealTileIDs[idealTileIDs.length - 1].overscaledZ; + for (const id in this._tiles) { + const childTile = this._tiles[id]; + if (retain[id] || !childTile.hasData()) { + continue; + } + let parentID = childTile.tileID; + while (parentID.overscaledZ > minZoom) { + parentID = parentID.scaledTo(parentID.overscaledZ - 1); + const tile = this._tiles[parentID.key]; + if (tile && tile.hasData() && fadingTiles[parentID.key]) { + retain[id] = childTile.tileID; + break; + } + } + } + for (const id in parentsForFading) { + if (!retain[id]) { + this._coveredTiles[id] = true; + retain[id] = parentsForFading[id]; + } + } + } + for (const retainedId in retain) { + this._tiles[retainedId].clearFadeHold(); + } + const remove = keysDifference(this._tiles, retain); + for (const tileID of remove) { + const tile = this._tiles[tileID]; + if (tile.hasSymbolBuckets && !tile.holdingForFade()) { + tile.setHoldDuration(this.map._fadeDuration); + } else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) { + this._removeTile(+tileID); + } + } + this._updateLoadedParentTileCache(); + if (this._onlySymbols && this._source.afterUpdate) { + this._source.afterUpdate(); + } + } + releaseSymbolFadeTiles() { + for (const id in this._tiles) { + if (this._tiles[id].holdingForFade()) { + this._removeTile(+id); + } + } + } + _updateRetainedTiles(idealTileIDs) { + const retain = {}; + if (idealTileIDs.length === 0) { + return retain; + } + const checked = {}; + const minZoom = idealTileIDs[idealTileIDs.length - 1].overscaledZ; + const maxZoom = idealTileIDs[0].overscaledZ; + const minCoveringZoom = Math.max(maxZoom - SourceCache.maxOverzooming, this._source.minzoom); + const maxCoveringZoom = Math.max(maxZoom + SourceCache.maxUnderzooming, this._source.minzoom); + const missingTiles = {}; + for (const tileID of idealTileIDs) { + const tile = this._addTile(tileID); + retain[tileID.key] = tileID; + if (tile.hasData()) + continue; + if (minZoom < this._source.maxzoom) { + missingTiles[tileID.key] = tileID; + } + } + this._retainLoadedChildren(missingTiles, minZoom, maxCoveringZoom, retain); + for (const tileID of idealTileIDs) { + let tile = this._tiles[tileID.key]; + if (tile.hasData()) + continue; + if (tileID.canonical.z >= this._source.maxzoom) { + const childCoord = tileID.children(this._source.maxzoom)[0]; + const childTile = this.getTile(childCoord); + if (!!childTile && childTile.hasData()) { + retain[childCoord.key] = childCoord; + continue; + } + } else { + const children = tileID.children(this._source.maxzoom); + if (retain[children[0].key] && retain[children[1].key] && retain[children[2].key] && retain[children[3].key]) + continue; + } + let parentWasRequested = tile.wasRequested(); + for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { + const parentId = tileID.scaledTo(overscaledZ); + if (checked[parentId.key]) + break; + checked[parentId.key] = true; + tile = this.getTile(parentId); + if (!tile && parentWasRequested) { + tile = this._addTile(parentId); + } + if (tile) { + retain[parentId.key] = parentId; + parentWasRequested = tile.wasRequested(); + if (tile.hasData()) + break; + } + } + } + return retain; + } + _updateLoadedParentTileCache() { + this._loadedParentTiles = {}; + for (const tileKey in this._tiles) { + const path = []; + let parentTile; + let currentId = this._tiles[tileKey].tileID; + while (currentId.overscaledZ > 0) { + if (currentId.key in this._loadedParentTiles) { + parentTile = this._loadedParentTiles[currentId.key]; + break; + } + path.push(currentId.key); + const parentId = currentId.scaledTo(currentId.overscaledZ - 1); + parentTile = this._getLoadedTile(parentId); + if (parentTile) { + break; + } + currentId = parentId; + } + for (const key of path) { + this._loadedParentTiles[key] = parentTile; + } + } + } + _addTile(tileID) { + let tile = this._tiles[tileID.key]; + if (tile) + return tile; + tile = this._cache.getAndRemove(tileID); + if (tile) { + this._setTileReloadTimer(tileID.key, tile); + tile.tileID = tileID; + this._state.initializeTileState(tile, this.map ? this.map.painter : null); + if (this._cacheTimers[tileID.key]) { + clearTimeout(this._cacheTimers[tileID.key]); + delete this._cacheTimers[tileID.key]; + this._setTileReloadTimer(tileID.key, tile); + } + } + const cached = Boolean(tile); + if (!cached) { + tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom); + this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); + } + if (!tile) + return null; + tile.uses++; + this._tiles[tileID.key] = tile; + if (!cached) + this._source.fire(new Event('dataloading', { + tile, + coord: tile.tileID, + dataType: 'source' + })); + return tile; + } + _setTileReloadTimer(id, tile) { + if (id in this._timers) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } + const expiryTimeout = tile.getExpiryTimeout(); + if (expiryTimeout) { + this._timers[id] = setTimeout(() => { + this._reloadTile(id, 'expired'); + delete this._timers[id]; + }, expiryTimeout); + } + } + _removeTile(id) { + const tile = this._tiles[id]; + if (!tile) + return; + tile.uses--; + delete this._tiles[id]; + if (this._timers[id]) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } + if (tile.uses > 0) + return; + if (tile.hasData() && tile.state !== 'reloading') { + this._cache.add(tile.tileID, tile, tile.getExpiryTimeout()); + } else { + tile.aborted = true; + this._abortTile(tile); + this._unloadTile(tile); + } + } + clearTiles() { + this._shouldReloadOnResume = false; + this._paused = false; + for (const id in this._tiles) + this._removeTile(+id); + this._cache.reset(); + } + tilesIn(queryGeometry, use3DQuery, visualizeQueryGeometry) { + const tileResults = []; + const transform = this.transform; + if (!transform) + return tileResults; + for (const tileID in this._tiles) { + const tile = this._tiles[tileID]; + if (visualizeQueryGeometry) { + tile.clearQueryDebugViz(); + } + if (tile.holdingForFade()) { + continue; + } + const tileResult = queryGeometry.containsTile(tile, transform, use3DQuery); + if (tileResult) { + tileResults.push(tileResult); + } + } + return tileResults; + } + getVisibleCoordinates(symbolLayer) { + const coords = this.getRenderableIds(symbolLayer).map(id => this._tiles[id].tileID); + for (const coord of coords) { + coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped()); + } + return coords; + } + hasTransition() { + if (this._source.hasTransition()) { + return true; + } + if (isRasterType(this._source.type)) { + for (const id in this._tiles) { + const tile = this._tiles[id]; + if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= exported.now()) { + return true; + } + } + } + return false; + } + setFeatureState(sourceLayer, featureId, state) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + this._state.updateState(sourceLayer, featureId, state); + } + removeFeatureState(sourceLayer, featureId, key) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + this._state.removeFeatureState(sourceLayer, featureId, key); + } + getFeatureState(sourceLayer, featureId) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + return this._state.getState(sourceLayer, featureId); + } + setDependencies(tileKey, namespace, dependencies) { + const tile = this._tiles[tileKey]; + if (tile) { + tile.setDependencies(namespace, dependencies); + } + } + reloadTilesForDependencies(namespaces, keys) { + for (const id in this._tiles) { + const tile = this._tiles[id]; + if (tile.hasDependency(namespaces, keys)) { + this._reloadTile(+id, 'reloading'); + } + } + this._cache.filter(tile => !tile.hasDependency(namespaces, keys)); + } +} +SourceCache.maxOverzooming = 10; +SourceCache.maxUnderzooming = 3; +function compareTileId(a, b) { + const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0); + const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0); + return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x; +} +function isRasterType(type) { + return type === 'raster' || type === 'image' || type === 'video'; +} + +class Elevation { + getAtPoint(point, defaultIfNotLoaded = 0) { + const src = this._source(); + if (!src) + return defaultIfNotLoaded; + if (point.y < 0 || point.y > 1) { + return defaultIfNotLoaded; + } + const cache = src; + const z = cache.getSource().maxzoom; + const tiles = 1 << z; + const wrap = Math.floor(point.x); + const px = point.x - wrap; + const tileID = new OverscaledTileID(z, wrap, z, Math.floor(px * tiles), Math.floor(point.y * tiles)); + const demTile = this.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { + return defaultIfNotLoaded; + } + const dem = demTile.dem; + const tilesAtTileZoom = 1 << demTile.tileID.canonical.z; + const x = (px * tilesAtTileZoom - demTile.tileID.canonical.x) * dem.dim; + const y = (point.y * tilesAtTileZoom - demTile.tileID.canonical.y) * dem.dim; + const i = Math.floor(x); + const j = Math.floor(y); + return this.exaggeration() * number(number(dem.get(i, j), dem.get(i, j + 1), y - j), number(dem.get(i + 1, j), dem.get(i + 1, j + 1), y - j), x - i); + } + getAtTileOffset(tileID, x, y) { + const tilesAtTileZoom = 1 << tileID.canonical.z; + return this.getAtPoint(new MercatorCoordinate(tileID.wrap + (tileID.canonical.x + x / EXTENT$1) / tilesAtTileZoom, (tileID.canonical.y + y / EXTENT$1) / tilesAtTileZoom)); + } + getForTilePoints(tileID, points, interpolated, useDemTile) { + const helper = DEMSampler.create(this, tileID, useDemTile); + if (!helper) { + return false; + } + points.forEach(p => { + p[2] = this.exaggeration() * helper.getElevationAt(p[0], p[1], interpolated); + }); + return true; + } + getMinMaxForTile(tileID) { + const demTile = this.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { + return null; + } + const dem = demTile.dem; + const tree = dem.tree; + const demTileID = demTile.tileID; + const scale = 1 << tileID.canonical.z - demTileID.canonical.z; + let xOffset = tileID.canonical.x / scale - demTileID.canonical.x; + let yOffset = tileID.canonical.y / scale - demTileID.canonical.y; + let index = 0; + for (let i = 0; i < tileID.canonical.z - demTileID.canonical.z; i++) { + if (tree.leaves[index]) + break; + xOffset *= 2; + yOffset *= 2; + const childOffset = 2 * Math.floor(yOffset) + Math.floor(xOffset); + index = tree.childOffsets[index] + childOffset; + xOffset = xOffset % 1; + yOffset = yOffset % 1; + } + return { + min: this.exaggeration() * tree.minimums[index], + max: this.exaggeration() * tree.maximums[index] + }; + } + raycast(position, dir, exaggeration) { + throw new Error('Pure virtual method called.'); + } + pointCoordinate(screenPoint) { + throw new Error('Pure virtual method called.'); + } + _source() { + throw new Error('Pure virtual method called.'); + } + exaggeration() { + throw new Error('Pure virtual method called.'); + } + findDEMTileFor(_) { + throw new Error('Pure virtual method called.'); + } + get visibleDemTiles() { + throw new Error('Getter must be implemented in subclass.'); + } +} +class DEMSampler { + constructor(demTile, scale, offset) { + this._demTile = demTile; + this._dem = this._demTile.dem; + this._scale = scale; + this._offset = offset; + } + static create(elevation, tileID, useDemTile) { + const demTile = useDemTile || elevation.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { + return; + } + const dem = demTile.dem; + const demTileID = demTile.tileID; + const scale = 1 << tileID.canonical.z - demTileID.canonical.z; + const xOffset = (tileID.canonical.x / scale - demTileID.canonical.x) * dem.dim; + const yOffset = (tileID.canonical.y / scale - demTileID.canonical.y) * dem.dim; + const k = demTile.tileSize / EXTENT$1 / scale; + return new DEMSampler(demTile, k, [ + xOffset, + yOffset + ]); + } + tileCoordToPixel(x, y) { + const px = x * this._scale + this._offset[0]; + const py = y * this._scale + this._offset[1]; + const i = Math.floor(px); + const j = Math.floor(py); + return new pointGeometry(i, j); + } + getElevationAt(x, y, interpolated, clampToEdge) { + const px = x * this._scale + this._offset[0]; + const py = y * this._scale + this._offset[1]; + const i = Math.floor(px); + const j = Math.floor(py); + const dem = this._dem; + clampToEdge = !!clampToEdge; + return interpolated ? number(number(dem.get(i, j, clampToEdge), dem.get(i, j + 1, clampToEdge), py - j), number(dem.get(i + 1, j, clampToEdge), dem.get(i + 1, j + 1, clampToEdge), py - j), px - i) : dem.get(i, j, clampToEdge); + } + getElevationAtPixel(x, y, clampToEdge) { + return this._dem.get(x, y, !!clampToEdge); + } + getMeterToDEM(lat) { + return (1 << this._demTile.tileID.canonical.z) * mercatorZfromAltitude(1, lat) * this._dem.stride; + } +} + +class FeatureIndex { + constructor(tileID, promoteId) { + this.tileID = tileID; + this.x = tileID.canonical.x; + this.y = tileID.canonical.y; + this.z = tileID.canonical.z; + this.grid = new gridIndex(EXTENT$1, 16, 0); + this.featureIndexArray = new FeatureIndexArray(); + this.promoteId = promoteId; + } + insert(feature, geometry, featureIndex, sourceLayerIndex, bucketIndex, layoutVertexArrayOffset = 0) { + const key = this.featureIndexArray.length; + this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex, layoutVertexArrayOffset); + const grid = this.grid; + for (let r = 0; r < geometry.length; r++) { + const ring = geometry[r]; + const bbox = [ + Infinity, + Infinity, + -Infinity, + -Infinity + ]; + for (let i = 0; i < ring.length; i++) { + const p = ring[i]; + bbox[0] = Math.min(bbox[0], p.x); + bbox[1] = Math.min(bbox[1], p.y); + bbox[2] = Math.max(bbox[2], p.x); + bbox[3] = Math.max(bbox[3], p.y); + } + if (bbox[0] < EXTENT$1 && bbox[1] < EXTENT$1 && bbox[2] >= 0 && bbox[3] >= 0) { + grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); + } + } + } + loadVTLayers() { + if (!this.vtLayers) { + this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers; + this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); + } + return this.vtLayers; + } + query(args, styleLayers, serializedLayers, sourceFeatureState) { + this.loadVTLayers(); + const params = args.params || {}, filter = createFilter(params.filter); + const tilespaceGeometry = args.tileResult; + const transform = args.transform; + const bounds = tilespaceGeometry.bufferedTilespaceBounds; + const queryPredicate = (bx1, by1, bx2, by2) => { + return polygonIntersectsBox(tilespaceGeometry.bufferedTilespaceGeometry, bx1, by1, bx2, by2); + }; + const matching = this.grid.query(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y, queryPredicate); + matching.sort(topDownFeatureComparator); + let elevationHelper = null; + if (transform.elevation && matching.length > 0) { + elevationHelper = DEMSampler.create(transform.elevation, this.tileID); + } + const result = {}; + let previousIndex; + for (let k = 0; k < matching.length; k++) { + const index = matching[k]; + if (index === previousIndex) + continue; + previousIndex = index; + const match = this.featureIndexArray.get(index); + let featureGeometry = null; + this.loadMatchingFeature(result, match, filter, params.layers, params.availableImages, styleLayers, serializedLayers, sourceFeatureState, (feature, styleLayer, featureState, layoutVertexArrayOffset = 0) => { + if (!featureGeometry) { + featureGeometry = loadGeometry(feature); + } + return styleLayer.queryIntersectsFeature(tilespaceGeometry, feature, featureState, featureGeometry, this.z, args.transform, args.pixelPosMatrix, elevationHelper, layoutVertexArrayOffset); + }); + } + return result; + } + loadMatchingFeature(result, featureIndexData, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers, sourceFeatureState, intersectionTest) { + const {featureIndex, bucketIndex, sourceLayerIndex, layoutVertexArrayOffset} = featureIndexData; + const layerIDs = this.bucketLayerIDs[bucketIndex]; + if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) + return; + const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); + const sourceLayer = this.vtLayers[sourceLayerName]; + const feature = sourceLayer.feature(featureIndex); + if (filter.needGeometry) { + const evaluationFeature = toEvaluationFeature(feature, true); + if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) { + return; + } + } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { + return; + } + const id = this.getId(feature, sourceLayerName); + for (let l = 0; l < layerIDs.length; l++) { + const layerID = layerIDs[l]; + if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { + continue; + } + const styleLayer = styleLayers[layerID]; + if (!styleLayer) + continue; + let featureState = {}; + if (id !== undefined && sourceFeatureState) { + featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id); + } + const serializedLayer = extend({}, serializedLayers[layerID]); + serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages); + serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages); + const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState, layoutVertexArrayOffset); + if (!intersectionZ) { + continue; + } + const geojsonFeature = new Feature(feature, this.z, this.x, this.y, id); + geojsonFeature.layer = serializedLayer; + let layerResult = result[layerID]; + if (layerResult === undefined) { + layerResult = result[layerID] = []; + } + layerResult.push({ + featureIndex, + feature: geojsonFeature, + intersectionZ + }); + } + } + lookupSymbolFeatures(symbolFeatureIndexes, serializedLayers, bucketIndex, sourceLayerIndex, filterSpec, filterLayerIDs, availableImages, styleLayers) { + const result = {}; + this.loadVTLayers(); + const filter = createFilter(filterSpec); + for (const symbolFeatureIndex of symbolFeatureIndexes) { + this.loadMatchingFeature(result, { + bucketIndex, + sourceLayerIndex, + featureIndex: symbolFeatureIndex, + layoutVertexArrayOffset: 0 + }, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers); + } + return result; + } + hasLayer(id) { + for (const layerIDs of this.bucketLayerIDs) { + for (const layerID of layerIDs) { + if (id === layerID) + return true; + } + } + return false; + } + getId(feature, sourceLayerId) { + let id = feature.id; + if (this.promoteId) { + const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId]; + id = feature.properties[propName]; + if (typeof id === 'boolean') + id = Number(id); + } + return id; + } +} +register('FeatureIndex', FeatureIndex, { + omit: [ + 'rawTileData', + 'sourceLayerCoder' + ] +}); +function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) { + return mapObject(serializedProperties, (property, key) => { + const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null; + return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop; + }); +} +function topDownFeatureComparator(a, b) { + return b - a; +} + +const glyphPadding = 1; +const localGlyphPadding = glyphPadding * SDF_SCALE; +class GlyphAtlas { + constructor(stacks) { + const positions = {}; + const bins = []; + for (const stack in stacks) { + const glyphs = stacks[stack]; + const stackPositions = positions[stack] = {}; + for (const id in glyphs) { + const src = glyphs[+id]; + if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) + continue; + const padding = src.metrics.localGlyph ? localGlyphPadding : glyphPadding; + const bin = { + x: 0, + y: 0, + w: src.bitmap.width + 2 * padding, + h: src.bitmap.height + 2 * padding + }; + bins.push(bin); + stackPositions[id] = { + rect: bin, + metrics: src.metrics + }; + } + } + const {w, h} = potpack(bins); + const image = new AlphaImage({ + width: w || 1, + height: h || 1 + }); + for (const stack in stacks) { + const glyphs = stacks[stack]; + for (const id in glyphs) { + const src = glyphs[+id]; + if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) + continue; + const bin = positions[stack][id].rect; + const padding = src.metrics.localGlyph ? localGlyphPadding : glyphPadding; + AlphaImage.copy(src.bitmap, image, { + x: 0, + y: 0 + }, { + x: bin.x + padding, + y: bin.y + padding + }, src.bitmap); + } + } + this.image = image; + this.positions = positions; + } +} +register('GlyphAtlas', GlyphAtlas); + +class WorkerTile { + constructor(params) { + this.tileID = new OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y); + this.tileZoom = params.tileZoom; + this.uid = params.uid; + this.zoom = params.zoom; + this.pixelRatio = params.pixelRatio; + this.tileSize = params.tileSize; + this.source = params.source; + this.overscaling = this.tileID.overscaleFactor(); + this.showCollisionBoxes = params.showCollisionBoxes; + this.collectResourceTiming = !!params.collectResourceTiming; + this.returnDependencies = !!params.returnDependencies; + this.promoteId = params.promoteId; + this.enableTerrain = !!params.enableTerrain; + this.isSymbolTile = params.isSymbolTile; + } + parse(data, layerIndex, availableImages, actor, callback) { + this.status = 'parsing'; + this.data = data; + this.collisionBoxArray = new CollisionBoxArray(); + const sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort()); + const featureIndex = new FeatureIndex(this.tileID, this.promoteId); + featureIndex.bucketLayerIDs = []; + const buckets = {}; + const options = { + featureIndex, + iconDependencies: {}, + patternDependencies: {}, + glyphDependencies: {}, + availableImages + }; + const layerFamilies = layerIndex.familiesBySource[this.source]; + for (const sourceLayerId in layerFamilies) { + const sourceLayer = data.layers[sourceLayerId]; + if (!sourceLayer) { + continue; + } + let anySymbolLayers = false; + let anyOtherLayers = false; + for (const family of layerFamilies[sourceLayerId]) { + if (family[0].type === 'symbol') { + anySymbolLayers = true; + } else { + anyOtherLayers = true; + } + } + if (this.isSymbolTile === true && !anySymbolLayers) { + continue; + } else if (this.isSymbolTile === false && !anyOtherLayers) { + continue; + } + if (sourceLayer.version === 1) { + warnOnce(`Vector tile source "${ this.source }" layer "${ sourceLayerId }" ` + `does not use vector tile spec v2 and therefore may have some rendering errors.`); + } + const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); + const features = []; + for (let index = 0; index < sourceLayer.length; index++) { + const feature = sourceLayer.feature(index); + const id = featureIndex.getId(feature, sourceLayerId); + features.push({ + feature, + id, + index, + sourceLayerIndex + }); + } + for (const family of layerFamilies[sourceLayerId]) { + const layer = family[0]; + if (this.isSymbolTile !== undefined && layer.type === 'symbol' !== this.isSymbolTile) + continue; + if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) + continue; + if (layer.maxzoom && this.zoom >= layer.maxzoom) + continue; + if (layer.visibility === 'none') + continue; + recalculateLayers(family, this.zoom, availableImages); + const bucket = buckets[layer.id] = layer.createBucket({ + index: featureIndex.bucketLayerIDs.length, + layers: family, + zoom: this.zoom, + pixelRatio: this.pixelRatio, + overscaling: this.overscaling, + collisionBoxArray: this.collisionBoxArray, + sourceLayerIndex, + sourceID: this.source, + enableTerrain: this.enableTerrain + }); + bucket.populate(features, options, this.tileID.canonical); + featureIndex.bucketLayerIDs.push(family.map(l => l.id)); + } + } + let error; + let glyphMap; + let iconMap; + let patternMap; + const taskMetadata = { + type: 'maybePrepare', + isSymbolTile: this.isSymbolTile, + zoom: this.zoom + }; + const stacks = mapObject(options.glyphDependencies, glyphs => Object.keys(glyphs).map(Number)); + if (Object.keys(stacks).length) { + actor.send('getGlyphs', { + uid: this.uid, + stacks + }, (err, result) => { + if (!error) { + error = err; + glyphMap = result; + maybePrepare.call(this); + } + }, undefined, undefined, taskMetadata); + } else { + glyphMap = {}; + } + const icons = Object.keys(options.iconDependencies); + if (icons.length) { + actor.send('getImages', { + icons, + source: this.source, + tileID: this.tileID, + type: 'icons' + }, (err, result) => { + if (!error) { + error = err; + iconMap = result; + maybePrepare.call(this); + } + }, undefined, undefined, taskMetadata); + } else { + iconMap = {}; + } + const patterns = Object.keys(options.patternDependencies); + if (patterns.length) { + actor.send('getImages', { + icons: patterns, + source: this.source, + tileID: this.tileID, + type: 'patterns' + }, (err, result) => { + if (!error) { + error = err; + patternMap = result; + maybePrepare.call(this); + } + }, undefined, undefined, taskMetadata); + } else { + patternMap = {}; + } + maybePrepare.call(this); + function maybePrepare() { + if (error) { + return callback(error); + } else if (glyphMap && iconMap && patternMap) { + const glyphAtlas = new GlyphAtlas(glyphMap); + const imageAtlas = new ImageAtlas(iconMap, patternMap); + for (const key in buckets) { + const bucket = buckets[key]; + if (bucket instanceof SymbolBucket) { + recalculateLayers(bucket.layers, this.zoom, availableImages); + performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes, this.tileID.canonical, this.tileZoom); + } else if (bucket.hasPattern && (bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)) { + recalculateLayers(bucket.layers, this.zoom, availableImages); + bucket.addFeatures(options, this.tileID.canonical, imageAtlas.patternPositions); + } + } + this.status = 'done'; + callback(null, { + buckets: values(buckets).filter(b => !b.isEmpty()), + featureIndex, + collisionBoxArray: this.collisionBoxArray, + glyphAtlasImage: glyphAtlas.image, + imageAtlas, + glyphMap: this.returnDependencies ? glyphMap : null, + iconMap: this.returnDependencies ? iconMap : null, + glyphPositions: this.returnDependencies ? glyphAtlas.positions : null + }); + } + } + } +} +function recalculateLayers(layers, zoom, availableImages) { + const parameters = new EvaluationParameters(zoom); + for (const layer of layers) { + layer.recalculate(parameters, availableImages); + } +} + +class DedupedRequest { + constructor(scheduler) { + this.entries = {}; + this.scheduler = scheduler; + } + request(key, metadata, request, callback) { + const entry = this.entries[key] = this.entries[key] || { callbacks: [] }; + if (entry.result) { + const [err, result] = entry.result; + if (this.scheduler) { + this.scheduler.add(() => { + callback(err, result); + }, metadata); + } else { + callback(err, result); + } + return () => { + }; + } + entry.callbacks.push(callback); + if (!entry.cancel) { + entry.cancel = request((err, result) => { + entry.result = [ + err, + result + ]; + for (const cb of entry.callbacks) { + if (this.scheduler) { + this.scheduler.add(() => { + cb(err, result); + }, metadata); + } else { + cb(err, result); + } + } + setTimeout(() => delete this.entries[key], 1000 * 3); + }); + } + return () => { + if (entry.result) + return; + entry.callbacks = entry.callbacks.filter(cb => cb !== callback); + if (!entry.callbacks.length) { + entry.cancel(); + delete this.entries[key]; + } + }; + } +} +function loadVectorTile(params, callback, skipParse) { + const key = JSON.stringify(params.request); + const makeRequest = callback => { + const request = getArrayBuffer(params.request, (err, data, cacheControl, expires) => { + if (err) { + callback(err); + } else if (data) { + callback(null, { + vectorTile: skipParse ? undefined : new vectorTile.VectorTile(new pbf(data)), + rawData: data, + cacheControl, + expires + }); + } + }); + return () => { + request.cancel(); + callback(); + }; + }; + if (params.data) { + this.deduped.entries[key] = { + result: [ + null, + params.data + ] + }; + } + const callbackMetadata = { + type: 'parseTile', + isSymbolTile: params.isSymbolTile, + zoom: params.tileZoom + }; + return this.deduped.request(key, callbackMetadata, makeRequest, callback); +} +class VectorTileWorkerSource extends Evented { + constructor(actor, layerIndex, availableImages, isSpriteLoaded, loadVectorData) { + super(); + this.actor = actor; + this.layerIndex = layerIndex; + this.availableImages = availableImages; + this.loadVectorData = loadVectorData || loadVectorTile; + this.loading = {}; + this.loaded = {}; + this.deduped = new DedupedRequest(actor.scheduler); + this.isSpriteLoaded = isSpriteLoaded; + this.scheduler = actor.scheduler; + } + loadTile(params, callback) { + const uid = params.uid; + const perf = params && params.request && params.request.collectResourceTiming ? new RequestPerformance(params.request) : false; + const workerTile = this.loading[uid] = new WorkerTile(params); + workerTile.abort = this.loadVectorData(params, (err, response) => { + const aborted = !this.loading[uid]; + delete this.loading[uid]; + if (aborted || err || !response) { + workerTile.status = 'done'; + if (!aborted) + this.loaded[uid] = workerTile; + return callback(err); + } + const rawTileData = response.rawData; + const cacheControl = {}; + if (response.expires) + cacheControl.expires = response.expires; + if (response.cacheControl) + cacheControl.cacheControl = response.cacheControl; + const resourceTiming = {}; + if (perf) { + const resourceTimingData = perf.finish(); + if (resourceTimingData) + resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); + } + workerTile.vectorTile = response.vectorTile || new vectorTile.VectorTile(new pbf(rawTileData)); + const parseTile = () => { + workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, (err, result) => { + if (err || !result) + return callback(err); + callback(null, extend({ rawTileData: rawTileData.slice(0) }, result, cacheControl, resourceTiming)); + }); + }; + if (this.isSpriteLoaded) { + parseTile(); + } else { + this.once('isSpriteLoaded', () => { + if (this.scheduler) { + const metadata = { + type: 'parseTile', + isSymbolTile: params.isSymbolTile, + zoom: params.tileZoom + }; + this.scheduler.add(parseTile, metadata); + } else { + parseTile(); + } + }); + } + this.loaded = this.loaded || {}; + this.loaded[uid] = workerTile; + }); + } + reloadTile(params, callback) { + const loaded = this.loaded, uid = params.uid, vtSource = this; + if (loaded && loaded[uid]) { + const workerTile = loaded[uid]; + workerTile.showCollisionBoxes = params.showCollisionBoxes; + workerTile.enableTerrain = !!params.enableTerrain; + const done = (err, data) => { + const reloadCallback = workerTile.reloadCallback; + if (reloadCallback) { + delete workerTile.reloadCallback; + workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, this.availableImages, vtSource.actor, reloadCallback); + } + callback(err, data); + }; + if (workerTile.status === 'parsing') { + workerTile.reloadCallback = done; + } else if (workerTile.status === 'done') { + if (workerTile.vectorTile) { + workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, done); + } else { + done(); + } + } + } + } + abortTile(params, callback) { + const uid = params.uid; + const tile = this.loading[uid]; + if (tile) { + if (tile.abort) + tile.abort(); + delete this.loading[uid]; + } + callback(); + } + removeTile(params, callback) { + const loaded = this.loaded, uid = params.uid; + if (loaded && loaded[uid]) { + delete loaded[uid]; + } + callback(); + } +} + +var refProperties = [ + 'type', + 'source', + 'source-layer', + 'minzoom', + 'maxzoom', + 'filter', + 'layout' +]; + +exports.AUTH_ERR_MSG = AUTH_ERR_MSG; +exports.Aabb = Aabb; +exports.Actor = Actor; +exports.CanonicalTileID = CanonicalTileID; +exports.Color = Color; +exports.ColorMode = ColorMode; +exports.Context = Context; +exports.CullFaceMode = CullFaceMode; +exports.DEMData = DEMData; +exports.DataConstantProperty = DataConstantProperty; +exports.DedupedRequest = DedupedRequest; +exports.DepthMode = DepthMode; +exports.DepthStencilAttachment = DepthStencilAttachment; +exports.EXTENT = EXTENT$1; +exports.Elevation = Elevation; +exports.ErrorEvent = ErrorEvent; +exports.EvaluationParameters = EvaluationParameters; +exports.Event = Event; +exports.Evented = Evented; +exports.Frustum = Frustum; +exports.GlyphManager = GlyphManager; +exports.ImagePosition = ImagePosition; +exports.LngLat = LngLat; +exports.LngLatBounds = LngLatBounds; +exports.LocalGlyphMode = LocalGlyphMode; +exports.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER; +exports.MercatorCoordinate = MercatorCoordinate; +exports.ONE_EM = ONE_EM; +exports.OverscaledTileID = OverscaledTileID; +exports.Point = pointGeometry; +exports.Point$1 = pointGeometry; +exports.Properties = Properties; +exports.RGBAImage = RGBAImage; +exports.Ray = Ray; +exports.RequestManager = RequestManager; +exports.RequestPerformance = RequestPerformance; +exports.ResourceType = ResourceType; +exports.SegmentVector = SegmentVector; +exports.SourceCache = SourceCache; +exports.StencilMode = StencilMode; +exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; +exports.StructArrayLayout2f1f2i16 = StructArrayLayout2f1f2i16; +exports.StructArrayLayout2i4 = StructArrayLayout2i4; +exports.StructArrayLayout3f12 = StructArrayLayout3f12; +exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; +exports.StructArrayLayout4i8 = StructArrayLayout4i8; +exports.Texture = Texture; +exports.Tile = Tile; +exports.Transitionable = Transitionable; +exports.Uniform1f = Uniform1f; +exports.Uniform1i = Uniform1i; +exports.Uniform2f = Uniform2f; +exports.Uniform3f = Uniform3f; +exports.Uniform4f = Uniform4f; +exports.UniformColor = UniformColor; +exports.UniformMatrix3f = UniformMatrix3f; +exports.UniformMatrix4f = UniformMatrix4f; +exports.UnwrappedTileID = UnwrappedTileID; +exports.ValidationError = ValidationError; +exports.VectorTileWorkerSource = VectorTileWorkerSource; +exports.WritingMode = WritingMode; +exports.ZoomHistory = ZoomHistory; +exports.add = add; +exports.addDynamicAttributes = addDynamicAttributes; +exports.altitudeFromMercatorZ = altitudeFromMercatorZ; +exports.asyncAll = asyncAll; +exports.bezier = bezier; +exports.bindAll = bindAll; +exports.browser = exported; +exports.bufferConvexPolygon = bufferConvexPolygon; +exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded; +exports.clamp = clamp; +exports.clearTileCache = clearTileCache; +exports.clipLine = clipLine; +exports.clone = clone$1; +exports.clone$1 = clone; +exports.collisionCircleLayout = collisionCircleLayout; +exports.config = config; +exports.conjugate = conjugate; +exports.create = create$2; +exports.create$1 = create$1; +exports.create$2 = create; +exports.createExpression = createExpression; +exports.createLayout = createLayout; +exports.createStyleLayer = createStyleLayer; +exports.cross = cross; +exports.deepEqual = deepEqual; +exports.degToRad = degToRad; +exports.div = div; +exports.dot = dot; +exports.ease = ease; +exports.easeCubicInOut = easeCubicInOut; +exports.emitValidationErrors = emitValidationErrors; +exports.endsWith = endsWith; +exports.enforceCacheSizeLimit = enforceCacheSizeLimit; +exports.evaluateSizeForFeature = evaluateSizeForFeature; +exports.evaluateSizeForZoom = evaluateSizeForZoom; +exports.evaluateVariableOffset = evaluateVariableOffset; +exports.evented = evented; +exports.exactEquals = exactEquals$2; +exports.exactEquals$1 = exactEquals; +exports.extend = extend; +exports.featureFilter = createFilter; +exports.filterObject = filterObject; +exports.fromMat4 = fromMat4; +exports.fromQuat = fromQuat; +exports.fromRotation = fromRotation; +exports.getAnchorAlignment = getAnchorAlignment; +exports.getAnchorJustification = getAnchorJustification; +exports.getBounds = getBounds; +exports.getImage = getImage; +exports.getJSON = getJSON; +exports.getMapSessionAPI = getMapSessionAPI; +exports.getRTLTextPluginStatus = getRTLTextPluginStatus; +exports.getReferrer = getReferrer; +exports.getVideo = getVideo; +exports.identity = identity; +exports.identity$1 = identity$1; +exports.invert = invert; +exports.isMapboxURL = isMapboxURL; +exports.latFromMercatorY = latFromMercatorY; +exports.len = len; +exports.length = length; +exports.length$1 = length$2; +exports.loadVectorTile = loadVectorTile; +exports.makeRequest = makeRequest; +exports.mercatorXfromLng = mercatorXfromLng$1; +exports.mercatorYfromLat = mercatorYfromLat$1; +exports.mercatorZfromAltitude = mercatorZfromAltitude; +exports.mul = mul; +exports.mul$1 = mul$1; +exports.multiply = multiply; +exports.mvt = vectorTile; +exports.nextPowerOfTwo = nextPowerOfTwo; +exports.normalize = normalize; +exports.normalize$1 = normalize$2; +exports.number = number; +exports.offscreenCanvasSupported = offscreenCanvasSupported; +exports.ortho = ortho; +exports.pbf = pbf; +exports.perspective = perspective; +exports.pick = pick; +exports.plugin = plugin; +exports.polygonIntersectsBox = polygonIntersectsBox; +exports.polygonIntersectsPolygon = polygonIntersectsPolygon; +exports.polygonizeBounds = polygonizeBounds; +exports.posAttributes = posAttributes; +exports.postMapLoadEvent = postMapLoadEvent; +exports.postTurnstileEvent = postTurnstileEvent; +exports.potpack = potpack; +exports.prevPowerOfTwo = prevPowerOfTwo; +exports.radToDeg = radToDeg; +exports.refProperties = refProperties; +exports.registerForPluginStateChange = registerForPluginStateChange; +exports.renderColorRamp = renderColorRamp; +exports.rotate = rotate; +exports.rotateX = rotateX; +exports.rotateX$1 = rotateX$1; +exports.rotateY = rotateY; +exports.rotateZ = rotateZ; +exports.rotateZ$1 = rotateZ$1; +exports.scale = scale; +exports.scale$1 = scale$2; +exports.scale$2 = scale$1; +exports.scaleAndAdd = scaleAndAdd; +exports.setCacheLimits = setCacheLimits; +exports.setRTLTextPlugin = setRTLTextPlugin; +exports.styleSpec = spec; +exports.sub = sub; +exports.subtract = subtract; +exports.symbolSize = symbolSize; +exports.transformMat3 = transformMat3; +exports.transformMat4 = transformMat4$1; +exports.transformQuat = transformQuat; +exports.translate = translate$1; +exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent; +exports.uniqueId = uniqueId; +exports.validateCustomStyleLayer = validateCustomStyleLayer; +exports.validateLight = validateLight$1; +exports.validateStyle = validateStyle; +exports.values = values; +exports.vectorTile = vectorTile; +exports.version = version; +exports.warnOnce = warnOnce; +exports.webpSupported = exported$1; +exports.window = window$1; +exports.wrap = wrap; + +}); + +define(['./shared'], function (ref_properties) { 'use strict'; + +function stringify(obj) { + const type = typeof obj; + if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) + return JSON.stringify(obj); + if (Array.isArray(obj)) { + let str = '['; + for (const val of obj) { + str += `${ stringify(val) },`; + } + return `${ str }]`; + } + const keys = Object.keys(obj).sort(); + let str = '{'; + for (let i = 0; i < keys.length; i++) { + str += `${ JSON.stringify(keys[i]) }:${ stringify(obj[keys[i]]) },`; + } + return `${ str }}`; +} +function getKey(layer) { + let key = ''; + for (const k of ref_properties.refProperties) { + key += `/${ stringify(layer[k]) }`; + } + return key; +} +function groupByLayout(layers, cachedKeys) { + const groups = {}; + for (let i = 0; i < layers.length; i++) { + const k = cachedKeys && cachedKeys[layers[i].id] || getKey(layers[i]); + if (cachedKeys) + cachedKeys[layers[i].id] = k; + let group = groups[k]; + if (!group) { + group = groups[k] = []; + } + group.push(layers[i]); + } + const result = []; + for (const k in groups) { + result.push(groups[k]); + } + return result; +} + +class StyleLayerIndex { + constructor(layerConfigs) { + this.keyCache = {}; + if (layerConfigs) { + this.replace(layerConfigs); + } + } + replace(layerConfigs) { + this._layerConfigs = {}; + this._layers = {}; + this.update(layerConfigs, []); + } + update(layerConfigs, removedIds) { + for (const layerConfig of layerConfigs) { + this._layerConfigs[layerConfig.id] = layerConfig; + const layer = this._layers[layerConfig.id] = ref_properties.createStyleLayer(layerConfig); + layer._featureFilter = ref_properties.featureFilter(layer.filter); + if (this.keyCache[layerConfig.id]) + delete this.keyCache[layerConfig.id]; + } + for (const id of removedIds) { + delete this.keyCache[id]; + delete this._layerConfigs[id]; + delete this._layers[id]; + } + this.familiesBySource = {}; + const groups = groupByLayout(ref_properties.values(this._layerConfigs), this.keyCache); + for (const layerConfigs of groups) { + const layers = layerConfigs.map(layerConfig => this._layers[layerConfig.id]); + const layer = layers[0]; + if (layer.visibility === 'none') { + continue; + } + const sourceId = layer.source || ''; + let sourceGroup = this.familiesBySource[sourceId]; + if (!sourceGroup) { + sourceGroup = this.familiesBySource[sourceId] = {}; + } + const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer'; + let sourceLayerFamilies = sourceGroup[sourceLayerId]; + if (!sourceLayerFamilies) { + sourceLayerFamilies = sourceGroup[sourceLayerId] = []; + } + sourceLayerFamilies.push(layers); + } + } +} + +const {ImageBitmap} = ref_properties.window; +class RasterDEMTileWorkerSource { + loadTile(params, callback) { + const {uid, encoding, rawImageData, padding, buildQuadTree} = params; + const imagePixels = ImageBitmap && rawImageData instanceof ImageBitmap ? this.getImageData(rawImageData, padding) : rawImageData; + const dem = new ref_properties.DEMData(uid, imagePixels, encoding, padding < 1, buildQuadTree); + callback(null, dem); + } + getImageData(imgBitmap, padding) { + if (!this.offscreenCanvas || !this.offscreenCanvasContext) { + this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height); + this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d'); + } + this.offscreenCanvas.width = imgBitmap.width; + this.offscreenCanvas.height = imgBitmap.height; + this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height); + const imgData = this.offscreenCanvasContext.getImageData(-padding, -padding, imgBitmap.width + 2 * padding, imgBitmap.height + 2 * padding); + this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height); + return new ref_properties.RGBAImage({ + width: imgData.width, + height: imgData.height + }, imgData.data); + } +} + +var geojsonRewind = rewind; +function rewind(gj, outer) { + var type = gj && gj.type, i; + if (type === 'FeatureCollection') { + for (i = 0; i < gj.features.length; i++) + rewind(gj.features[i], outer); + } else if (type === 'GeometryCollection') { + for (i = 0; i < gj.geometries.length; i++) + rewind(gj.geometries[i], outer); + } else if (type === 'Feature') { + rewind(gj.geometry, outer); + } else if (type === 'Polygon') { + rewindRings(gj.coordinates, outer); + } else if (type === 'MultiPolygon') { + for (i = 0; i < gj.coordinates.length; i++) + rewindRings(gj.coordinates[i], outer); + } + return gj; +} +function rewindRings(rings, outer) { + if (rings.length === 0) + return; + rewindRing(rings[0], outer); + for (var i = 1; i < rings.length; i++) { + rewindRing(rings[i], !outer); + } +} +function rewindRing(ring, dir) { + var area = 0; + for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + area += (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); + } + if (area >= 0 !== !!dir) + ring.reverse(); +} + +const toGeoJSON = ref_properties.vectorTile.VectorTileFeature.prototype.toGeoJSON; +class FeatureWrapper { + constructor(feature) { + this._feature = feature; + this.extent = ref_properties.EXTENT; + this.type = feature.type; + this.properties = feature.tags; + if ('id' in feature && !isNaN(feature.id)) { + this.id = parseInt(feature.id, 10); + } + } + loadGeometry() { + if (this._feature.type === 1) { + const geometry = []; + for (const point of this._feature.geometry) { + geometry.push([new ref_properties.Point$1(point[0], point[1])]); + } + return geometry; + } else { + const geometry = []; + for (const ring of this._feature.geometry) { + const newRing = []; + for (const point of ring) { + newRing.push(new ref_properties.Point$1(point[0], point[1])); + } + geometry.push(newRing); + } + return geometry; + } + } + toGeoJSON(x, y, z) { + return toGeoJSON.call(this, x, y, z); + } +} +class GeoJSONWrapper { + constructor(features) { + this.layers = { '_geojsonTileLayer': this }; + this.name = '_geojsonTileLayer'; + this.extent = ref_properties.EXTENT; + this.length = features.length; + this._features = features; + } + feature(i) { + return new FeatureWrapper(this._features[i]); + } +} + +var VectorTileFeature = ref_properties.vectorTile.VectorTileFeature; +var geojson_wrapper = GeoJSONWrapper$1; +function GeoJSONWrapper$1(features, options) { + this.options = options || {}; + this.features = features; + this.length = features.length; +} +GeoJSONWrapper$1.prototype.feature = function (i) { + return new FeatureWrapper$1(this.features[i], this.options.extent); +}; +function FeatureWrapper$1(feature, extent) { + this.id = typeof feature.id === 'number' ? feature.id : undefined; + this.type = feature.type; + this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry; + this.properties = feature.tags; + this.extent = extent || 4096; +} +FeatureWrapper$1.prototype.loadGeometry = function () { + var rings = this.rawGeometry; + this.geometry = []; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + var newRing = []; + for (var j = 0; j < ring.length; j++) { + newRing.push(new ref_properties.Point$1(ring[j][0], ring[j][1])); + } + this.geometry.push(newRing); + } + return this.geometry; +}; +FeatureWrapper$1.prototype.bbox = function () { + if (!this.geometry) + this.loadGeometry(); + var rings = this.geometry; + var x1 = Infinity; + var x2 = -Infinity; + var y1 = Infinity; + var y2 = -Infinity; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + for (var j = 0; j < ring.length; j++) { + var coord = ring[j]; + x1 = Math.min(x1, coord.x); + x2 = Math.max(x2, coord.x); + y1 = Math.min(y1, coord.y); + y2 = Math.max(y2, coord.y); + } + } + return [ + x1, + y1, + x2, + y2 + ]; +}; +FeatureWrapper$1.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; + +var vtPbf = fromVectorTileJs; +var fromVectorTileJs_1 = fromVectorTileJs; +var fromGeojsonVt_1 = fromGeojsonVt; +var GeoJSONWrapper_1 = geojson_wrapper; +function fromVectorTileJs(tile) { + var out = new ref_properties.pbf(); + writeTile(tile, out); + return out.finish(); +} +function fromGeojsonVt(layers, options) { + options = options || {}; + var l = {}; + for (var k in layers) { + l[k] = new geojson_wrapper(layers[k].features, options); + l[k].name = k; + l[k].version = options.version; + l[k].extent = options.extent; + } + return fromVectorTileJs({ layers: l }); +} +function writeTile(tile, pbf) { + for (var key in tile.layers) { + pbf.writeMessage(3, writeLayer, tile.layers[key]); + } +} +function writeLayer(layer, pbf) { + pbf.writeVarintField(15, layer.version || 1); + pbf.writeStringField(1, layer.name || ''); + pbf.writeVarintField(5, layer.extent || 4096); + var i; + var context = { + keys: [], + values: [], + keycache: {}, + valuecache: {} + }; + for (i = 0; i < layer.length; i++) { + context.feature = layer.feature(i); + pbf.writeMessage(2, writeFeature, context); + } + var keys = context.keys; + for (i = 0; i < keys.length; i++) { + pbf.writeStringField(3, keys[i]); + } + var values = context.values; + for (i = 0; i < values.length; i++) { + pbf.writeMessage(4, writeValue, values[i]); + } +} +function writeFeature(context, pbf) { + var feature = context.feature; + if (feature.id !== undefined) { + pbf.writeVarintField(1, feature.id); + } + pbf.writeMessage(2, writeProperties, context); + pbf.writeVarintField(3, feature.type); + pbf.writeMessage(4, writeGeometry, feature); +} +function writeProperties(context, pbf) { + var feature = context.feature; + var keys = context.keys; + var values = context.values; + var keycache = context.keycache; + var valuecache = context.valuecache; + for (var key in feature.properties) { + var keyIndex = keycache[key]; + if (typeof keyIndex === 'undefined') { + keys.push(key); + keyIndex = keys.length - 1; + keycache[key] = keyIndex; + } + pbf.writeVarint(keyIndex); + var value = feature.properties[key]; + var type = typeof value; + if (type !== 'string' && type !== 'boolean' && type !== 'number') { + value = JSON.stringify(value); + } + var valueKey = type + ':' + value; + var valueIndex = valuecache[valueKey]; + if (typeof valueIndex === 'undefined') { + values.push(value); + valueIndex = values.length - 1; + valuecache[valueKey] = valueIndex; + } + pbf.writeVarint(valueIndex); + } +} +function command(cmd, length) { + return (length << 3) + (cmd & 7); +} +function zigzag(num) { + return num << 1 ^ num >> 31; +} +function writeGeometry(feature, pbf) { + var geometry = feature.loadGeometry(); + var type = feature.type; + var x = 0; + var y = 0; + var rings = geometry.length; + for (var r = 0; r < rings; r++) { + var ring = geometry[r]; + var count = 1; + if (type === 1) { + count = ring.length; + } + pbf.writeVarint(command(1, count)); + var lineCount = type === 3 ? ring.length - 1 : ring.length; + for (var i = 0; i < lineCount; i++) { + if (i === 1 && type !== 1) { + pbf.writeVarint(command(2, lineCount - 1)); + } + var dx = ring[i].x - x; + var dy = ring[i].y - y; + pbf.writeVarint(zigzag(dx)); + pbf.writeVarint(zigzag(dy)); + x += dx; + y += dy; + } + if (type === 3) { + pbf.writeVarint(command(7, 1)); + } + } +} +function writeValue(value, pbf) { + var type = typeof value; + if (type === 'string') { + pbf.writeStringField(1, value); + } else if (type === 'boolean') { + pbf.writeBooleanField(7, value); + } else if (type === 'number') { + if (value % 1 !== 0) { + pbf.writeDoubleField(3, value); + } else if (value < 0) { + pbf.writeSVarintField(6, value); + } else { + pbf.writeVarintField(5, value); + } + } +} +vtPbf.fromVectorTileJs = fromVectorTileJs_1; +vtPbf.fromGeojsonVt = fromGeojsonVt_1; +vtPbf.GeoJSONWrapper = GeoJSONWrapper_1; + +function sortKD(ids, coords, nodeSize, left, right, depth) { + if (right - left <= nodeSize) + return; + const m = left + right >> 1; + select(ids, coords, m, left, right, depth % 2); + sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); + sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); +} +function select(ids, coords, k, left, right, inc) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + select(ids, coords, k, newLeft, newRight, inc); + } + const t = coords[2 * k + inc]; + let i = left; + let j = right; + swapItem(ids, coords, left, k); + if (coords[2 * right + inc] > t) + swapItem(ids, coords, left, right); + while (i < j) { + swapItem(ids, coords, i, j); + i++; + j--; + while (coords[2 * i + inc] < t) + i++; + while (coords[2 * j + inc] > t) + j--; + } + if (coords[2 * left + inc] === t) + swapItem(ids, coords, left, j); + else { + j++; + swapItem(ids, coords, j, right); + } + if (j <= k) + left = j + 1; + if (k <= j) + right = j - 1; + } +} +function swapItem(ids, coords, i, j) { + swap(ids, i, j); + swap(coords, 2 * i, 2 * j); + swap(coords, 2 * i + 1, 2 * j + 1); +} +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { + const stack = [ + 0, + ids.length - 1, + 0 + ]; + const result = []; + let x, y; + while (stack.length) { + const axis = stack.pop(); + const right = stack.pop(); + const left = stack.pop(); + if (right - left <= nodeSize) { + for (let i = left; i <= right; i++) { + x = coords[2 * i]; + y = coords[2 * i + 1]; + if (x >= minX && x <= maxX && y >= minY && y <= maxY) + result.push(ids[i]); + } + continue; + } + const m = Math.floor((left + right) / 2); + x = coords[2 * m]; + y = coords[2 * m + 1]; + if (x >= minX && x <= maxX && y >= minY && y <= maxY) + result.push(ids[m]); + const nextAxis = (axis + 1) % 2; + if (axis === 0 ? minX <= x : minY <= y) { + stack.push(left); + stack.push(m - 1); + stack.push(nextAxis); + } + if (axis === 0 ? maxX >= x : maxY >= y) { + stack.push(m + 1); + stack.push(right); + stack.push(nextAxis); + } + } + return result; +} + +function within(ids, coords, qx, qy, r, nodeSize) { + const stack = [ + 0, + ids.length - 1, + 0 + ]; + const result = []; + const r2 = r * r; + while (stack.length) { + const axis = stack.pop(); + const right = stack.pop(); + const left = stack.pop(); + if (right - left <= nodeSize) { + for (let i = left; i <= right; i++) { + if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) + result.push(ids[i]); + } + continue; + } + const m = Math.floor((left + right) / 2); + const x = coords[2 * m]; + const y = coords[2 * m + 1]; + if (sqDist(x, y, qx, qy) <= r2) + result.push(ids[m]); + const nextAxis = (axis + 1) % 2; + if (axis === 0 ? qx - r <= x : qy - r <= y) { + stack.push(left); + stack.push(m - 1); + stack.push(nextAxis); + } + if (axis === 0 ? qx + r >= x : qy + r >= y) { + stack.push(m + 1); + stack.push(right); + stack.push(nextAxis); + } + } + return result; +} +function sqDist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} + +const defaultGetX = p => p[0]; +const defaultGetY = p => p[1]; +class KDBush { + constructor(points, getX = defaultGetX, getY = defaultGetY, nodeSize = 64, ArrayType = Float64Array) { + this.nodeSize = nodeSize; + this.points = points; + const IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; + const ids = this.ids = new IndexArrayType(points.length); + const coords = this.coords = new ArrayType(points.length * 2); + for (let i = 0; i < points.length; i++) { + ids[i] = i; + coords[2 * i] = getX(points[i]); + coords[2 * i + 1] = getY(points[i]); + } + sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); + } + range(minX, minY, maxX, maxY) { + return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); + } + within(x, y, r) { + return within(this.ids, this.coords, x, y, r, this.nodeSize); + } +} + +const defaultOptions = { + minZoom: 0, + maxZoom: 16, + minPoints: 2, + radius: 40, + extent: 512, + nodeSize: 64, + log: false, + generateId: false, + reduce: null, + map: props => props +}; +const fround = Math.fround || (tmp => x => { + tmp[0] = +x; + return tmp[0]; +})(new Float32Array(1)); +class Supercluster { + constructor(options) { + this.options = extend(Object.create(defaultOptions), options); + this.trees = new Array(this.options.maxZoom + 1); + } + load(points) { + const {log, minZoom, maxZoom, nodeSize} = this.options; + if (log) + console.time('total time'); + const timerId = `prepare ${ points.length } points`; + if (log) + console.time(timerId); + this.points = points; + let clusters = []; + for (let i = 0; i < points.length; i++) { + if (!points[i].geometry) + continue; + clusters.push(createPointCluster(points[i], i)); + } + this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); + if (log) + console.timeEnd(timerId); + for (let z = maxZoom; z >= minZoom; z--) { + const now = +Date.now(); + clusters = this._cluster(clusters, z); + this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); + if (log) + console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); + } + if (log) + console.timeEnd('total time'); + return this; + } + getClusters(bbox, zoom) { + let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; + const minLat = Math.max(-90, Math.min(90, bbox[1])); + let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; + const maxLat = Math.max(-90, Math.min(90, bbox[3])); + if (bbox[2] - bbox[0] >= 360) { + minLng = -180; + maxLng = 180; + } else if (minLng > maxLng) { + const easternHem = this.getClusters([ + minLng, + minLat, + 180, + maxLat + ], zoom); + const westernHem = this.getClusters([ + -180, + minLat, + maxLng, + maxLat + ], zoom); + return easternHem.concat(westernHem); + } + const tree = this.trees[this._limitZoom(zoom)]; + const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat)); + const clusters = []; + for (const id of ids) { + const c = tree.points[id]; + clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + } + return clusters; + } + getChildren(clusterId) { + const originId = this._getOriginId(clusterId); + const originZoom = this._getOriginZoom(clusterId); + const errorMsg = 'No cluster with the specified id.'; + const index = this.trees[originZoom]; + if (!index) + throw new Error(errorMsg); + const origin = index.points[originId]; + if (!origin) + throw new Error(errorMsg); + const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); + const ids = index.within(origin.x, origin.y, r); + const children = []; + for (const id of ids) { + const c = index.points[id]; + if (c.parentId === clusterId) { + children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + } + } + if (children.length === 0) + throw new Error(errorMsg); + return children; + } + getLeaves(clusterId, limit, offset) { + limit = limit || 10; + offset = offset || 0; + const leaves = []; + this._appendLeaves(leaves, clusterId, limit, offset, 0); + return leaves; + } + getTile(z, x, y) { + const tree = this.trees[this._limitZoom(z)]; + const z2 = Math.pow(2, z); + const {extent, radius} = this.options; + const p = radius / extent; + const top = (y - p) / z2; + const bottom = (y + 1 + p) / z2; + const tile = { features: [] }; + this._addTileFeatures(tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), tree.points, x, y, z2, tile); + if (x === 0) { + this._addTileFeatures(tree.range(1 - p / z2, top, 1, bottom), tree.points, z2, y, z2, tile); + } + if (x === z2 - 1) { + this._addTileFeatures(tree.range(0, top, p / z2, bottom), tree.points, -1, y, z2, tile); + } + return tile.features.length ? tile : null; + } + getClusterExpansionZoom(clusterId) { + let expansionZoom = this._getOriginZoom(clusterId) - 1; + while (expansionZoom <= this.options.maxZoom) { + const children = this.getChildren(clusterId); + expansionZoom++; + if (children.length !== 1) + break; + clusterId = children[0].properties.cluster_id; + } + return expansionZoom; + } + _appendLeaves(result, clusterId, limit, offset, skipped) { + const children = this.getChildren(clusterId); + for (const child of children) { + const props = child.properties; + if (props && props.cluster) { + if (skipped + props.point_count <= offset) { + skipped += props.point_count; + } else { + skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped); + } + } else if (skipped < offset) { + skipped++; + } else { + result.push(child); + } + if (result.length === limit) + break; + } + return skipped; + } + _addTileFeatures(ids, points, x, y, z2, tile) { + for (const i of ids) { + const c = points[i]; + const isCluster = c.numPoints; + const f = { + type: 1, + geometry: [[ + Math.round(this.options.extent * (c.x * z2 - x)), + Math.round(this.options.extent * (c.y * z2 - y)) + ]], + tags: isCluster ? getClusterProperties(c) : this.points[c.index].properties + }; + let id; + if (isCluster) { + id = c.id; + } else if (this.options.generateId) { + id = c.index; + } else if (this.points[c.index].id) { + id = this.points[c.index].id; + } + if (id !== undefined) + f.id = id; + tile.features.push(f); + } + } + _limitZoom(z) { + return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1)); + } + _cluster(points, zoom) { + const clusters = []; + const {radius, extent, reduce, minPoints} = this.options; + const r = radius / (extent * Math.pow(2, zoom)); + for (let i = 0; i < points.length; i++) { + const p = points[i]; + if (p.zoom <= zoom) + continue; + p.zoom = zoom; + const tree = this.trees[zoom + 1]; + const neighborIds = tree.within(p.x, p.y, r); + const numPointsOrigin = p.numPoints || 1; + let numPoints = numPointsOrigin; + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; + if (b.zoom > zoom) + numPoints += b.numPoints || 1; + } + if (numPoints >= minPoints) { + let wx = p.x * numPointsOrigin; + let wy = p.y * numPointsOrigin; + let clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null; + const id = (i << 5) + (zoom + 1) + this.points.length; + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; + if (b.zoom <= zoom) + continue; + b.zoom = zoom; + const numPoints2 = b.numPoints || 1; + wx += b.x * numPoints2; + wy += b.y * numPoints2; + b.parentId = id; + if (reduce) { + if (!clusterProperties) + clusterProperties = this._map(p, true); + reduce(clusterProperties, this._map(b)); + } + } + p.parentId = id; + clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); + } else { + clusters.push(p); + if (numPoints > 1) { + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; + if (b.zoom <= zoom) + continue; + b.zoom = zoom; + clusters.push(b); + } + } + } + } + return clusters; + } + _getOriginId(clusterId) { + return clusterId - this.points.length >> 5; + } + _getOriginZoom(clusterId) { + return (clusterId - this.points.length) % 32; + } + _map(point, clone) { + if (point.numPoints) { + return clone ? extend({}, point.properties) : point.properties; + } + const original = this.points[point.index].properties; + const result = this.options.map(original); + return clone && result === original ? extend({}, result) : result; + } +} +function createCluster(x, y, id, numPoints, properties) { + return { + x: fround(x), + y: fround(y), + zoom: Infinity, + id, + parentId: -1, + numPoints, + properties + }; +} +function createPointCluster(p, id) { + const [x, y] = p.geometry.coordinates; + return { + x: fround(lngX(x)), + y: fround(latY(y)), + zoom: Infinity, + index: id, + parentId: -1 + }; +} +function getClusterJSON(cluster) { + return { + type: 'Feature', + id: cluster.id, + properties: getClusterProperties(cluster), + geometry: { + type: 'Point', + coordinates: [ + xLng(cluster.x), + yLat(cluster.y) + ] + } + }; +} +function getClusterProperties(cluster) { + const count = cluster.numPoints; + const abbrev = count >= 10000 ? `${ Math.round(count / 1000) }k` : count >= 1000 ? `${ Math.round(count / 100) / 10 }k` : count; + return extend(extend({}, cluster.properties), { + cluster: true, + cluster_id: cluster.id, + point_count: count, + point_count_abbreviated: abbrev + }); +} +function lngX(lng) { + return lng / 360 + 0.5; +} +function latY(lat) { + const sin = Math.sin(lat * Math.PI / 180); + const y = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; + return y < 0 ? 0 : y > 1 ? 1 : y; +} +function xLng(x) { + return (x - 0.5) * 360; +} +function yLat(y) { + const y2 = (180 - y * 360) * Math.PI / 180; + return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; +} +function extend(dest, src) { + for (const id in src) + dest[id] = src[id]; + return dest; +} +function getX(p) { + return p.x; +} +function getY(p) { + return p.y; +} + +function simplify(coords, first, last, sqTolerance) { + var maxSqDist = sqTolerance; + var mid = last - first >> 1; + var minPosToMid = last - first; + var index; + var ax = coords[first]; + var ay = coords[first + 1]; + var bx = coords[last]; + var by = coords[last + 1]; + for (var i = first + 3; i < last; i += 3) { + var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); + if (d > maxSqDist) { + index = i; + maxSqDist = d; + } else if (d === maxSqDist) { + var posToMid = Math.abs(i - mid); + if (posToMid < minPosToMid) { + index = i; + minPosToMid = posToMid; + } + } + } + if (maxSqDist > sqTolerance) { + if (index - first > 3) + simplify(coords, first, index, sqTolerance); + coords[index + 2] = maxSqDist; + if (last - index > 3) + simplify(coords, index, last, sqTolerance); + } +} +function getSqSegDist(px, py, x, y, bx, by) { + var dx = bx - x; + var dy = by - y; + if (dx !== 0 || dy !== 0) { + var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); + if (t > 1) { + x = bx; + y = by; + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + dx = px - x; + dy = py - y; + return dx * dx + dy * dy; +} + +function createFeature(id, type, geom, tags) { + var feature = { + id: typeof id === 'undefined' ? null : id, + type: type, + geometry: geom, + tags: tags, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; + calcBBox(feature); + return feature; +} +function calcBBox(feature) { + var geom = feature.geometry; + var type = feature.type; + if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { + calcLineBBox(feature, geom); + } else if (type === 'Polygon' || type === 'MultiLineString') { + for (var i = 0; i < geom.length; i++) { + calcLineBBox(feature, geom[i]); + } + } else if (type === 'MultiPolygon') { + for (i = 0; i < geom.length; i++) { + for (var j = 0; j < geom[i].length; j++) { + calcLineBBox(feature, geom[i][j]); + } + } + } +} +function calcLineBBox(feature, geom) { + for (var i = 0; i < geom.length; i += 3) { + feature.minX = Math.min(feature.minX, geom[i]); + feature.minY = Math.min(feature.minY, geom[i + 1]); + feature.maxX = Math.max(feature.maxX, geom[i]); + feature.maxY = Math.max(feature.maxY, geom[i + 1]); + } +} + +function convert(data, options) { + var features = []; + if (data.type === 'FeatureCollection') { + for (var i = 0; i < data.features.length; i++) { + convertFeature(features, data.features[i], options, i); + } + } else if (data.type === 'Feature') { + convertFeature(features, data, options); + } else { + convertFeature(features, { geometry: data }, options); + } + return features; +} +function convertFeature(features, geojson, options, index) { + if (!geojson.geometry) + return; + var coords = geojson.geometry.coordinates; + var type = geojson.geometry.type; + var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2); + var geometry = []; + var id = geojson.id; + if (options.promoteId) { + id = geojson.properties[options.promoteId]; + } else if (options.generateId) { + id = index || 0; + } + if (type === 'Point') { + convertPoint(coords, geometry); + } else if (type === 'MultiPoint') { + for (var i = 0; i < coords.length; i++) { + convertPoint(coords[i], geometry); + } + } else if (type === 'LineString') { + convertLine(coords, geometry, tolerance, false); + } else if (type === 'MultiLineString') { + if (options.lineMetrics) { + for (i = 0; i < coords.length; i++) { + geometry = []; + convertLine(coords[i], geometry, tolerance, false); + features.push(createFeature(id, 'LineString', geometry, geojson.properties)); + } + return; + } else { + convertLines(coords, geometry, tolerance, false); + } + } else if (type === 'Polygon') { + convertLines(coords, geometry, tolerance, true); + } else if (type === 'MultiPolygon') { + for (i = 0; i < coords.length; i++) { + var polygon = []; + convertLines(coords[i], polygon, tolerance, true); + geometry.push(polygon); + } + } else if (type === 'GeometryCollection') { + for (i = 0; i < geojson.geometry.geometries.length; i++) { + convertFeature(features, { + id: id, + geometry: geojson.geometry.geometries[i], + properties: geojson.properties + }, options, index); + } + return; + } else { + throw new Error('Input data is not a valid GeoJSON object.'); + } + features.push(createFeature(id, type, geometry, geojson.properties)); +} +function convertPoint(coords, out) { + out.push(projectX(coords[0])); + out.push(projectY(coords[1])); + out.push(0); +} +function convertLine(ring, out, tolerance, isPolygon) { + var x0, y0; + var size = 0; + for (var j = 0; j < ring.length; j++) { + var x = projectX(ring[j][0]); + var y = projectY(ring[j][1]); + out.push(x); + out.push(y); + out.push(0); + if (j > 0) { + if (isPolygon) { + size += (x0 * y - x * y0) / 2; + } else { + size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); + } + } + x0 = x; + y0 = y; + } + var last = out.length - 3; + out[2] = 1; + simplify(out, 0, last, tolerance); + out[last + 2] = 1; + out.size = Math.abs(size); + out.start = 0; + out.end = out.size; +} +function convertLines(rings, out, tolerance, isPolygon) { + for (var i = 0; i < rings.length; i++) { + var geom = []; + convertLine(rings[i], geom, tolerance, isPolygon); + out.push(geom); + } +} +function projectX(x) { + return x / 360 + 0.5; +} +function projectY(y) { + var sin = Math.sin(y * Math.PI / 180); + var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; + return y2 < 0 ? 0 : y2 > 1 ? 1 : y2; +} + +function clip(features, scale, k1, k2, axis, minAll, maxAll, options) { + k1 /= scale; + k2 /= scale; + if (minAll >= k1 && maxAll < k2) + return features; + else if (maxAll < k1 || minAll >= k2) + return null; + var clipped = []; + for (var i = 0; i < features.length; i++) { + var feature = features[i]; + var geometry = feature.geometry; + var type = feature.type; + var min = axis === 0 ? feature.minX : feature.minY; + var max = axis === 0 ? feature.maxX : feature.maxY; + if (min >= k1 && max < k2) { + clipped.push(feature); + continue; + } else if (max < k1 || min >= k2) { + continue; + } + var newGeometry = []; + if (type === 'Point' || type === 'MultiPoint') { + clipPoints(geometry, newGeometry, k1, k2, axis); + } else if (type === 'LineString') { + clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); + } else if (type === 'MultiLineString') { + clipLines(geometry, newGeometry, k1, k2, axis, false); + } else if (type === 'Polygon') { + clipLines(geometry, newGeometry, k1, k2, axis, true); + } else if (type === 'MultiPolygon') { + for (var j = 0; j < geometry.length; j++) { + var polygon = []; + clipLines(geometry[j], polygon, k1, k2, axis, true); + if (polygon.length) { + newGeometry.push(polygon); + } + } + } + if (newGeometry.length) { + if (options.lineMetrics && type === 'LineString') { + for (j = 0; j < newGeometry.length; j++) { + clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); + } + continue; + } + if (type === 'LineString' || type === 'MultiLineString') { + if (newGeometry.length === 1) { + type = 'LineString'; + newGeometry = newGeometry[0]; + } else { + type = 'MultiLineString'; + } + } + if (type === 'Point' || type === 'MultiPoint') { + type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; + } + clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); + } + } + return clipped.length ? clipped : null; +} +function clipPoints(geom, newGeom, k1, k2, axis) { + for (var i = 0; i < geom.length; i += 3) { + var a = geom[i + axis]; + if (a >= k1 && a <= k2) { + newGeom.push(geom[i]); + newGeom.push(geom[i + 1]); + newGeom.push(geom[i + 2]); + } + } +} +function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { + var slice = newSlice(geom); + var intersect = axis === 0 ? intersectX : intersectY; + var len = geom.start; + var segLen, t; + for (var i = 0; i < geom.length - 3; i += 3) { + var ax = geom[i]; + var ay = geom[i + 1]; + var az = geom[i + 2]; + var bx = geom[i + 3]; + var by = geom[i + 4]; + var a = axis === 0 ? ax : ay; + var b = axis === 0 ? bx : by; + var exited = false; + if (trackMetrics) + segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); + if (a < k1) { + if (b > k1) { + t = intersect(slice, ax, ay, bx, by, k1); + if (trackMetrics) + slice.start = len + segLen * t; + } + } else if (a > k2) { + if (b < k2) { + t = intersect(slice, ax, ay, bx, by, k2); + if (trackMetrics) + slice.start = len + segLen * t; + } + } else { + addPoint(slice, ax, ay, az); + } + if (b < k1 && a >= k1) { + t = intersect(slice, ax, ay, bx, by, k1); + exited = true; + } + if (b > k2 && a <= k2) { + t = intersect(slice, ax, ay, bx, by, k2); + exited = true; + } + if (!isPolygon && exited) { + if (trackMetrics) + slice.end = len + segLen * t; + newGeom.push(slice); + slice = newSlice(geom); + } + if (trackMetrics) + len += segLen; + } + var last = geom.length - 3; + ax = geom[last]; + ay = geom[last + 1]; + az = geom[last + 2]; + a = axis === 0 ? ax : ay; + if (a >= k1 && a <= k2) + addPoint(slice, ax, ay, az); + last = slice.length - 3; + if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) { + addPoint(slice, slice[0], slice[1], slice[2]); + } + if (slice.length) { + newGeom.push(slice); + } +} +function newSlice(line) { + var slice = []; + slice.size = line.size; + slice.start = line.start; + slice.end = line.end; + return slice; +} +function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { + for (var i = 0; i < geom.length; i++) { + clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); + } +} +function addPoint(out, x, y, z) { + out.push(x); + out.push(y); + out.push(z); +} +function intersectX(out, ax, ay, bx, by, x) { + var t = (x - ax) / (bx - ax); + out.push(x); + out.push(ay + (by - ay) * t); + out.push(1); + return t; +} +function intersectY(out, ax, ay, bx, by, y) { + var t = (y - ay) / (by - ay); + out.push(ax + (bx - ax) * t); + out.push(y); + out.push(1); + return t; +} + +function wrap(features, options) { + var buffer = options.buffer / options.extent; + var merged = features; + var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); + var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); + if (left || right) { + merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; + if (left) + merged = shiftFeatureCoords(left, 1).concat(merged); + if (right) + merged = merged.concat(shiftFeatureCoords(right, -1)); + } + return merged; +} +function shiftFeatureCoords(features, offset) { + var newFeatures = []; + for (var i = 0; i < features.length; i++) { + var feature = features[i], type = feature.type; + var newGeometry; + if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { + newGeometry = shiftCoords(feature.geometry, offset); + } else if (type === 'MultiLineString' || type === 'Polygon') { + newGeometry = []; + for (var j = 0; j < feature.geometry.length; j++) { + newGeometry.push(shiftCoords(feature.geometry[j], offset)); + } + } else if (type === 'MultiPolygon') { + newGeometry = []; + for (j = 0; j < feature.geometry.length; j++) { + var newPolygon = []; + for (var k = 0; k < feature.geometry[j].length; k++) { + newPolygon.push(shiftCoords(feature.geometry[j][k], offset)); + } + newGeometry.push(newPolygon); + } + } + newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); + } + return newFeatures; +} +function shiftCoords(points, offset) { + var newPoints = []; + newPoints.size = points.size; + if (points.start !== undefined) { + newPoints.start = points.start; + newPoints.end = points.end; + } + for (var i = 0; i < points.length; i += 3) { + newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); + } + return newPoints; +} + +function transformTile(tile, extent) { + if (tile.transformed) + return tile; + var z2 = 1 << tile.z, tx = tile.x, ty = tile.y, i, j, k; + for (i = 0; i < tile.features.length; i++) { + var feature = tile.features[i], geom = feature.geometry, type = feature.type; + feature.geometry = []; + if (type === 1) { + for (j = 0; j < geom.length; j += 2) { + feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty)); + } + } else { + for (j = 0; j < geom.length; j++) { + var ring = []; + for (k = 0; k < geom[j].length; k += 2) { + ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty)); + } + feature.geometry.push(ring); + } + } + } + tile.transformed = true; + return tile; +} +function transformPoint(x, y, extent, z2, tx, ty) { + return [ + Math.round(extent * (x * z2 - tx)), + Math.round(extent * (y * z2 - ty)) + ]; +} + +function createTile(features, z, tx, ty, options) { + var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent); + var tile = { + features: [], + numPoints: 0, + numSimplified: 0, + numFeatures: 0, + source: null, + x: tx, + y: ty, + z: z, + transformed: false, + minX: 2, + minY: 1, + maxX: -1, + maxY: 0 + }; + for (var i = 0; i < features.length; i++) { + tile.numFeatures++; + addFeature(tile, features[i], tolerance, options); + var minX = features[i].minX; + var minY = features[i].minY; + var maxX = features[i].maxX; + var maxY = features[i].maxY; + if (minX < tile.minX) + tile.minX = minX; + if (minY < tile.minY) + tile.minY = minY; + if (maxX > tile.maxX) + tile.maxX = maxX; + if (maxY > tile.maxY) + tile.maxY = maxY; + } + return tile; +} +function addFeature(tile, feature, tolerance, options) { + var geom = feature.geometry, type = feature.type, simplified = []; + if (type === 'Point' || type === 'MultiPoint') { + for (var i = 0; i < geom.length; i += 3) { + simplified.push(geom[i]); + simplified.push(geom[i + 1]); + tile.numPoints++; + tile.numSimplified++; + } + } else if (type === 'LineString') { + addLine(simplified, geom, tile, tolerance, false, false); + } else if (type === 'MultiLineString' || type === 'Polygon') { + for (i = 0; i < geom.length; i++) { + addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); + } + } else if (type === 'MultiPolygon') { + for (var k = 0; k < geom.length; k++) { + var polygon = geom[k]; + for (i = 0; i < polygon.length; i++) { + addLine(simplified, polygon[i], tile, tolerance, true, i === 0); + } + } + } + if (simplified.length) { + var tags = feature.tags || null; + if (type === 'LineString' && options.lineMetrics) { + tags = {}; + for (var key in feature.tags) + tags[key] = feature.tags[key]; + tags['mapbox_clip_start'] = geom.start / geom.size; + tags['mapbox_clip_end'] = geom.end / geom.size; + } + var tileFeature = { + geometry: simplified, + type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : type === 'LineString' || type === 'MultiLineString' ? 2 : 1, + tags: tags + }; + if (feature.id !== null) { + tileFeature.id = feature.id; + } + tile.features.push(tileFeature); + } +} +function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { + var sqTolerance = tolerance * tolerance; + if (tolerance > 0 && geom.size < (isPolygon ? sqTolerance : tolerance)) { + tile.numPoints += geom.length / 3; + return; + } + var ring = []; + for (var i = 0; i < geom.length; i += 3) { + if (tolerance === 0 || geom[i + 2] > sqTolerance) { + tile.numSimplified++; + ring.push(geom[i]); + ring.push(geom[i + 1]); + } + tile.numPoints++; + } + if (isPolygon) + rewind$1(ring, isOuter); + result.push(ring); +} +function rewind$1(ring, clockwise) { + var area = 0; + for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) { + area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]); + } + if (area > 0 === clockwise) { + for (i = 0, len = ring.length; i < len / 2; i += 2) { + var x = ring[i]; + var y = ring[i + 1]; + ring[i] = ring[len - 2 - i]; + ring[i + 1] = ring[len - 1 - i]; + ring[len - 2 - i] = x; + ring[len - 1 - i] = y; + } + } +} + +function geojsonvt(data, options) { + return new GeoJSONVT(data, options); +} +function GeoJSONVT(data, options) { + options = this.options = extend$1(Object.create(this.options), options); + var debug = options.debug; + if (debug) + console.time('preprocess data'); + if (options.maxZoom < 0 || options.maxZoom > 24) + throw new Error('maxZoom should be in the 0-24 range'); + if (options.promoteId && options.generateId) + throw new Error('promoteId and generateId cannot be used together.'); + var features = convert(data, options); + this.tiles = {}; + this.tileCoords = []; + if (debug) { + console.timeEnd('preprocess data'); + console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); + console.time('generate tiles'); + this.stats = {}; + this.total = 0; + } + features = wrap(features, options); + if (features.length) + this.splitTile(features, 0, 0, 0); + if (debug) { + if (features.length) + console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); + console.timeEnd('generate tiles'); + console.log('tiles generated:', this.total, JSON.stringify(this.stats)); + } +} +GeoJSONVT.prototype.options = { + maxZoom: 14, + indexMaxZoom: 5, + indexMaxPoints: 100000, + tolerance: 3, + extent: 4096, + buffer: 64, + lineMetrics: false, + promoteId: null, + generateId: false, + debug: 0 +}; +GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { + var stack = [ + features, + z, + x, + y + ], options = this.options, debug = options.debug; + while (stack.length) { + y = stack.pop(); + x = stack.pop(); + z = stack.pop(); + features = stack.pop(); + var z2 = 1 << z, id = toID(z, x, y), tile = this.tiles[id]; + if (!tile) { + if (debug > 1) + console.time('creation'); + tile = this.tiles[id] = createTile(features, z, x, y, options); + this.tileCoords.push({ + z: z, + x: x, + y: y + }); + if (debug) { + if (debug > 1) { + console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); + console.timeEnd('creation'); + } + var key = 'z' + z; + this.stats[key] = (this.stats[key] || 0) + 1; + this.total++; + } + } + tile.source = features; + if (!cz) { + if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) + continue; + } else { + if (z === options.maxZoom || z === cz) + continue; + var m = 1 << cz - z; + if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) + continue; + } + tile.source = null; + if (features.length === 0) + continue; + if (debug > 1) + console.time('clipping'); + var k1 = 0.5 * options.buffer / options.extent, k2 = 0.5 - k1, k3 = 0.5 + k1, k4 = 1 + k1, tl, bl, tr, br, left, right; + tl = bl = tr = br = null; + left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options); + right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options); + features = null; + if (left) { + tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); + bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); + left = null; + } + if (right) { + tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); + br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); + right = null; + } + if (debug > 1) + console.timeEnd('clipping'); + stack.push(tl || [], z + 1, x * 2, y * 2); + stack.push(bl || [], z + 1, x * 2, y * 2 + 1); + stack.push(tr || [], z + 1, x * 2 + 1, y * 2); + stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1); + } +}; +GeoJSONVT.prototype.getTile = function (z, x, y) { + var options = this.options, extent = options.extent, debug = options.debug; + if (z < 0 || z > 24) + return null; + var z2 = 1 << z; + x = (x % z2 + z2) % z2; + var id = toID(z, x, y); + if (this.tiles[id]) + return transformTile(this.tiles[id], extent); + if (debug > 1) + console.log('drilling down to z%d-%d-%d', z, x, y); + var z0 = z, x0 = x, y0 = y, parent; + while (!parent && z0 > 0) { + z0--; + x0 = Math.floor(x0 / 2); + y0 = Math.floor(y0 / 2); + parent = this.tiles[toID(z0, x0, y0)]; + } + if (!parent || !parent.source) + return null; + if (debug > 1) + console.log('found parent tile z%d-%d-%d', z0, x0, y0); + if (debug > 1) + console.time('drilling down'); + this.splitTile(parent.source, z0, x0, y0, z, x, y); + if (debug > 1) + console.timeEnd('drilling down'); + return this.tiles[id] ? transformTile(this.tiles[id], extent) : null; +}; +function toID(z, x, y) { + return ((1 << z) * y + x) * 32 + z; +} +function extend$1(dest, src) { + for (var i in src) + dest[i] = src[i]; + return dest; +} + +function loadGeoJSONTile(params, callback) { + const canonical = params.tileID.canonical; + if (!this._geoJSONIndex) { + return callback(null, null); + } + const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); + if (!geoJSONTile) { + return callback(null, null); + } + const geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); + let pbf = vtPbf(geojsonWrapper); + if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { + pbf = new Uint8Array(pbf); + } + callback(null, { + vectorTile: geojsonWrapper, + rawData: pbf.buffer + }); +} +class GeoJSONWorkerSource extends ref_properties.VectorTileWorkerSource { + constructor(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSON) { + super(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSONTile); + if (loadGeoJSON) { + this.loadGeoJSON = loadGeoJSON; + } + } + loadData(params, callback) { + if (this._pendingCallback) { + this._pendingCallback(null, { abandoned: true }); + } + this._pendingCallback = callback; + this._pendingLoadDataParams = params; + if (this._state && this._state !== 'Idle') { + this._state = 'NeedsLoadData'; + } else { + this._state = 'Coalescing'; + this._loadData(); + } + } + _loadData() { + if (!this._pendingCallback || !this._pendingLoadDataParams) { + return; + } + const callback = this._pendingCallback; + const params = this._pendingLoadDataParams; + delete this._pendingCallback; + delete this._pendingLoadDataParams; + const perf = params && params.request && params.request.collectResourceTiming ? new ref_properties.RequestPerformance(params.request) : false; + this.loadGeoJSON(params, (err, data) => { + if (err || !data) { + return callback(err); + } else if (typeof data !== 'object') { + return callback(new Error(`Input data given to '${ params.source }' is not a valid GeoJSON object.`)); + } else { + geojsonRewind(data, true); + try { + if (params.filter) { + const compiled = ref_properties.createExpression(params.filter, { + type: 'boolean', + 'property-type': 'data-driven', + overridable: false, + transition: false + }); + if (compiled.result === 'error') + throw new Error(compiled.value.map(err => `${ err.key }: ${ err.message }`).join(', ')); + const features = data.features.filter(feature => compiled.value.evaluate({ zoom: 0 }, feature)); + data = { + type: 'FeatureCollection', + features + }; + } + this._geoJSONIndex = params.cluster ? new Supercluster(getSuperclusterOptions(params)).load(data.features) : geojsonvt(data, params.geojsonVtOptions); + } catch (err) { + return callback(err); + } + this.loaded = {}; + const result = {}; + if (perf) { + const resourceTimingData = perf.finish(); + if (resourceTimingData) { + result.resourceTiming = {}; + result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData)); + } + } + callback(null, result); + } + }); + } + coalesce() { + if (this._state === 'Coalescing') { + this._state = 'Idle'; + } else if (this._state === 'NeedsLoadData') { + this._state = 'Coalescing'; + this._loadData(); + } + } + reloadTile(params, callback) { + const loaded = this.loaded, uid = params.uid; + if (loaded && loaded[uid]) { + return super.reloadTile(params, callback); + } else { + return this.loadTile(params, callback); + } + } + loadGeoJSON(params, callback) { + if (params.request) { + ref_properties.getJSON(params.request, callback); + } else if (typeof params.data === 'string') { + try { + return callback(null, JSON.parse(params.data)); + } catch (e) { + return callback(new Error(`Input data given to '${ params.source }' is not a valid GeoJSON object.`)); + } + } else { + return callback(new Error(`Input data given to '${ params.source }' is not a valid GeoJSON object.`)); + } + } + removeSource(params, callback) { + if (this._pendingCallback) { + this._pendingCallback(null, { abandoned: true }); + } + callback(); + } + getClusterExpansionZoom(params, callback) { + try { + callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); + } catch (e) { + callback(e); + } + } + getClusterChildren(params, callback) { + try { + callback(null, this._geoJSONIndex.getChildren(params.clusterId)); + } catch (e) { + callback(e); + } + } + getClusterLeaves(params, callback) { + try { + callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); + } catch (e) { + callback(e); + } + } +} +function getSuperclusterOptions({superclusterOptions, clusterProperties}) { + if (!clusterProperties || !superclusterOptions) + return superclusterOptions; + const mapExpressions = {}; + const reduceExpressions = {}; + const globals = { + accumulated: null, + zoom: 0 + }; + const feature = { properties: null }; + const propertyNames = Object.keys(clusterProperties); + for (const key of propertyNames) { + const [operator, mapExpression] = clusterProperties[key]; + const mapExpressionParsed = ref_properties.createExpression(mapExpression); + const reduceExpressionParsed = ref_properties.createExpression(typeof operator === 'string' ? [ + operator, + ['accumulated'], + [ + 'get', + key + ] + ] : operator); + mapExpressions[key] = mapExpressionParsed.value; + reduceExpressions[key] = reduceExpressionParsed.value; + } + superclusterOptions.map = pointProperties => { + feature.properties = pointProperties; + const properties = {}; + for (const key of propertyNames) { + properties[key] = mapExpressions[key].evaluate(globals, feature); + } + return properties; + }; + superclusterOptions.reduce = (accumulated, clusterProperties) => { + feature.properties = clusterProperties; + for (const key of propertyNames) { + globals.accumulated = accumulated[key]; + accumulated[key] = reduceExpressions[key].evaluate(globals, feature); + } + }; + return superclusterOptions; +} + +class Worker { + constructor(self) { + this.self = self; + this.actor = new ref_properties.Actor(self, this); + this.layerIndexes = {}; + this.availableImages = {}; + this.isSpriteLoaded = false; + this.workerSourceTypes = { + vector: ref_properties.VectorTileWorkerSource, + geojson: GeoJSONWorkerSource + }; + this.workerSources = {}; + this.demWorkerSources = {}; + this.self.registerWorkerSource = (name, WorkerSource) => { + if (this.workerSourceTypes[name]) { + throw new Error(`Worker source with name "${ name }" already registered.`); + } + this.workerSourceTypes[name] = WorkerSource; + }; + this.self.registerRTLTextPlugin = rtlTextPlugin => { + if (ref_properties.plugin.isParsed()) { + throw new Error('RTL text plugin already registered.'); + } + ref_properties.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; + ref_properties.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; + ref_properties.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; + }; + } + checkIfReady(mapID, unused, callback) { + callback(); + } + setReferrer(mapID, referrer) { + this.referrer = referrer; + } + spriteLoaded(mapId, bool) { + this.isSpriteLoaded = bool; + for (const workerSource in this.workerSources[mapId]) { + const ws = this.workerSources[mapId][workerSource]; + for (const source in ws) { + if (ws[source] instanceof ref_properties.VectorTileWorkerSource) { + ws[source].isSpriteLoaded = bool; + ws[source].fire(new ref_properties.Event('isSpriteLoaded')); + } + } + } + } + setImages(mapId, images, callback) { + this.availableImages[mapId] = images; + for (const workerSource in this.workerSources[mapId]) { + const ws = this.workerSources[mapId][workerSource]; + for (const source in ws) { + ws[source].availableImages = images; + } + } + callback(); + } + enableTerrain(mapId, enable, callback) { + this.terrain = enable; + callback(); + } + setLayers(mapId, layers, callback) { + this.getLayerIndex(mapId).replace(layers); + callback(); + } + updateLayers(mapId, params, callback) { + this.getLayerIndex(mapId).update(params.layers, params.removedIds); + callback(); + } + loadTile(mapId, params, callback) { + const p = this.enableTerrain ? ref_properties.extend({ enableTerrain: this.terrain }, params) : params; + this.getWorkerSource(mapId, params.type, params.source).loadTile(p, callback); + } + loadDEMTile(mapId, params, callback) { + const p = this.enableTerrain ? ref_properties.extend({ buildQuadTree: this.terrain }, params) : params; + this.getDEMWorkerSource(mapId, params.source).loadTile(p, callback); + } + reloadTile(mapId, params, callback) { + const p = this.enableTerrain ? ref_properties.extend({ enableTerrain: this.terrain }, params) : params; + this.getWorkerSource(mapId, params.type, params.source).reloadTile(p, callback); + } + abortTile(mapId, params, callback) { + this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); + } + removeTile(mapId, params, callback) { + this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); + } + removeSource(mapId, params, callback) { + if (!this.workerSources[mapId] || !this.workerSources[mapId][params.type] || !this.workerSources[mapId][params.type][params.source]) { + return; + } + const worker = this.workerSources[mapId][params.type][params.source]; + delete this.workerSources[mapId][params.type][params.source]; + if (worker.removeSource !== undefined) { + worker.removeSource(params, callback); + } else { + callback(); + } + } + loadWorkerSource(map, params, callback) { + try { + this.self.importScripts(params.url); + callback(); + } catch (e) { + callback(e.toString()); + } + } + syncRTLPluginState(map, state, callback) { + try { + ref_properties.plugin.setState(state); + const pluginURL = ref_properties.plugin.getPluginURL(); + if (ref_properties.plugin.isLoaded() && !ref_properties.plugin.isParsed() && pluginURL != null) { + this.self.importScripts(pluginURL); + const complete = ref_properties.plugin.isParsed(); + const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${ pluginURL }`); + callback(error, complete); + } + } catch (e) { + callback(e.toString()); + } + } + getAvailableImages(mapId) { + let availableImages = this.availableImages[mapId]; + if (!availableImages) { + availableImages = []; + } + return availableImages; + } + getLayerIndex(mapId) { + let layerIndexes = this.layerIndexes[mapId]; + if (!layerIndexes) { + layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); + } + return layerIndexes; + } + getWorkerSource(mapId, type, source) { + if (!this.workerSources[mapId]) + this.workerSources[mapId] = {}; + if (!this.workerSources[mapId][type]) + this.workerSources[mapId][type] = {}; + if (!this.workerSources[mapId][type][source]) { + const actor = { + send: (type, data, callback, mustQueue, _, metadata) => { + this.actor.send(type, data, callback, mapId, mustQueue, metadata); + }, + scheduler: this.actor.scheduler + }; + this.workerSources[mapId][type][source] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId), this.getAvailableImages(mapId), this.isSpriteLoaded); + } + return this.workerSources[mapId][type][source]; + } + getDEMWorkerSource(mapId, source) { + if (!this.demWorkerSources[mapId]) + this.demWorkerSources[mapId] = {}; + if (!this.demWorkerSources[mapId][source]) { + this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); + } + return this.demWorkerSources[mapId][source]; + } + enforceCacheSizeLimit(mapId, limit) { + ref_properties.enforceCacheSizeLimit(limit); + } + getWorkerPerformanceMetrics(mapId, params, callback) { + callback(undefined, void 0); + } +} +if (typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope) { + self.worker = new Worker(self); +} + +return Worker; + +}); + +define(['./shared'], function (ref_properties) { 'use strict'; + +var supported = isSupported; +function isSupported(options) { + return !notSupportedReason(options); +} +function notSupportedReason(options) { + if (!isBrowser()) + return 'not a browser'; + if (!isArraySupported()) + return 'insufficent Array support'; + if (!isFunctionSupported()) + return 'insufficient Function support'; + if (!isObjectSupported()) + return 'insufficient Object support'; + if (!isJSONSupported()) + return 'insufficient JSON support'; + if (!isWorkerSupported()) + return 'insufficient worker support'; + if (!isUint8ClampedArraySupported()) + return 'insufficient Uint8ClampedArray support'; + if (!isArrayBufferSupported()) + return 'insufficient ArrayBuffer support'; + if (!isCanvasGetImageDataSupported()) + return 'insufficient Canvas/getImageData support'; + if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) + return 'insufficient WebGL support'; + if (!isNotIE()) + return 'insufficient ECMAScript 6 support'; +} +function isBrowser() { + return typeof window !== 'undefined' && typeof document !== 'undefined'; +} +function isArraySupported() { + return Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray; +} +function isFunctionSupported() { + return Function.prototype && Function.prototype.bind; +} +function isObjectSupported() { + return Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions; +} +function isJSONSupported() { + return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; +} +function isWorkerSupported() { + if (!('Worker' in window && 'Blob' in window && 'URL' in window)) { + return false; + } + var blob = new Blob([''], { type: 'text/javascript' }); + var workerURL = URL.createObjectURL(blob); + var supported; + var worker; + try { + worker = new Worker(workerURL); + supported = true; + } catch (e) { + supported = false; + } + if (worker) { + worker.terminate(); + } + URL.revokeObjectURL(workerURL); + return supported; +} +function isUint8ClampedArraySupported() { + return 'Uint8ClampedArray' in window; +} +function isArrayBufferSupported() { + return ArrayBuffer.isView; +} +function isCanvasGetImageDataSupported() { + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + var context = canvas.getContext('2d'); + if (!context) { + return false; + } + var imageData = context.getImageData(0, 0, 1, 1); + return imageData && imageData.width === canvas.width; +} +var isWebGLSupportedCache = {}; +function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { + if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { + isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); + } + return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; +} +isSupported.webGLContextAttributes = { + antialias: false, + alpha: true, + stencil: true, + depth: true +}; +function getWebGLContext(failIfMajorPerformanceCaveat) { + var canvas = document.createElement('canvas'); + var attributes = Object.create(isSupported.webGLContextAttributes); + attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; + return canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes); +} +function isWebGLSupported(failIfMajorPerformanceCaveat) { + var gl = getWebGLContext(failIfMajorPerformanceCaveat); + if (!gl) { + return false; + } + var shader; + try { + shader = gl.createShader(gl.VERTEX_SHADER); + } catch (e) { + return false; + } + if (!shader || gl.isContextLost()) { + return false; + } + gl.shaderSource(shader, 'void main() {}'); + gl.compileShader(shader); + return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true; +} +function isNotIE() { + return !document.documentMode; +} + +const DOM = {}; +DOM.create = function (tagName, className, container) { + const el = ref_properties.window.document.createElement(tagName); + if (className !== undefined) + el.className = className; + if (container) + container.appendChild(el); + return el; +}; +DOM.createNS = function (namespaceURI, tagName) { + const el = ref_properties.window.document.createElementNS(namespaceURI, tagName); + return el; +}; +const docStyle = ref_properties.window.document && ref_properties.window.document.documentElement.style; +const selectProp = docStyle && docStyle.userSelect !== undefined ? 'userSelect' : 'WebkitUserSelect'; +let userSelect; +DOM.disableDrag = function () { + if (docStyle && selectProp) { + userSelect = docStyle[selectProp]; + docStyle[selectProp] = 'none'; + } +}; +DOM.enableDrag = function () { + if (docStyle && selectProp) { + docStyle[selectProp] = userSelect; + } +}; +DOM.setTransform = function (el, value) { + el.style.transform = value; +}; +let passiveSupported = false; +try { + const options = Object.defineProperty({}, 'passive', { + get() { + passiveSupported = true; + } + }); + ref_properties.window.addEventListener('test', options, options); + ref_properties.window.removeEventListener('test', options, options); +} catch (err) { + passiveSupported = false; +} +DOM.addEventListener = function (target, type, callback, options = {}) { + if ('passive' in options && passiveSupported) { + target.addEventListener(type, callback, options); + } else { + target.addEventListener(type, callback, options.capture); + } +}; +DOM.removeEventListener = function (target, type, callback, options = {}) { + if ('passive' in options && passiveSupported) { + target.removeEventListener(type, callback, options); + } else { + target.removeEventListener(type, callback, options.capture); + } +}; +const suppressClick = function (e) { + e.preventDefault(); + e.stopPropagation(); + ref_properties.window.removeEventListener('click', suppressClick, true); +}; +DOM.suppressClick = function () { + ref_properties.window.addEventListener('click', suppressClick, true); + ref_properties.window.setTimeout(() => { + ref_properties.window.removeEventListener('click', suppressClick, true); + }, 0); +}; +DOM.mousePos = function (el, e) { + const rect = el.getBoundingClientRect(); + return new ref_properties.Point(e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop); +}; +DOM.touchPos = function (el, touches) { + const rect = el.getBoundingClientRect(), points = []; + for (let i = 0; i < touches.length; i++) { + points.push(new ref_properties.Point(touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop)); + } + return points; +}; +DOM.mouseButton = function (e) { + if (typeof ref_properties.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && ref_properties.window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + return 0; + } + return e.button; +}; +DOM.remove = function (node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +}; + +function loadSprite (baseURL, requestManager, callback) { + let json, image, error; + const format = ref_properties.browser.devicePixelRatio > 1 ? '@2x' : ''; + let jsonRequest = ref_properties.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), ref_properties.ResourceType.SpriteJSON), (err, data) => { + jsonRequest = null; + if (!error) { + error = err; + json = data; + maybeComplete(); + } + }); + let imageRequest = ref_properties.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), ref_properties.ResourceType.SpriteImage), (err, img) => { + imageRequest = null; + if (!error) { + error = err; + image = img; + maybeComplete(); + } + }); + function maybeComplete() { + if (error) { + callback(error); + } else if (json && image) { + const imageData = ref_properties.browser.getImageData(image); + const result = {}; + for (const id in json) { + const {width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content} = json[id]; + const data = new ref_properties.RGBAImage({ + width, + height + }); + ref_properties.RGBAImage.copy(imageData, data, { + x, + y + }, { + x: 0, + y: 0 + }, { + width, + height + }); + result[id] = { + data, + pixelRatio, + sdf, + stretchX, + stretchY, + content + }; + } + callback(null, result); + } + } + return { + cancel() { + if (jsonRequest) { + jsonRequest.cancel(); + jsonRequest = null; + } + if (imageRequest) { + imageRequest.cancel(); + imageRequest = null; + } + } + }; +} + +function renderStyleImage(image) { + const {userImage} = image; + if (userImage && userImage.render) { + const updated = userImage.render(); + if (updated) { + image.data.replace(new Uint8Array(userImage.data.buffer)); + return true; + } + } + return false; +} + +const padding = 1; +class ImageManager extends ref_properties.Evented { + constructor() { + super(); + this.images = {}; + this.updatedImages = {}; + this.callbackDispatchedThisFrame = {}; + this.loaded = false; + this.requestors = []; + this.patterns = {}; + this.atlasImage = new ref_properties.RGBAImage({ + width: 1, + height: 1 + }); + this.dirty = true; + } + isLoaded() { + return this.loaded; + } + setLoaded(loaded) { + if (this.loaded === loaded) { + return; + } + this.loaded = loaded; + if (loaded) { + for (const {ids, callback} of this.requestors) { + this._notify(ids, callback); + } + this.requestors = []; + } + } + getImage(id) { + return this.images[id]; + } + addImage(id, image) { + if (this._validate(id, image)) { + this.images[id] = image; + } + } + _validate(id, image) { + let valid = true; + if (!this._validateStretch(image.stretchX, image.data && image.data.width)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${ id }" has invalid "stretchX" value`))); + valid = false; + } + if (!this._validateStretch(image.stretchY, image.data && image.data.height)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${ id }" has invalid "stretchY" value`))); + valid = false; + } + if (!this._validateContent(image.content, image)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${ id }" has invalid "content" value`))); + valid = false; + } + return valid; + } + _validateStretch(stretch, size) { + if (!stretch) + return true; + let last = 0; + for (const part of stretch) { + if (part[0] < last || part[1] < part[0] || size < part[1]) + return false; + last = part[1]; + } + return true; + } + _validateContent(content, image) { + if (!content) + return true; + if (content.length !== 4) + return false; + if (content[0] < 0 || image.data.width < content[0]) + return false; + if (content[1] < 0 || image.data.height < content[1]) + return false; + if (content[2] < 0 || image.data.width < content[2]) + return false; + if (content[3] < 0 || image.data.height < content[3]) + return false; + if (content[2] < content[0]) + return false; + if (content[3] < content[1]) + return false; + return true; + } + updateImage(id, image) { + const oldImage = this.images[id]; + image.version = oldImage.version + 1; + this.images[id] = image; + this.updatedImages[id] = true; + } + removeImage(id) { + const image = this.images[id]; + delete this.images[id]; + delete this.patterns[id]; + if (image.userImage && image.userImage.onRemove) { + image.userImage.onRemove(); + } + } + listImages() { + return Object.keys(this.images); + } + getImages(ids, callback) { + let hasAllDependencies = true; + if (!this.isLoaded()) { + for (const id of ids) { + if (!this.images[id]) { + hasAllDependencies = false; + } + } + } + if (this.isLoaded() || hasAllDependencies) { + this._notify(ids, callback); + } else { + this.requestors.push({ + ids, + callback + }); + } + } + _notify(ids, callback) { + const response = {}; + for (const id of ids) { + if (!this.images[id]) { + this.fire(new ref_properties.Event('styleimagemissing', { id })); + } + const image = this.images[id]; + if (image) { + response[id] = { + data: image.data.clone(), + pixelRatio: image.pixelRatio, + sdf: image.sdf, + version: image.version, + stretchX: image.stretchX, + stretchY: image.stretchY, + content: image.content, + hasRenderCallback: Boolean(image.userImage && image.userImage.render) + }; + } else { + ref_properties.warnOnce(`Image "${ id }" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`); + } + } + callback(null, response); + } + getPixelSize() { + const {width, height} = this.atlasImage; + return { + width, + height + }; + } + getPattern(id) { + const pattern = this.patterns[id]; + const image = this.getImage(id); + if (!image) { + return null; + } + if (pattern && pattern.position.version === image.version) { + return pattern.position; + } + if (!pattern) { + const w = image.data.width + padding * 2; + const h = image.data.height + padding * 2; + const bin = { + w, + h, + x: 0, + y: 0 + }; + const position = new ref_properties.ImagePosition(bin, image); + this.patterns[id] = { + bin, + position + }; + } else { + pattern.position.version = image.version; + } + this._updatePatternAtlas(); + return this.patterns[id].position; + } + bind(context) { + const gl = context.gl; + if (!this.atlasTexture) { + this.atlasTexture = new ref_properties.Texture(context, this.atlasImage, gl.RGBA); + } else if (this.dirty) { + this.atlasTexture.update(this.atlasImage); + this.dirty = false; + } + this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + } + _updatePatternAtlas() { + const bins = []; + for (const id in this.patterns) { + bins.push(this.patterns[id].bin); + } + const {w, h} = ref_properties.potpack(bins); + const dst = this.atlasImage; + dst.resize({ + width: w || 1, + height: h || 1 + }); + for (const id in this.patterns) { + const {bin} = this.patterns[id]; + const x = bin.x + padding; + const y = bin.y + padding; + const src = this.images[id].data; + const w = src.width; + const h = src.height; + ref_properties.RGBAImage.copy(src, dst, { + x: 0, + y: 0 + }, { + x, + y + }, { + width: w, + height: h + }); + ref_properties.RGBAImage.copy(src, dst, { + x: 0, + y: h - 1 + }, { + x, + y: y - 1 + }, { + width: w, + height: 1 + }); + ref_properties.RGBAImage.copy(src, dst, { + x: 0, + y: 0 + }, { + x, + y: y + h + }, { + width: w, + height: 1 + }); + ref_properties.RGBAImage.copy(src, dst, { + x: w - 1, + y: 0 + }, { + x: x - 1, + y + }, { + width: 1, + height: h + }); + ref_properties.RGBAImage.copy(src, dst, { + x: 0, + y: 0 + }, { + x: x + w, + y + }, { + width: 1, + height: h + }); + } + this.dirty = true; + } + beginFrame() { + this.callbackDispatchedThisFrame = {}; + } + dispatchRenderCallbacks(ids) { + for (const id of ids) { + if (this.callbackDispatchedThisFrame[id]) + continue; + this.callbackDispatchedThisFrame[id] = true; + const image = this.images[id]; + const updated = renderStyleImage(image); + if (updated) { + this.updateImage(id, image); + } + } + } +} + +function sphericalToCartesian([r, azimuthal, polar]) { + const a = ref_properties.degToRad(azimuthal + 90), p = ref_properties.degToRad(polar); + return { + x: r * Math.cos(a) * Math.sin(p), + y: r * Math.sin(a) * Math.sin(p), + z: r * Math.cos(p), + azimuthal, + polar + }; +} +class LightPositionProperty { + constructor() { + this.specification = ref_properties.styleSpec.light.position; + } + possiblyEvaluate(value, parameters) { + return sphericalToCartesian(value.expression.evaluate(parameters)); + } + interpolate(a, b, t) { + return { + x: ref_properties.number(a.x, b.x, t), + y: ref_properties.number(a.y, b.y, t), + z: ref_properties.number(a.z, b.z, t), + azimuthal: ref_properties.number(a.azimuthal, b.azimuthal, t), + polar: ref_properties.number(a.polar, b.polar, t) + }; + } +} +const properties = new ref_properties.Properties({ + 'anchor': new ref_properties.DataConstantProperty(ref_properties.styleSpec.light.anchor), + 'position': new LightPositionProperty(), + 'color': new ref_properties.DataConstantProperty(ref_properties.styleSpec.light.color), + 'intensity': new ref_properties.DataConstantProperty(ref_properties.styleSpec.light.intensity) +}); +const TRANSITION_SUFFIX = '-transition'; +class Light extends ref_properties.Evented { + constructor(lightOptions) { + super(); + this._transitionable = new ref_properties.Transitionable(properties); + this.setLight(lightOptions); + this._transitioning = this._transitionable.untransitioned(); + } + getLight() { + return this._transitionable.serialize(); + } + setLight(light, options = {}) { + if (this._validate(ref_properties.validateLight, light, options)) { + return; + } + for (const name in light) { + const value = light[name]; + if (ref_properties.endsWith(name, TRANSITION_SUFFIX)) { + this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); + } else { + this._transitionable.setValue(name, value); + } + } + } + updateTransitions(parameters) { + this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); + } + hasTransition() { + return this._transitioning.hasTransition(); + } + recalculate(parameters) { + this.properties = this._transitioning.possiblyEvaluate(parameters); + } + _validate(validate, value, options) { + if (options && options.validate === false) { + return false; + } + return ref_properties.emitValidationErrors(this, validate.call(ref_properties.validateStyle, ref_properties.extend({ + value, + style: { + glyphs: true, + sprite: true + }, + styleSpec: ref_properties.styleSpec + }))); + } +} + +const properties$1 = new ref_properties.Properties({ + 'source': new ref_properties.DataConstantProperty(ref_properties.styleSpec.terrain.source), + 'exaggeration': new ref_properties.DataConstantProperty(ref_properties.styleSpec.terrain.exaggeration) +}); +const TRANSITION_SUFFIX$1 = '-transition'; +class Terrain extends ref_properties.Evented { + constructor(terrainOptions) { + super(); + this._transitionable = new ref_properties.Transitionable(properties$1); + this.set(terrainOptions); + this._transitioning = this._transitionable.untransitioned(); + } + get() { + return this._transitionable.serialize(); + } + set(terrain) { + for (const name in terrain) { + const value = terrain[name]; + if (ref_properties.endsWith(name, TRANSITION_SUFFIX$1)) { + this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX$1.length), value); + } else { + this._transitionable.setValue(name, value); + } + } + } + updateTransitions(parameters) { + this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); + } + hasTransition() { + return this._transitioning.hasTransition(); + } + recalculate(parameters) { + this.properties = this._transitioning.possiblyEvaluate(parameters); + } +} + +class LineAtlas { + constructor(width, height) { + this.width = width; + this.height = height; + this.nextRow = 0; + this.data = new Uint8Array(this.width * this.height); + this.dashEntry = {}; + } + getDash(dasharray, round) { + const key = dasharray.join(',') + String(round); + if (!this.dashEntry[key]) { + this.dashEntry[key] = this.addDash(dasharray, round); + } + return this.dashEntry[key]; + } + getDashRanges(dasharray, lineAtlasWidth, stretch) { + const oddDashArray = dasharray.length % 2 === 1; + const ranges = []; + let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0; + let right = dasharray[0] * stretch; + let isDash = true; + ranges.push({ + left, + right, + isDash, + zeroLength: dasharray[0] === 0 + }); + let currentDashLength = dasharray[0]; + for (let i = 1; i < dasharray.length; i++) { + isDash = !isDash; + const dashLength = dasharray[i]; + left = currentDashLength * stretch; + currentDashLength += dashLength; + right = currentDashLength * stretch; + ranges.push({ + left, + right, + isDash, + zeroLength: dashLength === 0 + }); + } + return ranges; + } + addRoundDash(ranges, stretch, n) { + const halfStretch = stretch / 2; + for (let y = -n; y <= n; y++) { + const row = this.nextRow + n + y; + const index = this.width * row; + let currIndex = 0; + let range = ranges[currIndex]; + for (let x = 0; x < this.width; x++) { + if (x / range.right > 1) { + range = ranges[++currIndex]; + } + const distLeft = Math.abs(x - range.left); + const distRight = Math.abs(x - range.right); + const minDist = Math.min(distLeft, distRight); + let signedDistance; + const distMiddle = y / n * (halfStretch + 1); + if (range.isDash) { + const distEdge = halfStretch - Math.abs(distMiddle); + signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge); + } else { + signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle); + } + this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + } + } + } + addRegularDash(ranges) { + for (let i = ranges.length - 1; i >= 0; --i) { + const part = ranges[i]; + const next = ranges[i + 1]; + if (part.zeroLength) { + ranges.splice(i, 1); + } else if (next && next.isDash === part.isDash) { + next.left = part.left; + ranges.splice(i, 1); + } + } + const first = ranges[0]; + const last = ranges[ranges.length - 1]; + if (first.isDash === last.isDash) { + first.left = last.left - this.width; + last.right = first.right + this.width; + } + const index = this.width * this.nextRow; + let currIndex = 0; + let range = ranges[currIndex]; + for (let x = 0; x < this.width; x++) { + if (x / range.right > 1) { + range = ranges[++currIndex]; + } + const distLeft = Math.abs(x - range.left); + const distRight = Math.abs(x - range.right); + const minDist = Math.min(distLeft, distRight); + const signedDistance = range.isDash ? minDist : -minDist; + this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + } + } + addDash(dasharray, round) { + const n = round ? 7 : 0; + const height = 2 * n + 1; + if (this.nextRow + height > this.height) { + ref_properties.warnOnce('LineAtlas out of space'); + return null; + } + if (dasharray.length === 0) { + dasharray.push(1); + } + let length = 0; + for (let i = 0; i < dasharray.length; i++) { + if (dasharray[i] < 0) { + ref_properties.warnOnce('Negative value is found in line dasharray, replacing values with 0'); + dasharray[i] = 0; + } + length += dasharray[i]; + } + if (length !== 0) { + const stretch = this.width / length; + const ranges = this.getDashRanges(dasharray, this.width, stretch); + if (round) { + this.addRoundDash(ranges, stretch, n); + } else { + this.addRegularDash(ranges); + } + } + const dashEntry = { + y: (this.nextRow + n + 0.5) / this.height, + height: 2 * n / this.height, + width: length + }; + this.nextRow += height; + this.dirty = true; + return dashEntry; + } + bind(context) { + const gl = context.gl; + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + if (this.dirty) { + this.dirty = false; + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); + } + } + } +} + +class Dispatcher { + constructor(workerPool, parent) { + this.workerPool = workerPool; + this.actors = []; + this.currentActor = 0; + this.id = ref_properties.uniqueId(); + const workers = this.workerPool.acquire(this.id); + for (let i = 0; i < workers.length; i++) { + const worker = workers[i]; + const actor = new Dispatcher.Actor(worker, parent, this.id); + actor.name = `Worker ${ i }`; + this.actors.push(actor); + } + this.ready = false; + this.broadcast('checkIfReady', null, () => { + this.ready = true; + }); + } + broadcast(type, data, cb) { + cb = cb || function () { + }; + ref_properties.asyncAll(this.actors, (actor, done) => { + actor.send(type, data, done); + }, cb); + } + getActor() { + this.currentActor = (this.currentActor + 1) % this.actors.length; + return this.actors[this.currentActor]; + } + remove() { + this.actors.forEach(actor => { + actor.remove(); + }); + this.actors = []; + this.workerPool.release(this.id); + } +} +Dispatcher.Actor = ref_properties.Actor; + +function pixelsToTileUnits (tile, pixelValue, z) { + return pixelValue * (ref_properties.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); +} + +class QueryGeometry { + constructor(screenBounds, cameraPoint, aboveHorizon, transform) { + this.screenBounds = screenBounds; + this.cameraPoint = cameraPoint; + this._screenRaycastCache = {}; + this._cameraRaycastCache = {}; + this.isAboveHorizon = aboveHorizon; + this.screenGeometry = this.bufferedScreenGeometry(0); + this.screenGeometryMercator = this.screenGeometry.map(p => transform.pointCoordinate3D(p)); + this.cameraGeometry = this.bufferedCameraGeometry(0); + } + static createFromScreenPoints(geometry, transform) { + let screenGeometry; + let aboveHorizon; + if (geometry instanceof ref_properties.Point || typeof geometry[0] === 'number') { + const pt = ref_properties.Point.convert(geometry); + screenGeometry = [ref_properties.Point.convert(geometry)]; + aboveHorizon = transform.isPointAboveHorizon(pt); + } else { + const tl = ref_properties.Point.convert(geometry[0]); + const br = ref_properties.Point.convert(geometry[1]); + screenGeometry = [ + tl, + br + ]; + aboveHorizon = ref_properties.polygonizeBounds(tl, br).every(p => transform.isPointAboveHorizon(p)); + } + return new QueryGeometry(screenGeometry, transform.getCameraPoint(), aboveHorizon, transform); + } + isPointQuery() { + return this.screenBounds.length === 1; + } + bufferedScreenGeometry(buffer) { + return ref_properties.polygonizeBounds(this.screenBounds[0], this.screenBounds.length === 1 ? this.screenBounds[0] : this.screenBounds[1], buffer); + } + bufferedCameraGeometry(buffer) { + const min = this.screenBounds[0]; + const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new ref_properties.Point(1, 1)) : this.screenBounds[1]; + const cameraPolygon = ref_properties.polygonizeBounds(min, max, 0, false); + if (this.cameraPoint.y > max.y) { + if (this.cameraPoint.x > min.x && this.cameraPoint.x < max.x) { + cameraPolygon.splice(3, 0, this.cameraPoint); + } else if (this.cameraPoint.x >= max.x) { + cameraPolygon[2] = this.cameraPoint; + } else if (this.cameraPoint.x <= min.x) { + cameraPolygon[3] = this.cameraPoint; + } + } + return ref_properties.bufferConvexPolygon(cameraPolygon, buffer); + } + containsTile(tile, transform, use3D) { + const bias = 1; + const padding = tile.queryPadding + bias; + const geometryForTileCheck = use3D ? this._bufferedCameraMercator(padding, transform).map(p => tile.tileID.getTilePoint(p)) : this._bufferedScreenMercator(padding, transform).map(p => tile.tileID.getTilePoint(p)); + const tilespaceVec3s = this.screenGeometryMercator.map(p => tile.tileID.getTileVec3(p)); + const tilespaceGeometry = tilespaceVec3s.map(v => new ref_properties.Point(v[0], v[1])); + const cameraMercator = transform.getFreeCameraOptions().position || new ref_properties.MercatorCoordinate(0, 0, 0); + const tilespaceCameraPosition = tile.tileID.getTileVec3(cameraMercator); + const tilespaceRays = tilespaceVec3s.map(tileVec => { + const dir = ref_properties.sub(tileVec, tileVec, tilespaceCameraPosition); + ref_properties.normalize(dir, dir); + return new ref_properties.Ray(tilespaceCameraPosition, dir); + }); + const pixelToTileUnitsFactor = pixelsToTileUnits(tile, 1, transform.zoom); + if (ref_properties.polygonIntersectsBox(geometryForTileCheck, 0, 0, ref_properties.EXTENT, ref_properties.EXTENT)) { + return { + queryGeometry: this, + tilespaceGeometry, + tilespaceRays, + bufferedTilespaceGeometry: geometryForTileCheck, + bufferedTilespaceBounds: clampBoundsToTileExtents(ref_properties.getBounds(geometryForTileCheck)), + tile, + tileID: tile.tileID, + pixelToTileUnitsFactor + }; + } + } + _bufferedScreenMercator(padding, transform) { + const key = cacheKey(padding); + if (this._screenRaycastCache[key]) { + return this._screenRaycastCache[key]; + } else { + const poly = this.bufferedScreenGeometry(padding).map(p => transform.pointCoordinate3D(p)); + this._screenRaycastCache[key] = poly; + return poly; + } + } + _bufferedCameraMercator(padding, transform) { + const key = cacheKey(padding); + if (this._cameraRaycastCache[key]) { + return this._cameraRaycastCache[key]; + } else { + const poly = this.bufferedCameraGeometry(padding).map(p => transform.pointCoordinate3D(p)); + this._cameraRaycastCache[key] = poly; + return poly; + } + } +} +function cacheKey(padding) { + return padding * 100 | 0; +} +function clampBoundsToTileExtents(bounds) { + bounds.min.x = ref_properties.clamp(bounds.min.x, 0, ref_properties.EXTENT); + bounds.min.y = ref_properties.clamp(bounds.min.y, 0, ref_properties.EXTENT); + bounds.max.x = ref_properties.clamp(bounds.max.x, 0, ref_properties.EXTENT); + bounds.max.y = ref_properties.clamp(bounds.max.y, 0, ref_properties.EXTENT); + return bounds; +} + +function loadTileJSON (options, requestManager, callback) { + const loaded = function (err, tileJSON) { + if (err) { + return callback(err); + } else if (tileJSON) { + const result = ref_properties.pick(ref_properties.extend(tileJSON, options), [ + 'tiles', + 'minzoom', + 'maxzoom', + 'attribution', + 'mapbox_logo', + 'bounds', + 'scheme', + 'tileSize', + 'encoding' + ]); + if (tileJSON.vector_layers) { + result.vectorLayers = tileJSON.vector_layers; + result.vectorLayerIds = result.vectorLayers.map(layer => { + return layer.id; + }); + } + result.tiles = requestManager.canonicalizeTileset(result, options.url); + callback(null, result); + } + }; + if (options.url) { + return ref_properties.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url), ref_properties.ResourceType.Source), loaded); + } else { + return ref_properties.browser.frame(() => loaded(null, options)); + } +} + +class TileBounds { + constructor(bounds, minzoom, maxzoom) { + this.bounds = ref_properties.LngLatBounds.convert(this.validateBounds(bounds)); + this.minzoom = minzoom || 0; + this.maxzoom = maxzoom || 24; + } + validateBounds(bounds) { + if (!Array.isArray(bounds) || bounds.length !== 4) + return [ + -180, + -90, + 180, + 90 + ]; + return [ + Math.max(-180, bounds[0]), + Math.max(-90, bounds[1]), + Math.min(180, bounds[2]), + Math.min(90, bounds[3]) + ]; + } + contains(tileID) { + const worldSize = Math.pow(2, tileID.z); + const level = { + minX: Math.floor(ref_properties.mercatorXfromLng(this.bounds.getWest()) * worldSize), + minY: Math.floor(ref_properties.mercatorYfromLat(this.bounds.getNorth()) * worldSize), + maxX: Math.ceil(ref_properties.mercatorXfromLng(this.bounds.getEast()) * worldSize), + maxY: Math.ceil(ref_properties.mercatorYfromLat(this.bounds.getSouth()) * worldSize) + }; + const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; + return hit; + } +} + +class VectorTileSource extends ref_properties.Evented { + constructor(id, options, dispatcher, eventedParent) { + super(); + this.id = id; + this.dispatcher = dispatcher; + this.type = 'vector'; + this.minzoom = 0; + this.maxzoom = 22; + this.scheme = 'xyz'; + this.tileSize = 512; + this.reparseOverscaled = true; + this.isTileClipped = true; + this._loaded = false; + ref_properties.extend(this, ref_properties.pick(options, [ + 'url', + 'scheme', + 'tileSize', + 'promoteId' + ])); + this._options = ref_properties.extend({ type: 'vector' }, options); + this._collectResourceTiming = options.collectResourceTiming; + if (this.tileSize !== 512) { + throw new Error('vector tile sources must have a tileSize of 512'); + } + this.setEventedParent(eventedParent); + this._tileWorkers = {}; + this._deduped = new ref_properties.DedupedRequest(); + } + load() { + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', { dataType: 'source' })); + this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => { + this._tileJSONRequest = null; + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (tileJSON) { + ref_properties.extend(this, tileJSON); + if (tileJSON.bounds) + this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); + ref_properties.postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken); + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'metadata' + })); + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'content' + })); + } + }); + } + loaded() { + return this._loaded; + } + hasTile(tileID) { + return !this.tileBounds || this.tileBounds.contains(tileID.canonical); + } + onAdd(map) { + this.map = map; + this.load(); + } + setSourceProperty(callback) { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); + } + callback(); + const sourceCaches = this.map.style._getSourceCaches(this.id); + for (const sourceCache of sourceCaches) { + sourceCache.clearTiles(); + } + this.load(); + } + setTiles(tiles) { + this.setSourceProperty(() => { + this._options.tiles = tiles; + }); + return this; + } + setUrl(url) { + this.setSourceProperty(() => { + this.url = url; + this._options.url = url; + }); + return this; + } + onRemove() { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); + this._tileJSONRequest = null; + } + } + serialize() { + return ref_properties.extend({}, this._options); + } + loadTile(tile, callback) { + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme)); + const request = this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile); + const params = { + request, + data: undefined, + uid: tile.uid, + tileID: tile.tileID, + tileZoom: tile.tileZoom, + zoom: tile.tileID.overscaledZ, + tileSize: this.tileSize * tile.tileID.overscaleFactor(), + type: this.type, + source: this.id, + pixelRatio: ref_properties.browser.devicePixelRatio, + showCollisionBoxes: this.map.showCollisionBoxes, + promoteId: this.promoteId, + isSymbolTile: tile.isSymbolTile + }; + params.request.collectResourceTiming = this._collectResourceTiming; + if (!tile.actor || tile.state === 'expired') { + tile.actor = this._tileWorkers[url] = this._tileWorkers[url] || this.dispatcher.getActor(); + if (!this.dispatcher.ready) { + const cancel = ref_properties.loadVectorTile.call({ deduped: this._deduped }, params, (err, data) => { + if (err || !data) { + done.call(this, err); + } else { + params.data = { + cacheControl: data.cacheControl, + expires: data.expires, + rawData: data.rawData.slice(0) + }; + if (tile.actor) + tile.actor.send('loadTile', params, done.bind(this)); + } + }, true); + tile.request = { cancel }; + } else { + tile.request = tile.actor.send('loadTile', params, done.bind(this)); + } + } else if (tile.state === 'loading') { + tile.reloadCallback = callback; + } else { + tile.request = tile.actor.send('reloadTile', params, done.bind(this)); + } + function done(err, data) { + delete tile.request; + if (tile.aborted) + return callback(null); + if (err && err.status !== 404) { + return callback(err); + } + if (data && data.resourceTiming) + tile.resourceTiming = data.resourceTiming; + if (this.map._refreshExpiredTiles && data) + tile.setExpiryData(data); + tile.loadVectorData(data, this.map.painter); + ref_properties.cacheEntryPossiblyAdded(this.dispatcher); + callback(null); + if (tile.reloadCallback) { + this.loadTile(tile, tile.reloadCallback); + tile.reloadCallback = null; + } + } + } + abortTile(tile) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + if (tile.actor) { + tile.actor.send('abortTile', { + uid: tile.uid, + type: this.type, + source: this.id + }, undefined); + } + } + unloadTile(tile) { + tile.unloadVectorData(); + if (tile.actor) { + tile.actor.send('removeTile', { + uid: tile.uid, + type: this.type, + source: this.id + }, undefined); + } + } + hasTransition() { + return false; + } + afterUpdate() { + this._tileWorkers = {}; + } +} + +class RasterTileSource extends ref_properties.Evented { + constructor(id, options, dispatcher, eventedParent) { + super(); + this.id = id; + this.dispatcher = dispatcher; + this.setEventedParent(eventedParent); + this.type = 'raster'; + this.minzoom = 0; + this.maxzoom = 22; + this.roundZoom = true; + this.scheme = 'xyz'; + this.tileSize = 512; + this._loaded = false; + this._options = ref_properties.extend({ type: 'raster' }, options); + ref_properties.extend(this, ref_properties.pick(options, [ + 'url', + 'scheme', + 'tileSize' + ])); + } + load() { + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', { dataType: 'source' })); + this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => { + this._tileJSONRequest = null; + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (tileJSON) { + ref_properties.extend(this, tileJSON); + if (tileJSON.bounds) + this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); + ref_properties.postTurnstileEvent(tileJSON.tiles); + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'metadata' + })); + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'content' + })); + } + }); + } + loaded() { + return this._loaded; + } + onAdd(map) { + this.map = map; + this.load(); + } + onRemove() { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); + this._tileJSONRequest = null; + } + } + serialize() { + return ref_properties.extend({}, this._options); + } + hasTile(tileID) { + return !this.tileBounds || this.tileBounds.contains(tileID.canonical); + } + loadTile(tile, callback) { + const use2x = ref_properties.browser.devicePixelRatio >= 2; + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), use2x, this.tileSize); + tile.request = ref_properties.getImage(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile), (err, img) => { + delete tile.request; + if (tile.aborted) { + tile.state = 'unloaded'; + callback(null); + } else if (err) { + tile.state = 'errored'; + callback(err); + } else if (img) { + if (this.map._refreshExpiredTiles) + tile.setExpiryData(img); + delete img.cacheControl; + delete img.expires; + const context = this.map.painter.context; + const gl = context.gl; + tile.texture = this.map.painter.getTileTexture(img.width); + if (tile.texture) { + tile.texture.update(img, { useMipmap: true }); + } else { + tile.texture = new ref_properties.Texture(context, img, gl.RGBA, { useMipmap: true }); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + if (context.extTextureFilterAnisotropic) { + gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); + } + } + tile.state = 'loaded'; + ref_properties.cacheEntryPossiblyAdded(this.dispatcher); + callback(null); + } + }); + } + abortTile(tile, callback) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + callback(); + } + unloadTile(tile, callback) { + if (tile.texture) + this.map.painter.saveTileTexture(tile.texture); + callback(); + } + hasTransition() { + return false; + } +} + +class RasterDEMTileSource extends RasterTileSource { + constructor(id, options, dispatcher, eventedParent) { + super(id, options, dispatcher, eventedParent); + this.type = 'raster-dem'; + this.maxzoom = 22; + this._options = ref_properties.extend({ type: 'raster-dem' }, options); + this.encoding = options.encoding || 'mapbox'; + } + serialize() { + return { + type: 'raster-dem', + url: this.url, + tileSize: this.tileSize, + tiles: this.tiles, + bounds: this.bounds, + encoding: this.encoding + }; + } + loadTile(tile, callback) { + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), false, this.tileSize); + tile.request = ref_properties.getImage(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile), imageLoaded.bind(this)); + function imageLoaded(err, img) { + delete tile.request; + if (tile.aborted) { + tile.state = 'unloaded'; + callback(null); + } else if (err) { + tile.state = 'errored'; + callback(err); + } else if (img) { + if (this.map._refreshExpiredTiles) + tile.setExpiryData(img); + delete img.cacheControl; + delete img.expires; + const transfer = ref_properties.window.ImageBitmap && img instanceof ref_properties.window.ImageBitmap && ref_properties.offscreenCanvasSupported(); + const buffer = (img.width - ref_properties.prevPowerOfTwo(img.width)) / 2; + const padding = 1 - buffer; + const borderReady = padding < 1; + if (!borderReady && !tile.neighboringTiles) { + tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); + } + const rawImageData = transfer ? img : ref_properties.browser.getImageData(img, padding); + const params = { + uid: tile.uid, + coord: tile.tileID, + source: this.id, + rawImageData, + encoding: this.encoding, + padding + }; + if (!tile.actor || tile.state === 'expired') { + tile.actor = this.dispatcher.getActor(); + tile.actor.send('loadDEMTile', params, done.bind(this)); + } + } + } + function done(err, dem) { + if (err) { + tile.state = 'errored'; + callback(err); + } + if (dem) { + tile.dem = dem; + tile.dem.onDeserialize(); + tile.needsHillshadePrepare = true; + tile.needsDEMTextureUpload = true; + tile.state = 'loaded'; + callback(null); + } + } + } + _getNeighboringTiles(tileID) { + const canonical = tileID.canonical; + const dim = Math.pow(2, canonical.z); + const px = (canonical.x - 1 + dim) % dim; + const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; + const nx = (canonical.x + 1 + dim) % dim; + const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; + const neighboringTiles = {}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = { backfilled: false }; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = { backfilled: false }; + if (canonical.y > 0) { + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = { backfilled: false }; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = { backfilled: false }; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = { backfilled: false }; + } + if (canonical.y + 1 < dim) { + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = { backfilled: false }; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = { backfilled: false }; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = { backfilled: false }; + } + return neighboringTiles; + } + unloadTile(tile) { + if (tile.demTexture) + this.map.painter.saveTileTexture(tile.demTexture); + if (tile.fbo) { + tile.fbo.destroy(); + delete tile.fbo; + } + if (tile.dem) + delete tile.dem; + delete tile.neighboringTiles; + tile.state = 'unloaded'; + } +} + +class GeoJSONSource extends ref_properties.Evented { + constructor(id, options, dispatcher, eventedParent) { + super(); + this.id = id; + this.type = 'geojson'; + this.minzoom = 0; + this.maxzoom = 18; + this.tileSize = 512; + this.isTileClipped = true; + this.reparseOverscaled = true; + this._removed = false; + this._loaded = false; + this.actor = dispatcher.getActor(); + this.setEventedParent(eventedParent); + this._data = options.data; + this._options = ref_properties.extend({}, options); + this._collectResourceTiming = options.collectResourceTiming; + this._resourceTiming = []; + if (options.maxzoom !== undefined) + this.maxzoom = options.maxzoom; + if (options.type) + this.type = options.type; + if (options.attribution) + this.attribution = options.attribution; + this.promoteId = options.promoteId; + const scale = ref_properties.EXTENT / this.tileSize; + this.workerOptions = ref_properties.extend({ + source: this.id, + cluster: options.cluster || false, + geojsonVtOptions: { + buffer: (options.buffer !== undefined ? options.buffer : 128) * scale, + tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale, + extent: ref_properties.EXTENT, + maxZoom: this.maxzoom, + lineMetrics: options.lineMetrics || false, + generateId: options.generateId || false + }, + superclusterOptions: { + maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1, + minPoints: Math.max(2, options.clusterMinPoints || 2), + extent: ref_properties.EXTENT, + radius: (options.clusterRadius || 50) * scale, + log: false, + generateId: options.generateId || false + }, + clusterProperties: options.clusterProperties, + filter: options.filter + }, options.workerOptions); + } + load() { + this.fire(new ref_properties.Event('dataloading', { dataType: 'source' })); + this._updateWorkerData(err => { + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + return; + } + const data = { + dataType: 'source', + sourceDataType: 'metadata' + }; + if (this._collectResourceTiming && this._resourceTiming && this._resourceTiming.length > 0) { + data.resourceTiming = this._resourceTiming; + this._resourceTiming = []; + } + this.fire(new ref_properties.Event('data', data)); + }); + } + onAdd(map) { + this.map = map; + this.load(); + } + setData(data) { + this._data = data; + this.fire(new ref_properties.Event('dataloading', { dataType: 'source' })); + this._updateWorkerData(err => { + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + return; + } + const data = { + dataType: 'source', + sourceDataType: 'content' + }; + if (this._collectResourceTiming && this._resourceTiming && this._resourceTiming.length > 0) { + data.resourceTiming = this._resourceTiming; + this._resourceTiming = []; + } + this.fire(new ref_properties.Event('data', data)); + }); + return this; + } + getClusterExpansionZoom(clusterId, callback) { + this.actor.send('geojson.getClusterExpansionZoom', { + clusterId, + source: this.id + }, callback); + return this; + } + getClusterChildren(clusterId, callback) { + this.actor.send('geojson.getClusterChildren', { + clusterId, + source: this.id + }, callback); + return this; + } + getClusterLeaves(clusterId, limit, offset, callback) { + this.actor.send('geojson.getClusterLeaves', { + source: this.id, + clusterId, + limit, + offset + }, callback); + return this; + } + _updateWorkerData(callback) { + this._loaded = false; + const options = ref_properties.extend({}, this.workerOptions); + const data = this._data; + if (typeof data === 'string') { + options.request = this.map._requestManager.transformRequest(ref_properties.browser.resolveURL(data), ref_properties.ResourceType.Source); + options.request.collectResourceTiming = this._collectResourceTiming; + } else { + options.data = JSON.stringify(data); + } + this.actor.send(`${ this.type }.loadData`, options, (err, result) => { + if (this._removed || result && result.abandoned) { + return; + } + this._loaded = true; + if (result && result.resourceTiming && result.resourceTiming[this.id]) + this._resourceTiming = result.resourceTiming[this.id].slice(0); + this.actor.send(`${ this.type }.coalesce`, { source: options.source }, null); + callback(err); + }); + } + loaded() { + return this._loaded; + } + loadTile(tile, callback) { + const message = !tile.actor ? 'loadTile' : 'reloadTile'; + tile.actor = this.actor; + const params = { + type: this.type, + uid: tile.uid, + tileID: tile.tileID, + tileZoom: tile.tileZoom, + zoom: tile.tileID.overscaledZ, + maxZoom: this.maxzoom, + tileSize: this.tileSize, + source: this.id, + pixelRatio: ref_properties.browser.devicePixelRatio, + showCollisionBoxes: this.map.showCollisionBoxes, + promoteId: this.promoteId + }; + tile.request = this.actor.send(message, params, (err, data) => { + delete tile.request; + tile.unloadVectorData(); + if (tile.aborted) { + return callback(null); + } + if (err) { + return callback(err); + } + tile.loadVectorData(data, this.map.painter, message === 'reloadTile'); + return callback(null); + }); + } + abortTile(tile) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + tile.aborted = true; + } + unloadTile(tile) { + tile.unloadVectorData(); + this.actor.send('removeTile', { + uid: tile.uid, + type: this.type, + source: this.id + }); + } + onRemove() { + this._removed = true; + this.actor.send('removeSource', { + type: this.type, + source: this.id + }); + } + serialize() { + return ref_properties.extend({}, this._options, { + type: this.type, + data: this._data + }); + } + hasTransition() { + return false; + } +} + +var rasterBoundsAttributes = ref_properties.createLayout([ + { + name: 'a_pos', + type: 'Int16', + components: 2 + }, + { + name: 'a_texture_pos', + type: 'Int16', + components: 2 + } +]); + +class ImageSource extends ref_properties.Evented { + constructor(id, options, dispatcher, eventedParent) { + super(); + this.id = id; + this.dispatcher = dispatcher; + this.coordinates = options.coordinates; + this.type = 'image'; + this.minzoom = 0; + this.maxzoom = 22; + this.tileSize = 512; + this.tiles = {}; + this._loaded = false; + this.setEventedParent(eventedParent); + this.options = options; + } + load(newCoordinates, successCallback) { + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', { dataType: 'source' })); + this.url = this.options.url; + ref_properties.getImage(this.map._requestManager.transformRequest(this.url, ref_properties.ResourceType.Image), (err, image) => { + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (image) { + this.image = image; + if (newCoordinates) { + this.coordinates = newCoordinates; + } + if (successCallback) { + successCallback(); + } + this._finishLoading(); + } + }); + } + loaded() { + return this._loaded; + } + updateImage(options) { + if (!this.image || !options.url) { + return this; + } + this.options.url = options.url; + this.load(options.coordinates, () => { + this.texture = null; + }); + return this; + } + _finishLoading() { + if (this.map) { + this.setCoordinates(this.coordinates); + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'metadata' + })); + } + } + onAdd(map) { + this.map = map; + this.load(); + } + setCoordinates(coordinates) { + this.coordinates = coordinates; + const cornerCoords = coordinates.map(ref_properties.MercatorCoordinate.fromLngLat); + this.tileID = getCoordinatesCenterTileID(cornerCoords); + this.minzoom = this.maxzoom = this.tileID.z; + const tileCoords = cornerCoords.map(coord => this.tileID.getTilePoint(coord)._round()); + this._boundsArray = new ref_properties.StructArrayLayout4i8(); + this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0); + this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, ref_properties.EXTENT, 0); + this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, ref_properties.EXTENT); + this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, ref_properties.EXTENT, ref_properties.EXTENT); + if (this.boundsBuffer) { + this.boundsBuffer.destroy(); + delete this.boundsBuffer; + } + this.fire(new ref_properties.Event('data', { + dataType: 'source', + sourceDataType: 'content' + })); + return this; + } + prepare() { + if (Object.keys(this.tiles).length === 0 || !this.image) { + return; + } + const context = this.map.painter.context; + const gl = context.gl; + if (!this.boundsBuffer) { + this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); + } + if (!this.boundsSegments) { + this.boundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + } + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.image, gl.RGBA); + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + } + for (const w in this.tiles) { + const tile = this.tiles[w]; + if (tile.state !== 'loaded') { + tile.state = 'loaded'; + tile.texture = this.texture; + } + } + } + loadTile(tile, callback) { + if (this.tileID && this.tileID.equals(tile.tileID.canonical)) { + this.tiles[String(tile.tileID.wrap)] = tile; + tile.buckets = {}; + callback(null); + } else { + tile.state = 'errored'; + callback(null); + } + } + serialize() { + return { + type: 'image', + url: this.options.url, + coordinates: this.coordinates + }; + } + hasTransition() { + return false; + } +} +function getCoordinatesCenterTileID(coords) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const coord of coords) { + minX = Math.min(minX, coord.x); + minY = Math.min(minY, coord.y); + maxX = Math.max(maxX, coord.x); + maxY = Math.max(maxY, coord.y); + } + const dx = maxX - minX; + const dy = maxY - minY; + const dMax = Math.max(dx, dy); + const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); + const tilesAtZoom = Math.pow(2, zoom); + return new ref_properties.CanonicalTileID(zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom)); +} + +class VideoSource extends ImageSource { + constructor(id, options, dispatcher, eventedParent) { + super(id, options, dispatcher, eventedParent); + this.roundZoom = true; + this.type = 'video'; + this.options = options; + } + load() { + this._loaded = false; + const options = this.options; + this.urls = []; + for (const url of options.urls) { + this.urls.push(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Source).url); + } + ref_properties.getVideo(this.urls, (err, video) => { + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (video) { + this.video = video; + this.video.loop = true; + this.video.addEventListener('playing', () => { + this.map.triggerRepaint(); + }); + if (this.map) { + this.video.play(); + } + this._finishLoading(); + } + }); + } + pause() { + if (this.video) { + this.video.pause(); + } + } + play() { + if (this.video) { + this.video.play(); + } + } + seek(seconds) { + if (this.video) { + const seekableRange = this.video.seekable; + if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ this.id }`, null, `Playback for this video can be set only between the ${ seekableRange.start(0) } and ${ seekableRange.end(0) }-second mark.`))); + } else + this.video.currentTime = seconds; + } + } + getVideo() { + return this.video; + } + onAdd(map) { + if (this.map) + return; + this.map = map; + this.load(); + if (this.video) { + this.video.play(); + this.setCoordinates(this.coordinates); + } + } + prepare() { + if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { + return; + } + const context = this.map.painter.context; + const gl = context.gl; + if (!this.boundsBuffer) { + this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); + } + if (!this.boundsSegments) { + this.boundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + } + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.video, gl.RGBA); + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + } else if (!this.video.paused) { + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); + } + for (const w in this.tiles) { + const tile = this.tiles[w]; + if (tile.state !== 'loaded') { + tile.state = 'loaded'; + tile.texture = this.texture; + } + } + } + serialize() { + return { + type: 'video', + urls: this.urls, + coordinates: this.coordinates + }; + } + hasTransition() { + return this.video && !this.video.paused; + } +} + +class CanvasSource extends ImageSource { + constructor(id, options, dispatcher, eventedParent) { + super(id, options, dispatcher, eventedParent); + if (!options.coordinates) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ id }`, null, 'missing required property "coordinates"'))); + } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ id }`, null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); + } + if (options.animate && typeof options.animate !== 'boolean') { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ id }`, null, 'optional "animate" property must be a boolean value'))); + } + if (!options.canvas) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ id }`, null, 'missing required property "canvas"'))); + } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof ref_properties.window.HTMLCanvasElement)) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${ id }`, null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))); + } + this.options = options; + this.animate = options.animate !== undefined ? options.animate : true; + } + load() { + this._loaded = true; + if (!this.canvas) { + this.canvas = this.options.canvas instanceof ref_properties.window.HTMLCanvasElement ? this.options.canvas : ref_properties.window.document.getElementById(this.options.canvas); + } + this.width = this.canvas.width; + this.height = this.canvas.height; + if (this._hasInvalidDimensions()) { + this.fire(new ref_properties.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); + return; + } + this.play = function () { + this._playing = true; + this.map.triggerRepaint(); + }; + this.pause = function () { + if (this._playing) { + this.prepare(); + this._playing = false; + } + }; + this._finishLoading(); + } + getCanvas() { + return this.canvas; + } + onAdd(map) { + this.map = map; + this.load(); + if (this.canvas) { + if (this.animate) + this.play(); + } + } + onRemove() { + this.pause(); + } + prepare() { + let resize = false; + if (this.canvas.width !== this.width) { + this.width = this.canvas.width; + resize = true; + } + if (this.canvas.height !== this.height) { + this.height = this.canvas.height; + resize = true; + } + if (this._hasInvalidDimensions()) + return; + if (Object.keys(this.tiles).length === 0) + return; + const context = this.map.painter.context; + const gl = context.gl; + if (!this.boundsBuffer) { + this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); + } + if (!this.boundsSegments) { + this.boundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + } + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.canvas, gl.RGBA, { premultiply: true }); + } else if (resize || this._playing) { + this.texture.update(this.canvas, { premultiply: true }); + } + for (const w in this.tiles) { + const tile = this.tiles[w]; + if (tile.state !== 'loaded') { + tile.state = 'loaded'; + tile.texture = this.texture; + } + } + } + serialize() { + return { + type: 'canvas', + coordinates: this.coordinates + }; + } + hasTransition() { + return this._playing; + } + _hasInvalidDimensions() { + for (const x of [ + this.canvas.width, + this.canvas.height + ]) { + if (isNaN(x) || x <= 0) + return true; + } + return false; + } +} + +const sourceTypes = { + vector: VectorTileSource, + raster: RasterTileSource, + 'raster-dem': RasterDEMTileSource, + geojson: GeoJSONSource, + video: VideoSource, + image: ImageSource, + canvas: CanvasSource +}; +const create = function (id, specification, dispatcher, eventedParent) { + const source = new sourceTypes[specification.type](id, specification, dispatcher, eventedParent); + if (source.id !== id) { + throw new Error(`Expected Source id to be ${ id } instead of ${ source.id }`); + } + ref_properties.bindAll([ + 'load', + 'abort', + 'unload', + 'serialize', + 'prepare' + ], source); + return source; +}; +const getType = function (name) { + return sourceTypes[name]; +}; +const setType = function (name, type) { + sourceTypes[name] = type; +}; + +function getPixelPosMatrix(transform, tileID) { + const t = ref_properties.identity([]); + ref_properties.scale(t, t, [ + transform.width * 0.5, + -transform.height * 0.5, + 1 + ]); + ref_properties.translate(t, t, [ + 1, + -1, + 0 + ]); + return ref_properties.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped())); +} +function queryRenderedFeatures(sourceCache, styleLayers, serializedLayers, queryGeometry, params, transform, use3DQuery, visualizeQueryGeometry = false) { + const tileResults = sourceCache.tilesIn(queryGeometry, use3DQuery, visualizeQueryGeometry); + tileResults.sort(sortTilesIn); + const renderedFeatureLayers = []; + for (const tileResult of tileResults) { + renderedFeatureLayers.push({ + wrappedTileID: tileResult.tile.tileID.wrapped().key, + queryResults: tileResult.tile.queryRenderedFeatures(styleLayers, serializedLayers, sourceCache._state, tileResult, params, transform, getPixelPosMatrix(sourceCache.transform, tileResult.tile.tileID), visualizeQueryGeometry) + }); + } + const result = mergeRenderedFeatureLayers(renderedFeatureLayers); + for (const layerID in result) { + result[layerID].forEach(featureWrapper => { + const feature = featureWrapper.feature; + const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); + feature.source = feature.layer.source; + if (feature.layer['source-layer']) { + feature.sourceLayer = feature.layer['source-layer']; + } + feature.state = state; + }); + } + return result; +} +function queryRenderedSymbols(styleLayers, serializedLayers, getLayerSourceCache, queryGeometry, params, collisionIndex, retainedQueryData) { + const result = {}; + const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); + const bucketQueryData = []; + for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) { + bucketQueryData.push(retainedQueryData[bucketInstanceId]); + } + bucketQueryData.sort(sortTilesIn); + for (const queryData of bucketQueryData) { + const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures(renderedSymbols[queryData.bucketInstanceId], serializedLayers, queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, params.availableImages, styleLayers); + for (const layerID in bucketSymbols) { + const resultFeatures = result[layerID] = result[layerID] || []; + const layerSymbols = bucketSymbols[layerID]; + layerSymbols.sort((a, b) => { + const featureSortOrder = queryData.featureSortOrder; + if (featureSortOrder) { + const sortedA = featureSortOrder.indexOf(a.featureIndex); + const sortedB = featureSortOrder.indexOf(b.featureIndex); + return sortedB - sortedA; + } else { + return b.featureIndex - a.featureIndex; + } + }); + for (const symbolFeature of layerSymbols) { + resultFeatures.push(symbolFeature); + } + } + } + for (const layerName in result) { + result[layerName].forEach(featureWrapper => { + const feature = featureWrapper.feature; + const layer = styleLayers[layerName]; + const sourceCache = getLayerSourceCache(layer); + const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); + feature.source = feature.layer.source; + if (feature.layer['source-layer']) { + feature.sourceLayer = feature.layer['source-layer']; + } + feature.state = state; + }); + } + return result; +} +function querySourceFeatures(sourceCache, params) { + const tiles = sourceCache.getRenderableIds().map(id => { + return sourceCache.getTileByID(id); + }); + const result = []; + const dataTiles = {}; + for (let i = 0; i < tiles.length; i++) { + const tile = tiles[i]; + const dataID = tile.tileID.canonical.key; + if (!dataTiles[dataID]) { + dataTiles[dataID] = true; + tile.querySourceFeatures(result, params); + } + } + return result; +} +function sortTilesIn(a, b) { + const idA = a.tileID; + const idB = b.tileID; + return idA.overscaledZ - idB.overscaledZ || idA.canonical.y - idB.canonical.y || idA.wrap - idB.wrap || idA.canonical.x - idB.canonical.x; +} +function mergeRenderedFeatureLayers(tiles) { + const result = {}; + const wrappedIDLayerMap = {}; + for (const tile of tiles) { + const queryResults = tile.queryResults; + const wrappedID = tile.wrappedTileID; + const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; + for (const layerID in queryResults) { + const tileFeatures = queryResults[layerID]; + const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; + const resultFeatures = result[layerID] = result[layerID] || []; + for (const tileFeature of tileFeatures) { + if (!wrappedIDFeatures[tileFeature.featureIndex]) { + wrappedIDFeatures[tileFeature.featureIndex] = true; + resultFeatures.push(tileFeature); + } + } + } + } + return result; +} + +function WebWorker () { + return exported.workerClass != null ? new exported.workerClass() : new ref_properties.window.Worker(exported.workerUrl); +} + +const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool'; +class WorkerPool { + constructor() { + this.active = {}; + } + acquire(mapId) { + if (!this.workers) { + this.workers = []; + while (this.workers.length < WorkerPool.workerCount) { + this.workers.push(new WebWorker()); + } + } + this.active[mapId] = true; + return this.workers.slice(); + } + release(mapId) { + delete this.active[mapId]; + if (this.numActive() === 0) { + this.workers.forEach(w => { + w.terminate(); + }); + this.workers = null; + } + } + isPreloaded() { + return !!this.active[PRELOAD_POOL_ID]; + } + numActive() { + return Object.keys(this.active).length; + } +} +WorkerPool.workerCount = 2; + +let globalWorkerPool; +function getGlobalWorkerPool() { + if (!globalWorkerPool) { + globalWorkerPool = new WorkerPool(); + } + return globalWorkerPool; +} +function prewarm() { + const workerPool = getGlobalWorkerPool(); + workerPool.acquire(PRELOAD_POOL_ID); +} +function clearPrewarmedResources() { + const pool = globalWorkerPool; + if (pool) { + if (pool.isPreloaded() && pool.numActive() === 1) { + pool.release(PRELOAD_POOL_ID); + globalWorkerPool = null; + } else { + console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()'); + } + } +} + +function deref(layer, parent) { + const result = {}; + for (const k in layer) { + if (k !== 'ref') { + result[k] = layer[k]; + } + } + ref_properties.refProperties.forEach(k => { + if (k in parent) { + result[k] = parent[k]; + } + }); + return result; +} +function derefLayers(layers) { + layers = layers.slice(); + const map = Object.create(null); + for (let i = 0; i < layers.length; i++) { + map[layers[i].id] = layers[i]; + } + for (let i = 0; i < layers.length; i++) { + if ('ref' in layers[i]) { + layers[i] = deref(layers[i], map[layers[i].ref]); + } + } + return layers; +} + +function emptyStyle() { + const style = {}; + const version = ref_properties.styleSpec['$version']; + for (const styleKey in ref_properties.styleSpec['$root']) { + const spec = ref_properties.styleSpec['$root'][styleKey]; + if (spec.required) { + let value = null; + if (styleKey === 'version') { + value = version; + } else { + if (spec.type === 'array') { + value = []; + } else { + value = {}; + } + } + if (value != null) { + style[styleKey] = value; + } + } + } + return style; +} + +const operations = { + setStyle: 'setStyle', + addLayer: 'addLayer', + removeLayer: 'removeLayer', + setPaintProperty: 'setPaintProperty', + setLayoutProperty: 'setLayoutProperty', + setFilter: 'setFilter', + addSource: 'addSource', + removeSource: 'removeSource', + setGeoJSONSourceData: 'setGeoJSONSourceData', + setLayerZoomRange: 'setLayerZoomRange', + setLayerProperty: 'setLayerProperty', + setCenter: 'setCenter', + setZoom: 'setZoom', + setBearing: 'setBearing', + setPitch: 'setPitch', + setSprite: 'setSprite', + setGlyphs: 'setGlyphs', + setTransition: 'setTransition', + setLight: 'setLight', + setTerrain: 'setTerrain' +}; +function addSource(sourceId, after, commands) { + commands.push({ + command: operations.addSource, + args: [ + sourceId, + after[sourceId] + ] + }); +} +function removeSource(sourceId, commands, sourcesRemoved) { + commands.push({ + command: operations.removeSource, + args: [sourceId] + }); + sourcesRemoved[sourceId] = true; +} +function updateSource(sourceId, after, commands, sourcesRemoved) { + removeSource(sourceId, commands, sourcesRemoved); + addSource(sourceId, after, commands); +} +function canUpdateGeoJSON(before, after, sourceId) { + let prop; + for (prop in before[sourceId]) { + if (!before[sourceId].hasOwnProperty(prop)) + continue; + if (prop !== 'data' && !ref_properties.deepEqual(before[sourceId][prop], after[sourceId][prop])) { + return false; + } + } + for (prop in after[sourceId]) { + if (!after[sourceId].hasOwnProperty(prop)) + continue; + if (prop !== 'data' && !ref_properties.deepEqual(before[sourceId][prop], after[sourceId][prop])) { + return false; + } + } + return true; +} +function diffSources(before, after, commands, sourcesRemoved) { + before = before || {}; + after = after || {}; + let sourceId; + for (sourceId in before) { + if (!before.hasOwnProperty(sourceId)) + continue; + if (!after.hasOwnProperty(sourceId)) { + removeSource(sourceId, commands, sourcesRemoved); + } + } + for (sourceId in after) { + if (!after.hasOwnProperty(sourceId)) + continue; + if (!before.hasOwnProperty(sourceId)) { + addSource(sourceId, after, commands); + } else if (!ref_properties.deepEqual(before[sourceId], after[sourceId])) { + if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) { + commands.push({ + command: operations.setGeoJSONSourceData, + args: [ + sourceId, + after[sourceId].data + ] + }); + } else { + updateSource(sourceId, after, commands, sourcesRemoved); + } + } + } +} +function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { + before = before || {}; + after = after || {}; + let prop; + for (prop in before) { + if (!before.hasOwnProperty(prop)) + continue; + if (!ref_properties.deepEqual(before[prop], after[prop])) { + commands.push({ + command, + args: [ + layerId, + prop, + after[prop], + klass + ] + }); + } + } + for (prop in after) { + if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) + continue; + if (!ref_properties.deepEqual(before[prop], after[prop])) { + commands.push({ + command, + args: [ + layerId, + prop, + after[prop], + klass + ] + }); + } + } +} +function pluckId(layer) { + return layer.id; +} +function indexById(group, layer) { + group[layer.id] = layer; + return group; +} +function diffLayers(before, after, commands) { + before = before || []; + after = after || []; + const beforeOrder = before.map(pluckId); + const afterOrder = after.map(pluckId); + const beforeIndex = before.reduce(indexById, {}); + const afterIndex = after.reduce(indexById, {}); + const tracker = beforeOrder.slice(); + const clean = Object.create(null); + let i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; + for (i = 0, d = 0; i < beforeOrder.length; i++) { + layerId = beforeOrder[i]; + if (!afterIndex.hasOwnProperty(layerId)) { + commands.push({ + command: operations.removeLayer, + args: [layerId] + }); + tracker.splice(tracker.indexOf(layerId, d), 1); + } else { + d++; + } + } + for (i = 0, d = 0; i < afterOrder.length; i++) { + layerId = afterOrder[afterOrder.length - 1 - i]; + if (tracker[tracker.length - 1 - i] === layerId) + continue; + if (beforeIndex.hasOwnProperty(layerId)) { + commands.push({ + command: operations.removeLayer, + args: [layerId] + }); + tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); + } else { + d++; + } + insertBeforeLayerId = tracker[tracker.length - i]; + commands.push({ + command: operations.addLayer, + args: [ + afterIndex[layerId], + insertBeforeLayerId + ] + }); + tracker.splice(tracker.length - i, 0, layerId); + clean[layerId] = true; + } + for (i = 0; i < afterOrder.length; i++) { + layerId = afterOrder[i]; + beforeLayer = beforeIndex[layerId]; + afterLayer = afterIndex[layerId]; + if (clean[layerId] || ref_properties.deepEqual(beforeLayer, afterLayer)) + continue; + if (!ref_properties.deepEqual(beforeLayer.source, afterLayer.source) || !ref_properties.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !ref_properties.deepEqual(beforeLayer.type, afterLayer.type)) { + commands.push({ + command: operations.removeLayer, + args: [layerId] + }); + insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1]; + commands.push({ + command: operations.addLayer, + args: [ + afterLayer, + insertBeforeLayerId + ] + }); + continue; + } + diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty); + diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty); + if (!ref_properties.deepEqual(beforeLayer.filter, afterLayer.filter)) { + commands.push({ + command: operations.setFilter, + args: [ + layerId, + afterLayer.filter + ] + }); + } + if (!ref_properties.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !ref_properties.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { + commands.push({ + command: operations.setLayerZoomRange, + args: [ + layerId, + afterLayer.minzoom, + afterLayer.maxzoom + ] + }); + } + for (prop in beforeLayer) { + if (!beforeLayer.hasOwnProperty(prop)) + continue; + if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') + continue; + if (prop.indexOf('paint.') === 0) { + diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); + } else if (!ref_properties.deepEqual(beforeLayer[prop], afterLayer[prop])) { + commands.push({ + command: operations.setLayerProperty, + args: [ + layerId, + prop, + afterLayer[prop] + ] + }); + } + } + for (prop in afterLayer) { + if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) + continue; + if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') + continue; + if (prop.indexOf('paint.') === 0) { + diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); + } else if (!ref_properties.deepEqual(beforeLayer[prop], afterLayer[prop])) { + commands.push({ + command: operations.setLayerProperty, + args: [ + layerId, + prop, + afterLayer[prop] + ] + }); + } + } + } +} +function diffStyles(before, after) { + if (!before) + return [{ + command: operations.setStyle, + args: [after] + }]; + let commands = []; + try { + if (!ref_properties.deepEqual(before.version, after.version)) { + return [{ + command: operations.setStyle, + args: [after] + }]; + } + if (!ref_properties.deepEqual(before.center, after.center)) { + commands.push({ + command: operations.setCenter, + args: [after.center] + }); + } + if (!ref_properties.deepEqual(before.zoom, after.zoom)) { + commands.push({ + command: operations.setZoom, + args: [after.zoom] + }); + } + if (!ref_properties.deepEqual(before.bearing, after.bearing)) { + commands.push({ + command: operations.setBearing, + args: [after.bearing] + }); + } + if (!ref_properties.deepEqual(before.pitch, after.pitch)) { + commands.push({ + command: operations.setPitch, + args: [after.pitch] + }); + } + if (!ref_properties.deepEqual(before.sprite, after.sprite)) { + commands.push({ + command: operations.setSprite, + args: [after.sprite] + }); + } + if (!ref_properties.deepEqual(before.glyphs, after.glyphs)) { + commands.push({ + command: operations.setGlyphs, + args: [after.glyphs] + }); + } + if (!ref_properties.deepEqual(before.transition, after.transition)) { + commands.push({ + command: operations.setTransition, + args: [after.transition] + }); + } + if (!ref_properties.deepEqual(before.light, after.light)) { + commands.push({ + command: operations.setLight, + args: [after.light] + }); + } + const sourcesRemoved = {}; + const removeOrAddSourceCommands = []; + diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); + const beforeLayers = []; + if (before.layers) { + before.layers.forEach(layer => { + if (sourcesRemoved[layer.source]) { + commands.push({ + command: operations.removeLayer, + args: [layer.id] + }); + } else { + beforeLayers.push(layer); + } + }); + } + let beforeTerrain = before.terrain; + if (beforeTerrain) { + if (sourcesRemoved[beforeTerrain.source]) { + commands.push({ + command: operations.setTerrain, + args: [undefined] + }); + beforeTerrain = undefined; + } + } + commands = commands.concat(removeOrAddSourceCommands); + if (!ref_properties.deepEqual(beforeTerrain, after.terrain)) { + commands.push({ + command: operations.setTerrain, + args: [after.terrain] + }); + } + diffLayers(beforeLayers, after.layers, commands); + } catch (e) { + console.warn('Unable to compute style diff:', e); + commands = [{ + command: operations.setStyle, + args: [after] + }]; + } + return commands; +} + +class PathInterpolator { + constructor(points_, padding_) { + this.reset(points_, padding_); + } + reset(points_, padding_) { + this.points = points_ || []; + this._distances = [0]; + for (let i = 1; i < this.points.length; i++) { + this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]); + } + this.length = this._distances[this._distances.length - 1]; + this.padding = Math.min(padding_ || 0, this.length * 0.5); + this.paddedLength = this.length - this.padding * 2; + } + lerp(t) { + if (this.points.length === 1) { + return this.points[0]; + } + t = ref_properties.clamp(t, 0, 1); + let currentIndex = 1; + let distOfCurrentIdx = this._distances[currentIndex]; + const distToTarget = t * this.paddedLength + this.padding; + while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) { + distOfCurrentIdx = this._distances[++currentIndex]; + } + const idxOfPrevPoint = currentIndex - 1; + const distOfPrevIdx = this._distances[idxOfPrevPoint]; + const segmentLength = distOfCurrentIdx - distOfPrevIdx; + const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0; + return this.points[idxOfPrevPoint].mult(1 - segmentT).add(this.points[currentIndex].mult(segmentT)); + } +} + +class GridIndex { + constructor(width, height, cellSize) { + const boxCells = this.boxCells = []; + const circleCells = this.circleCells = []; + this.xCellCount = Math.ceil(width / cellSize); + this.yCellCount = Math.ceil(height / cellSize); + for (let i = 0; i < this.xCellCount * this.yCellCount; i++) { + boxCells.push([]); + circleCells.push([]); + } + this.circleKeys = []; + this.boxKeys = []; + this.bboxes = []; + this.circles = []; + this.width = width; + this.height = height; + this.xScale = this.xCellCount / width; + this.yScale = this.yCellCount / height; + this.boxUid = 0; + this.circleUid = 0; + } + keysLength() { + return this.boxKeys.length + this.circleKeys.length; + } + insert(key, x1, y1, x2, y2) { + this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++); + this.boxKeys.push(key); + this.bboxes.push(x1); + this.bboxes.push(y1); + this.bboxes.push(x2); + this.bboxes.push(y2); + } + insertCircle(key, x, y, radius) { + this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++); + this.circleKeys.push(key); + this.circles.push(x); + this.circles.push(y); + this.circles.push(radius); + } + _insertBoxCell(x1, y1, x2, y2, cellIndex, uid) { + this.boxCells[cellIndex].push(uid); + } + _insertCircleCell(x1, y1, x2, y2, cellIndex, uid) { + this.circleCells[cellIndex].push(uid); + } + _query(x1, y1, x2, y2, hitTest, predicate) { + if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { + return hitTest ? false : []; + } + const result = []; + if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { + if (hitTest) { + return true; + } + for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) { + result.push({ + key: this.boxKeys[boxUid], + x1: this.bboxes[boxUid * 4], + y1: this.bboxes[boxUid * 4 + 1], + x2: this.bboxes[boxUid * 4 + 2], + y2: this.bboxes[boxUid * 4 + 3] + }); + } + for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { + const x = this.circles[circleUid * 3]; + const y = this.circles[circleUid * 3 + 1]; + const radius = this.circles[circleUid * 3 + 2]; + result.push({ + key: this.circleKeys[circleUid], + x1: x - radius, + y1: y - radius, + x2: x + radius, + y2: y + radius + }); + } + return predicate ? result.filter(predicate) : result; + } else { + const queryArgs = { + hitTest, + seenUids: { + box: {}, + circle: {} + } + }; + this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); + return hitTest ? result.length > 0 : result; + } + } + _queryCircle(x, y, radius, hitTest, predicate) { + const x1 = x - radius; + const x2 = x + radius; + const y1 = y - radius; + const y2 = y + radius; + if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { + return hitTest ? false : []; + } + const result = []; + const queryArgs = { + hitTest, + circle: { + x, + y, + radius + }, + seenUids: { + box: {}, + circle: {} + } + }; + this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); + return hitTest ? result.length > 0 : result; + } + query(x1, y1, x2, y2, predicate) { + return this._query(x1, y1, x2, y2, false, predicate); + } + hitTest(x1, y1, x2, y2, predicate) { + return this._query(x1, y1, x2, y2, true, predicate); + } + hitTestCircle(x, y, radius, predicate) { + return this._queryCircle(x, y, radius, true, predicate); + } + _queryCell(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) { + const seenUids = queryArgs.seenUids; + const boxCell = this.boxCells[cellIndex]; + if (boxCell !== null) { + const bboxes = this.bboxes; + for (const boxUid of boxCell) { + if (!seenUids.box[boxUid]) { + seenUids.box[boxUid] = true; + const offset = boxUid * 4; + if (x1 <= bboxes[offset + 2] && y1 <= bboxes[offset + 3] && x2 >= bboxes[offset + 0] && y2 >= bboxes[offset + 1] && (!predicate || predicate(this.boxKeys[boxUid]))) { + if (queryArgs.hitTest) { + result.push(true); + return true; + } else { + result.push({ + key: this.boxKeys[boxUid], + x1: bboxes[offset], + y1: bboxes[offset + 1], + x2: bboxes[offset + 2], + y2: bboxes[offset + 3] + }); + } + } + } + } + } + const circleCell = this.circleCells[cellIndex]; + if (circleCell !== null) { + const circles = this.circles; + for (const circleUid of circleCell) { + if (!seenUids.circle[circleUid]) { + seenUids.circle[circleUid] = true; + const offset = circleUid * 3; + if (this._circleAndRectCollide(circles[offset], circles[offset + 1], circles[offset + 2], x1, y1, x2, y2) && (!predicate || predicate(this.circleKeys[circleUid]))) { + if (queryArgs.hitTest) { + result.push(true); + return true; + } else { + const x = circles[offset]; + const y = circles[offset + 1]; + const radius = circles[offset + 2]; + result.push({ + key: this.circleKeys[circleUid], + x1: x - radius, + y1: y - radius, + x2: x + radius, + y2: y + radius + }); + } + } + } + } + } + } + _queryCellCircle(x1, y1, x2, y2, cellIndex, result, queryArgs, predicate) { + const circle = queryArgs.circle; + const seenUids = queryArgs.seenUids; + const boxCell = this.boxCells[cellIndex]; + if (boxCell !== null) { + const bboxes = this.bboxes; + for (const boxUid of boxCell) { + if (!seenUids.box[boxUid]) { + seenUids.box[boxUid] = true; + const offset = boxUid * 4; + if (this._circleAndRectCollide(circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) && (!predicate || predicate(this.boxKeys[boxUid]))) { + result.push(true); + return true; + } + } + } + } + const circleCell = this.circleCells[cellIndex]; + if (circleCell !== null) { + const circles = this.circles; + for (const circleUid of circleCell) { + if (!seenUids.circle[circleUid]) { + seenUids.circle[circleUid] = true; + const offset = circleUid * 3; + if (this._circlesCollide(circles[offset], circles[offset + 1], circles[offset + 2], circle.x, circle.y, circle.radius) && (!predicate || predicate(this.circleKeys[circleUid]))) { + result.push(true); + return true; + } + } + } + } + } + _forEachCell(x1, y1, x2, y2, fn, arg1, arg2, predicate) { + const cx1 = this._convertToXCellCoord(x1); + const cy1 = this._convertToYCellCoord(y1); + const cx2 = this._convertToXCellCoord(x2); + const cy2 = this._convertToYCellCoord(y2); + for (let x = cx1; x <= cx2; x++) { + for (let y = cy1; y <= cy2; y++) { + const cellIndex = this.xCellCount * y + x; + if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) + return; + } + } + } + _convertToXCellCoord(x) { + return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); + } + _convertToYCellCoord(y) { + return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); + } + _circlesCollide(x1, y1, r1, x2, y2, r2) { + const dx = x2 - x1; + const dy = y2 - y1; + const bothRadii = r1 + r2; + return bothRadii * bothRadii > dx * dx + dy * dy; + } + _circleAndRectCollide(circleX, circleY, radius, x1, y1, x2, y2) { + const halfRectWidth = (x2 - x1) / 2; + const distX = Math.abs(circleX - (x1 + halfRectWidth)); + if (distX > halfRectWidth + radius) { + return false; + } + const halfRectHeight = (y2 - y1) / 2; + const distY = Math.abs(circleY - (y1 + halfRectHeight)); + if (distY > halfRectHeight + radius) { + return false; + } + if (distX <= halfRectWidth || distY <= halfRectHeight) { + return true; + } + const dx = distX - halfRectWidth; + const dy = distY - halfRectHeight; + return dx * dx + dy * dy <= radius * radius; + } +} + +function getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) { + const m = ref_properties.create(); + if (pitchWithMap) { + ref_properties.scale(m, m, [ + 1 / pixelsToTileUnits, + 1 / pixelsToTileUnits, + 1 + ]); + if (!rotateWithMap) { + ref_properties.rotateZ(m, m, transform.angle); + } + } else { + ref_properties.multiply(m, transform.labelPlaneMatrix, posMatrix); + } + return m; +} +function getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, transform, pixelsToTileUnits) { + if (pitchWithMap) { + const m = ref_properties.clone(posMatrix); + ref_properties.scale(m, m, [ + pixelsToTileUnits, + pixelsToTileUnits, + 1 + ]); + if (!rotateWithMap) { + ref_properties.rotateZ(m, m, -transform.angle); + } + return m; + } else { + return transform.glCoordMatrix; + } +} +function project(point, matrix, elevation = 0) { + const pos = [ + point.x, + point.y, + elevation, + 1 + ]; + if (elevation) { + ref_properties.transformMat4(pos, pos, matrix); + } else { + xyTransformMat4(pos, pos, matrix); + } + const w = pos[3]; + return { + point: new ref_properties.Point(pos[0] / w, pos[1] / w), + signedDistanceFromCamera: w + }; +} +function getPerspectiveRatio(cameraToCenterDistance, signedDistanceFromCamera) { + return Math.min(0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera), 1.5); +} +function isVisible(anchorPos, clippingBuffer) { + const x = anchorPos[0] / anchorPos[3]; + const y = anchorPos[1] / anchorPos[3]; + const inPaddedViewport = x >= -clippingBuffer[0] && x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]; + return inPaddedViewport; +} +function updateLineLabels(bucket, posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, getElevation) { + const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; + const partiallyEvaluatedSize = ref_properties.evaluateSizeForZoom(sizeData, painter.transform.zoom); + const clippingBuffer = [ + 256 / painter.width * 2 + 1, + 256 / painter.height * 2 + 1 + ]; + const dynamicLayoutVertexArray = isText ? bucket.text.dynamicLayoutVertexArray : bucket.icon.dynamicLayoutVertexArray; + dynamicLayoutVertexArray.clear(); + const lineVertexArray = bucket.lineVertexArray; + const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; + const aspectRatio = painter.transform.width / painter.transform.height; + let useVertical = false; + for (let s = 0; s < placedSymbols.length; s++) { + const symbol = placedSymbols.get(s); + if (symbol.hidden || symbol.writingMode === ref_properties.WritingMode.vertical && !useVertical) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + continue; + } + useVertical = false; + const elevation = getElevation ? getElevation({ + x: symbol.anchorX, + y: symbol.anchorY + }) : 0; + const anchorPos = [ + symbol.anchorX, + symbol.anchorY, + elevation, + 1 + ]; + ref_properties.transformMat4(anchorPos, anchorPos, posMatrix); + if (!isVisible(anchorPos, clippingBuffer)) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + continue; + } + const cameraToAnchorDistance = anchorPos[3]; + const perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance); + const fontSize = ref_properties.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); + const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; + const tileAnchorPoint = new ref_properties.Point(symbol.anchorX, symbol.anchorY); + const transformedTileAnchor = project(tileAnchorPoint, labelPlaneMatrix, elevation); + if (transformedTileAnchor.signedDistanceFromCamera <= 0) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + continue; + } + const anchorPoint = transformedTileAnchor.point; + let projectionCache = {}; + const getElevationForPlacement = pitchWithMap ? null : getElevation; + const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement); + useVertical = placeUnflipped.useVertical; + if (getElevationForPlacement && placeUnflipped.needsFlipping) + projectionCache = {}; + if (placeUnflipped.notEnoughRoom || useVertical || placeUnflipped.needsFlipping && placeGlyphsAlongLine(symbol, pitchScaledFontSize, true, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement).notEnoughRoom) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + } + } + if (isText) { + bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); + } else { + bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); + } +} +function placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords) { + const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; + const lineStartIndex = symbol.lineStartIndex; + const lineEndIndex = symbol.lineStartIndex + symbol.lineLength; + const firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); + const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); + const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true); + if (!firstPlacedGlyph) + return null; + const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true); + if (!lastPlacedGlyph) + return null; + return { + first: firstPlacedGlyph, + last: lastPlacedGlyph + }; +} +function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) { + if (writingMode === ref_properties.WritingMode.horizontal) { + const rise = Math.abs(lastPoint.y - firstPoint.y); + const run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; + if (rise > run) { + return { useVertical: true }; + } + } + if (writingMode === ref_properties.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) { + return { needsFlipping: true }; + } + return null; +} +function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevation) { + const fontScale = fontSize / 24; + const lineOffsetX = symbol.lineOffsetX * fontScale; + const lineOffsetY = symbol.lineOffsetY * fontScale; + let placedGlyphs; + if (symbol.numGlyphs > 1) { + const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; + const lineStartIndex = symbol.lineStartIndex; + const lineEndIndex = symbol.lineStartIndex + symbol.lineLength; + const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation); + if (!firstAndLastGlyph) { + return { notEnoughRoom: true }; + } + const firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; + const lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; + if (keepUpright && !flip) { + const orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio); + if (orientationChange) { + return orientationChange; + } + } + placedGlyphs = [firstAndLastGlyph.first]; + for (let glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) { + placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation)); + } + placedGlyphs.push(firstAndLastGlyph.last); + } else { + if (keepUpright && !flip) { + const a = project(tileAnchorPoint, posMatrix).point; + const tileVertexIndex = symbol.lineStartIndex + symbol.segment + 1; + const tileSegmentEnd = new ref_properties.Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); + const projectedVertex = project(tileSegmentEnd, posMatrix); + const b = projectedVertex.signedDistanceFromCamera > 0 ? projectedVertex.point : projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix); + const orientationChange = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio); + if (orientationChange) { + return orientationChange; + } + } + const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation); + if (!singleGlyph) + return { notEnoughRoom: true }; + placedGlyphs = [singleGlyph]; + } + for (const glyph of placedGlyphs) { + ref_properties.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); + } + return {}; +} +function projectTruncatedLineSegment(previousTilePoint, currentTilePoint, previousProjectedPoint, minimumLength, projectionMatrix, getElevation) { + const unitVertex = previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()); + const projectedUnitVertex = project(unitVertex, projectionMatrix, getElevation ? getElevation(unitVertex) : 0).point; + const projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); + return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); +} +function interpolate(p1, p2, a) { + const b = 1 - a; + return new ref_properties.Point(p1.x * b + p2.x * a, p1.y * b + p2.y * a); +} +function placeGlyphAlongLine(offsetX, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, anchorSegment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, endGlyph) { + const combinedOffsetX = flip ? offsetX - lineOffsetX : offsetX + lineOffsetX; + let dir = combinedOffsetX > 0 ? 1 : -1; + let angle = 0; + if (flip) { + dir *= -1; + angle = Math.PI; + } + if (dir < 0) + angle += Math.PI; + let currentIndex = dir > 0 ? lineStartIndex + anchorSegment : lineStartIndex + anchorSegment + 1; + let current = anchorPoint; + let prev = anchorPoint; + let distanceToPrev = 0; + let currentSegmentDistance = 0; + const absOffsetX = Math.abs(combinedOffsetX); + const pathVertices = []; + const tilePath = []; + let currentVertex = tileAnchorPoint; + const previousTilePoint = () => { + const previousLineVertexIndex = currentIndex - dir; + return distanceToPrev === 0 ? tileAnchorPoint : new ref_properties.Point(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); + }; + const getTruncatedLineSegment = () => { + return projectTruncatedLineSegment(previousTilePoint(), currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix, getElevation); + }; + while (distanceToPrev + currentSegmentDistance <= absOffsetX) { + currentIndex += dir; + if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) + return null; + prev = current; + pathVertices.push(current); + if (returnPathInTileCoords) + tilePath.push(currentVertex || previousTilePoint()); + current = projectionCache[currentIndex]; + if (current === undefined) { + currentVertex = new ref_properties.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); + const projection = project(currentVertex, labelPlaneMatrix, getElevation ? getElevation(currentVertex) : 0); + if (projection.signedDistanceFromCamera > 0) { + current = projectionCache[currentIndex] = projection.point; + } else { + current = getTruncatedLineSegment(); + } + } else { + currentVertex = null; + } + distanceToPrev += currentSegmentDistance; + currentSegmentDistance = prev.dist(current); + } + if (endGlyph && getElevation) { + currentVertex = currentVertex || new ref_properties.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); + projectionCache[currentIndex] = current = projectionCache[currentIndex] === undefined ? current : getTruncatedLineSegment(); + currentSegmentDistance = prev.dist(current); + } + const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; + const prevToCurrent = current.sub(prev); + const p = prevToCurrent.mult(segmentInterpolationT)._add(prev); + if (lineOffsetY) + p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); + const segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); + pathVertices.push(p); + if (returnPathInTileCoords) { + currentVertex = currentVertex || new ref_properties.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); + const prevVertex = tilePath.length > 0 ? tilePath[tilePath.length - 1] : currentVertex; + tilePath.push(interpolate(prevVertex, currentVertex, segmentInterpolationT)); + } + return { + point: p, + angle: segmentAngle, + path: pathVertices, + tilePath + }; +} +const hiddenGlyphAttributes = new Float32Array([ + -Infinity, + -Infinity, + 0, + -Infinity, + -Infinity, + 0, + -Infinity, + -Infinity, + 0, + -Infinity, + -Infinity, + 0 +]); +function hideGlyphs(num, dynamicLayoutVertexArray) { + for (let i = 0; i < num; i++) { + const offset = dynamicLayoutVertexArray.length; + dynamicLayoutVertexArray.resize(offset + 4); + dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3); + } +} +function xyTransformMat4(out, a, m) { + const x = a[0], y = a[1]; + out[0] = m[0] * x + m[4] * y + m[12]; + out[1] = m[1] * x + m[5] * y + m[13]; + out[3] = m[3] * x + m[7] * y + m[15]; + return out; +} + +const viewportPadding = 100; +class CollisionIndex { + constructor(transform, grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25), ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25)) { + this.transform = transform; + this.grid = grid; + this.ignoredGrid = ignoredGrid; + this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; + this.screenRightBoundary = transform.width + viewportPadding; + this.screenBottomBoundary = transform.height + viewportPadding; + this.gridRightBoundary = transform.width + 2 * viewportPadding; + this.gridBottomBoundary = transform.height + 2 * viewportPadding; + } + placeCollisionBox(scale, collisionBox, shift, allowOverlap, textPixelRatio, posMatrix, collisionGroupPredicate) { + const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY, collisionBox.elevation); + const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; + const tlX = (collisionBox.x1 * scale + shift.x - collisionBox.padding) * tileToViewport + projectedPoint.point.x; + const tlY = (collisionBox.y1 * scale + shift.y - collisionBox.padding) * tileToViewport + projectedPoint.point.y; + const brX = (collisionBox.x2 * scale + shift.x + collisionBox.padding) * tileToViewport + projectedPoint.point.x; + const brY = (collisionBox.y2 * scale + shift.y + collisionBox.padding) * tileToViewport + projectedPoint.point.y; + const minPerspectiveRatio = 0.55; + const isClipped = projectedPoint.perspectiveRatio <= minPerspectiveRatio || projectedPoint.aboveHorizon; + if (!this.isInsideGrid(tlX, tlY, brX, brY) || !allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate) || isClipped) { + return { + box: [], + offscreen: false + }; + } + return { + box: [ + tlX, + tlY, + brX, + brY + ], + offscreen: this.isOffscreen(tlX, tlY, brX, brY) + }; + } + placeCollisionCircles(allowOverlap, symbol, lineVertexArray, glyphOffsetArray, fontSize, posMatrix, labelPlaneMatrix, labelToScreenMatrix, showCollisionCircles, pitchWithMap, collisionGroupPredicate, circlePixelDiameter, textPixelPadding, tileID) { + const placedCollisionCircles = []; + const elevation = this.transform.elevation; + const getElevation = elevation ? p => elevation.getAtTileOffset(tileID, p.x, p.y) : _ => 0; + const tileUnitAnchorPoint = new ref_properties.Point(symbol.anchorX, symbol.anchorY); + const anchorElevation = getElevation(tileUnitAnchorPoint); + const screenAnchorPoint = this.projectAndGetPerspectiveRatio(posMatrix, tileUnitAnchorPoint.x, tileUnitAnchorPoint.y, anchorElevation); + const {perspectiveRatio} = screenAnchorPoint; + const labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; + const labelPlaneFontScale = labelPlaneFontSize / ref_properties.ONE_EM; + const labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix, anchorElevation).point; + const projectionCache = {}; + const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale; + const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale; + const firstAndLastGlyph = screenAnchorPoint.signedDistanceFromCamera > 0 ? placeFirstAndLastGlyph(labelPlaneFontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, elevation && !pitchWithMap ? getElevation : null, pitchWithMap && !!elevation) : null; + let collisionDetected = false; + let inGrid = false; + let entirelyOffscreen = true; + if (firstAndLastGlyph && !screenAnchorPoint.aboveHorizon) { + const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding; + const screenPlaneMin = new ref_properties.Point(-viewportPadding, -viewportPadding); + const screenPlaneMax = new ref_properties.Point(this.screenRightBoundary, this.screenBottomBoundary); + const interpolator = new PathInterpolator(); + const first = firstAndLastGlyph.first; + const last = firstAndLastGlyph.last; + let projectedPath = []; + for (let i = first.path.length - 1; i >= 1; i--) { + projectedPath.push(first.path[i]); + } + for (let i = 1; i < last.path.length; i++) { + projectedPath.push(last.path[i]); + } + const circleDist = radius * 2.5; + if (labelToScreenMatrix) { + const screenSpacePath = elevation ? projectedPath.map((p, index) => { + const z = getElevation(index < first.path.length - 1 ? first.tilePath[first.path.length - 1 - index] : last.tilePath[index - first.path.length + 2]); + return project(p, labelToScreenMatrix, z); + }) : projectedPath.map(p => project(p, labelToScreenMatrix)); + if (screenSpacePath.some(point => point.signedDistanceFromCamera <= 0)) { + projectedPath = []; + } else { + projectedPath = screenSpacePath.map(p => p.point); + } + } + let segments = []; + if (projectedPath.length > 0) { + const minPoint = projectedPath[0].clone(); + const maxPoint = projectedPath[0].clone(); + for (let i = 1; i < projectedPath.length; i++) { + minPoint.x = Math.min(minPoint.x, projectedPath[i].x); + minPoint.y = Math.min(minPoint.y, projectedPath[i].y); + maxPoint.x = Math.max(maxPoint.x, projectedPath[i].x); + maxPoint.y = Math.max(maxPoint.y, projectedPath[i].y); + } + if (minPoint.x >= screenPlaneMin.x && maxPoint.x <= screenPlaneMax.x && minPoint.y >= screenPlaneMin.y && maxPoint.y <= screenPlaneMax.y) { + segments = [projectedPath]; + } else if (maxPoint.x < screenPlaneMin.x || minPoint.x > screenPlaneMax.x || maxPoint.y < screenPlaneMin.y || minPoint.y > screenPlaneMax.y) { + segments = []; + } else { + segments = ref_properties.clipLine([projectedPath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y); + } + } + for (const seg of segments) { + interpolator.reset(seg, radius * 0.25); + let numCircles = 0; + if (interpolator.length <= 0.5 * radius) { + numCircles = 1; + } else { + numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1; + } + for (let i = 0; i < numCircles; i++) { + const t = i / Math.max(numCircles - 1, 1); + const circlePosition = interpolator.lerp(t); + const centerX = circlePosition.x + viewportPadding; + const centerY = circlePosition.y + viewportPadding; + placedCollisionCircles.push(centerX, centerY, radius, 0); + const x1 = centerX - radius; + const y1 = centerY - radius; + const x2 = centerX + radius; + const y2 = centerY + radius; + entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); + inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); + if (!allowOverlap) { + if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) { + collisionDetected = true; + if (!showCollisionCircles) { + return { + circles: [], + offscreen: false, + collisionDetected + }; + } + } + } + } + } + } + return { + circles: !showCollisionCircles && collisionDetected || !inGrid ? [] : placedCollisionCircles, + offscreen: entirelyOffscreen, + collisionDetected + }; + } + queryRenderedSymbols(viewportQueryGeometry) { + if (viewportQueryGeometry.length === 0 || this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0) { + return {}; + } + const query = []; + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const point of viewportQueryGeometry) { + const gridPoint = new ref_properties.Point(point.x + viewportPadding, point.y + viewportPadding); + minX = Math.min(minX, gridPoint.x); + minY = Math.min(minY, gridPoint.y); + maxX = Math.max(maxX, gridPoint.x); + maxY = Math.max(maxY, gridPoint.y); + query.push(gridPoint); + } + const features = this.grid.query(minX, minY, maxX, maxY).concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); + const seenFeatures = {}; + const result = {}; + for (const feature of features) { + const featureKey = feature.key; + if (seenFeatures[featureKey.bucketInstanceId] === undefined) { + seenFeatures[featureKey.bucketInstanceId] = {}; + } + if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) { + continue; + } + const bbox = [ + new ref_properties.Point(feature.x1, feature.y1), + new ref_properties.Point(feature.x2, feature.y1), + new ref_properties.Point(feature.x2, feature.y2), + new ref_properties.Point(feature.x1, feature.y2) + ]; + if (!ref_properties.polygonIntersectsPolygon(query, bbox)) { + continue; + } + seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; + if (result[featureKey.bucketInstanceId] === undefined) { + result[featureKey.bucketInstanceId] = []; + } + result[featureKey.bucketInstanceId].push(featureKey.featureIndex); + } + return result; + } + insertCollisionBox(collisionBox, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) { + const grid = ignorePlacement ? this.ignoredGrid : this.grid; + const key = { + bucketInstanceId, + featureIndex, + collisionGroupID + }; + grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); + } + insertCollisionCircles(collisionCircles, ignorePlacement, bucketInstanceId, featureIndex, collisionGroupID) { + const grid = ignorePlacement ? this.ignoredGrid : this.grid; + const key = { + bucketInstanceId, + featureIndex, + collisionGroupID + }; + for (let k = 0; k < collisionCircles.length; k += 4) { + grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); + } + } + projectAndGetPerspectiveRatio(posMatrix, x, y, elevation) { + const p = [ + x, + y, + elevation || 0, + 1 + ]; + let aboveHorizon = false; + if (elevation || this.transform.pitch > 0) { + ref_properties.transformMat4(p, p, posMatrix); + aboveHorizon = p[2] > p[3]; + } else { + xyTransformMat4(p, p, posMatrix); + } + const a = new ref_properties.Point((p[0] / p[3] + 1) / 2 * this.transform.width + viewportPadding, (-p[1] / p[3] + 1) / 2 * this.transform.height + viewportPadding); + return { + point: a, + perspectiveRatio: Math.min(0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]), 1.5), + signedDistanceFromCamera: p[3], + aboveHorizon + }; + } + isOffscreen(x1, y1, x2, y2) { + return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; + } + isInsideGrid(x1, y1, x2, y2) { + return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; + } + getViewportMatrix() { + const m = ref_properties.identity([]); + ref_properties.translate(m, m, [ + -viewportPadding, + -viewportPadding, + 0 + ]); + return m; + } +} + +class OpacityState { + constructor(prevState, increment, placed, skipFade) { + if (prevState) { + this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment))); + } else { + this.opacity = skipFade && placed ? 1 : 0; + } + this.placed = placed; + } + isHidden() { + return this.opacity === 0 && !this.placed; + } +} +class JointOpacityState { + constructor(prevState, increment, placedText, placedIcon, skipFade) { + this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); + this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); + } + isHidden() { + return this.text.isHidden() && this.icon.isHidden(); + } +} +class JointPlacement { + constructor(text, icon, skipFade) { + this.text = text; + this.icon = icon; + this.skipFade = skipFade; + } +} +class CollisionCircleArray { + constructor() { + this.invProjMatrix = ref_properties.create(); + this.viewportMatrix = ref_properties.create(); + this.circles = []; + } +} +class RetainedQueryData { + constructor(bucketInstanceId, featureIndex, sourceLayerIndex, bucketIndex, tileID) { + this.bucketInstanceId = bucketInstanceId; + this.featureIndex = featureIndex; + this.sourceLayerIndex = sourceLayerIndex; + this.bucketIndex = bucketIndex; + this.tileID = tileID; + } +} +class CollisionGroups { + constructor(crossSourceCollisions) { + this.crossSourceCollisions = crossSourceCollisions; + this.maxGroupID = 0; + this.collisionGroups = {}; + } + get(sourceID) { + if (!this.crossSourceCollisions) { + if (!this.collisionGroups[sourceID]) { + const nextGroupID = ++this.maxGroupID; + this.collisionGroups[sourceID] = { + ID: nextGroupID, + predicate: key => { + return key.collisionGroupID === nextGroupID; + } + }; + } + return this.collisionGroups[sourceID]; + } else { + return { + ID: 0, + predicate: null + }; + } + } +} +function calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale) { + const {horizontalAlign, verticalAlign} = ref_properties.getAnchorAlignment(anchor); + const shiftX = -(horizontalAlign - 0.5) * width; + const shiftY = -(verticalAlign - 0.5) * height; + const offset = ref_properties.evaluateVariableOffset(anchor, textOffset); + return new ref_properties.Point(shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale); +} +function offsetShift(shiftX, shiftY, rotateWithMap, pitchWithMap, angle) { + const shift = new ref_properties.Point(shiftX, shiftY); + if (rotateWithMap) { + shift._rotate(pitchWithMap ? angle : -angle); + } + return shift; +} +class Placement { + constructor(transform, fadeDuration, crossSourceCollisions, prevPlacement) { + this.transform = transform.clone(); + this.collisionIndex = new CollisionIndex(this.transform); + this.placements = {}; + this.opacities = {}; + this.variableOffsets = {}; + this.stale = false; + this.commitTime = 0; + this.fadeDuration = fadeDuration; + this.retainedQueryData = {}; + this.collisionGroups = new CollisionGroups(crossSourceCollisions); + this.collisionCircleArrays = {}; + this.prevPlacement = prevPlacement; + if (prevPlacement) { + prevPlacement.prevPlacement = undefined; + } + this.placedOrientations = {}; + } + getBucketParts(results, styleLayer, tile, sortAcrossTiles) { + const symbolBucket = tile.getBucket(styleLayer); + const bucketFeatureIndex = tile.latestFeatureIndex; + if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) + return; + const collisionBoxArray = tile.collisionBoxArray; + const layout = symbolBucket.layers[0].layout; + const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); + const textPixelRatio = tile.tileSize / ref_properties.EXTENT; + const posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + const pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom); + const textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles); + let labelToScreenMatrix = null; + if (pitchWithMap) { + const glMatrix = getGlCoordMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles); + labelToScreenMatrix = ref_properties.multiply([], this.transform.labelPlaneMatrix, glMatrix); + } + this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData(symbolBucket.bucketInstanceId, bucketFeatureIndex, symbolBucket.sourceLayerIndex, symbolBucket.index, tile.tileID); + const parameters = { + bucket: symbolBucket, + layout, + posMatrix, + textLabelPlaneMatrix, + labelToScreenMatrix, + scale, + textPixelRatio, + holdingForFade: tile.holdingForFade(), + collisionBoxArray, + partiallyEvaluatedTextSize: ref_properties.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom), + partiallyEvaluatedIconSize: ref_properties.evaluateSizeForZoom(symbolBucket.iconSizeData, this.transform.zoom), + collisionGroup: this.collisionGroups.get(symbolBucket.sourceID) + }; + if (sortAcrossTiles) { + for (const range of symbolBucket.sortKeyRanges) { + const {sortKey, symbolInstanceStart, symbolInstanceEnd} = range; + results.push({ + sortKey, + symbolInstanceStart, + symbolInstanceEnd, + parameters + }); + } + } else { + results.push({ + symbolInstanceStart: 0, + symbolInstanceEnd: symbolBucket.symbolInstances.length, + parameters + }); + } + } + attemptAnchorPlacement(anchor, textBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, textAllowOverlap, symbolInstance, symbolIndex, bucket, orientation, iconBox, textSize, iconSize) { + const textOffset = [ + symbolInstance.textOffset0, + symbolInstance.textOffset1 + ]; + const textScale = bucket.getSymbolInstanceTextSize(textSize, symbolInstance, this.transform.zoom, symbolIndex); + const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale); + const placedGlyphBoxes = this.collisionIndex.placeCollisionBox(textScale, textBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + if (iconBox) { + const placedIconBoxes = this.collisionIndex.placeCollisionBox(bucket.getSymbolInstanceIconSize(iconSize, this.transform.zoom, symbolIndex), iconBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + if (placedIconBoxes.box.length === 0) + return; + } + if (placedGlyphBoxes.box.length > 0) { + let prevAnchor; + if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID].text) { + prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor; + } + this.variableOffsets[symbolInstance.crossTileID] = { + textOffset, + width, + height, + anchor, + textBoxScale, + prevAnchor + }; + this.markUsedJustification(bucket, anchor, symbolInstance, orientation); + if (bucket.allowVerticalPlacement) { + this.markUsedOrientation(bucket, orientation, symbolInstance); + this.placedOrientations[symbolInstance.crossTileID] = orientation; + } + return { + shift, + placedGlyphBoxes + }; + } + } + placeLayerBucketPart(bucketPart, seenCrossTileIDs, showCollisionBoxes) { + const {bucket, layout, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, textPixelRatio, holdingForFade, collisionBoxArray, partiallyEvaluatedTextSize, partiallyEvaluatedIconSize, collisionGroup} = bucketPart.parameters; + const textOptional = layout.get('text-optional'); + const iconOptional = layout.get('icon-optional'); + const textAllowOverlap = layout.get('text-allow-overlap'); + const iconAllowOverlap = layout.get('icon-allow-overlap'); + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; + const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; + const alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); + const alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); + if (!bucket.collisionArrays && collisionBoxArray) { + bucket.deserializeCollisionBoxes(collisionBoxArray); + } + if (showCollisionBoxes) { + bucket.updateCollisionDebugBuffers(this.transform.zoom, collisionBoxArray); + } + const placeSymbol = (symbolInstance, symbolIndex, collisionArrays) => { + if (seenCrossTileIDs[symbolInstance.crossTileID]) + return; + if (holdingForFade) { + this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); + return; + } + let placeText = false; + let placeIcon = false; + let offscreen = true; + let shift = null; + let placed = { + box: null, + offscreen: null + }; + let placedVerticalText = { + box: null, + offscreen: null + }; + let placedGlyphBoxes = null; + let placedGlyphCircles = null; + let placedIconBoxes = null; + let textFeatureIndex = 0; + let verticalTextFeatureIndex = 0; + let iconFeatureIndex = 0; + if (collisionArrays.textFeatureIndex) { + textFeatureIndex = collisionArrays.textFeatureIndex; + } else if (symbolInstance.useRuntimeCollisionCircles) { + textFeatureIndex = symbolInstance.featureIndex; + } + if (collisionArrays.verticalTextFeatureIndex) { + verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex; + } + const updateElevation = box => { + if (!this.transform.elevation && !box.elevation) + return; + box.elevation = this.transform.elevation ? this.transform.elevation.getAtTileOffset(this.retainedQueryData[bucket.bucketInstanceId].tileID, box.anchorPointX, box.anchorPointY) : 0; + }; + const textBox = collisionArrays.textBox; + if (textBox) { + updateElevation(textBox); + const updatePreviousOrientationIfNotPlaced = isPlaced => { + let previousOrientation = ref_properties.WritingMode.horizontal; + if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) { + const prevPlacedOrientation = this.prevPlacement.placedOrientations[symbolInstance.crossTileID]; + if (prevPlacedOrientation) { + this.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation; + previousOrientation = prevPlacedOrientation; + this.markUsedOrientation(bucket, previousOrientation, symbolInstance); + } + } + return previousOrientation; + }; + const placeTextForPlacementModes = (placeHorizontalFn, placeVerticalFn) => { + if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) { + for (const placementMode of bucket.writingModes) { + if (placementMode === ref_properties.WritingMode.vertical) { + placed = placeVerticalFn(); + placedVerticalText = placed; + } else { + placed = placeHorizontalFn(); + } + if (placed && placed.box && placed.box.length) + break; + } + } else { + placed = placeHorizontalFn(); + } + }; + if (!layout.get('text-variable-anchor')) { + const placeBox = (collisionTextBox, orientation) => { + const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, symbolIndex); + const placedFeature = this.collisionIndex.placeCollisionBox(textScale, collisionTextBox, new ref_properties.Point(0, 0), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + if (placedFeature && placedFeature.box && placedFeature.box.length) { + this.markUsedOrientation(bucket, orientation, symbolInstance); + this.placedOrientations[symbolInstance.crossTileID] = orientation; + } + return placedFeature; + }; + const placeHorizontal = () => { + return placeBox(textBox, ref_properties.WritingMode.horizontal); + }; + const placeVertical = () => { + const verticalTextBox = collisionArrays.verticalTextBox; + if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { + updateElevation(verticalTextBox); + return placeBox(verticalTextBox, ref_properties.WritingMode.vertical); + } + return { + box: null, + offscreen: null + }; + }; + placeTextForPlacementModes(placeHorizontal, placeVertical); + updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length); + } else { + let anchors = layout.get('text-variable-anchor'); + if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { + const prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; + if (anchors.indexOf(prevOffsets.anchor) > 0) { + anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor); + anchors.unshift(prevOffsets.anchor); + } + } + const placeBoxForVariableAnchors = (collisionTextBox, collisionIconBox, orientation) => { + const textBoxScale = symbolInstance.textBoxScale; + const width = (collisionTextBox.x2 - collisionTextBox.x1) * textBoxScale + 2 * collisionTextBox.padding; + const height = (collisionTextBox.y2 - collisionTextBox.y1) * textBoxScale + 2 * collisionTextBox.padding; + const variableIconBox = hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null; + if (variableIconBox) + updateElevation(variableIconBox); + let placedBox = { + box: [], + offscreen: false + }; + const placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length; + for (let i = 0; i < placementAttempts; ++i) { + const anchor = anchors[i % anchors.length]; + const allowOverlap = i >= anchors.length; + const result = this.attemptAnchorPlacement(anchor, collisionTextBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap, symbolInstance, symbolIndex, bucket, orientation, variableIconBox, partiallyEvaluatedTextSize, partiallyEvaluatedIconSize); + if (result) { + placedBox = result.placedGlyphBoxes; + if (placedBox && placedBox.box && placedBox.box.length) { + placeText = true; + shift = result.shift; + break; + } + } + } + return placedBox; + }; + const placeHorizontal = () => { + return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, ref_properties.WritingMode.horizontal); + }; + const placeVertical = () => { + const verticalTextBox = collisionArrays.verticalTextBox; + if (verticalTextBox) + updateElevation(verticalTextBox); + const wasPlaced = placed && placed.box && placed.box.length; + if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { + return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, ref_properties.WritingMode.vertical); + } + return { + box: null, + offscreen: null + }; + }; + placeTextForPlacementModes(placeHorizontal, placeVertical); + if (placed) { + placeText = placed.box; + offscreen = placed.offscreen; + } + const prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box); + if (!placeText && this.prevPlacement) { + const prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; + if (prevOffset) { + this.variableOffsets[symbolInstance.crossTileID] = prevOffset; + this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation); + } + } + } + } + placedGlyphBoxes = placed; + placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0; + offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; + if (symbolInstance.useRuntimeCollisionCircles) { + const placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex); + const fontSize = ref_properties.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); + const textPixelPadding = layout.get('text-padding'); + const circlePixelDiameter = symbolInstance.collisionCircleDiameter; + placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textAllowOverlap, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate, circlePixelDiameter, textPixelPadding, this.retainedQueryData[bucket.bucketInstanceId].tileID); + placeText = textAllowOverlap || placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected; + offscreen = offscreen && placedGlyphCircles.offscreen; + } + if (collisionArrays.iconFeatureIndex) { + iconFeatureIndex = collisionArrays.iconFeatureIndex; + } + if (collisionArrays.iconBox) { + const placeIconFeature = iconBox => { + updateElevation(iconBox); + const shiftPoint = hasIconTextFit && shift ? offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) : new ref_properties.Point(0, 0); + const iconScale = bucket.getSymbolInstanceIconSize(partiallyEvaluatedIconSize, this.transform.zoom, symbolIndex); + return this.collisionIndex.placeCollisionBox(iconScale, iconBox, shiftPoint, iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + }; + if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) { + placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox); + placeIcon = placedIconBoxes.box.length > 0; + } else { + placedIconBoxes = placeIconFeature(collisionArrays.iconBox); + placeIcon = placedIconBoxes.box.length > 0; + } + offscreen = offscreen && placedIconBoxes.offscreen; + } + const iconWithoutText = textOptional || symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0; + const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; + if (!iconWithoutText && !textWithoutIcon) { + placeIcon = placeText = placeIcon && placeText; + } else if (!textWithoutIcon) { + placeText = placeIcon && placeText; + } else if (!iconWithoutText) { + placeIcon = placeIcon && placeText; + } + if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) { + if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) { + this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID); + } else { + this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); + } + } + if (placeIcon && placedIconBoxes) { + this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); + } + if (placedGlyphCircles) { + if (placeText) { + this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); + } + if (showCollisionBoxes) { + const id = bucket.bucketInstanceId; + let circleArray = this.collisionCircleArrays[id]; + if (circleArray === undefined) + circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray(); + for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) { + circleArray.circles.push(placedGlyphCircles.circles[i + 0]); + circleArray.circles.push(placedGlyphCircles.circles[i + 1]); + circleArray.circles.push(placedGlyphCircles.circles[i + 2]); + circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); + } + } + } + this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); + seenCrossTileIDs[symbolInstance.crossTileID] = true; + }; + if (zOrderByViewportY) { + const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle); + for (let i = symbolIndexes.length - 1; i >= 0; --i) { + const symbolIndex = symbolIndexes[i]; + placeSymbol(bucket.symbolInstances.get(symbolIndex), symbolIndex, bucket.collisionArrays[symbolIndex]); + } + } else { + for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) { + placeSymbol(bucket.symbolInstances.get(i), i, bucket.collisionArrays[i]); + } + } + if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) { + const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId]; + ref_properties.invert(circleArray.invProjMatrix, posMatrix); + circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix(); + } + bucket.justReloaded = false; + } + markUsedJustification(bucket, placedAnchor, symbolInstance, orientation) { + const justifications = { + 'left': symbolInstance.leftJustifiedTextSymbolIndex, + 'center': symbolInstance.centerJustifiedTextSymbolIndex, + 'right': symbolInstance.rightJustifiedTextSymbolIndex + }; + let autoIndex; + if (orientation === ref_properties.WritingMode.vertical) { + autoIndex = symbolInstance.verticalPlacedTextSymbolIndex; + } else { + autoIndex = justifications[ref_properties.getAnchorJustification(placedAnchor)]; + } + const indexes = [ + symbolInstance.leftJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.verticalPlacedTextSymbolIndex + ]; + for (const index of indexes) { + if (index >= 0) { + if (autoIndex >= 0 && index !== autoIndex) { + bucket.text.placedSymbolArray.get(index).crossTileID = 0; + } else { + bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID; + } + } + } + } + markUsedOrientation(bucket, orientation, symbolInstance) { + const horizontal = orientation === ref_properties.WritingMode.horizontal || orientation === ref_properties.WritingMode.horizontalOnly ? orientation : 0; + const vertical = orientation === ref_properties.WritingMode.vertical ? orientation : 0; + const horizontalIndexes = [ + symbolInstance.leftJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.rightJustifiedTextSymbolIndex + ]; + for (const index of horizontalIndexes) { + bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal; + } + if (symbolInstance.verticalPlacedTextSymbolIndex) { + bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical; + } + } + commit(now) { + this.commitTime = now; + this.zoomAtLastRecencyCheck = this.transform.zoom; + const prevPlacement = this.prevPlacement; + let placementChanged = false; + this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0; + const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1; + const prevOpacities = prevPlacement ? prevPlacement.opacities : {}; + const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; + const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {}; + for (const crossTileID in this.placements) { + const jointPlacement = this.placements[crossTileID]; + const prevOpacity = prevOpacities[crossTileID]; + if (prevOpacity) { + this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); + placementChanged = placementChanged || jointPlacement.text !== prevOpacity.text.placed || jointPlacement.icon !== prevOpacity.icon.placed; + } else { + this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade); + placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; + } + } + for (const crossTileID in prevOpacities) { + const prevOpacity = prevOpacities[crossTileID]; + if (!this.opacities[crossTileID]) { + const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false); + if (!jointOpacity.isHidden()) { + this.opacities[crossTileID] = jointOpacity; + placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed; + } + } + } + for (const crossTileID in prevOffsets) { + if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { + this.variableOffsets[crossTileID] = prevOffsets[crossTileID]; + } + } + for (const crossTileID in prevOrientations) { + if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { + this.placedOrientations[crossTileID] = prevOrientations[crossTileID]; + } + } + if (placementChanged) { + this.lastPlacementChangeTime = now; + } else if (typeof this.lastPlacementChangeTime !== 'number') { + this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; + } + } + updateLayerOpacities(styleLayer, tiles) { + const seenCrossTileIDs = {}; + for (const tile of tiles) { + const symbolBucket = tile.getBucket(styleLayer); + if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { + this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); + } + } + } + updateBucketOpacities(bucket, seenCrossTileIDs, collisionBoxArray) { + if (bucket.hasTextData()) + bucket.text.opacityVertexArray.clear(); + if (bucket.hasIconData()) + bucket.icon.opacityVertexArray.clear(); + if (bucket.hasIconCollisionBoxData()) + bucket.iconCollisionBox.collisionVertexArray.clear(); + if (bucket.hasTextCollisionBoxData()) + bucket.textCollisionBox.collisionVertexArray.clear(); + const layout = bucket.layers[0].layout; + const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); + const textAllowOverlap = layout.get('text-allow-overlap'); + const iconAllowOverlap = layout.get('icon-allow-overlap'); + const variablePlacement = layout.get('text-variable-anchor'); + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; + const defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true); + if (!bucket.collisionArrays && collisionBoxArray && (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData())) { + bucket.deserializeCollisionBoxes(collisionBoxArray); + } + const addOpacities = (iconOrText, numVertices, opacity) => { + for (let i = 0; i < numVertices / 4; i++) { + iconOrText.opacityVertexArray.emplaceBack(opacity); + } + }; + for (let s = 0; s < bucket.symbolInstances.length; s++) { + const symbolInstance = bucket.symbolInstances.get(s); + const {numHorizontalGlyphVertices, numVerticalGlyphVertices, crossTileID} = symbolInstance; + const isDuplicate = seenCrossTileIDs[crossTileID]; + let opacityState = this.opacities[crossTileID]; + if (isDuplicate) { + opacityState = duplicateOpacityState; + } else if (!opacityState) { + opacityState = defaultOpacityState; + this.opacities[crossTileID] = opacityState; + } + seenCrossTileIDs[crossTileID] = true; + const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; + const hasIcon = symbolInstance.numIconVertices > 0; + const placedOrientation = this.placedOrientations[symbolInstance.crossTileID]; + const horizontalHidden = placedOrientation === ref_properties.WritingMode.vertical; + const verticalHidden = placedOrientation === ref_properties.WritingMode.horizontal || placedOrientation === ref_properties.WritingMode.horizontalOnly; + if (hasText) { + const packedOpacity = packOpacity(opacityState.text); + const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; + addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity); + const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; + addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity); + const symbolHidden = opacityState.text.isHidden(); + [ + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.leftJustifiedTextSymbolIndex + ].forEach(index => { + if (index >= 0) { + bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0; + } + }); + if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { + bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0; + } + const prevOffset = this.variableOffsets[symbolInstance.crossTileID]; + if (prevOffset) { + this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation); + } + const prevOrientation = this.placedOrientations[symbolInstance.crossTileID]; + if (prevOrientation) { + this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation); + this.markUsedOrientation(bucket, prevOrientation, symbolInstance); + } + } + if (hasIcon) { + const packedOpacity = packOpacity(opacityState.icon); + const useHorizontal = !(hasIconTextFit && symbolInstance.verticalPlacedIconSymbolIndex && horizontalHidden); + if (symbolInstance.placedIconSymbolIndex >= 0) { + const horizontalOpacity = useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY; + addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity); + bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden = opacityState.icon.isHidden(); + } + if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { + const verticalOpacity = !useHorizontal ? packedOpacity : PACKED_HIDDEN_OPACITY; + addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity); + bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden = opacityState.icon.isHidden(); + } + } + if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) { + const collisionArrays = bucket.collisionArrays[s]; + if (collisionArrays) { + let shift = new ref_properties.Point(0, 0); + if (collisionArrays.textBox || collisionArrays.verticalTextBox) { + let used = true; + if (variablePlacement) { + const variableOffset = this.variableOffsets[crossTileID]; + if (variableOffset) { + shift = calculateVariableLayoutShift(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.textOffset, variableOffset.textBoxScale); + if (rotateWithMap) { + shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle); + } + } else { + used = false; + } + } + if (collisionArrays.textBox) { + updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y); + } + if (collisionArrays.verticalTextBox) { + updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y); + } + } + const verticalIconUsed = Boolean(!verticalHidden && collisionArrays.verticalIconBox); + if (collisionArrays.iconBox) { + updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0); + } + if (collisionArrays.verticalIconBox) { + updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0); + } + } + } + } + bucket.sortFeatures(this.transform.angle); + if (this.retainedQueryData[bucket.bucketInstanceId]) { + this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; + } + if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { + bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); + } + if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { + bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); + } + if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) { + bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray); + } + if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) { + bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray); + } + if (bucket.bucketInstanceId in this.collisionCircleArrays) { + const instance = this.collisionCircleArrays[bucket.bucketInstanceId]; + bucket.placementInvProjMatrix = instance.invProjMatrix; + bucket.placementViewportMatrix = instance.viewportMatrix; + bucket.collisionCircleArray = instance.circles; + delete this.collisionCircleArrays[bucket.bucketInstanceId]; + } + } + symbolFadeChange(now) { + return this.fadeDuration === 0 ? 1 : (now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment; + } + zoomAdjustment(zoom) { + return Math.max(0, (this.transform.zoom - zoom) / 1.5); + } + hasTransitions(now) { + return this.stale || now - this.lastPlacementChangeTime < this.fadeDuration; + } + stillRecent(now, zoom) { + const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ? 1 - this.zoomAdjustment(zoom) : 1; + this.zoomAtLastRecencyCheck = zoom; + return this.commitTime + this.fadeDuration * durationAdjustment > now; + } + setStale() { + this.stale = true; + } +} +function updateCollisionVertices(collisionVertexArray, placed, notUsed, shiftX, shiftY) { + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); +} +const shift25 = Math.pow(2, 25); +const shift24 = Math.pow(2, 24); +const shift17 = Math.pow(2, 17); +const shift16 = Math.pow(2, 16); +const shift9 = Math.pow(2, 9); +const shift8 = Math.pow(2, 8); +const shift1 = Math.pow(2, 1); +function packOpacity(opacityState) { + if (opacityState.opacity === 0 && !opacityState.placed) { + return 0; + } else if (opacityState.opacity === 1 && opacityState.placed) { + return 4294967295; + } + const targetBit = opacityState.placed ? 1 : 0; + const opacityBits = Math.floor(opacityState.opacity * 127); + return opacityBits * shift25 + targetBit * shift24 + opacityBits * shift17 + targetBit * shift16 + opacityBits * shift9 + targetBit * shift8 + opacityBits * shift1 + targetBit; +} +const PACKED_HIDDEN_OPACITY = 0; + +class LayerPlacement { + constructor(styleLayer) { + this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' && styleLayer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + this._currentTileIndex = 0; + this._currentPartIndex = 0; + this._seenCrossTileIDs = {}; + this._bucketParts = []; + } + continuePlacement(tiles, placement, showCollisionBoxes, styleLayer, shouldPausePlacement) { + const bucketParts = this._bucketParts; + while (this._currentTileIndex < tiles.length) { + const tile = tiles[this._currentTileIndex]; + placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles); + this._currentTileIndex++; + if (shouldPausePlacement()) { + return true; + } + } + if (this._sortAcrossTiles) { + this._sortAcrossTiles = false; + bucketParts.sort((a, b) => a.sortKey - b.sortKey); + } + while (this._currentPartIndex < bucketParts.length) { + const bucketPart = bucketParts[this._currentPartIndex]; + placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes); + this._currentPartIndex++; + if (shouldPausePlacement()) { + return true; + } + } + return false; + } +} +class PauseablePlacement { + constructor(transform, order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, prevPlacement) { + this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement); + this._currentPlacementIndex = order.length - 1; + this._forceFullPlacement = forceFullPlacement; + this._showCollisionBoxes = showCollisionBoxes; + this._done = false; + } + isDone() { + return this._done; + } + continuePlacement(order, layers, layerTiles) { + const startTime = ref_properties.browser.now(); + const shouldPausePlacement = () => { + const elapsedTime = ref_properties.browser.now() - startTime; + return this._forceFullPlacement ? false : elapsedTime > 2; + }; + while (this._currentPlacementIndex >= 0) { + const layerId = order[this._currentPlacementIndex]; + const layer = layers[layerId]; + const placementZoom = this.placement.collisionIndex.transform.zoom; + if (layer.type === 'symbol' && (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { + if (!this._inProgressLayer) { + this._inProgressLayer = new LayerPlacement(layer); + } + const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); + if (pausePlacement) { + return; + } + delete this._inProgressLayer; + } + this._currentPlacementIndex--; + } + this._done = true; + } + commit(now) { + this.placement.commit(now); + return this.placement; + } +} + +const roundingFactor = 512 / ref_properties.EXTENT / 2; +class TileLayerIndex { + constructor(tileID, symbolInstances, bucketInstanceId) { + this.tileID = tileID; + this.indexedSymbolInstances = {}; + this.bucketInstanceId = bucketInstanceId; + for (let i = 0; i < symbolInstances.length; i++) { + const symbolInstance = symbolInstances.get(i); + const key = symbolInstance.key; + if (!this.indexedSymbolInstances[key]) { + this.indexedSymbolInstances[key] = []; + } + this.indexedSymbolInstances[key].push({ + crossTileID: symbolInstance.crossTileID, + coord: this.getScaledCoordinates(symbolInstance, tileID) + }); + } + } + getScaledCoordinates(symbolInstance, childTileID) { + const zDifference = childTileID.canonical.z - this.tileID.canonical.z; + const scale = roundingFactor / Math.pow(2, zDifference); + return { + x: Math.floor((childTileID.canonical.x * ref_properties.EXTENT + symbolInstance.anchorX) * scale), + y: Math.floor((childTileID.canonical.y * ref_properties.EXTENT + symbolInstance.anchorY) * scale) + }; + } + findMatches(symbolInstances, newTileID, zoomCrossTileIDs) { + const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); + for (let i = 0; i < symbolInstances.length; i++) { + const symbolInstance = symbolInstances.get(i); + if (symbolInstance.crossTileID) { + continue; + } + const indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; + if (!indexedInstances) { + continue; + } + const scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); + for (const thisTileSymbol of indexedInstances) { + if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance && Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance && !zoomCrossTileIDs[thisTileSymbol.crossTileID]) { + zoomCrossTileIDs[thisTileSymbol.crossTileID] = true; + symbolInstance.crossTileID = thisTileSymbol.crossTileID; + break; + } + } + } + } +} +class CrossTileIDs { + constructor() { + this.maxCrossTileID = 0; + } + generate() { + return ++this.maxCrossTileID; + } +} +class CrossTileSymbolLayerIndex { + constructor() { + this.indexes = {}; + this.usedCrossTileIDs = {}; + this.lng = 0; + } + handleWrapJump(lng) { + const wrapDelta = Math.round((lng - this.lng) / 360); + if (wrapDelta !== 0) { + for (const zoom in this.indexes) { + const zoomIndexes = this.indexes[zoom]; + const newZoomIndex = {}; + for (const key in zoomIndexes) { + const index = zoomIndexes[key]; + index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); + newZoomIndex[index.tileID.key] = index; + } + this.indexes[zoom] = newZoomIndex; + } + } + this.lng = lng; + } + addBucket(tileID, bucket, crossTileIDs) { + if (this.indexes[tileID.overscaledZ] && this.indexes[tileID.overscaledZ][tileID.key]) { + if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId === bucket.bucketInstanceId) { + return false; + } else { + this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]); + } + } + for (let i = 0; i < bucket.symbolInstances.length; i++) { + const symbolInstance = bucket.symbolInstances.get(i); + symbolInstance.crossTileID = 0; + } + if (!this.usedCrossTileIDs[tileID.overscaledZ]) { + this.usedCrossTileIDs[tileID.overscaledZ] = {}; + } + const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; + for (const zoom in this.indexes) { + const zoomIndexes = this.indexes[zoom]; + if (Number(zoom) > tileID.overscaledZ) { + for (const id in zoomIndexes) { + const childIndex = zoomIndexes[id]; + if (childIndex.tileID.isChildOf(tileID)) { + childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); + } + } + } else { + const parentCoord = tileID.scaledTo(Number(zoom)); + const parentIndex = zoomIndexes[parentCoord.key]; + if (parentIndex) { + parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); + } + } + } + for (let i = 0; i < bucket.symbolInstances.length; i++) { + const symbolInstance = bucket.symbolInstances.get(i); + if (!symbolInstance.crossTileID) { + symbolInstance.crossTileID = crossTileIDs.generate(); + zoomCrossTileIDs[symbolInstance.crossTileID] = true; + } + } + if (this.indexes[tileID.overscaledZ] === undefined) { + this.indexes[tileID.overscaledZ] = {}; + } + this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); + return true; + } + removeBucketCrossTileIDs(zoom, removedBucket) { + for (const key in removedBucket.indexedSymbolInstances) { + for (const symbolInstance of removedBucket.indexedSymbolInstances[key]) { + delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; + } + } + } + removeStaleBuckets(currentIDs) { + let tilesChanged = false; + for (const z in this.indexes) { + const zoomIndexes = this.indexes[z]; + for (const tileKey in zoomIndexes) { + if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { + this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); + delete zoomIndexes[tileKey]; + tilesChanged = true; + } + } + } + return tilesChanged; + } +} +class CrossTileSymbolIndex { + constructor() { + this.layerIndexes = {}; + this.crossTileIDs = new CrossTileIDs(); + this.maxBucketInstanceId = 0; + this.bucketsInCurrentPlacement = {}; + } + addLayer(styleLayer, tiles, lng) { + let layerIndex = this.layerIndexes[styleLayer.id]; + if (layerIndex === undefined) { + layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); + } + let symbolBucketsChanged = false; + const currentBucketIDs = {}; + layerIndex.handleWrapJump(lng); + for (const tile of tiles) { + const symbolBucket = tile.getBucket(styleLayer); + if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0]) + continue; + if (!symbolBucket.bucketInstanceId) { + symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; + } + if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { + symbolBucketsChanged = true; + } + currentBucketIDs[symbolBucket.bucketInstanceId] = true; + } + if (layerIndex.removeStaleBuckets(currentBucketIDs)) { + symbolBucketsChanged = true; + } + return symbolBucketsChanged; + } + pruneUnusedLayers(usedLayers) { + const usedLayerMap = {}; + usedLayers.forEach(usedLayer => { + usedLayerMap[usedLayer] = true; + }); + for (const layerId in this.layerIndexes) { + if (!usedLayerMap[layerId]) { + delete this.layerIndexes[layerId]; + } + } + } +} + +const emitValidationErrors = (evented, errors) => ref_properties.emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas')); +const supportedDiffOperations = ref_properties.pick(operations, [ + 'addLayer', + 'removeLayer', + 'setPaintProperty', + 'setLayoutProperty', + 'setFilter', + 'addSource', + 'removeSource', + 'setLayerZoomRange', + 'setLight', + 'setTransition', + 'setGeoJSONSourceData', + 'setTerrain' +]); +const ignoredDiffOperations = ref_properties.pick(operations, [ + 'setCenter', + 'setZoom', + 'setBearing', + 'setPitch' +]); +const empty = emptyStyle(); +const drapedLayers = { + 'fill': true, + 'line': true, + 'background': true, + 'hillshade': true, + 'raster': true +}; +class Style extends ref_properties.Evented { + constructor(map, options = {}) { + super(); + this.map = map; + this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); + this.imageManager = new ImageManager(); + this.imageManager.setEventedParent(this); + this.glyphManager = new ref_properties.GlyphManager(map._requestManager, options.localFontFamily ? ref_properties.LocalGlyphMode.all : options.localIdeographFontFamily ? ref_properties.LocalGlyphMode.ideographs : ref_properties.LocalGlyphMode.none, options.localFontFamily || options.localIdeographFontFamily); + this.lineAtlas = new LineAtlas(256, 512); + this.crossTileSymbolIndex = new CrossTileSymbolIndex(); + this._layers = {}; + this._num3DLayers = 0; + this._numSymbolLayers = 0; + this._numCircleLayers = 0; + this._serializedLayers = {}; + this._sourceCaches = {}; + this._otherSourceCaches = {}; + this._symbolSourceCaches = {}; + this.zoomHistory = new ref_properties.ZoomHistory(); + this._loaded = false; + this._availableImages = []; + this._order = []; + this._drapedFirstOrder = []; + this._resetUpdates(); + this.dispatcher.broadcast('setReferrer', ref_properties.getReferrer()); + const self = this; + this._rtlTextPluginCallback = Style.registerForPluginStateChange(event => { + const state = { + pluginStatus: event.pluginStatus, + pluginURL: event.pluginURL + }; + self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => { + ref_properties.triggerPluginCompletionEvent(err); + if (results) { + const allComplete = results.every(elem => elem); + if (allComplete) { + for (const id in self._sourceCaches) { + const sourceCache = self._sourceCaches[id]; + const sourceCacheType = sourceCache.getSource().type; + if (sourceCacheType === 'vector' || sourceCacheType === 'geojson') { + sourceCache.reload(); + } + } + } + } + }); + }); + this.on('data', event => { + if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { + return; + } + const source = this.getSource(event.sourceId); + if (!source || !source.vectorLayerIds) { + return; + } + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.source === source.id) { + this._validateLayer(layer); + } + } + }); + } + loadURL(url, options = {}) { + this.fire(new ref_properties.Event('dataloading', { dataType: 'style' })); + const validate = typeof options.validate === 'boolean' ? options.validate : !ref_properties.isMapboxURL(url); + url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); + const request = this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Style); + this._request = ref_properties.getJSON(request, (error, json) => { + this._request = null; + if (error) { + this.fire(new ref_properties.ErrorEvent(error)); + } else if (json) { + this._load(json, validate); + } + }); + } + loadJSON(json, options = {}) { + this.fire(new ref_properties.Event('dataloading', { dataType: 'style' })); + this._request = ref_properties.browser.frame(() => { + this._request = null; + this._load(json, options.validate !== false); + }); + } + loadEmpty() { + this.fire(new ref_properties.Event('dataloading', { dataType: 'style' })); + this._load(empty, false); + } + _updateLayerCount(layer, add) { + const count = add ? 1 : -1; + if (layer.is3D()) { + this._num3DLayers += count; + } + if (layer.type === 'circle') { + this._numCircleLayers += count; + } + if (layer.type === 'symbol') { + this._numSymbolLayers += count; + } + } + _load(json, validate) { + if (validate && emitValidationErrors(this, ref_properties.validateStyle(json))) { + return; + } + this._loaded = true; + this.stylesheet = json; + for (const id in json.sources) { + this.addSource(id, json.sources[id], { validate: false }); + } + this._changed = false; + if (json.sprite) { + this._loadSprite(json.sprite); + } else { + this.imageManager.setLoaded(true); + this.dispatcher.broadcast('spriteLoaded', true); + } + this.glyphManager.setURL(json.glyphs); + const layers = derefLayers(this.stylesheet.layers); + this._order = layers.map(layer => layer.id); + this._layers = {}; + this._serializedLayers = {}; + for (let layer of layers) { + layer = ref_properties.createStyleLayer(layer); + layer.setEventedParent(this, { layer: { id: layer.id } }); + this._layers[layer.id] = layer; + this._serializedLayers[layer.id] = layer.serialize(); + this._updateLayerCount(layer, true); + } + this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); + this.light = new Light(this.stylesheet.light); + if (this.stylesheet.terrain) { + this._createTerrain(this.stylesheet.terrain); + } + this._updateDrapeFirstLayers(); + this.fire(new ref_properties.Event('data', { dataType: 'style' })); + this.fire(new ref_properties.Event('style.load')); + } + _loadSprite(url) { + this._spriteRequest = loadSprite(url, this.map._requestManager, (err, images) => { + this._spriteRequest = null; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (images) { + for (const id in images) { + this.imageManager.addImage(id, images[id]); + } + } + this.imageManager.setLoaded(true); + this._availableImages = this.imageManager.listImages(); + this.dispatcher.broadcast('setImages', this._availableImages); + this.dispatcher.broadcast('spriteLoaded', true); + this.fire(new ref_properties.Event('data', { dataType: 'style' })); + }); + } + _validateLayer(layer) { + const source = this.getSource(layer.source); + if (!source) { + return; + } + const sourceLayer = layer.sourceLayer; + if (!sourceLayer) { + return; + } + if (source.type === 'geojson' || source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1) { + this.fire(new ref_properties.ErrorEvent(new Error(`Source layer "${ sourceLayer }" ` + `does not exist on source "${ source.id }" ` + `as specified by style layer "${ layer.id }"`))); + } + } + loaded() { + if (!this._loaded) + return false; + if (Object.keys(this._updatedSources).length) + return false; + for (const id in this._sourceCaches) + if (!this._sourceCaches[id].loaded()) + return false; + if (!this.imageManager.isLoaded()) + return false; + return true; + } + _serializeLayers(ids) { + const serializedLayers = []; + for (const id of ids) { + const layer = this._layers[id]; + if (layer.type !== 'custom') { + serializedLayers.push(layer.serialize()); + } + } + return serializedLayers; + } + hasTransitions() { + if (this.light && this.light.hasTransition()) { + return true; + } + for (const id in this._sourceCaches) { + if (this._sourceCaches[id].hasTransition()) { + return true; + } + } + for (const id in this._layers) { + if (this._layers[id].hasTransition()) { + return true; + } + } + return false; + } + get order() { + if (this.map._optimizeForTerrain && this.terrain) { + return this._drapedFirstOrder; + } + return this._order; + } + isLayerDraped(layer) { + if (!this.terrain) + return false; + return drapedLayers[layer.type]; + } + _checkLoaded() { + if (!this._loaded) { + throw new Error('Style is not done loading'); + } + } + update(parameters) { + if (!this._loaded) { + return; + } + const changed = this._changed; + if (this._changed) { + const updatedIds = Object.keys(this._updatedLayers); + const removedIds = Object.keys(this._removedLayers); + if (updatedIds.length || removedIds.length) { + this._updateWorkerLayers(updatedIds, removedIds); + } + for (const id in this._updatedSources) { + const action = this._updatedSources[id]; + if (action === 'reload') { + this._reloadSource(id); + } else if (action === 'clear') { + this._clearSource(id); + } + } + this._updateTilesForChangedImages(); + for (const id in this._updatedPaintProps) { + this._layers[id].updateTransitions(parameters); + } + this.light.updateTransitions(parameters); + this._resetUpdates(); + } + const sourcesUsedBefore = {}; + for (const sourceId in this._sourceCaches) { + const sourceCache = this._sourceCaches[sourceId]; + sourcesUsedBefore[sourceId] = sourceCache.used; + sourceCache.used = false; + } + for (const layerId of this._order) { + const layer = this._layers[layerId]; + layer.recalculate(parameters, this._availableImages); + if (!layer.isHidden(parameters.zoom)) { + const sourceCache = this._getLayerSourceCache(layer); + if (sourceCache) + sourceCache.used = true; + } + const painter = this.map.painter; + if (painter) { + const programIds = layer.getProgramIds(); + if (!programIds) + continue; + const programConfiguration = layer.getProgramConfiguration(parameters.zoom); + for (const programId of programIds) { + painter.useProgram(programId, programConfiguration); + } + } + } + for (const sourceId in sourcesUsedBefore) { + const sourceCache = this._sourceCaches[sourceId]; + if (sourcesUsedBefore[sourceId] !== sourceCache.used) { + sourceCache.getSource().fire(new ref_properties.Event('data', { + sourceDataType: 'visibility', + dataType: 'source', + sourceId: sourceCache.getSource().id + })); + } + } + this.light.recalculate(parameters); + if (this.terrain) { + this.terrain.recalculate(parameters); + } + this.z = parameters.zoom; + if (changed) { + this.fire(new ref_properties.Event('data', { dataType: 'style' })); + } + } + _updateTilesForChangedImages() { + const changedImages = Object.keys(this._changedImages); + if (changedImages.length) { + for (const name in this._sourceCaches) { + this._sourceCaches[name].reloadTilesForDependencies([ + 'icons', + 'patterns' + ], changedImages); + } + this._changedImages = {}; + } + } + _updateWorkerLayers(updatedIds, removedIds) { + this.dispatcher.broadcast('updateLayers', { + layers: this._serializeLayers(updatedIds), + removedIds + }); + } + _resetUpdates() { + this._changed = false; + this._updatedLayers = {}; + this._removedLayers = {}; + this._updatedSources = {}; + this._updatedPaintProps = {}; + this._changedImages = {}; + } + setState(nextState) { + this._checkLoaded(); + if (emitValidationErrors(this, ref_properties.validateStyle(nextState))) + return false; + nextState = ref_properties.clone$1(nextState); + nextState.layers = derefLayers(nextState.layers); + const changes = diffStyles(this.serialize(), nextState).filter(op => !(op.command in ignoredDiffOperations)); + if (changes.length === 0) { + return false; + } + const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations)); + if (unimplementedOps.length > 0) { + throw new Error(`Unimplemented: ${ unimplementedOps.map(op => op.command).join(', ') }.`); + } + changes.forEach(op => { + if (op.command === 'setTransition') { + return; + } + this[op.command].apply(this, op.args); + }); + this.stylesheet = nextState; + return true; + } + addImage(id, image) { + if (this.getImage(id)) { + return this.fire(new ref_properties.ErrorEvent(new Error('An image with this name already exists.'))); + } + this.imageManager.addImage(id, image); + this._afterImageUpdated(id); + } + updateImage(id, image) { + this.imageManager.updateImage(id, image); + } + getImage(id) { + return this.imageManager.getImage(id); + } + removeImage(id) { + if (!this.getImage(id)) { + return this.fire(new ref_properties.ErrorEvent(new Error('No image with this name exists.'))); + } + this.imageManager.removeImage(id); + this._afterImageUpdated(id); + } + _afterImageUpdated(id) { + this._availableImages = this.imageManager.listImages(); + this._changedImages[id] = true; + this._changed = true; + this.dispatcher.broadcast('setImages', this._availableImages); + this.fire(new ref_properties.Event('data', { dataType: 'style' })); + } + listImages() { + this._checkLoaded(); + return this.imageManager.listImages(); + } + addSource(id, source, options = {}) { + this._checkLoaded(); + if (this.getSource(id) !== undefined) { + throw new Error('There is already a source with this ID'); + } + if (!source.type) { + throw new Error(`The type property must be defined, but only the following properties were given: ${ Object.keys(source).join(', ') }.`); + } + const builtIns = [ + 'vector', + 'raster', + 'geojson', + 'video', + 'image' + ]; + const shouldValidate = builtIns.indexOf(source.type) >= 0; + if (shouldValidate && this._validate(ref_properties.validateStyle.source, `sources.${ id }`, source, null, options)) + return; + if (this.map && this.map._collectResourceTiming) + source.collectResourceTiming = true; + const sourceInstance = create(id, source, this.dispatcher, this); + sourceInstance.setEventedParent(this, () => ({ + isSourceLoaded: this.loaded(), + source: sourceInstance.serialize(), + sourceId: id + })); + const addSourceCache = onlySymbols => { + const sourceCacheId = (onlySymbols ? 'symbol:' : 'other:') + id; + const sourceCache = this._sourceCaches[sourceCacheId] = new ref_properties.SourceCache(sourceCacheId, sourceInstance, onlySymbols); + (onlySymbols ? this._symbolSourceCaches : this._otherSourceCaches)[id] = sourceCache; + sourceCache.style = this; + sourceCache.onAdd(this.map); + }; + addSourceCache(false); + if (source.type === 'vector' || source.type === 'geojson') { + addSourceCache(true); + } + if (sourceInstance.onAdd) + sourceInstance.onAdd(this.map); + this._changed = true; + } + removeSource(id) { + this._checkLoaded(); + const source = this.getSource(id); + if (source === undefined) { + throw new Error('There is no source with this ID'); + } + for (const layerId in this._layers) { + if (this._layers[layerId].source === id) { + return this.fire(new ref_properties.ErrorEvent(new Error(`Source "${ id }" cannot be removed while layer "${ layerId }" is using it.`))); + } + } + if (this.terrain && this.terrain.get().source === id) { + return this.fire(new ref_properties.ErrorEvent(new Error(`Source "${ id }" cannot be removed while terrain is using it.`))); + } + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + delete this._sourceCaches[sourceCache.id]; + delete this._updatedSources[sourceCache.id]; + sourceCache.fire(new ref_properties.Event('data', { + sourceDataType: 'metadata', + dataType: 'source', + sourceId: sourceCache.getSource().id + })); + sourceCache.setEventedParent(null); + sourceCache.clearTiles(); + } + delete this._otherSourceCaches[id]; + delete this._symbolSourceCaches[id]; + source.setEventedParent(null); + if (source.onRemove) { + source.onRemove(this.map); + } + this._changed = true; + } + setGeoJSONSourceData(id, data) { + this._checkLoaded(); + const geojsonSource = this.getSource(id); + geojsonSource.setData(data); + this._changed = true; + } + getSource(id) { + const sourceCache = this._getSourceCache(id); + return sourceCache && sourceCache.getSource(); + } + addLayer(layerObject, before, options = {}) { + this._checkLoaded(); + const id = layerObject.id; + if (this.getLayer(id)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${ id }" already exists on this map`))); + return; + } + let layer; + if (layerObject.type === 'custom') { + if (emitValidationErrors(this, ref_properties.validateCustomStyleLayer(layerObject))) + return; + layer = ref_properties.createStyleLayer(layerObject); + } else { + if (typeof layerObject.source === 'object') { + this.addSource(id, layerObject.source); + layerObject = ref_properties.clone$1(layerObject); + layerObject = ref_properties.extend(layerObject, { source: id }); + } + if (this._validate(ref_properties.validateStyle.layer, `layers.${ id }`, layerObject, { arrayIndex: -1 }, options)) + return; + layer = ref_properties.createStyleLayer(layerObject); + this._validateLayer(layer); + layer.setEventedParent(this, { layer: { id } }); + this._serializedLayers[layer.id] = layer.serialize(); + this._updateLayerCount(layer, true); + } + const index = before ? this._order.indexOf(before) : this._order.length; + if (before && index === -1) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${ before }" does not exist on this map.`))); + return; + } + this._order.splice(index, 0, id); + this._layerOrderChanged = true; + this._layers[id] = layer; + const sourceCache = this._getLayerSourceCache(layer); + if (this._removedLayers[id] && layer.source && sourceCache && layer.type !== 'custom') { + const removed = this._removedLayers[id]; + delete this._removedLayers[id]; + if (removed.type !== layer.type) { + this._updatedSources[layer.source] = 'clear'; + } else { + this._updatedSources[layer.source] = 'reload'; + sourceCache.pause(); + } + } + this._updateLayer(layer); + if (layer.onAdd) { + layer.onAdd(this.map); + } + this._updateDrapeFirstLayers(); + } + moveLayer(id, before) { + this._checkLoaded(); + this._changed = true; + const layer = this._layers[id]; + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ id }' does not exist in the map's style and cannot be moved.`))); + return; + } + if (id === before) { + return; + } + const index = this._order.indexOf(id); + this._order.splice(index, 1); + const newIndex = before ? this._order.indexOf(before) : this._order.length; + if (before && newIndex === -1) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${ before }" does not exist on this map.`))); + return; + } + this._order.splice(newIndex, 0, id); + this._layerOrderChanged = true; + this._updateDrapeFirstLayers(); + } + removeLayer(id) { + this._checkLoaded(); + const layer = this._layers[id]; + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ id }' does not exist in the map's style and cannot be removed.`))); + return; + } + layer.setEventedParent(null); + this._updateLayerCount(layer, false); + const index = this._order.indexOf(id); + this._order.splice(index, 1); + this._layerOrderChanged = true; + this._changed = true; + this._removedLayers[id] = layer; + delete this._layers[id]; + delete this._serializedLayers[id]; + delete this._updatedLayers[id]; + delete this._updatedPaintProps[id]; + if (layer.onRemove) { + layer.onRemove(this.map); + } + this._updateDrapeFirstLayers(); + } + getLayer(id) { + return this._layers[id]; + } + hasLayer(id) { + return id in this._layers; + } + hasLayerType(type) { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.type === type) { + return true; + } + } + return false; + } + setLayerZoomRange(layerId, minzoom, maxzoom) { + this._checkLoaded(); + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style and cannot have zoom extent.`))); + return; + } + if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) + return; + if (minzoom != null) { + layer.minzoom = minzoom; + } + if (maxzoom != null) { + layer.maxzoom = maxzoom; + } + this._updateLayer(layer); + } + setFilter(layerId, filter, options = {}) { + this._checkLoaded(); + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style and cannot be filtered.`))); + return; + } + if (ref_properties.deepEqual(layer.filter, filter)) { + return; + } + if (filter === null || filter === undefined) { + layer.filter = undefined; + this._updateLayer(layer); + return; + } + if (this._validate(ref_properties.validateStyle.filter, `layers.${ layer.id }.filter`, filter, null, options)) { + return; + } + layer.filter = ref_properties.clone$1(filter); + this._updateLayer(layer); + } + getFilter(layer) { + return ref_properties.clone$1(this.getLayer(layer).filter); + } + setLayoutProperty(layerId, name, value, options = {}) { + this._checkLoaded(); + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style and cannot be styled.`))); + return; + } + if (ref_properties.deepEqual(layer.getLayoutProperty(name), value)) + return; + layer.setLayoutProperty(name, value, options); + this._updateLayer(layer); + } + getLayoutProperty(layerId, name) { + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style.`))); + return; + } + return layer.getLayoutProperty(name); + } + setPaintProperty(layerId, name, value, options = {}) { + this._checkLoaded(); + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style and cannot be styled.`))); + return; + } + if (ref_properties.deepEqual(layer.getPaintProperty(name), value)) + return; + const requiresRelayout = layer.setPaintProperty(name, value, options); + if (requiresRelayout) { + this._updateLayer(layer); + } + this._changed = true; + this._updatedPaintProps[layerId] = true; + } + getPaintProperty(layer, name) { + return this.getLayer(layer).getPaintProperty(name); + } + setFeatureState(target, state) { + this._checkLoaded(); + const sourceId = target.source; + const sourceLayer = target.sourceLayer; + const source = this.getSource(sourceId); + if (source === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${ sourceId }' does not exist in the map's style.`))); + return; + } + const sourceType = source.type; + if (sourceType === 'geojson' && sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`GeoJSON sources cannot have a sourceLayer parameter.`))); + return; + } + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; + } + if (target.id === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The feature id parameter must be provided.`))); + } + const sourceCaches = this._getSourceCaches(sourceId); + for (const sourceCache of sourceCaches) { + sourceCache.setFeatureState(sourceLayer, target.id, state); + } + } + removeFeatureState(target, key) { + this._checkLoaded(); + const sourceId = target.source; + const source = this.getSource(sourceId); + if (source === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${ sourceId }' does not exist in the map's style.`))); + return; + } + const sourceType = source.type; + const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; + } + if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { + this.fire(new ref_properties.ErrorEvent(new Error(`A feature id is required to remove its specific state property.`))); + return; + } + const sourceCaches = this._getSourceCaches(sourceId); + for (const sourceCache of sourceCaches) { + sourceCache.removeFeatureState(sourceLayer, target.id, key); + } + } + getFeatureState(target) { + this._checkLoaded(); + const sourceId = target.source; + const sourceLayer = target.sourceLayer; + const source = this.getSource(sourceId); + if (source === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${ sourceId }' does not exist in the map's style.`))); + return; + } + const sourceType = source.type; + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; + } + if (target.id === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The feature id parameter must be provided.`))); + } + const sourceCaches = this._getSourceCaches(sourceId); + return sourceCaches[0].getFeatureState(sourceLayer, target.id); + } + getTransition() { + return ref_properties.extend({ + duration: 300, + delay: 0 + }, this.stylesheet && this.stylesheet.transition); + } + serialize() { + const sources = {}; + for (const cacheId in this._sourceCaches) { + const source = this._sourceCaches[cacheId].getSource(); + if (!sources[source.id]) { + sources[source.id] = source.serialize(); + } + } + return ref_properties.filterObject({ + version: this.stylesheet.version, + name: this.stylesheet.name, + metadata: this.stylesheet.metadata, + light: this.stylesheet.light, + terrain: this.stylesheet.terrain, + center: this.stylesheet.center, + zoom: this.stylesheet.zoom, + bearing: this.stylesheet.bearing, + pitch: this.stylesheet.pitch, + sprite: this.stylesheet.sprite, + glyphs: this.stylesheet.glyphs, + transition: this.stylesheet.transition, + sources, + layers: this._serializeLayers(this._order) + }, value => { + return value !== undefined; + }); + } + _updateLayer(layer) { + this._updatedLayers[layer.id] = true; + const sourceCache = this._getLayerSourceCache(layer); + if (layer.source && !this._updatedSources[layer.source] && sourceCache && sourceCache.getSource().type !== 'raster') { + this._updatedSources[layer.source] = 'reload'; + sourceCache.pause(); + } + this._changed = true; + } + _flattenAndSortRenderedFeatures(sourceResults) { + const isLayer3D = layerId => this._layers[layerId].type === 'fill-extrusion'; + const layerIndex = {}; + const features3D = []; + for (let l = this._order.length - 1; l >= 0; l--) { + const layerId = this._order[l]; + if (isLayer3D(layerId)) { + layerIndex[layerId] = l; + for (const sourceResult of sourceResults) { + const layerFeatures = sourceResult[layerId]; + if (layerFeatures) { + for (const featureWrapper of layerFeatures) { + features3D.push(featureWrapper); + } + } + } + } + } + features3D.sort((a, b) => { + return b.intersectionZ - a.intersectionZ; + }); + const features = []; + for (let l = this._order.length - 1; l >= 0; l--) { + const layerId = this._order[l]; + if (isLayer3D(layerId)) { + for (let i = features3D.length - 1; i >= 0; i--) { + const topmost3D = features3D[i].feature; + if (layerIndex[topmost3D.layer.id] < l) + break; + features.push(topmost3D); + features3D.pop(); + } + } else { + for (const sourceResult of sourceResults) { + const layerFeatures = sourceResult[layerId]; + if (layerFeatures) { + for (const featureWrapper of layerFeatures) { + features.push(featureWrapper.feature); + } + } + } + } + } + return features; + } + queryRenderedFeatures(queryGeometry, params, transform) { + if (params && params.filter) { + this._validate(ref_properties.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params); + } + const includedSources = {}; + if (params && params.layers) { + if (!Array.isArray(params.layers)) { + this.fire(new ref_properties.ErrorEvent(new Error('parameters.layers must be an Array.'))); + return []; + } + for (const layerId of params.layers) { + const layer = this._layers[layerId]; + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${ layerId }' does not exist in the map's style and cannot be queried for features.`))); + return []; + } + includedSources[layer.source] = true; + } + } + const sourceResults = []; + params.availableImages = this._availableImages; + const has3DLayer = params && params.layers ? params.layers.some(layerId => { + const layer = this.getLayer(layerId); + return layer && layer.is3D(); + }) : this.has3DLayers(); + const queryGeometryStruct = QueryGeometry.createFromScreenPoints(queryGeometry, transform); + for (const id in this._sourceCaches) { + const sourceId = this._sourceCaches[id].getSource().id; + if (params.layers && !includedSources[sourceId]) + continue; + sourceResults.push(queryRenderedFeatures(this._sourceCaches[id], this._layers, this._serializedLayers, queryGeometryStruct, params, transform, has3DLayer, !!this.map._showQueryGeometry)); + } + if (this.placement) { + sourceResults.push(queryRenderedSymbols(this._layers, this._serializedLayers, this._getLayerSourceCache.bind(this), queryGeometryStruct.screenGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData)); + } + return this._flattenAndSortRenderedFeatures(sourceResults); + } + querySourceFeatures(sourceID, params) { + if (params && params.filter) { + this._validate(ref_properties.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params); + } + const sourceCaches = this._getSourceCaches(sourceID); + let results = []; + for (const sourceCache of sourceCaches) { + results = results.concat(querySourceFeatures(sourceCache, params)); + } + return results; + } + addSourceType(name, SourceType, callback) { + if (Style.getSourceType(name)) { + return callback(new Error(`A source type called "${ name }" already exists.`)); + } + Style.setSourceType(name, SourceType); + if (!SourceType.workerSourceURL) { + return callback(null, null); + } + this.dispatcher.broadcast('loadWorkerSource', { + name, + url: SourceType.workerSourceURL + }, callback); + } + getLight() { + return this.light.getLight(); + } + setLight(lightOptions, options = {}) { + this._checkLoaded(); + const light = this.light.getLight(); + let _update = false; + for (const key in lightOptions) { + if (!ref_properties.deepEqual(lightOptions[key], light[key])) { + _update = true; + break; + } + } + if (!_update) + return; + const parameters = { + now: ref_properties.browser.now(), + transition: ref_properties.extend({ + duration: 300, + delay: 0 + }, this.stylesheet.transition) + }; + this.light.setLight(lightOptions, options); + this.light.updateTransitions(parameters); + } + setTerrain(terrainOptions) { + this._checkLoaded(); + if (!terrainOptions) { + delete this.terrain; + delete this.stylesheet.terrain; + this.dispatcher.broadcast('enableTerrain', false); + this._force3DLayerUpdate(); + return; + } + if (typeof terrainOptions.source === 'object') { + const id = 'terrain-dem-src'; + this.addSource(id, terrainOptions.source); + terrainOptions = ref_properties.clone$1(terrainOptions); + terrainOptions = ref_properties.extend(terrainOptions, { source: id }); + } + if (this._validate(ref_properties.validateStyle.terrain, 'terrain', terrainOptions)) + return; + if (!this.terrain) { + this._createTerrain(terrainOptions); + } else { + const terrain = this.terrain; + const currSpec = terrain.get(); + for (const key in terrainOptions) { + if (!ref_properties.deepEqual(terrainOptions[key], currSpec[key])) { + terrain.set(terrainOptions); + this.stylesheet.terrain = terrainOptions; + const parameters = { + now: ref_properties.browser.now(), + transition: ref_properties.extend({ duration: 0 }, this.stylesheet.transition) + }; + terrain.updateTransitions(parameters); + break; + } + } + } + this._updateDrapeFirstLayers(); + } + _updateDrapeFirstLayers() { + if (!this.map._optimizeForTerrain || !this.terrain) { + return; + } + const draped = this._order.filter(id => { + return this.isLayerDraped(this._layers[id]); + }); + const nonDraped = this._order.filter(id => { + return !this.isLayerDraped(this._layers[id]); + }); + this._drapedFirstOrder = []; + this._drapedFirstOrder.push(...draped); + this._drapedFirstOrder.push(...nonDraped); + } + _createTerrain(terrainOptions) { + const terrain = this.terrain = new Terrain(terrainOptions); + this.stylesheet.terrain = terrainOptions; + this.dispatcher.broadcast('enableTerrain', true); + this._force3DLayerUpdate(); + const parameters = { + now: ref_properties.browser.now(), + transition: ref_properties.extend({ duration: 0 }, this.stylesheet.transition) + }; + terrain.updateTransitions(parameters); + } + _force3DLayerUpdate() { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.type === 'fill-extrusion') { + this._updateLayer(layer); + } + } + } + _validate(validate, key, value, props, options = {}) { + if (options && options.validate === false) { + return false; + } + return emitValidationErrors(this, validate.call(ref_properties.validateStyle, ref_properties.extend({ + key, + style: this.serialize(), + value, + styleSpec: ref_properties.styleSpec + }, props))); + } + _remove() { + if (this._request) { + this._request.cancel(); + this._request = null; + } + if (this._spriteRequest) { + this._spriteRequest.cancel(); + this._spriteRequest = null; + } + ref_properties.evented.off('pluginStateChange', this._rtlTextPluginCallback); + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + layer.setEventedParent(null); + } + for (const id in this._sourceCaches) { + this._sourceCaches[id].clearTiles(); + this._sourceCaches[id].setEventedParent(null); + } + this.imageManager.setEventedParent(null); + this.setEventedParent(null); + this.dispatcher.remove(); + } + _clearSource(id) { + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + sourceCache.clearTiles(); + } + } + _reloadSource(id) { + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + sourceCache.resume(); + sourceCache.reload(); + } + } + _updateSources(transform) { + for (const id in this._sourceCaches) { + this._sourceCaches[id].update(transform); + } + } + _generateCollisionBoxes() { + for (const id in this._sourceCaches) { + const sourceCache = this._sourceCaches[id]; + sourceCache.resume(); + sourceCache.reload(); + } + } + _updatePlacement(transform, showCollisionBoxes, fadeDuration, crossSourceCollisions, forceFullPlacement = false) { + let symbolBucketsChanged = false; + let placementCommitted = false; + const layerTiles = {}; + for (const layerID of this._order) { + const styleLayer = this._layers[layerID]; + if (styleLayer.type !== 'symbol') + continue; + if (!layerTiles[styleLayer.source]) { + const sourceCache = this._getLayerSourceCache(styleLayer); + if (!sourceCache) + continue; + layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true).map(id => sourceCache.getTileByID(id)).sort((a, b) => b.tileID.overscaledZ - a.tileID.overscaledZ || (a.tileID.isLessThan(b.tileID) ? -1 : 1)); + } + const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng); + symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; + } + this.crossTileSymbolIndex.pruneUnusedLayers(this._order); + forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0; + if (this._layerOrderChanged) { + this.fire(new ref_properties.Event('neworder')); + } + if (forceFullPlacement || !this.pauseablePlacement || this.pauseablePlacement.isDone() && !this.placement.stillRecent(ref_properties.browser.now(), transform.zoom)) { + this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement); + this._layerOrderChanged = false; + } + if (this.pauseablePlacement.isDone()) { + this.placement.setStale(); + } else { + this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles); + if (this.pauseablePlacement.isDone()) { + this.placement = this.pauseablePlacement.commit(ref_properties.browser.now()); + placementCommitted = true; + } + if (symbolBucketsChanged) { + this.pauseablePlacement.placement.setStale(); + } + } + if (placementCommitted || symbolBucketsChanged) { + for (const layerID of this._order) { + const styleLayer = this._layers[layerID]; + if (styleLayer.type !== 'symbol') + continue; + this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]); + } + } + const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(ref_properties.browser.now()); + return needsRerender; + } + _releaseSymbolFadeTiles() { + for (const id in this._sourceCaches) { + this._sourceCaches[id].releaseSymbolFadeTiles(); + } + } + getImages(mapId, params, callback) { + this.imageManager.getImages(params.icons, callback); + this._updateTilesForChangedImages(); + const setDependencies = sourceCache => { + if (sourceCache) { + sourceCache.setDependencies(params.tileID.key, params.type, params.icons); + } + }; + setDependencies(this._otherSourceCaches[params.source]); + setDependencies(this._symbolSourceCaches[params.source]); + } + getGlyphs(mapId, params, callback) { + this.glyphManager.getGlyphs(params.stacks, callback); + } + getResource(mapId, params, callback) { + return ref_properties.makeRequest(params, callback); + } + _getSourceCache(source) { + return this._otherSourceCaches[source]; + } + _getLayerSourceCache(layer) { + return layer.type === 'symbol' ? this._symbolSourceCaches[layer.source] : this._otherSourceCaches[layer.source]; + } + _getSourceCaches(source) { + const sourceCaches = []; + if (this._otherSourceCaches[source]) { + sourceCaches.push(this._otherSourceCaches[source]); + } + if (this._symbolSourceCaches[source]) { + sourceCaches.push(this._symbolSourceCaches[source]); + } + return sourceCaches; + } + has3DLayers() { + return this._num3DLayers > 0; + } + hasSymbolLayers() { + return this._numSymbolLayers > 0; + } + hasCircleLayers() { + return this._numCircleLayers > 0; + } +} +Style.getSourceType = getType; +Style.setSourceType = setType; +Style.registerForPluginStateChange = ref_properties.registerForPluginStateChange; + +var preludeFrag = "#ifdef GL_ES\nprecision mediump float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nconst float PI=3.141592653589793;"; + +var preludeVert = "#ifdef GL_ES\nprecision highp float;\n#else\n#if !defined(lowp)\n#define lowp\n#endif\n#if !defined(mediump)\n#define mediump\n#endif\n#if !defined(highp)\n#define highp\n#endif\n#endif\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(\nunpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}const float PI=3.141592653589793;const vec4 AWAY=vec4(-1000.0,-1000.0,-1000.0,1);//Normalized device coordinate that is not rendered."; + +var backgroundFrag = "uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var backgroundVert = "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"; + +var backgroundPatternFrag = "uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var backgroundPatternVert = "uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}"; + +var circleFrag = "varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(\nantialiased_blur,0.0,extrude_length-radius/(radius+stroke_width)\n);gl_FragColor=v_visibility*opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var circleVert = "#define NUM_VISIBILITY_RINGS 2\n#define INV_SQRT2 0.70710678\n#define ELEVATION_BIAS 0.0001\n#define NUM_SAMPLES_PER_RING 16\nuniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;varying float v_visibility;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\nvec2 calc_offset(vec2 extrusion,float radius,float stroke_width, float view_scale) {return extrusion*(radius+stroke_width)*u_extrude_scale*view_scale;}float cantilevered_elevation(vec2 pos,float radius,float stroke_width,float view_scale) {vec2 c1=pos+calc_offset(vec2(-1,-1),radius,stroke_width,view_scale);vec2 c2=pos+calc_offset(vec2(1,-1),radius,stroke_width,view_scale);vec2 c3=pos+calc_offset(vec2(1,1),radius,stroke_width,view_scale);vec2 c4=pos+calc_offset(vec2(-1,1),radius,stroke_width,view_scale);float h1=elevation(c1)+ELEVATION_BIAS;float h2=elevation(c2)+ELEVATION_BIAS;float h3=elevation(c3)+ELEVATION_BIAS;float h4=elevation(c4)+ELEVATION_BIAS;return max(h4,max(h3,max(h1,h2)));}float circle_elevation(vec2 pos) {\n#if defined(TERRAIN)\nreturn elevation(pos)+ELEVATION_BIAS;\n#else\nreturn 0.0;\n#endif\n}vec4 project_vertex(vec2 extrusion,vec4 world_center,vec4 projected_center,float radius,float stroke_width, float view_scale) {vec2 sample_offset=calc_offset(extrusion,radius,stroke_width,view_scale);\n#ifdef PITCH_WITH_MAP\nreturn u_matrix*( world_center+vec4(sample_offset,0,0) );\n#else\nreturn projected_center+vec4(sample_offset,0,0);\n#endif\n}float get_sample_step() {\n#ifdef PITCH_WITH_MAP\nreturn 2.0*PI/float(NUM_SAMPLES_PER_RING);\n#else\nreturn PI/float(NUM_SAMPLES_PER_RING);\n#endif\n}void main(void) {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize mediump float radius\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize highp vec4 stroke_color\n#pragma mapbox: initialize mediump float stroke_width\n#pragma mapbox: initialize lowp float stroke_opacity\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);float height=circle_elevation(circle_center);vec4 world_center=vec4(circle_center,height,1);vec4 projected_center=u_matrix*world_center;float view_scale=0.0;\n#ifdef PITCH_WITH_MAP\n#ifdef SCALE_WITH_MAP\nview_scale=1.0;\n#else\nview_scale=projected_center.w/u_camera_to_center_distance;\n#endif\n#else\n#ifdef SCALE_WITH_MAP\nview_scale=u_camera_to_center_distance;\n#else\nview_scale=projected_center.w;\n#endif\n#endif\ngl_Position=project_vertex(extrude,world_center,projected_center,radius,stroke_width,view_scale);float visibility=0.0;\n#ifdef TERRAIN\nfloat step=get_sample_step();\n#ifdef PITCH_WITH_MAP\nfloat cantilevered_height=cantilevered_elevation(circle_center,radius,stroke_width,view_scale);vec4 occlusion_world_center=vec4(circle_center,cantilevered_height,1);vec4 occlusion_projected_center=u_matrix*occlusion_world_center;\n#else\nvec4 occlusion_world_center=world_center;vec4 occlusion_projected_center=projected_center;\n#endif\nfor(int ring=0; ring < NUM_VISIBILITY_RINGS; ring++) {float scale=(float(ring)+1.0)/float(NUM_VISIBILITY_RINGS);for(int i=0; i < NUM_SAMPLES_PER_RING; i++) {vec2 extrusion=vec2(cos(step*float(i)),-sin(step*float(i)))*scale;vec4 frag_pos=project_vertex(extrusion,occlusion_world_center,occlusion_projected_center,radius,stroke_width,view_scale);visibility+=float(!isOccluded(frag_pos));}}visibility/=float(NUM_VISIBILITY_RINGS)*float(NUM_SAMPLES_PER_RING);\n#else\nvisibility=1.0;\n#endif\nv_visibility=visibility;lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}"; + +var clippingMaskFrag = "void main() {gl_FragColor=vec4(1.0);}"; + +var clippingMaskVert = "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"; + +var heatmapFrag = "uniform highp float u_intensity;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#define GAUSS_COEF 0.3989422804014327\nvoid main() {\n#pragma mapbox: initialize highp float weight\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var heatmapVert = "uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\nconst highp float ZERO=1.0/255.0/16.0;\n#define GAUSS_COEF 0.3989422804014327\nvoid main(void) {\n#pragma mapbox: initialize highp float weight\n#pragma mapbox: initialize mediump float radius\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,elevation(floor(a_pos*0.5)),1);gl_Position=u_matrix*pos;}"; + +var heatmapTextureFrag = "uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(0.0);\n#endif\n}"; + +var heatmapTextureVert = "uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}"; + +var collisionBoxFrag = "varying float v_placed;varying float v_notUsed;void main() {vec4 red =vec4(1.0,0.0,0.0,1.0);vec4 blue=vec4(0.0,0.0,1.0,0.5);gl_FragColor =mix(red,blue,step(0.5,v_placed))*0.5;gl_FragColor*=mix(1.0,0.1,step(0.5,v_notUsed));}"; + +var collisionBoxVert = "attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;attribute float a_size_scale;attribute vec2 a_padding;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,elevation(a_anchor_pos),1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,1.5);gl_Position=u_matrix*vec4(a_pos,elevation(a_pos),1.0);gl_Position.xy+=(a_extrude*a_size_scale+a_shift+a_padding)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"; + +var collisionCircleFrag = "varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}"; + +var collisionCircleVert = "attribute vec2 a_pos_2f;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos_2f;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(\nmix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(\n0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"; + +var debugFrag = "uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}"; + +var debugVert = "attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {float h=elevation(a_pos);v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,h,1);}"; + +var fillFrag = "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillVert = "attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}"; + +var fillOutlineFrag = "varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillOutlineVert = "attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"; + +var fillOutlinePatternFrag = "uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillOutlinePatternVert = "uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"; + +var fillPatternFrag = "uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillPatternVert = "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"; + +var fillExtrusionFrag = "varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillExtrusionVert = "uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 pos_nx=floor(a_pos_normal_ed.xyz*0.5);mediump vec3 top_up_ny=a_pos_normal_ed.xyz-2.0*pos_nx;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));base=max(0.0,base);height=max(0.0,height);float t=top_up_ny.x;\n#ifdef TERRAIN\nvec2 centroid_pos=a_centroid_pos;bool flat_roof=centroid_pos.x !=0.0;float ele=elevation(pos_nx.xy);float hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);float c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;float h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);gl_Position=mix(u_matrix*vec4(pos_nx.xy,h,1),AWAY,hidden);\n#else\ngl_Position=u_matrix*vec4(pos_nx.xy,t > 0.0 ? height : base,1);\n#endif\nfloat colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=(\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"; + +var fillExtrusionPatternFrag = "uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var fillExtrusionPatternVert = "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec4 a_pos_normal_ed;attribute vec2 a_centroid_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 pos_nx=floor(a_pos_normal_ed.xyz*0.5);mediump vec3 top_up_ny=a_pos_normal_ed.xyz-2.0*pos_nx;float x_normal=pos_nx.z/8192.0;vec3 normal=top_up_ny.y==1.0 ? vec3(0.0,0.0,1.0) : normalize(vec3(x_normal,(2.0*top_up_ny.z-1.0)*(1.0-abs(x_normal)),0.0));float edgedistance=a_pos_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=top_up_ny.x;float z=t > 0.0 ? height : base;\n#ifdef TERRAIN\nvec2 centroid_pos=a_centroid_pos;bool flat_roof=centroid_pos.x !=0.0;float ele=elevation(pos_nx.xy);float hidden=float(centroid_pos.x==0.0 && centroid_pos.y==1.0);float c_ele=flat_roof ? centroid_pos.y==0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;float h=flat_roof ? max(c_ele+height,ele+base+2.0) : ele+(t > 0.0 ? height : base==0.0 ?-5.0 : base);gl_Position=mix(u_matrix*vec4(pos_nx.xy,h,1),AWAY,hidden);\n#else\ngl_Position=u_matrix*vec4(pos_nx.xy,z,1);\n#endif\nvec2 pos=normal.z==1.0\n? pos_nx.xy\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=(\n(1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"; + +var hillshadePrepareFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2(\n(c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c)\n)/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(\nderiv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var hillshadePrepareVert = "uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"; + +var hillshadeFrag = "uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;void main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var hillshadeVert = "uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"; + +var lineFrag = "uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var lineVert = "\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_width2=vec2(outset,inset);}"; + +var lineGradientFrag = "uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var lineGradientVert = "\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_width2=vec2(outset,inset);}"; + +var linePatternFrag = "uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var linePatternVert = "\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_linesofar;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"; + +var lineSDFFrag = "uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var lineSDFVert = "\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_linesofar;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;\n#ifndef RENDER_TO_TEXTURE\nfloat extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;\n#else\nv_gamma_scale=1.0;\n#endif\nv_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"; + +var rasterFrag = "uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(\ndot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var rasterVert = "uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"; + +var symbolIconFrag = "uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var symbolIconVert = "attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));}"; + +var symbolSDFFrag = "#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var symbolSDFVert = "attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"; + +var symbolTextAndIconFrag = "#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var symbolTextAndIconVert = "attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}float h=elevation(a_pos);vec4 projectedPoint=u_matrix*vec4(a_pos,h,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(\n0.5+0.5*distance_ratio,0.0,1.5);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),h,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,h,1.0);float z=0.0;vec2 offset=rotation_matrix*(a_offset/32.0*fontScale);\n#ifdef PITCH_WITH_MAP_TERRAIN\nvec4 tile_pos=u_label_plane_matrix_inv*vec4(a_projected_pos.xy+offset,0.0,1.0);z=elevation(tile_pos.xy);\n#endif\nfloat occlusion_fade=occlusionFade(projectedPoint);gl_Position=mix(u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+offset,z,1.0),AWAY,float(projectedPoint.w <=0.0 || occlusion_fade==0.0));float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(occlusion_fade,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}"; + +var skyboxFrag = "\nvarying lowp vec3 v_uv;uniform lowp samplerCube u_cubemap;uniform lowp float u_opacity;uniform highp float u_temporal_offset;uniform highp vec3 u_sun_direction;highp vec3 hash(highp vec2 p) {highp vec3 p3=fract(vec3(p.xyx)*vec3(443.8975,397.2973,491.1871));p3+=dot(p3,p3.yxz+19.19);return fract(vec3((p3.x+p3.y)*p3.z,(p3.x+p3.z)*p3.y,(p3.y+p3.z)*p3.x));}vec3 dither(vec3 color,highp vec2 seed) {vec3 rnd=hash(seed)+hash(seed+0.59374)-0.5;color.rgb+=rnd/255.0;return color;}float sun_disk(highp vec3 ray_direction,highp vec3 sun_direction) {highp float cos_angle=dot(normalize(ray_direction),sun_direction);const highp float cos_sun_angular_diameter=0.99996192306;const highp float smoothstep_delta=1e-5;return smoothstep(\ncos_sun_angular_diameter-smoothstep_delta,cos_sun_angular_diameter+smoothstep_delta,cos_angle);}float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec3 uv=v_uv;const float y_bias=0.015;uv.y+=y_bias;uv.y=pow(abs(uv.y),1.0/5.0);uv.y=map(uv.y,0.0,1.0,-1.0,1.0);vec3 sky_color=textureCube(u_cubemap,uv).rgb;sky_color.rgb=dither(sky_color.rgb,gl_FragCoord.xy+u_temporal_offset);sky_color+=0.1*sun_disk(v_uv,u_sun_direction);gl_FragColor=vec4(sky_color*u_opacity,u_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var skyboxGradientFrag = "varying highp vec3 v_uv;uniform lowp sampler2D u_color_ramp;uniform lowp vec3 u_center_direction;uniform lowp float u_radius;uniform lowp float u_opacity;uniform highp float u_temporal_offset;highp vec3 hash(highp vec2 p) {highp vec3 p3=fract(vec3(p.xyx)*vec3(443.8975,397.2973,491.1871));p3+=dot(p3,p3.yxz+19.19);return fract(vec3((p3.x+p3.y)*p3.z,(p3.x+p3.z)*p3.y,(p3.y+p3.z)*p3.x));}vec3 dither(vec3 color,highp vec2 seed) {vec3 rnd=hash(seed)+hash(seed+0.59374)-0.5;color.rgb+=rnd/255.0;return color;}void main() {float progress=acos(dot(normalize(v_uv),u_center_direction))/u_radius;vec4 color=texture2D(u_color_ramp,vec2(progress,0.5))*u_opacity;color.rgb=dither(color.rgb,gl_FragCoord.xy+u_temporal_offset);gl_FragColor=color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var skyboxVert = "attribute highp vec3 a_pos_3f;uniform lowp mat4 u_matrix;varying highp vec3 v_uv;void main() {const mat3 half_neg_pi_around_x=mat3(1.0,0.0, 0.0,0.0,0.0,-1.0,0.0,1.0, 0.0);v_uv=half_neg_pi_around_x*a_pos_3f;vec4 pos=u_matrix*vec4(a_pos_3f,1.0);gl_Position=pos.xyww;}"; + +var terrainRasterFrag = "uniform sampler2D u_image0;varying vec2 v_pos0;void main() {gl_FragColor=texture2D(u_image0,v_pos0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}"; + +var terrainRasterVert = "uniform mat4 u_matrix;uniform float u_skirt_height;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;const float skirtOffset=24575.0;void main() {v_pos0=a_texture_pos/8192.0;float skirt=float(a_pos.x >=skirtOffset);float elevation=elevation(a_texture_pos)-skirt*u_skirt_height;vec2 decodedPos=a_pos-vec2(skirt*skirtOffset,0.0);gl_Position=u_matrix*vec4(decodedPos,elevation,1.0);}"; + +var terrainDepthFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\nvec4 pack_depth(float ndc_z) {float depth=ndc_z*0.5+0.5;const vec4 bit_shift=vec4(256.0*256.0*256.0,256.0*256.0,256.0,1.0);const vec4 bit_mask =vec4(0.0,1.0/256.0,1.0/256.0,1.0/256.0);vec4 res=fract(depth*bit_shift);res-=res.xxyz*bit_mask;return res;}varying float v_depth;void main() {gl_FragColor=pack_depth(v_depth);}"; + +var terrainDepthVert = "uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying float v_depth;void main() {float elevation=elevation(a_texture_pos);gl_Position=u_matrix*vec4(a_pos,elevation,1.0);v_depth=gl_Position.z/gl_Position.w;}"; + +var preludeTerrainVert = "\n#define ELEVATION_SCALE 7.3\n#ifdef TERRAIN\nuniform sampler2D u_dem;uniform sampler2D u_dem_prev;uniform vec4 u_dem_unpack;uniform vec2 u_dem_tl;uniform vec2 u_dem_tl_prev;uniform float u_dem_scale;uniform float u_dem_scale_prev;uniform float u_dem_size;uniform float u_dem_lerp;uniform float u_exaggeration;uniform float u_meter_to_dem;uniform mat4 u_label_plane_matrix_inv;uniform sampler2D u_depth;uniform vec2 u_depth_size_inv;vec4 tileUvToDemSample(vec2 uv,float dem_size,float dem_scale,vec2 dem_tl) {vec2 pos=dem_size*(uv*dem_scale+dem_tl)+1.0;vec2 f=fract(pos);return vec4((pos-f+0.5)/(dem_size+2.0),f);}float decodeElevation(vec4 v) {return dot(vec4(v.xyz*255.0,-1.0),u_dem_unpack);}float currentElevation(vec2 apos) {float dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale,u_dem_tl);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem,pos));float tr=decodeElevation(texture2D(u_dem,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);}float prevElevation(vec2 apos) {float dd=1.0/(u_dem_size+2.0);vec4 r=tileUvToDemSample(apos/8192.0,u_dem_size,u_dem_scale_prev,u_dem_tl_prev);vec2 pos=r.xy;vec2 f=r.zw;float tl=decodeElevation(texture2D(u_dem_prev,pos));float tr=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,0.0)));float bl=decodeElevation(texture2D(u_dem_prev,pos+vec2(0.0,dd)));float br=decodeElevation(texture2D(u_dem_prev,pos+vec2(dd,dd)));return u_exaggeration*mix(mix(tl,tr,f.x),mix(bl,br,f.x),f.y);}\n#ifdef TERRAIN_VERTEX_MORPHING\nfloat elevation(vec2 apos) {float nextElevation=currentElevation(apos);float prevElevation=prevElevation(apos);return mix(prevElevation,nextElevation,u_dem_lerp);}\n#else\nfloat elevation(vec2 apos) {return currentElevation(apos);}\n#endif\nfloat unpack_depth(vec4 rgba_depth)\n{const vec4 bit_shift=vec4(1.0/(256.0*256.0*256.0),1.0/(256.0*256.0),1.0/256.0,1.0);return dot(rgba_depth,bit_shift)*2.0-1.0;}bool isOccluded(vec4 frag) {vec3 coord=frag.xyz/frag.w;float depth=unpack_depth(texture2D(u_depth,(coord.xy+1.0)*0.5));return coord.z > depth+0.0005;}float occlusionFade(vec4 frag) {vec3 coord=frag.xyz/frag.w;vec3 df=vec3(5.0*u_depth_size_inv,0.0);vec2 uv=0.5*coord.xy+0.5;vec4 depth=vec4(\nunpack_depth(texture2D(u_depth,uv-df.xz)),unpack_depth(texture2D(u_depth,uv+df.xz)),unpack_depth(texture2D(u_depth,uv-df.zy)),unpack_depth(texture2D(u_depth,uv+df.zy))\n);return dot(vec4(0.25),vec4(1.0)-clamp(300.0*(vec4(coord.z-0.001)-depth),0.0,1.0));}vec4 fourSample(vec2 pos,vec2 off) {vec4 demtl=vec4(texture2D(u_dem,pos).xyz*255.0,-1.0);float tl=dot(demtl,u_dem_unpack);vec4 demtr=vec4(texture2D(u_dem,pos+vec2(off.x,0.0)).xyz*255.0,-1.0);float tr=dot(demtr,u_dem_unpack);vec4 dembl=vec4(texture2D(u_dem,pos+vec2(0.0,off.y)).xyz*255.0,-1.0);float bl=dot(dembl,u_dem_unpack);vec4 dembr=vec4(texture2D(u_dem,pos+off).xyz*255.0,-1.0);float br=dot(dembr,u_dem_unpack);return vec4(tl,tr,bl,br);}float flatElevation(vec2 pack) {vec2 apos=floor(pack/8.0);vec2 span=10.0*(pack-apos*8.0);vec2 uvTex=(apos-vec2(1.0,1.0))/8190.0;float size=u_dem_size+2.0;float dd=1.0/size;vec2 pos=u_dem_size*(uvTex*u_dem_scale+u_dem_tl)+1.0;vec2 f=fract(pos);pos=(pos-f+0.5)*dd;vec4 h=fourSample(pos,vec2(dd));float z=mix(mix(h.x,h.y,f.x),mix(h.z,h.w,f.x),f.y);vec2 w=floor(0.5*(span*u_meter_to_dem-1.0));vec2 d=dd*w;vec4 bounds=vec4(d,vec2(1.0)-d);h=fourSample(pos-d,2.0*d+vec2(dd));vec4 diff=abs(h.xzxy-h.ywzw);vec2 slope=min(vec2(0.25),u_meter_to_dem*0.5*(diff.xz+diff.yw)/(2.0*w+vec2(1.0)));vec2 fix=slope*span;float base=z+max(fix.x,fix.y);return u_exaggeration*base;}float elevationFromUint16(float word) {return u_exaggeration*word/ELEVATION_SCALE;}\n#else\nfloat elevation(vec2 pos) { return 0.0; }bool isOccluded(vec4 frag) { return false; }float occlusionFade(vec4 frag) { return 1.0; }\n#endif"; + +var skyboxCaptureFrag = "\nvarying highp vec3 v_position;uniform highp float u_sun_intensity;uniform highp float u_luminance;uniform lowp vec3 u_sun_direction;uniform highp vec4 u_color_tint_r;uniform highp vec4 u_color_tint_m;\n#ifdef GL_ES\nprecision highp float;\n#endif\n#define BETA_R vec3(5.5e-6,13.0e-6,22.4e-6)\n#define BETA_M vec3(21e-6,21e-6,21e-6)\n#define MIE_G 0.76\n#define DENSITY_HEIGHT_SCALE_R 8000.0\n#define DENSITY_HEIGHT_SCALE_M 1200.0\n#define PLANET_RADIUS 6360e3\n#define ATMOSPHERE_RADIUS 6420e3\n#define SAMPLE_STEPS 10\n#define DENSITY_STEPS 4\nfloat ray_sphere_exit(vec3 orig,vec3 dir,float radius) {float a=dot(dir,dir);float b=2.0*dot(dir,orig);float c=dot(orig,orig)-radius*radius;float d=sqrt(b*b-4.0*a*c);return (-b+d)/(2.0*a);}vec3 extinction(vec2 density) {return exp(-vec3(BETA_R*u_color_tint_r.a*density.x+BETA_M*u_color_tint_m.a*density.y));}vec2 local_density(vec3 point) {float height=max(length(point)-PLANET_RADIUS,0.0);float exp_r=exp(-height/DENSITY_HEIGHT_SCALE_R);float exp_m=exp(-height/DENSITY_HEIGHT_SCALE_M);return vec2(exp_r,exp_m);}float phase_ray(float cos_angle) {return (3.0/(16.0*PI))*(1.0+cos_angle*cos_angle);}float phase_mie(float cos_angle) {return (3.0/(8.0*PI))*((1.0-MIE_G*MIE_G)*(1.0+cos_angle*cos_angle))/((2.0+MIE_G*MIE_G)*pow(1.0+MIE_G*MIE_G-2.0*MIE_G*cos_angle,1.5));}vec2 density_to_atmosphere(vec3 point,vec3 light_dir) {float ray_len=ray_sphere_exit(point,light_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(DENSITY_STEPS);vec2 density_point_to_atmosphere=vec2(0.0);for (int i=0; i < DENSITY_STEPS;++i) {vec3 point_on_ray=point+light_dir*((float(i)+0.5)*step_len);density_point_to_atmosphere+=local_density(point_on_ray)*step_len;;}return density_point_to_atmosphere;}vec3 atmosphere(vec3 ray_dir,vec3 sun_direction,float sun_intensity) {vec2 density_orig_to_point=vec2(0.0);vec3 scatter_r=vec3(0.0);vec3 scatter_m=vec3(0.0);vec3 origin=vec3(0.0,PLANET_RADIUS,0.0);float ray_len=ray_sphere_exit(origin,ray_dir,ATMOSPHERE_RADIUS);float step_len=ray_len/float(SAMPLE_STEPS);for (int i=0; i < SAMPLE_STEPS;++i) {vec3 point_on_ray=origin+ray_dir*((float(i)+0.5)*step_len);vec2 density=local_density(point_on_ray)*step_len;density_orig_to_point+=density;vec2 density_point_to_atmosphere=density_to_atmosphere(point_on_ray,sun_direction);vec2 density_orig_to_atmosphere=density_orig_to_point+density_point_to_atmosphere;vec3 extinction=extinction(density_orig_to_atmosphere);scatter_r+=density.x*extinction;scatter_m+=density.y*extinction;}float cos_angle=dot(ray_dir,sun_direction);float phase_r=phase_ray(cos_angle);float phase_m=phase_mie(cos_angle);vec3 beta_r=BETA_R*u_color_tint_r.rgb*u_color_tint_r.a;vec3 beta_m=BETA_M*u_color_tint_m.rgb*u_color_tint_m.a;return (scatter_r*phase_r*beta_r+scatter_m*phase_m*beta_m)*sun_intensity;}const float A=0.15;const float B=0.50;const float C=0.10;const float D=0.20;const float E=0.02;const float F=0.30;vec3 uncharted2_tonemap(vec3 x) {return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;}void main() {vec3 ray_direction=v_position;ray_direction.y=pow(ray_direction.y,5.0);const float y_bias=0.015;ray_direction.y+=y_bias;vec3 color=atmosphere(normalize(ray_direction),u_sun_direction,u_sun_intensity);float white_scale=1.0748724675633854;color=uncharted2_tonemap((log2(2.0/pow(u_luminance,4.0)))*color)*white_scale;gl_FragColor=vec4(color,1.0);}"; + +var skyboxCaptureVert = "attribute highp vec3 a_pos_3f;uniform mat3 u_matrix_3f;varying highp vec3 v_position;float map(float value,float start,float end,float new_start,float new_end) {return ((value-start)*(new_end-new_start))/(end-start)+new_start;}void main() {vec4 pos=vec4(u_matrix_3f*a_pos_3f,1.0);v_position=pos.xyz;v_position.y*=-1.0;v_position.y=map(v_position.y,-1.0,1.0,0.0,1.0);gl_Position=vec4(a_pos_3f.xy,0.0,1.0);}"; + +let preludeTerrain = {}; +preludeTerrain = compile('', preludeTerrainVert, true); +const prelude = compile(preludeFrag, preludeVert); +const background = compile(backgroundFrag, backgroundVert); +const backgroundPattern = compile(backgroundPatternFrag, backgroundPatternVert); +const circle = compile(circleFrag, circleVert); +const clippingMask = compile(clippingMaskFrag, clippingMaskVert); +const heatmap = compile(heatmapFrag, heatmapVert); +const heatmapTexture = compile(heatmapTextureFrag, heatmapTextureVert); +const collisionBox = compile(collisionBoxFrag, collisionBoxVert); +const collisionCircle = compile(collisionCircleFrag, collisionCircleVert); +const debug = compile(debugFrag, debugVert); +const fill = compile(fillFrag, fillVert); +const fillOutline = compile(fillOutlineFrag, fillOutlineVert); +const fillOutlinePattern = compile(fillOutlinePatternFrag, fillOutlinePatternVert); +const fillPattern = compile(fillPatternFrag, fillPatternVert); +const fillExtrusion = compile(fillExtrusionFrag, fillExtrusionVert); +const fillExtrusionPattern = compile(fillExtrusionPatternFrag, fillExtrusionPatternVert); +const hillshadePrepare = compile(hillshadePrepareFrag, hillshadePrepareVert); +const hillshade = compile(hillshadeFrag, hillshadeVert); +const line = compile(lineFrag, lineVert); +const lineGradient = compile(lineGradientFrag, lineGradientVert); +const linePattern = compile(linePatternFrag, linePatternVert); +const lineSDF = compile(lineSDFFrag, lineSDFVert); +const raster = compile(rasterFrag, rasterVert); +const symbolIcon = compile(symbolIconFrag, symbolIconVert); +const symbolSDF = compile(symbolSDFFrag, symbolSDFVert); +const symbolTextAndIcon = compile(symbolTextAndIconFrag, symbolTextAndIconVert); +const terrainRaster = compile(terrainRasterFrag, terrainRasterVert); +const terrainDepth = compile(terrainDepthFrag, terrainDepthVert); +const skybox = compile(skyboxFrag, skyboxVert); +const skyboxGradient = compile(skyboxGradientFrag, skyboxVert); +const skyboxCapture = compile(skyboxCaptureFrag, skyboxCaptureVert); +function compile(fragmentSource, vertexSource, isPreludeTerrainShader) { + const re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; + const staticAttributes = vertexSource.match(/attribute (highp |mediump |lowp )?([\w]+) ([\w]+)/g); + const fragmentUniforms = fragmentSource.match(/uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g); + const vertexUniforms = vertexSource.match(/uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g); + let staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms; + if (!isPreludeTerrainShader) { + staticUniforms = preludeTerrain.staticUniforms.concat(staticUniforms); + } + const fragmentPragmas = {}; + fragmentSource = fragmentSource.replace(re, (match, operation, precision, type, name) => { + fragmentPragmas[name] = true; + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${ name } +varying ${ precision } ${ type } ${ name }; +#else +uniform ${ precision } ${ type } u_${ name }; +#endif +`; + } else { + return ` +#ifdef HAS_UNIFORM_u_${ name } + ${ precision } ${ type } ${ name } = u_${ name }; +#endif +`; + } + }); + vertexSource = vertexSource.replace(re, (match, operation, precision, type, name) => { + const attrType = type === 'float' ? 'vec2' : 'vec4'; + const unpackType = name.match(/color/) ? 'color' : attrType; + if (fragmentPragmas[name]) { + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${ name } +uniform lowp float u_${ name }_t; +attribute ${ precision } ${ attrType } a_${ name }; +varying ${ precision } ${ type } ${ name }; +#else +uniform ${ precision } ${ type } u_${ name }; +#endif +`; + } else { + if (unpackType === 'vec4') { + return ` +#ifndef HAS_UNIFORM_u_${ name } + ${ name } = a_${ name }; +#else + ${ precision } ${ type } ${ name } = u_${ name }; +#endif +`; + } else { + return ` +#ifndef HAS_UNIFORM_u_${ name } + ${ name } = unpack_mix_${ unpackType }(a_${ name }, u_${ name }_t); +#else + ${ precision } ${ type } ${ name } = u_${ name }; +#endif +`; + } + } + } else { + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${ name } +uniform lowp float u_${ name }_t; +attribute ${ precision } ${ attrType } a_${ name }; +#else +uniform ${ precision } ${ type } u_${ name }; +#endif +`; + } else { + if (unpackType === 'vec4') { + return ` +#ifndef HAS_UNIFORM_u_${ name } + ${ precision } ${ type } ${ name } = a_${ name }; +#else + ${ precision } ${ type } ${ name } = u_${ name }; +#endif +`; + } else { + return ` +#ifndef HAS_UNIFORM_u_${ name } + ${ precision } ${ type } ${ name } = unpack_mix_${ unpackType }(a_${ name }, u_${ name }_t); +#else + ${ precision } ${ type } ${ name } = u_${ name }; +#endif +`; + } + } + } + }); + return { + fragmentSource, + vertexSource, + staticAttributes, + staticUniforms + }; +} + +var shaders = /*#__PURE__*/Object.freeze({ +__proto__: null, +get preludeTerrain () { return preludeTerrain; }, +prelude: prelude, +background: background, +backgroundPattern: backgroundPattern, +circle: circle, +clippingMask: clippingMask, +heatmap: heatmap, +heatmapTexture: heatmapTexture, +collisionBox: collisionBox, +collisionCircle: collisionCircle, +debug: debug, +fill: fill, +fillOutline: fillOutline, +fillOutlinePattern: fillOutlinePattern, +fillPattern: fillPattern, +fillExtrusion: fillExtrusion, +fillExtrusionPattern: fillExtrusionPattern, +hillshadePrepare: hillshadePrepare, +hillshade: hillshade, +line: line, +lineGradient: lineGradient, +linePattern: linePattern, +lineSDF: lineSDF, +raster: raster, +symbolIcon: symbolIcon, +symbolSDF: symbolSDF, +symbolTextAndIcon: symbolTextAndIcon, +terrainRaster: terrainRaster, +terrainDepth: terrainDepth, +skybox: skybox, +skyboxGradient: skyboxGradient, +skyboxCapture: skyboxCapture +}); + +class VertexArrayObject { + constructor() { + this.boundProgram = null; + this.boundLayoutVertexBuffer = null; + this.boundPaintVertexBuffers = []; + this.boundIndexBuffer = null; + this.boundVertexOffset = null; + this.boundDynamicVertexBuffer = null; + this.vao = null; + } + bind(context, program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) { + this.context = context; + let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; + for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { + if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { + paintBuffersDiffer = true; + } + } + const isFreshBindRequired = !this.vao || this.boundProgram !== program || this.boundLayoutVertexBuffer !== layoutVertexBuffer || paintBuffersDiffer || this.boundIndexBuffer !== indexBuffer || this.boundVertexOffset !== vertexOffset || this.boundDynamicVertexBuffer !== dynamicVertexBuffer || this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2; + if (!context.extVertexArrayObject || isFreshBindRequired) { + this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2); + } else { + context.bindVertexArrayOES.set(this.vao); + if (dynamicVertexBuffer) { + dynamicVertexBuffer.bind(); + } + if (indexBuffer && indexBuffer.dynamicDraw) { + indexBuffer.bind(); + } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.bind(); + } + } + } + freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2) { + let numPrevAttributes; + const numNextAttributes = program.numAttributes; + const context = this.context; + const gl = context.gl; + if (context.extVertexArrayObject) { + if (this.vao) + this.destroy(); + this.vao = context.extVertexArrayObject.createVertexArrayOES(); + context.bindVertexArrayOES.set(this.vao); + numPrevAttributes = 0; + this.boundProgram = program; + this.boundLayoutVertexBuffer = layoutVertexBuffer; + this.boundPaintVertexBuffers = paintVertexBuffers; + this.boundIndexBuffer = indexBuffer; + this.boundVertexOffset = vertexOffset; + this.boundDynamicVertexBuffer = dynamicVertexBuffer; + this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2; + } else { + numPrevAttributes = context.currentNumAttributes || 0; + for (let i = numNextAttributes; i < numPrevAttributes; i++) { + gl.disableVertexAttribArray(i); + } + } + layoutVertexBuffer.enableAttributes(gl, program); + for (const vertexBuffer of paintVertexBuffers) { + vertexBuffer.enableAttributes(gl, program); + } + if (dynamicVertexBuffer) { + dynamicVertexBuffer.enableAttributes(gl, program); + } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.enableAttributes(gl, program); + } + layoutVertexBuffer.bind(); + layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + for (const vertexBuffer of paintVertexBuffers) { + vertexBuffer.bind(); + vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + } + if (dynamicVertexBuffer) { + dynamicVertexBuffer.bind(); + dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + } + if (indexBuffer) { + indexBuffer.bind(); + } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.bind(); + dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); + } + context.currentNumAttributes = numNextAttributes; + } + destroy() { + if (this.vao) { + this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); + this.vao = null; + } + } +} + +const hillshadeUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_latrange': new ref_properties.Uniform2f(context, locations.u_latrange), + 'u_light': new ref_properties.Uniform2f(context, locations.u_light), + 'u_shadow': new ref_properties.UniformColor(context, locations.u_shadow), + 'u_highlight': new ref_properties.UniformColor(context, locations.u_highlight), + 'u_accent': new ref_properties.UniformColor(context, locations.u_accent) +}); +const hillshadePrepareUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_dimension': new ref_properties.Uniform2f(context, locations.u_dimension), + 'u_zoom': new ref_properties.Uniform1f(context, locations.u_zoom), + 'u_unpack': new ref_properties.Uniform4f(context, locations.u_unpack) +}); +const hillshadeUniformValues = (painter, tile, layer, matrix) => { + const shadow = layer.paint.get('hillshade-shadow-color'); + const highlight = layer.paint.get('hillshade-highlight-color'); + const accent = layer.paint.get('hillshade-accent-color'); + let azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180); + if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') { + azimuthal -= painter.transform.angle; + } + const align = !painter.options.moving; + return { + 'u_matrix': matrix ? matrix : painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align), + 'u_image': 0, + 'u_latrange': getTileLatRange(painter, tile.tileID), + 'u_light': [ + layer.paint.get('hillshade-exaggeration'), + azimuthal + ], + 'u_shadow': shadow, + 'u_highlight': highlight, + 'u_accent': accent + }; +}; +const hillshadeUniformPrepareValues = (tileID, dem) => { + const stride = dem.stride; + const matrix = ref_properties.create(); + ref_properties.ortho(matrix, 0, ref_properties.EXTENT, -ref_properties.EXTENT, 0, 0, 1); + ref_properties.translate(matrix, matrix, [ + 0, + -ref_properties.EXTENT, + 0 + ]); + return { + 'u_matrix': matrix, + 'u_image': 1, + 'u_dimension': [ + stride, + stride + ], + 'u_zoom': tileID.overscaledZ, + 'u_unpack': dem.unpackVector + }; +}; +function getTileLatRange(painter, tileID) { + const tilesAtZoom = Math.pow(2, tileID.canonical.z); + const y = tileID.canonical.y; + return [ + new ref_properties.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, + new ref_properties.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat + ]; +} + +function drawHillshade(painter, sourceCache, layer, tileIDs) { + if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') + return; + const context = painter.context; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); + const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; + const [stencilModes, coords] = painter.renderPass === 'translucent' && !renderingToTexture ? painter.stencilConfigForOverlap(tileIDs) : [ + {}, + tileIDs + ]; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { + prepareHillshade(painter, tile, layer, depthMode, ref_properties.StencilMode.disabled, colorMode); + } else if (painter.renderPass === 'translucent') { + const stencilMode = renderingToTexture && painter.terrain ? painter.terrain.stencilModeForRTTOverlap(coord) : stencilModes[coord.overscaledZ]; + renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode); + } + } + context.viewport.set([ + 0, + 0, + painter.width, + painter.height + ]); +} +function renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const fbo = tile.fbo; + if (!fbo) + return; + painter.prepareDrawTile(coord); + const program = painter.useProgram('hillshade'); + context.activeTexture.set(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); + const uniformValues = hillshadeUniformValues(painter, tile, layer, painter.terrain ? coord.posMatrix : null); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); +} +function prepareDEMTexture(painter, tile, dem) { + if (!tile.needsDEMTextureUpload) + return; + const context = painter.context; + const gl = context.gl; + context.pixelStoreUnpackPremultiplyAlpha.set(false); + const textureStride = dem.stride; + tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); + const pixelData = dem.getPixels(); + if (tile.demTexture) { + tile.demTexture.update(pixelData, { premultiply: false }); + } else { + tile.demTexture = new ref_properties.Texture(context, pixelData, gl.RGBA, { premultiply: false }); + } + tile.needsDEMTextureUpload = false; +} +function prepareHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + if (!tile.dem) + return; + const dem = tile.dem; + context.activeTexture.set(gl.TEXTURE1); + prepareDEMTexture(painter, tile, dem); + if (!tile.demTexture) + return; + tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + const tileSize = dem.dim; + context.activeTexture.set(gl.TEXTURE0); + let fbo = tile.fbo; + if (!fbo) { + const renderTexture = new ref_properties.Texture(context, { + width: tileSize, + height: tileSize, + data: null + }, gl.RGBA); + renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize, true); + fbo.colorAttachment.set(renderTexture.texture); + } + context.bindFramebuffer.set(fbo.framebuffer); + context.viewport.set([ + 0, + 0, + tileSize, + tileSize + ]); + painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, hillshadeUniformPrepareValues(tile.tileID, dem), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); + tile.needsHillshadePrepare = false; +} + +const terrainRasterUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image0': new ref_properties.Uniform1i(context, locations.u_image0), + 'u_skirt_height': new ref_properties.Uniform1f(context, locations.u_skirt_height) +}); +const terrainRasterUniformValues = (matrix, skirtHeight) => ({ + 'u_matrix': matrix, + 'u_image0': 0, + 'u_skirt_height': skirtHeight +}); + +class VertexMorphing { + constructor() { + this.operations = {}; + } + newMorphing(key, from, to, now, duration) { + if (key in this.operations) { + const op = this.operations[key]; + if (op.to.tileID.key !== to.tileID.key) + op.queued = to; + } else { + this.operations[key] = { + startTime: now, + phase: 0, + duration, + from, + to, + queued: null + }; + } + } + getMorphValuesForProxy(key) { + if (!(key in this.operations)) + return null; + const op = this.operations[key]; + const from = op.from; + const to = op.to; + return { + from, + to, + phase: op.phase + }; + } + update(now) { + for (const key in this.operations) { + const op = this.operations[key]; + op.phase = (now - op.startTime) / op.duration; + while (op.phase >= 1 || !this._validOp(op)) { + if (!this._nextOp(op, now)) { + delete this.operations[key]; + break; + } + } + } + } + _nextOp(op, now) { + if (!op.queued) + return false; + op.from = op.to; + op.to = op.queued; + op.queued = null; + op.phase = 0; + op.startTime = now; + return true; + } + _validOp(op) { + return op.from.hasData() && op.to.hasData(); + } +} +function demTileChanged(prev, next) { + if (prev == null || next == null) + return false; + if (!prev.hasData() || !next.hasData()) + return false; + if (prev.demTexture == null || next.demTexture == null) + return false; + return prev.tileID.key !== next.tileID.key; +} +const vertexMorphing = new VertexMorphing(); +const SHADER_DEFAULT = 0; +const SHADER_MORPHING = 1; +const defaultDuration = 250; +const shaderDefines = { + '0': null, + '1': 'TERRAIN_VERTEX_MORPHING' +}; +function drawTerrainRaster(painter, terrain, sourceCache, tileIDs, now) { + const context = painter.context; + const gl = context.gl; + let program = painter.useProgram('terrainRaster'); + let programMode = SHADER_DEFAULT; + const setShaderMode = mode => { + if (programMode === mode) + return; + program = painter.useProgram('terrainRaster', null, shaderDefines[mode]); + programMode = mode; + }; + const colorMode = painter.colorModeForRenderPass(); + const depthMode = new ref_properties.DepthMode(gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); + vertexMorphing.update(now); + const tr = painter.transform; + const skirt = skirtHeight(tr.zoom) * terrain.exaggeration(); + for (const coord of tileIDs) { + const tile = sourceCache.getTile(coord); + const stencilMode = ref_properties.StencilMode.disabled; + const prevDemTile = terrain.prevTerrainTileForTile[coord.key]; + const nextDemTile = terrain.terrainTileForTile[coord.key]; + if (demTileChanged(prevDemTile, nextDemTile)) { + vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration); + } + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + const morph = vertexMorphing.getMorphValuesForProxy(coord.key); + const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT; + let elevationOptions; + if (morph) { + elevationOptions = { + morphing: { + srcDemTile: morph.from, + dstDemTile: morph.to, + phase: ref_properties.easeCubicInOut(morph.phase) + } + }; + } + const uniformValues = terrainRasterUniformValues(coord.posMatrix, isEdgeTile(coord.canonical, tr.renderWorldCopies) ? skirt / 10 : skirt); + setShaderMode(shaderMode); + terrain.setupElevationDraw(tile, program, elevationOptions); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.backCCW, uniformValues, 'terrain_raster', terrain.gridBuffer, terrain.gridIndexBuffer, terrain.gridSegments); + } +} +function drawTerrainDepth(painter, terrain, sourceCache, tileIDs) { + const context = painter.context; + const gl = context.gl; + context.clear({ depth: 1 }); + const program = painter.useProgram('terrainDepth'); + const depthMode = new ref_properties.DepthMode(gl.LESS, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); + for (const coord of tileIDs) { + const tile = sourceCache.getTile(coord); + const uniformValues = terrainRasterUniformValues(coord.posMatrix, 0); + terrain.setupElevationDraw(tile, program); + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, ref_properties.ColorMode.unblended, ref_properties.CullFaceMode.backCCW, uniformValues, 'terrain_depth', terrain.gridBuffer, terrain.gridIndexBuffer, terrain.gridNoSkirtSegments); + } +} +function skirtHeight(zoom) { + return 6 * Math.pow(1.5, 22 - zoom); +} +function isEdgeTile(cid, renderWorldCopies) { + const numTiles = 1 << cid.z; + return !renderWorldCopies && (cid.x === 0 || cid.x === numTiles - 1) || cid.y === 0 || cid.y === numTiles - 1; +} + +const clippingMaskUniforms = (context, locations) => ({ 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) }); +const clippingMaskUniformValues = matrix => ({ 'u_matrix': matrix }); + +function rasterFade(tile, parentTile, sourceCache, transform, fadeDuration) { + if (fadeDuration > 0) { + const now = ref_properties.browser.now(); + const sinceTile = (now - tile.timeAdded) / fadeDuration; + const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; + const source = sourceCache.getSource(); + const idealZ = transform.coveringZoomLevel({ + tileSize: source.tileSize, + roundZoom: source.roundZoom + }); + const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); + const childOpacity = fadeIn && tile.refreshedUponExpiration ? 1 : ref_properties.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); + if (tile.refreshedUponExpiration && sinceTile >= 1) + tile.refreshedUponExpiration = false; + if (parentTile) { + return { + opacity: 1, + mix: 1 - childOpacity + }; + } else { + return { + opacity: childOpacity, + mix: 0 + }; + } + } else { + return { + opacity: 1, + mix: 0 + }; + } +} + +const GRID_DIM = 128; +const FBO_POOL_SIZE = 5; +const RENDER_CACHE_MAX_SIZE = 50; +class ProxySourceCache extends ref_properties.SourceCache { + constructor(map) { + const source = create('proxy', { + type: 'geojson', + maxzoom: map.transform.maxZoom + }, new Dispatcher(getGlobalWorkerPool(), null), map.style); + super('proxy', source, false); + source.setEventedParent(this); + this.map = this.getSource().map = map; + this.used = this._sourceLoaded = true; + this.renderCache = []; + this.renderCachePool = []; + this.proxyCachedFBO = {}; + } + update(transform, tileSize, updateForTerrain) { + if (transform.freezeTileCoverage) { + return; + } + this.transform = transform; + const idealTileIDs = transform.coveringTiles({ + tileSize: this._source.tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom, + reparseOverscaled: this._source.reparseOverscaled, + useElevationData: true + }); + const incoming = idealTileIDs.reduce((acc, tileID) => { + acc[tileID.key] = ''; + if (!this._tiles[tileID.key]) { + const tile = new ref_properties.Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), transform.tileZoom); + tile.state = 'loaded'; + this._tiles[tileID.key] = tile; + } + return acc; + }, {}); + for (const id in this._tiles) { + if (!(id in incoming)) { + this.freeFBO(id); + this._tiles[id].state = 'unloaded'; + delete this._tiles[id]; + } + } + } + freeFBO(id) { + const fbos = this.proxyCachedFBO[id]; + if (fbos !== undefined) { + const fboIds = Object.values(fbos); + this.renderCachePool.push(...fboIds); + delete this.proxyCachedFBO[id]; + } + } + deallocRenderCache() { + this.renderCache.forEach(fbo => fbo.fb.destroy()); + this.renderCache = []; + this.renderCachePool = []; + this.proxyCachedFBO = {}; + } +} +class ProxiedTileID extends ref_properties.OverscaledTileID { + constructor(tileID, proxyTileKey, posMatrix) { + super(tileID.overscaledZ, tileID.wrap, tileID.canonical.z, tileID.canonical.x, tileID.canonical.y); + this.proxyTileKey = proxyTileKey; + this.posMatrix = posMatrix; + } +} +class Terrain$1 extends ref_properties.Elevation { + constructor(painter, style) { + super(); + this.painter = painter; + this.terrainTileForTile = {}; + this.prevTerrainTileForTile = {}; + const [triangleGridArray, triangleGridIndices, skirtIndicesOffset] = createGrid(GRID_DIM + 1); + const context = painter.context; + this.gridBuffer = context.createVertexBuffer(triangleGridArray, rasterBoundsAttributes.members); + this.gridIndexBuffer = context.createIndexBuffer(triangleGridIndices); + this.gridSegments = ref_properties.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, triangleGridIndices.length); + this.gridNoSkirtSegments = ref_properties.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, skirtIndicesOffset); + this.proxyCoords = []; + this.proxiedCoords = {}; + this._visibleDemTiles = []; + this._drapedRenderBatches = []; + this._sourceTilesOverlap = {}; + this.proxySourceCache = new ProxySourceCache(style.map); + this.orthoMatrix = ref_properties.create(); + ref_properties.ortho(this.orthoMatrix, 0, ref_properties.EXTENT, 0, ref_properties.EXTENT, 0, 1); + const gl = context.gl; + this._overlapStencilMode = new ref_properties.StencilMode({ + func: gl.GEQUAL, + mask: 255 + }, 0, 255, gl.KEEP, gl.KEEP, gl.REPLACE); + this._previousZoom = painter.transform.zoom; + this.pool = []; + this._findCoveringTileCache = {}; + this._tilesDirty = {}; + this.style = style; + this._useVertexMorphing = true; + } + set style(style) { + style.on('data', this._onStyleDataEvent.bind(this)); + style.on('neworder', this._checkRenderCacheEfficiency.bind(this)); + this._style = style; + this._checkRenderCacheEfficiency(); + } + update(style, transform, cameraChanging) { + if (style && style.terrain) { + if (this._style !== style) { + this.style = style; + } + this.enabled = true; + const terrainProps = style.terrain.properties; + this.sourceCache = style._getSourceCache(terrainProps.get('source')); + this._exaggeration = terrainProps.get('exaggeration'); + const updateSourceCache = () => { + if (this.sourceCache.used) { + ref_properties.warnOnce(`Raster DEM source '${ this.sourceCache.id }' is used both for terrain and as layer source.\n` + 'This leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.'); + } + const demScale = this.sourceCache.getSource().tileSize / GRID_DIM; + const proxyTileSize = this.proxySourceCache.getSource().tileSize; + this.sourceCache.update(transform, demScale * proxyTileSize, true); + this._findCoveringTileCache[this.sourceCache.id] = {}; + }; + if (!this.sourceCache.usedForTerrain) { + this._findCoveringTileCache[this.sourceCache.id] = {}; + this.sourceCache.usedForTerrain = true; + updateSourceCache(); + this._initializing = true; + } + updateSourceCache(); + transform.updateElevation(!cameraChanging); + this._findCoveringTileCache[this.proxySourceCache.id] = {}; + this.proxySourceCache.update(transform); + this._emptyDEMTextureDirty = true; + } else { + this._disable(); + } + } + _checkRenderCacheEfficiency() { + const renderCacheInfo = this.renderCacheEfficiency(this._style); + if (this._style.map._optimizeForTerrain) ; else if (renderCacheInfo.efficiency !== 100) { + ref_properties.warnOnce(`Terrain render cache efficiency is not optimal (${ renderCacheInfo.efficiency }%) and performance + may be affected negatively, consider placing all background, fill and line layers before layer + with id '${ renderCacheInfo.firstUndrapedLayer }' or create a map using optimizeForTerrain: true option.`); + } + } + _onStyleDataEvent(event) { + if (event.coord && event.dataType === 'source') { + this._clearRenderCacheForTile(event.sourceCacheId, event.coord); + } else if (event.dataType === 'style') { + this._invalidateRenderCache = true; + } + } + _disable() { + if (!this.enabled) + return; + this.enabled = false; + this.proxySourceCache.deallocRenderCache(); + if (this._style) { + for (const id in this._style._sourceCaches) { + this._style._sourceCaches[id].usedForTerrain = false; + } + } + } + destroy() { + this._disable(); + if (this._emptyDEMTexture) + this._emptyDEMTexture.destroy(); + this.pool.forEach(fbo => fbo.fb.destroy()); + this.pool = []; + if (this._depthFBO) { + this._depthFBO.destroy(); + delete this._depthFBO; + delete this._depthTexture; + } + } + _source() { + return this.enabled ? this.sourceCache : null; + } + exaggeration() { + return this._exaggeration; + } + get visibleDemTiles() { + return this._visibleDemTiles; + } + get drapeBufferSize() { + const extent = this.proxySourceCache.getSource().tileSize * 2; + return [ + extent, + extent + ]; + } + set useVertexMorphing(enable) { + this._useVertexMorphing = enable; + } + updateTileBinding(sourcesCoords) { + if (!this.enabled) + return; + this.prevTerrainTileForTile = this.terrainTileForTile; + const psc = this.proxySourceCache; + const tr = this.painter.transform; + if (this._initializing) { + this._initializing = tr._centerAltitude === 0 && this.getAtPoint(ref_properties.MercatorCoordinate.fromLngLat(tr.center), -1) === -1; + this._emptyDEMTextureDirty = !this._initializing; + } + const options = this.painter.options; + this.renderCached = (options.zooming || options.moving || options.rotating || !!this.forceRenderCached) && !this._invalidateRenderCache; + this._invalidateRenderCache = false; + const coords = this.proxyCoords = psc.getIds().map(id => { + const tileID = psc.getTileByID(id).tileID; + tileID.posMatrix = tr.calculatePosMatrix(tileID.toUnwrapped()); + return tileID; + }); + sortByDistanceToCamera(coords, this.painter); + this._previousZoom = tr.zoom; + const previousProxyToSource = this.proxyToSource || {}; + this.proxyToSource = {}; + coords.forEach(tileID => { + this.proxyToSource[tileID.key] = {}; + }); + this.terrainTileForTile = {}; + const sourceCaches = this._style._sourceCaches; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + if (!sourceCache.used) + continue; + if (sourceCache !== this.sourceCache) + this._findCoveringTileCache[sourceCache.id] = {}; + this._setupProxiedCoordsForOrtho(sourceCache, sourcesCoords[id], previousProxyToSource); + if (sourceCache.usedForTerrain) + continue; + const coordinates = sourcesCoords[id]; + if (sourceCache.getSource().reparseOverscaled) { + this._assignTerrainTiles(coordinates); + } + } + this.proxiedCoords[psc.id] = coords.map(tileID => new ProxiedTileID(tileID, tileID.key, this.orthoMatrix)); + this._assignTerrainTiles(coords); + this._prepareDEMTextures(); + this._setupDrapedRenderBatches(); + this._setupRenderCache(previousProxyToSource); + this.renderingToTexture = false; + this._initFBOPool(); + this._updateTimestamp = ref_properties.browser.now(); + const visibleKeys = {}; + this._visibleDemTiles = []; + for (const id of this.proxyCoords) { + const demTile = this.terrainTileForTile[id.key]; + if (!demTile) + continue; + const key = demTile.tileID.key; + if (key in visibleKeys) + continue; + this._visibleDemTiles.push(demTile); + visibleKeys[key] = key; + } + } + _assignTerrainTiles(coords) { + if (this._initializing) + return; + coords.forEach(tileID => { + if (this.terrainTileForTile[tileID.key]) + return; + const demTile = this._findTileCoveringTileID(tileID, this.sourceCache); + if (demTile) + this.terrainTileForTile[tileID.key] = demTile; + }); + } + _prepareDEMTextures() { + const context = this.painter.context; + const gl = context.gl; + for (const key in this.terrainTileForTile) { + const tile = this.terrainTileForTile[key]; + const dem = tile.dem; + if (dem && (!tile.demTexture || tile.needsDEMTextureUpload)) { + context.activeTexture.set(gl.TEXTURE1); + prepareDEMTexture(this.painter, tile, dem); + } + } + } + _prepareDemTileUniforms(proxyTile, demTile, uniforms, uniformSuffix) { + if (!demTile || demTile.demTexture == null) + return false; + const proxyId = proxyTile.tileID.canonical; + const demId = demTile.tileID.canonical; + const demScaleBy = Math.pow(2, demId.z - proxyId.z); + const suffix = uniformSuffix || ''; + uniforms[`u_dem_tl${ suffix }`] = [ + proxyId.x * demScaleBy % 1, + proxyId.y * demScaleBy % 1 + ]; + uniforms[`u_dem_scale${ suffix }`] = demScaleBy; + return true; + } + get emptyDEMTexture() { + return !this._emptyDEMTextureDirty && this._emptyDEMTexture ? this._emptyDEMTexture : this._updateEmptyDEMTexture(); + } + _getLoadedAreaMinimum() { + let nonzero = 0; + const min = this._visibleDemTiles.reduce((acc, tile) => { + if (!tile.dem) + return acc; + const m = tile.dem.tree.minimums[0]; + acc += m; + if (m > 0) + nonzero++; + return acc; + }, 0); + return nonzero ? min / nonzero : 0; + } + _updateEmptyDEMTexture() { + const context = this.painter.context; + const gl = context.gl; + context.activeTexture.set(gl.TEXTURE2); + const min = this._getLoadedAreaMinimum(); + const image = { + width: 1, + height: 1, + data: new Uint8Array(ref_properties.DEMData.pack(min, this.sourceCache.getSource().encoding)) + }; + this._emptyDEMTextureDirty = false; + let texture = this._emptyDEMTexture; + if (!texture) { + texture = this._emptyDEMTexture = new ref_properties.Texture(context, image, gl.RGBA, { premultiply: false }); + } else { + texture.update(image, { premultiply: false }); + } + return texture; + } + setupElevationDraw(tile, program, options) { + const context = this.painter.context; + const gl = context.gl; + const uniforms = defaultTerrainUniforms(this.sourceCache.getSource().encoding); + uniforms['u_dem_size'] = this.sourceCache.getSource().tileSize; + uniforms['u_exaggeration'] = this.exaggeration(); + let demTile = null; + let prevDemTile = null; + let morphingPhase = 1; + if (options && options.morphing && this._useVertexMorphing) { + const srcTile = options.morphing.srcDemTile; + const dstTile = options.morphing.dstDemTile; + morphingPhase = options.morphing.phase; + if (srcTile && dstTile) { + if (this._prepareDemTileUniforms(tile, srcTile, uniforms, '_prev')) + prevDemTile = srcTile; + if (this._prepareDemTileUniforms(tile, dstTile, uniforms)) + demTile = dstTile; + } + } + if (prevDemTile && demTile) { + context.activeTexture.set(gl.TEXTURE2); + demTile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + context.activeTexture.set(gl.TEXTURE4); + prevDemTile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + uniforms['u_dem_lerp'] = morphingPhase; + } else { + demTile = this.terrainTileForTile[tile.tileID.key]; + context.activeTexture.set(gl.TEXTURE2); + const demTexture = this._prepareDemTileUniforms(tile, demTile, uniforms) ? demTile.demTexture : this.emptyDEMTexture; + demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + } + if (options && options.useDepthForOcclusion) { + context.activeTexture.set(gl.TEXTURE3); + this._depthTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + uniforms['u_depth_size_inv'] = [ + 1 / this._depthFBO.width, + 1 / this._depthFBO.height + ]; + } + if (options && options.useMeterToDem && demTile) { + const meterToDEM = (1 << demTile.tileID.canonical.z) * ref_properties.mercatorZfromAltitude(1, this.painter.transform.center.lat) * this.sourceCache.getSource().tileSize; + uniforms['u_meter_to_dem'] = meterToDEM; + } + if (options && options.labelPlaneMatrixInv) { + uniforms['u_label_plane_matrix_inv'] = options.labelPlaneMatrixInv; + } + program.setTerrainUniformValues(context, uniforms); + } + renderBatch(startLayerIndex) { + if (this._drapedRenderBatches.length === 0) { + return startLayerIndex + 1; + } + this.renderingToTexture = true; + const painter = this.painter; + const context = this.painter.context; + const psc = this.proxySourceCache; + const proxies = this.proxiedCoords[psc.id]; + const setupRenderToScreen = () => { + context.bindFramebuffer.set(null); + context.viewport.set([ + 0, + 0, + painter.width, + painter.height + ]); + this.renderingToTexture = false; + }; + const drapedLayerBatch = this._drapedRenderBatches.shift(); + let drawAsRasterCoords = []; + const layerIds = painter.style.order; + let poolIndex = 0; + for (let i = 0; i < proxies.length; i++) { + const proxy = proxies[i]; + const tile = psc.getTileByID(proxy.proxyTileKey); + const renderCacheIndex = psc.proxyCachedFBO[proxy.key] ? psc.proxyCachedFBO[proxy.key][startLayerIndex] : undefined; + let fbo; + if (renderCacheIndex !== undefined) { + fbo = this.currentFBO = psc.renderCache[renderCacheIndex]; + } else { + fbo = this.currentFBO = this.pool[poolIndex++]; + } + tile.texture = fbo.tex; + if (renderCacheIndex !== undefined && !fbo.dirty) { + drawAsRasterCoords.push(tile.tileID); + continue; + } + context.bindFramebuffer.set(fbo.fb.framebuffer); + this.renderedToTile = false; + if (fbo.dirty) { + context.clear({ color: ref_properties.Color.transparent }); + fbo.dirty = false; + } + let currentStencilSource; + for (let j = drapedLayerBatch.start; j <= drapedLayerBatch.end; ++j) { + const layer = painter.style._layers[layerIds[j]]; + const hidden = layer.isHidden(painter.transform.zoom); + if (hidden) + continue; + const sourceCache = painter.style._getLayerSourceCache(layer); + const proxiedCoords = sourceCache ? this.proxyToSource[proxy.key][sourceCache.id] : [proxy]; + if (!proxiedCoords) + continue; + const coords = proxiedCoords; + context.viewport.set([ + 0, + 0, + fbo.fb.width, + fbo.fb.height + ]); + if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) { + this._setupStencil(proxiedCoords, layer, sourceCache); + currentStencilSource = sourceCache ? sourceCache.id : null; + } + painter.renderLayer(painter, sourceCache, layer, coords); + } + fbo.dirty = this.renderedToTile; + if (this.renderedToTile) + drawAsRasterCoords.push(tile.tileID); + if (poolIndex === FBO_POOL_SIZE) { + poolIndex = 0; + if (drawAsRasterCoords.length > 0) { + setupRenderToScreen(); + drawTerrainRaster(painter, this, psc, drawAsRasterCoords, this._updateTimestamp); + this.renderingToTexture = true; + drawAsRasterCoords = []; + } + } + } + setupRenderToScreen(); + if (drawAsRasterCoords.length > 0) { + drawTerrainRaster(painter, this, psc, drawAsRasterCoords, this._updateTimestamp); + } + return drapedLayerBatch.end + 1; + } + postRender() { + } + renderCacheEfficiency(style) { + const layerCount = style.order.length; + if (layerCount === 0) { + return { efficiency: 100 }; + } + let uncacheableLayerCount = 0; + let drapedLayerCount = 0; + let reachedUndrapedLayer = false; + let firstUndrapedLayer; + for (let i = 0; i < layerCount; ++i) { + const layer = style._layers[style.order[i]]; + if (!this._style.isLayerDraped(layer)) { + if (!reachedUndrapedLayer) { + reachedUndrapedLayer = true; + firstUndrapedLayer = layer.id; + } + } else { + if (reachedUndrapedLayer) { + ++uncacheableLayerCount; + } + ++drapedLayerCount; + } + } + if (drapedLayerCount === 0) { + return { efficiency: 100 }; + } + return { + efficiency: (1 - uncacheableLayerCount / drapedLayerCount) * 100, + firstUndrapedLayer + }; + } + raycast(pos, dir, exaggeration) { + if (!this._visibleDemTiles) + return null; + const preparedTiles = this._visibleDemTiles.filter(tile => tile.dem).map(tile => { + const id = tile.tileID; + const tiles = Math.pow(2, id.overscaledZ); + const {x, y} = id.canonical; + const minx = x / tiles; + const maxx = (x + 1) / tiles; + const miny = y / tiles; + const maxy = (y + 1) / tiles; + const tree = tile.dem.tree; + return { + minx, + miny, + maxx, + maxy, + t: tree.raycastRoot(minx, miny, maxx, maxy, pos, dir, exaggeration), + tile + }; + }); + preparedTiles.sort((a, b) => { + const at = a.t !== null ? a.t : Number.MAX_VALUE; + const bt = b.t !== null ? b.t : Number.MAX_VALUE; + return at - bt; + }); + for (const obj of preparedTiles) { + if (obj.t == null) + return null; + const tree = obj.tile.dem.tree; + const t = tree.raycast(obj.minx, obj.miny, obj.maxx, obj.maxy, pos, dir, exaggeration); + if (t != null) + return t; + } + return null; + } + _createFBO() { + const painter = this.painter; + const context = painter.context; + const gl = context.gl; + const bufferSize = this.drapeBufferSize; + context.activeTexture.set(gl.TEXTURE0); + const tex = new ref_properties.Texture(context, { + width: bufferSize[0], + height: bufferSize[1], + data: null + }, gl.RGBA); + tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + const fb = context.createFramebuffer(bufferSize[0], bufferSize[1], false); + fb.colorAttachment.set(tex.texture); + if (context.extTextureFilterAnisotropic && !context.extTextureFilterAnisotropicForceOff) { + gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); + } + return { + fb, + tex, + dirty: false, + ref: 1 + }; + } + _initFBOPool() { + while (this.pool.length < Math.min(FBO_POOL_SIZE, this.proxyCoords.length)) { + this.pool.push(this._createFBO()); + } + } + _shouldDisableRenderCache() { + const isCrossFading = id => { + const layer = this._style._layers[id]; + const isHidden = !layer.isHidden(this.painter.transform.zoom); + const crossFade = layer.getCrossfadeParameters(); + const isFading = !!crossFade && crossFade.t !== 1; + return layer.type !== 'custom' && !isHidden && isFading; + }; + return !this.renderCached || this._style.order.some(isCrossFading); + } + _clearRasterFadeFromRenderCache() { + let hasRasterSource = false; + for (const id in this._style._sourceCaches) { + if (this._style._sourceCaches[id]._source instanceof RasterTileSource) { + hasRasterSource = true; + break; + } + } + if (!hasRasterSource) { + return; + } + for (let i = 0; i < this._style.order.length; ++i) { + const layer = this._style._layers[this._style.order[i]]; + const isHidden = layer.isHidden(this.painter.transform.zoom); + const sourceCache = this._style._getLayerSourceCache(layer); + if (layer.type !== 'raster' || isHidden || !sourceCache) { + continue; + } + const rasterLayer = layer; + const fadeDuration = rasterLayer.paint.get('raster-fade-duration'); + for (const proxy of this.proxyCoords) { + const proxiedCoords = this.proxyToSource[proxy.key][sourceCache.id]; + const coords = proxiedCoords; + if (!coords) { + continue; + } + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const parent = sourceCache.findLoadedParent(coord, 0); + const fade = rasterFade(tile, parent, sourceCache, this.painter.transform, fadeDuration); + const isFading = fade.opacity !== 1 || fade.mix !== 0; + if (isFading) { + this._clearRenderCacheForTile(sourceCache.id, coord); + } + } + } + } + } + _setupDrapedRenderBatches() { + const layerIds = this._style.order; + const layerCount = layerIds.length; + if (layerCount === 0) { + return; + } + const batches = []; + let currentLayer = 0; + let layer = this._style._layers[layerIds[currentLayer]]; + while (!this._style.isLayerDraped(layer) && layer.isHidden(this.painter.transform.zoom) && ++currentLayer < layerCount) { + layer = this._style._layers[layerIds[currentLayer]]; + } + let batchStart; + for (; currentLayer < layerCount; ++currentLayer) { + const layer = this._style._layers[layerIds[currentLayer]]; + if (layer.isHidden(this.painter.transform.zoom)) { + continue; + } + if (!this._style.isLayerDraped(layer)) { + if (batchStart !== undefined) { + batches.push({ + start: batchStart, + end: currentLayer - 1 + }); + batchStart = undefined; + } + continue; + } + if (batchStart === undefined) { + batchStart = currentLayer; + } + } + if (batchStart !== undefined) { + batches.push({ + start: batchStart, + end: currentLayer - 1 + }); + } + if (this._style.map._optimizeForTerrain) ; + this._drapedRenderBatches = batches; + } + _setupRenderCache(previousProxyToSource) { + const psc = this.proxySourceCache; + if (this._shouldDisableRenderCache()) { + if (psc.renderCache.length > psc.renderCachePool.length) { + const used = Object.values(psc.proxyCachedFBO); + psc.proxyCachedFBO = {}; + for (let i = 0; i < used.length; ++i) { + const fbos = Object.values(used[i]); + psc.renderCachePool.push(...fbos); + } + } + return; + } + this._clearRasterFadeFromRenderCache(); + const coords = this.proxyCoords; + const dirty = this._tilesDirty; + for (let i = coords.length - 1; i >= 0; i--) { + const proxy = coords[i]; + const tile = psc.getTileByID(proxy.key); + if (psc.proxyCachedFBO[proxy.key] !== undefined) { + const prev = previousProxyToSource[proxy.key]; + const current = this.proxyToSource[proxy.key]; + let equal = 0; + for (const source in current) { + const tiles = current[source]; + const prevTiles = prev[source]; + if (!prevTiles || prevTiles.length !== tiles.length || tiles.some((t, index) => t !== prevTiles[index] || dirty[source] && dirty[source].hasOwnProperty(t.key))) { + equal = -1; + break; + } + ++equal; + } + for (const proxyFBO in psc.proxyCachedFBO[proxy.key]) { + psc.renderCache[psc.proxyCachedFBO[proxy.key][proxyFBO]].dirty = equal < 0 || equal !== Object.values(prev).length; + } + } else { + for (let j = 0; j < this._drapedRenderBatches.length; ++j) { + const batch = this._drapedRenderBatches[j]; + let index = psc.renderCachePool.pop(); + if (index === undefined && psc.renderCache.length < RENDER_CACHE_MAX_SIZE) { + index = psc.renderCache.length; + psc.renderCache.push(this._createFBO()); + } + if (index !== undefined) { + if (psc.proxyCachedFBO[proxy.key] === undefined) + psc.proxyCachedFBO[proxy.key] = {}; + psc.proxyCachedFBO[proxy.key][batch.start] = index; + psc.renderCache[index].dirty = true; + } + } + } + } + this._tilesDirty = {}; + } + _setupStencil(proxiedCoords, layer, sourceCache) { + if (!sourceCache || !this._sourceTilesOverlap[sourceCache.id]) { + if (this._overlapStencilType) + this._overlapStencilType = false; + return; + } + const context = this.painter.context; + const gl = context.gl; + if (proxiedCoords.length <= 1) { + this._overlapStencilType = false; + return; + } + const fbo = this.currentFBO; + const fb = fbo.fb; + let stencilRange; + if (layer.isTileClipped()) { + stencilRange = proxiedCoords.length; + this._overlapStencilMode.test = { + func: gl.EQUAL, + mask: 255 + }; + this._overlapStencilType = 'Clip'; + } else if (proxiedCoords[0].overscaledZ > proxiedCoords[proxiedCoords.length - 1].overscaledZ) { + stencilRange = 1; + this._overlapStencilMode.test = { + func: gl.GREATER, + mask: 255 + }; + this._overlapStencilType = 'Mask'; + } else { + this._overlapStencilType = false; + return; + } + if (!fb.depthAttachment) { + const renderbuffer = context.createRenderbuffer(context.gl.DEPTH_STENCIL, fb.width, fb.height); + fb.depthAttachment = new ref_properties.DepthStencilAttachment(context, fb.framebuffer); + fb.depthAttachment.set(renderbuffer); + context.clear({ stencil: 0 }); + } + if (fbo.ref + stencilRange > 255) { + context.clear({ stencil: 0 }); + fbo.ref = 0; + } + fbo.ref += stencilRange; + this._overlapStencilMode.ref = fbo.ref; + if (layer.isTileClipped()) { + this._renderTileClippingMasks(proxiedCoords, this._overlapStencilMode.ref); + } + } + stencilModeForRTTOverlap(id) { + if (!this.renderingToTexture || !this._overlapStencilType) { + return ref_properties.StencilMode.disabled; + } + if (this._overlapStencilType === 'Clip') { + this._overlapStencilMode.ref = this.painter._tileClippingMaskIDs[id.key]; + } + return this._overlapStencilMode; + } + _renderTileClippingMasks(proxiedCoords, ref) { + const painter = this.painter; + const context = this.painter.context; + const gl = context.gl; + painter._tileClippingMaskIDs = {}; + context.setColorMode(ref_properties.ColorMode.disabled); + context.setDepthMode(ref_properties.DepthMode.disabled); + const program = painter.useProgram('clippingMask'); + for (const tileID of proxiedCoords) { + const id = painter._tileClippingMaskIDs[tileID.key] = --ref; + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, new ref_properties.StencilMode({ + func: gl.ALWAYS, + mask: 0 + }, id, 255, gl.KEEP, gl.KEEP, gl.REPLACE), ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments); + } + } + pointCoordinate(screenPoint) { + const transform = this.painter.transform; + if (screenPoint.x < 0 || screenPoint.x > transform.width || screenPoint.y < 0 || screenPoint.y > transform.height) { + return null; + } + const far = [ + screenPoint.x, + screenPoint.y, + 1, + 1 + ]; + ref_properties.transformMat4(far, far, transform.pixelMatrixInverse); + ref_properties.scale$1(far, far, 1 / far[3]); + far[0] /= transform.worldSize; + far[1] /= transform.worldSize; + const camera = transform._camera.position; + const mercatorZScale = ref_properties.mercatorZfromAltitude(1, transform.center.lat); + const p = [ + camera[0], + camera[1], + camera[2] / mercatorZScale, + 0 + ]; + const dir = ref_properties.subtract([], far.slice(0, 3), p); + ref_properties.normalize(dir, dir); + const distanceAlongRay = this.raycast(p, dir, this._exaggeration); + if (distanceAlongRay === null || !distanceAlongRay) + return null; + ref_properties.scaleAndAdd(p, p, dir, distanceAlongRay); + p[3] = p[2]; + p[2] *= mercatorZScale; + return p; + } + drawDepth() { + const painter = this.painter; + const context = painter.context; + const psc = this.proxySourceCache; + const width = Math.ceil(painter.width), height = Math.ceil(painter.height); + if (this._depthFBO && (this._depthFBO.width !== width || this._depthFBO.height !== height)) { + this._depthFBO.destroy(); + delete this._depthFBO; + delete this._depthTexture; + } + if (!this._depthFBO) { + const gl = context.gl; + const fbo = context.createFramebuffer(width, height, true); + context.activeTexture.set(gl.TEXTURE0); + const texture = new ref_properties.Texture(context, { + width, + height, + data: null + }, gl.RGBA); + texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + fbo.colorAttachment.set(texture.texture); + const renderbuffer = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, width, height); + fbo.depthAttachment.set(renderbuffer); + this._depthFBO = fbo; + this._depthTexture = texture; + } + context.bindFramebuffer.set(this._depthFBO.framebuffer); + context.viewport.set([ + 0, + 0, + width, + height + ]); + drawTerrainDepth(painter, this, psc, this.proxyCoords); + } + _setupProxiedCoordsForOrtho(sourceCache, sourceCoords, previousProxyToSource) { + if (sourceCache.getSource() instanceof ImageSource) { + return this._setupProxiedCoordsForImageSource(sourceCache, sourceCoords, previousProxyToSource); + } + this._findCoveringTileCache[sourceCache.id] = this._findCoveringTileCache[sourceCache.id] || {}; + const coords = this.proxiedCoords[sourceCache.id] = []; + const proxys = this.proxyCoords; + for (let i = 0; i < proxys.length; i++) { + const proxyTileID = proxys[i]; + const proxied = this._findTileCoveringTileID(proxyTileID, sourceCache); + if (proxied) { + const id = this._createProxiedId(proxyTileID, proxied, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); + coords.push(id); + this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; + } + } + let hasOverlap = false; + for (let i = 0; i < sourceCoords.length; i++) { + const tile = sourceCache.getTile(sourceCoords[i]); + if (!tile || !tile.hasData()) + continue; + const proxy = this._findTileCoveringTileID(tile.tileID, this.proxySourceCache); + if (proxy && proxy.tileID.canonical.z !== tile.tileID.canonical.z) { + const array = this.proxyToSource[proxy.tileID.key][sourceCache.id]; + const id = this._createProxiedId(proxy.tileID, tile, previousProxyToSource[proxy.tileID.key] && previousProxyToSource[proxy.tileID.key][sourceCache.id]); + if (!array) { + this.proxyToSource[proxy.tileID.key][sourceCache.id] = [id]; + } else { + array.splice(array.length - 1, 0, id); + } + coords.push(id); + hasOverlap = true; + } + } + this._sourceTilesOverlap[sourceCache.id] = hasOverlap; + } + _setupProxiedCoordsForImageSource(sourceCache, sourceCoords, previousProxyToSource) { + if (!sourceCache.getSource().loaded()) + return; + const coords = this.proxiedCoords[sourceCache.id] = []; + const proxys = this.proxyCoords; + const imageSource = sourceCache.getSource(); + const anchor = new ref_properties.Point(imageSource.tileID.x, imageSource.tileID.y)._div(1 << imageSource.tileID.z); + const aabb = imageSource.coordinates.map(ref_properties.MercatorCoordinate.fromLngLat).reduce((acc, coord) => { + acc.min.x = Math.min(acc.min.x, coord.x - anchor.x); + acc.min.y = Math.min(acc.min.y, coord.y - anchor.y); + acc.max.x = Math.max(acc.max.x, coord.x - anchor.x); + acc.max.y = Math.max(acc.max.y, coord.y - anchor.y); + return acc; + }, { + min: new ref_properties.Point(Number.MAX_VALUE, Number.MAX_VALUE), + max: new ref_properties.Point(-Number.MAX_VALUE, -Number.MAX_VALUE) + }); + const tileOutsideImage = (tileID, imageTileID) => { + const x = tileID.wrap + tileID.canonical.x / (1 << tileID.canonical.z); + const y = tileID.canonical.y / (1 << tileID.canonical.z); + const d = ref_properties.EXTENT / (1 << tileID.canonical.z); + const ix = imageTileID.wrap + imageTileID.canonical.x / (1 << imageTileID.canonical.z); + const iy = imageTileID.canonical.y / (1 << imageTileID.canonical.z); + return x + d < ix + aabb.min.x || x > ix + aabb.max.x || y + d < iy + aabb.min.y || y > iy + aabb.max.y; + }; + for (let i = 0; i < proxys.length; i++) { + const proxyTileID = proxys[i]; + for (let j = 0; j < sourceCoords.length; j++) { + const tile = sourceCache.getTile(sourceCoords[j]); + if (!tile || !tile.hasData()) + continue; + if (tileOutsideImage(proxyTileID, tile.tileID)) + continue; + const id = this._createProxiedId(proxyTileID, tile, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); + const array = this.proxyToSource[proxyTileID.key][sourceCache.id]; + if (!array) { + this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; + } else { + array.push(id); + } + coords.push(id); + } + } + } + _createProxiedId(proxyTileID, tile, recycle) { + let matrix = this.orthoMatrix; + if (recycle) { + const recycled = recycle.find(proxied => proxied.key === tile.tileID.key); + if (recycled) + return recycled; + } + if (tile.tileID.key !== proxyTileID.key) { + const scale = proxyTileID.canonical.z - tile.tileID.canonical.z; + matrix = ref_properties.create(); + let size, xOffset, yOffset; + const wrap = tile.tileID.wrap - proxyTileID.wrap << proxyTileID.overscaledZ; + if (scale > 0) { + size = ref_properties.EXTENT >> scale; + xOffset = size * ((tile.tileID.canonical.x << scale) - proxyTileID.canonical.x + wrap); + yOffset = size * ((tile.tileID.canonical.y << scale) - proxyTileID.canonical.y); + } else { + size = ref_properties.EXTENT << -scale; + xOffset = ref_properties.EXTENT * (tile.tileID.canonical.x - (proxyTileID.canonical.x + wrap << -scale)); + yOffset = ref_properties.EXTENT * (tile.tileID.canonical.y - (proxyTileID.canonical.y << -scale)); + } + ref_properties.ortho(matrix, 0, size, 0, size, 0, 1); + ref_properties.translate(matrix, matrix, [ + xOffset, + yOffset, + 0 + ]); + } + return new ProxiedTileID(tile.tileID, proxyTileID.key, matrix); + } + _findTileCoveringTileID(tileID, sourceCache) { + let tile = sourceCache.getTile(tileID); + if (tile && tile.hasData()) + return tile; + const lookup = this._findCoveringTileCache[sourceCache.id]; + const key = lookup[tileID.key]; + tile = key ? sourceCache.getTileByID(key) : null; + if (tile && tile.hasData() || key === null) + return tile; + let sourceTileID = tile ? tile.tileID : tileID; + let z = sourceTileID.overscaledZ; + const minzoom = sourceCache.getSource().minzoom; + const path = []; + if (!key) { + const maxzoom = sourceCache.getSource().maxzoom; + if (tileID.canonical.z >= maxzoom) { + const downscale = tileID.canonical.z - maxzoom; + if (sourceCache.getSource().reparseOverscaled) { + z = Math.max(tileID.canonical.z + 2, sourceCache.transform.tileZoom); + sourceTileID = new ref_properties.OverscaledTileID(z, tileID.wrap, maxzoom, tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); + } else if (downscale !== 0) { + z = maxzoom; + sourceTileID = new ref_properties.OverscaledTileID(z, tileID.wrap, maxzoom, tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); + } + } + if (sourceTileID.key !== tileID.key) { + path.push(sourceTileID.key); + tile = sourceCache.getTile(sourceTileID); + } + } + const pathToLookup = key => { + path.forEach(id => { + lookup[id] = key; + }); + path.length = 0; + }; + for (z = z - 1; z >= minzoom && !(tile && tile.hasData()); z--) { + if (tile) { + pathToLookup(tile.tileID.key); + } + const id = sourceTileID.calculateScaledKey(z); + tile = sourceCache.getTileByID(id); + if (tile && tile.hasData()) + break; + const key = lookup[id]; + if (key === null) { + break; + } else if (key !== undefined) { + tile = sourceCache.getTileByID(key); + continue; + } + path.push(id); + } + pathToLookup(tile ? tile.tileID.key : null); + return tile && tile.hasData() ? tile : null; + } + findDEMTileFor(tileID) { + return this.enabled ? this._findTileCoveringTileID(tileID, this.sourceCache) : null; + } + prepareDrawTile(coord) { + if (!this.renderedToTile) { + this.renderedToTile = true; + } + } + _clearRenderCacheForTile(source, coord) { + let sourceTiles = this._tilesDirty[source]; + if (!sourceTiles) + sourceTiles = this._tilesDirty[source] = {}; + sourceTiles[coord.key] = true; + } +} +function sortByDistanceToCamera(tileIDs, painter) { + const cameraCoordinate = painter.transform.pointCoordinate(painter.transform.getCameraPoint()); + const cameraPoint = new ref_properties.Point(cameraCoordinate.x, cameraCoordinate.y); + tileIDs.sort((a, b) => { + if (b.overscaledZ - a.overscaledZ) + return b.overscaledZ - a.overscaledZ; + const aPoint = new ref_properties.Point(a.canonical.x + (1 << a.canonical.z) * a.wrap, a.canonical.y); + const bPoint = new ref_properties.Point(b.canonical.x + (1 << b.canonical.z) * b.wrap, b.canonical.y); + const cameraScaled = cameraPoint.mult(1 << a.canonical.z); + cameraScaled.x -= 0.5; + cameraScaled.y -= 0.5; + return cameraScaled.distSqr(aPoint) - cameraScaled.distSqr(bPoint); + }); +} +function createGrid(count) { + const boundsArray = new ref_properties.StructArrayLayout4i8(); + const indexArray = new ref_properties.StructArrayLayout3ui6(); + const size = count + 2; + boundsArray.reserve(size * size); + indexArray.reserve((size - 1) * (size - 1) * 2); + const step = ref_properties.EXTENT / (count - 1); + const gridBound = ref_properties.EXTENT + step / 2; + const bound = gridBound + step; + const skirtOffset = 24575; + for (let y = -step; y < bound; y += step) { + for (let x = -step; x < bound; x += step) { + const offset = x < 0 || x > gridBound || y < 0 || y > gridBound ? skirtOffset : 0; + const xi = ref_properties.clamp(Math.round(x), 0, ref_properties.EXTENT); + const yi = ref_properties.clamp(Math.round(y), 0, ref_properties.EXTENT); + boundsArray.emplaceBack(xi + offset, yi, xi, yi); + } + } + const skirtIndicesOffset = (size - 3) * (size - 3) * 2; + const quad = (i, j) => { + const index = j * size + i; + indexArray.emplaceBack(index + 1, index, index + size); + indexArray.emplaceBack(index + size, index + size + 1, index + 1); + }; + for (let j = 1; j < size - 2; j++) { + for (let i = 1; i < size - 2; i++) { + quad(i, j); + } + } + [ + 0, + size - 2 + ].forEach(j => { + for (let i = 0; i < size - 1; i++) { + quad(i, j); + quad(j, i); + } + }); + return [ + boundsArray, + indexArray, + skirtIndicesOffset + ]; +} +const terrainUniforms = (context, locations) => ({ + 'u_dem': new ref_properties.Uniform1i(context, locations.u_dem), + 'u_dem_prev': new ref_properties.Uniform1i(context, locations.u_dem_prev), + 'u_dem_unpack': new ref_properties.Uniform4f(context, locations.u_dem_unpack), + 'u_dem_tl': new ref_properties.Uniform2f(context, locations.u_dem_tl), + 'u_dem_scale': new ref_properties.Uniform1f(context, locations.u_dem_scale), + 'u_dem_tl_prev': new ref_properties.Uniform2f(context, locations.u_dem_tl_prev), + 'u_dem_scale_prev': new ref_properties.Uniform1f(context, locations.u_dem_scale_prev), + 'u_dem_size': new ref_properties.Uniform1f(context, locations.u_dem_size), + 'u_dem_lerp': new ref_properties.Uniform1f(context, locations.u_dem_lerp), + 'u_exaggeration': new ref_properties.Uniform1f(context, locations.u_exaggeration), + 'u_depth': new ref_properties.Uniform1i(context, locations.u_depth), + 'u_depth_size_inv': new ref_properties.Uniform2f(context, locations.u_depth_size_inv), + 'u_meter_to_dem': new ref_properties.Uniform1f(context, locations.u_meter_to_dem), + 'u_label_plane_matrix_inv': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix_inv) +}); +function defaultTerrainUniforms(encoding) { + return { + 'u_dem': 2, + 'u_dem_prev': 4, + 'u_dem_unpack': ref_properties.DEMData.getUnpackVector(encoding), + 'u_dem_tl': [ + 0, + 0 + ], + 'u_dem_tl_prev': [ + 0, + 0 + ], + 'u_dem_scale': 0, + 'u_dem_scale_prev': 0, + 'u_dem_size': 0, + 'u_dem_lerp': 1, + 'u_depth': 3, + 'u_depth_size_inv': [ + 0, + 0 + ], + 'u_exaggeration': 0 + }; +} + +function getTokenizedAttributesAndUniforms(array) { + const result = []; + for (let i = 0; i < array.length; i++) { + if (array[i] === null) + continue; + const token = array[i].split(' '); + result.push(token.pop()); + } + return result; +} +class Program { + static cacheKey(name, defines, programConfiguration) { + let key = `${ name }${ programConfiguration ? programConfiguration.cacheKey : '' }`; + for (const define of defines) { + key += `/${ define }`; + } + return key; + } + constructor(context, name, source, configuration, fixedUniforms, fixedDefines) { + const gl = context.gl; + this.program = gl.createProgram(); + const staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes); + const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : []; + const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo); + const staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : []; + const dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : []; + const uniformList = staticUniformsInfo.concat(dynamicUniformsInfo); + const allUniformsInfo = []; + for (const uniform of uniformList) { + if (allUniformsInfo.indexOf(uniform) < 0) + allUniformsInfo.push(uniform); + } + let defines = configuration ? configuration.defines() : []; + defines = defines.concat(fixedDefines.map(define => `#define ${ define }`)); + const fragmentSource = defines.concat(prelude.fragmentSource, source.fragmentSource).join('\n'); + const vertexSource = defines.concat(prelude.vertexSource, preludeTerrain.vertexSource, source.vertexSource).join('\n'); + const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + if (gl.isContextLost()) { + this.failedToCreate = true; + return; + } + gl.shaderSource(fragmentShader, fragmentSource); + gl.compileShader(fragmentShader); + gl.attachShader(this.program, fragmentShader); + const vertexShader = gl.createShader(gl.VERTEX_SHADER); + if (gl.isContextLost()) { + this.failedToCreate = true; + return; + } + gl.shaderSource(vertexShader, vertexSource); + gl.compileShader(vertexShader); + gl.attachShader(this.program, vertexShader); + this.attributes = {}; + const uniformLocations = {}; + this.numAttributes = allAttrInfo.length; + for (let i = 0; i < this.numAttributes; i++) { + if (allAttrInfo[i]) { + gl.bindAttribLocation(this.program, i, allAttrInfo[i]); + this.attributes[allAttrInfo[i]] = i; + } + } + gl.linkProgram(this.program); + gl.deleteShader(vertexShader); + gl.deleteShader(fragmentShader); + for (let it = 0; it < allUniformsInfo.length; it++) { + const uniform = allUniformsInfo[it]; + if (uniform && !uniformLocations[uniform]) { + const uniformLocation = gl.getUniformLocation(this.program, uniform); + if (uniformLocation) { + uniformLocations[uniform] = uniformLocation; + } + } + } + this.fixedUniforms = fixedUniforms(context, uniformLocations); + this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : []; + if (fixedDefines.indexOf('TERRAIN') !== -1) { + this.terrainUniforms = terrainUniforms(context, uniformLocations); + } + } + setTerrainUniformValues(context, terrainUnformValues) { + if (!this.terrainUniforms) + return; + const uniforms = this.terrainUniforms; + if (this.failedToCreate) + return; + context.program.set(this.program); + for (const name in terrainUnformValues) { + uniforms[name].set(terrainUnformValues[name]); + } + } + draw(context, drawMode, depthMode, stencilMode, colorMode, cullFaceMode, uniformValues, layerID, layoutVertexBuffer, indexBuffer, segments, currentProperties, zoom, configuration, dynamicLayoutBuffer, dynamicLayoutBuffer2) { + const gl = context.gl; + if (this.failedToCreate) + return; + context.program.set(this.program); + context.setDepthMode(depthMode); + context.setStencilMode(stencilMode); + context.setColorMode(colorMode); + context.setCullFace(cullFaceMode); + for (const name in this.fixedUniforms) { + this.fixedUniforms[name].set(uniformValues[name]); + } + if (configuration) { + configuration.setUniforms(context, this.binderUniforms, currentProperties, { zoom: zoom }); + } + const primitiveSize = { + [gl.LINES]: 2, + [gl.TRIANGLES]: 3, + [gl.LINE_STRIP]: 1 + }[drawMode]; + for (const segment of segments.get()) { + const vaos = segment.vaos || (segment.vaos = {}); + const vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); + vao.bind(context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2); + gl.drawElements(drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2); + } + } +} + +function patternUniformValues(crossfade, painter, tile) { + const tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); + const numTiles = Math.pow(2, tile.tileID.overscaledZ); + const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; + const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); + const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; + return { + 'u_image': 0, + 'u_texsize': tile.imageAtlasTexture.size, + 'u_scale': [ + tileRatio, + crossfade.fromScale, + crossfade.toScale + ], + 'u_fade': crossfade.t, + 'u_pixel_coord_upper': [ + pixelX >> 16, + pixelY >> 16 + ], + 'u_pixel_coord_lower': [ + pixelX & 65535, + pixelY & 65535 + ] + }; +} +function bgPatternUniformValues(image, crossfade, painter, tile) { + const imagePosA = painter.imageManager.getPattern(image.from.toString()); + const imagePosB = painter.imageManager.getPattern(image.to.toString()); + const {width, height} = painter.imageManager.getPixelSize(); + const numTiles = Math.pow(2, tile.tileID.overscaledZ); + const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; + const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); + const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; + return { + 'u_image': 0, + 'u_pattern_tl_a': imagePosA.tl, + 'u_pattern_br_a': imagePosA.br, + 'u_pattern_tl_b': imagePosB.tl, + 'u_pattern_br_b': imagePosB.br, + 'u_texsize': [ + width, + height + ], + 'u_mix': crossfade.t, + 'u_pattern_size_a': imagePosA.displaySize, + 'u_pattern_size_b': imagePosB.displaySize, + 'u_scale_a': crossfade.fromScale, + 'u_scale_b': crossfade.toScale, + 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), + 'u_pixel_coord_upper': [ + pixelX >> 16, + pixelY >> 16 + ], + 'u_pixel_coord_lower': [ + pixelX & 65535, + pixelY & 65535 + ] + }; +} + +const fillExtrusionUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_lightpos': new ref_properties.Uniform3f(context, locations.u_lightpos), + 'u_lightintensity': new ref_properties.Uniform1f(context, locations.u_lightintensity), + 'u_lightcolor': new ref_properties.Uniform3f(context, locations.u_lightcolor), + 'u_vertical_gradient': new ref_properties.Uniform1f(context, locations.u_vertical_gradient), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity) +}); +const fillExtrusionPatternUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_lightpos': new ref_properties.Uniform3f(context, locations.u_lightpos), + 'u_lightintensity': new ref_properties.Uniform1f(context, locations.u_lightintensity), + 'u_lightcolor': new ref_properties.Uniform3f(context, locations.u_lightcolor), + 'u_vertical_gradient': new ref_properties.Uniform1f(context, locations.u_vertical_gradient), + 'u_height_factor': new ref_properties.Uniform1f(context, locations.u_height_factor), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity) +}); +const fillExtrusionUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity) => { + const light = painter.style.light; + const _lp = light.properties.get('position'); + const lightPos = [ + _lp.x, + _lp.y, + _lp.z + ]; + const lightMat = ref_properties.create$1(); + const anchor = light.properties.get('anchor'); + if (anchor === 'viewport') { + ref_properties.fromRotation(lightMat, -painter.transform.angle); + ref_properties.transformMat3(lightPos, lightPos, lightMat); + } + const lightColor = light.properties.get('color'); + return { + 'u_matrix': matrix, + 'u_lightpos': lightPos, + 'u_lightintensity': light.properties.get('intensity'), + 'u_lightcolor': [ + lightColor.r, + lightColor.g, + lightColor.b + ], + 'u_vertical_gradient': +shouldUseVerticalGradient, + 'u_opacity': opacity + }; +}; +const fillExtrusionPatternUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) => { + return ref_properties.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), { 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 }); +}; + +const fillUniforms = (context, locations) => ({ 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) }); +const fillPatternUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade) +}); +const fillOutlineUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_world': new ref_properties.Uniform2f(context, locations.u_world) +}); +const fillOutlinePatternUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_world': new ref_properties.Uniform2f(context, locations.u_world), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade) +}); +const fillUniformValues = matrix => ({ 'u_matrix': matrix }); +const fillPatternUniformValues = (matrix, painter, crossfade, tile) => ref_properties.extend(fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile)); +const fillOutlineUniformValues = (matrix, drawingBufferSize) => ({ + 'u_matrix': matrix, + 'u_world': drawingBufferSize +}); +const fillOutlinePatternUniformValues = (matrix, painter, crossfade, tile, drawingBufferSize) => ref_properties.extend(fillPatternUniformValues(matrix, painter, crossfade, tile), { 'u_world': drawingBufferSize }); + +const circleUniforms = (context, locations) => ({ + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_extrude_scale': new ref_properties.Uniform2f(context, locations.u_extrude_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) +}); +const circleUniformValues = (painter, coord, tile, layer) => { + const transform = painter.transform; + let extrudeScale; + if (layer.paint.get('circle-pitch-alignment') === 'map') { + const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); + extrudeScale = [ + pixelRatio, + pixelRatio + ]; + } else { + extrudeScale = transform.pixelsToGLUnits; + } + return { + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_matrix': painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')), + 'u_device_pixel_ratio': ref_properties.browser.devicePixelRatio, + 'u_extrude_scale': extrudeScale + }; +}; +const circleDefinesValues = layer => { + const values = []; + if (layer.paint.get('circle-pitch-alignment') === 'map') + values.push('PITCH_WITH_MAP'); + if (layer.paint.get('circle-pitch-scale') === 'map') + values.push('SCALE_WITH_MAP'); + return values; +}; + +const collisionUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_extrude_scale': new ref_properties.Uniform2f(context, locations.u_extrude_scale) +}); +const collisionCircleUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_inv_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_matrix), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_viewport_size': new ref_properties.Uniform2f(context, locations.u_viewport_size) +}); +const collisionUniformValues = (matrix, transform, tile) => { + const pixelRatio = ref_properties.EXTENT / tile.tileSize; + return { + 'u_matrix': matrix, + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_extrude_scale': [ + transform.pixelsToGLUnits[0] / pixelRatio, + transform.pixelsToGLUnits[1] / pixelRatio + ] + }; +}; +const collisionCircleUniformValues = (matrix, invMatrix, transform) => { + return { + 'u_matrix': matrix, + 'u_inv_matrix': invMatrix, + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_viewport_size': [ + transform.width, + transform.height + ] + }; +}; + +const debugUniforms = (context, locations) => ({ + 'u_color': new ref_properties.UniformColor(context, locations.u_color), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_overlay': new ref_properties.Uniform1i(context, locations.u_overlay), + 'u_overlay_scale': new ref_properties.Uniform1f(context, locations.u_overlay_scale) +}); +const debugUniformValues = (matrix, color, scaleRatio = 1) => ({ + 'u_matrix': matrix, + 'u_color': color, + 'u_overlay': 0, + 'u_overlay_scale': scaleRatio +}); + +const heatmapUniforms = (context, locations) => ({ + 'u_extrude_scale': new ref_properties.Uniform1f(context, locations.u_extrude_scale), + 'u_intensity': new ref_properties.Uniform1f(context, locations.u_intensity), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) +}); +const heatmapTextureUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_world': new ref_properties.Uniform2f(context, locations.u_world), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_color_ramp': new ref_properties.Uniform1i(context, locations.u_color_ramp), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity) +}); +const heatmapUniformValues = (matrix, tile, zoom, intensity) => ({ + 'u_matrix': matrix, + 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom), + 'u_intensity': intensity +}); +const heatmapTextureUniformValues = (painter, layer, textureUnit, colorRampUnit) => { + const matrix = ref_properties.create(); + ref_properties.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); + const gl = painter.context.gl; + return { + 'u_matrix': matrix, + 'u_world': [ + gl.drawingBufferWidth, + gl.drawingBufferHeight + ], + 'u_image': textureUnit, + 'u_color_ramp': colorRampUnit, + 'u_opacity': layer.paint.get('heatmap-opacity') + }; +}; + +const lineUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_ratio': new ref_properties.Uniform1f(context, locations.u_ratio), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels) +}); +const lineGradientUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_ratio': new ref_properties.Uniform1f(context, locations.u_ratio), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_image_height': new ref_properties.Uniform1f(context, locations.u_image_height) +}); +const linePatternUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_ratio': new ref_properties.Uniform1f(context, locations.u_ratio), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade) +}); +const lineSDFUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_ratio': new ref_properties.Uniform1f(context, locations.u_ratio), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels), + 'u_patternscale_a': new ref_properties.Uniform2f(context, locations.u_patternscale_a), + 'u_patternscale_b': new ref_properties.Uniform2f(context, locations.u_patternscale_b), + 'u_sdfgamma': new ref_properties.Uniform1f(context, locations.u_sdfgamma), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_tex_y_a': new ref_properties.Uniform1f(context, locations.u_tex_y_a), + 'u_tex_y_b': new ref_properties.Uniform1f(context, locations.u_tex_y_b), + 'u_mix': new ref_properties.Uniform1f(context, locations.u_mix) +}); +const lineUniformValues = (painter, tile, layer, matrix) => { + const transform = painter.transform; + return { + 'u_matrix': calculateMatrix(painter, tile, layer, matrix), + 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), + 'u_device_pixel_ratio': ref_properties.browser.devicePixelRatio, + 'u_units_to_pixels': [ + 1 / transform.pixelsToGLUnits[0], + 1 / transform.pixelsToGLUnits[1] + ] + }; +}; +const lineGradientUniformValues = (painter, tile, layer, matrix, imageHeight) => { + return ref_properties.extend(lineUniformValues(painter, tile, layer, matrix), { + 'u_image': 0, + 'u_image_height': imageHeight + }); +}; +const linePatternUniformValues = (painter, tile, layer, crossfade, matrix) => { + const transform = painter.transform; + const tileZoomRatio = calculateTileRatio(tile, transform); + return { + 'u_matrix': calculateMatrix(painter, tile, layer, matrix), + 'u_texsize': tile.imageAtlasTexture.size, + 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), + 'u_device_pixel_ratio': ref_properties.browser.devicePixelRatio, + 'u_image': 0, + 'u_scale': [ + tileZoomRatio, + crossfade.fromScale, + crossfade.toScale + ], + 'u_fade': crossfade.t, + 'u_units_to_pixels': [ + 1 / transform.pixelsToGLUnits[0], + 1 / transform.pixelsToGLUnits[1] + ] + }; +}; +const lineSDFUniformValues = (painter, tile, layer, dasharray, crossfade, matrix) => { + const transform = painter.transform; + const lineAtlas = painter.lineAtlas; + const tileRatio = calculateTileRatio(tile, transform); + const round = layer.layout.get('line-cap') === 'round'; + const posA = lineAtlas.getDash(dasharray.from, round); + const posB = lineAtlas.getDash(dasharray.to, round); + const widthA = posA.width * crossfade.fromScale; + const widthB = posB.width * crossfade.toScale; + return ref_properties.extend(lineUniformValues(painter, tile, layer, matrix), { + 'u_patternscale_a': [ + tileRatio / widthA, + -posA.height / 2 + ], + 'u_patternscale_b': [ + tileRatio / widthB, + -posB.height / 2 + ], + 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * ref_properties.browser.devicePixelRatio) / 2, + 'u_image': 0, + 'u_tex_y_a': posA.y, + 'u_tex_y_b': posB.y, + 'u_mix': crossfade.t + }); +}; +function calculateTileRatio(tile, transform) { + return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom); +} +function calculateMatrix(painter, tile, layer, matrix) { + return painter.translatePosMatrix(matrix ? matrix : tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor')); +} + +const rasterUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_tl_parent': new ref_properties.Uniform2f(context, locations.u_tl_parent), + 'u_scale_parent': new ref_properties.Uniform1f(context, locations.u_scale_parent), + 'u_buffer_scale': new ref_properties.Uniform1f(context, locations.u_buffer_scale), + 'u_fade_t': new ref_properties.Uniform1f(context, locations.u_fade_t), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_image0': new ref_properties.Uniform1i(context, locations.u_image0), + 'u_image1': new ref_properties.Uniform1i(context, locations.u_image1), + 'u_brightness_low': new ref_properties.Uniform1f(context, locations.u_brightness_low), + 'u_brightness_high': new ref_properties.Uniform1f(context, locations.u_brightness_high), + 'u_saturation_factor': new ref_properties.Uniform1f(context, locations.u_saturation_factor), + 'u_contrast_factor': new ref_properties.Uniform1f(context, locations.u_contrast_factor), + 'u_spin_weights': new ref_properties.Uniform3f(context, locations.u_spin_weights) +}); +const rasterUniformValues = (matrix, parentTL, parentScaleBy, fade, layer) => ({ + 'u_matrix': matrix, + 'u_tl_parent': parentTL, + 'u_scale_parent': parentScaleBy, + 'u_buffer_scale': 1, + 'u_fade_t': fade.mix, + 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'), + 'u_image0': 0, + 'u_image1': 1, + 'u_brightness_low': layer.paint.get('raster-brightness-min'), + 'u_brightness_high': layer.paint.get('raster-brightness-max'), + 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')), + 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')), + 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')) +}); +function spinWeights(angle) { + angle *= Math.PI / 180; + const s = Math.sin(angle); + const c = Math.cos(angle); + return [ + (2 * c + 1) / 3, + (-Math.sqrt(3) * s - c + 1) / 3, + (Math.sqrt(3) * s - c + 1) / 3 + ]; +} +function contrastFactor(contrast) { + return contrast > 0 ? 1 / (1 - contrast) : 1 + contrast; +} +function saturationFactor(saturation) { + return saturation > 0 ? 1 - 1 / (1.001 - saturation) : -saturation; +} + +const symbolIconUniforms = (context, locations) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_pitch': new ref_properties.Uniform1f(context, locations.u_pitch), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture) +}); +const symbolSDFUniforms = (context, locations) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_pitch': new ref_properties.Uniform1f(context, locations.u_pitch), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture), + 'u_gamma_scale': new ref_properties.Uniform1f(context, locations.u_gamma_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_is_halo': new ref_properties.Uniform1i(context, locations.u_is_halo) +}); +const symbolTextAndIconUniforms = (context, locations) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_pitch': new ref_properties.Uniform1f(context, locations.u_pitch), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_texsize_icon': new ref_properties.Uniform2f(context, locations.u_texsize_icon), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture), + 'u_texture_icon': new ref_properties.Uniform1i(context, locations.u_texture_icon), + 'u_gamma_scale': new ref_properties.Uniform1f(context, locations.u_gamma_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_is_halo': new ref_properties.Uniform1i(context, locations.u_is_halo) +}); +const symbolIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize) => { + const transform = painter.transform; + return { + 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'), + 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'), + 'u_size_t': size ? size.uSizeT : 0, + 'u_size': size ? size.uSize : 0, + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_pitch': transform.pitch / 360 * 2 * Math.PI, + 'u_rotate_symbol': +rotateInShader, + 'u_aspect_ratio': transform.width / transform.height, + 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1, + 'u_matrix': matrix, + 'u_label_plane_matrix': labelPlaneMatrix, + 'u_coord_matrix': glCoordMatrix, + 'u_is_text': +isText, + 'u_pitch_with_map': +pitchWithMap, + 'u_texsize': texSize, + 'u_texture': 0 + }; +}; +const symbolSDFUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize, isHalo) => { + const {cameraToCenterDistance, _pitch} = painter.transform; + return ref_properties.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), { + 'u_gamma_scale': pitchWithMap ? cameraToCenterDistance * Math.cos(painter.terrain ? 0 : _pitch) : 1, + 'u_device_pixel_ratio': ref_properties.browser.devicePixelRatio, + 'u_is_halo': +isHalo + }); +}; +const symbolTextAndIconUniformValues = (functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, texSizeSDF, texSizeIcon) => { + return ref_properties.extend(symbolSDFUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF, true), { + 'u_texsize_icon': texSizeIcon, + 'u_texture_icon': 1 + }); +}; + +const backgroundUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_color': new ref_properties.UniformColor(context, locations.u_color) +}); +const backgroundPatternUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_pattern_tl_a': new ref_properties.Uniform2f(context, locations.u_pattern_tl_a), + 'u_pattern_br_a': new ref_properties.Uniform2f(context, locations.u_pattern_br_a), + 'u_pattern_tl_b': new ref_properties.Uniform2f(context, locations.u_pattern_tl_b), + 'u_pattern_br_b': new ref_properties.Uniform2f(context, locations.u_pattern_br_b), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_mix': new ref_properties.Uniform1f(context, locations.u_mix), + 'u_pattern_size_a': new ref_properties.Uniform2f(context, locations.u_pattern_size_a), + 'u_pattern_size_b': new ref_properties.Uniform2f(context, locations.u_pattern_size_b), + 'u_scale_a': new ref_properties.Uniform1f(context, locations.u_scale_a), + 'u_scale_b': new ref_properties.Uniform1f(context, locations.u_scale_b), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_tile_units_to_pixels': new ref_properties.Uniform1f(context, locations.u_tile_units_to_pixels) +}); +const backgroundUniformValues = (matrix, opacity, color) => ({ + 'u_matrix': matrix, + 'u_opacity': opacity, + 'u_color': color +}); +const backgroundPatternUniformValues = (matrix, opacity, painter, image, tile, crossfade) => ref_properties.extend(bgPatternUniformValues(image, crossfade, painter, tile), { + 'u_matrix': matrix, + 'u_opacity': opacity +}); + +const skyboxUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_sun_direction': new ref_properties.Uniform3f(context, locations.u_sun_direction), + 'u_cubemap': new ref_properties.Uniform1i(context, locations.u_cubemap), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_temporal_offset': new ref_properties.Uniform1f(context, locations.u_temporal_offset) +}); +const skyboxUniformValues = (matrix, sunDirection, cubemap, opacity, temporalOffset) => ({ + 'u_matrix': matrix, + 'u_sun_direction': sunDirection, + 'u_cubemap': cubemap, + 'u_opacity': opacity, + 'u_temporal_offset': temporalOffset +}); +const skyboxGradientUniforms = (context, locations) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_color_ramp': new ref_properties.Uniform1i(context, locations.u_color_ramp), + 'u_center_direction': new ref_properties.Uniform3f(context, locations.u_center_direction), + 'u_radius': new ref_properties.Uniform1f(context, locations.u_radius), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_temporal_offset': new ref_properties.Uniform1f(context, locations.u_temporal_offset) +}); +const skyboxGradientUniformValues = (matrix, centerDirection, radius, opacity, temporalOffset) => { + return { + 'u_matrix': matrix, + 'u_color_ramp': 0, + 'u_center_direction': centerDirection, + 'u_radius': ref_properties.degToRad(radius), + 'u_opacity': opacity, + 'u_temporal_offset': temporalOffset + }; +}; + +const skyboxCaptureUniforms = (context, locations) => ({ + 'u_matrix_3f': new ref_properties.UniformMatrix3f(context, locations.u_matrix_3f), + 'u_sun_direction': new ref_properties.Uniform3f(context, locations.u_sun_direction), + 'u_sun_intensity': new ref_properties.Uniform1f(context, locations.u_sun_intensity), + 'u_color_tint_r': new ref_properties.Uniform4f(context, locations.u_color_tint_r), + 'u_color_tint_m': new ref_properties.Uniform4f(context, locations.u_color_tint_m), + 'u_luminance': new ref_properties.Uniform1f(context, locations.u_luminance) +}); +const skyboxCaptureUniformValues = (matrix, sunDirection, sunIntensity, atmosphereColor, atmosphereHaloColor) => ({ + 'u_matrix_3f': matrix, + 'u_sun_direction': sunDirection, + 'u_sun_intensity': sunIntensity, + 'u_color_tint_r': [ + atmosphereColor.r, + atmosphereColor.g, + atmosphereColor.b, + atmosphereColor.a + ], + 'u_color_tint_m': [ + atmosphereHaloColor.r, + atmosphereHaloColor.g, + atmosphereHaloColor.b, + atmosphereHaloColor.a + ], + 'u_luminance': 0.00005 +}); + +const programUniforms = { + fillExtrusion: fillExtrusionUniforms, + fillExtrusionPattern: fillExtrusionPatternUniforms, + fill: fillUniforms, + fillPattern: fillPatternUniforms, + fillOutline: fillOutlineUniforms, + fillOutlinePattern: fillOutlinePatternUniforms, + circle: circleUniforms, + collisionBox: collisionUniforms, + collisionCircle: collisionCircleUniforms, + debug: debugUniforms, + clippingMask: clippingMaskUniforms, + heatmap: heatmapUniforms, + heatmapTexture: heatmapTextureUniforms, + hillshade: hillshadeUniforms, + hillshadePrepare: hillshadePrepareUniforms, + line: lineUniforms, + lineGradient: lineGradientUniforms, + linePattern: linePatternUniforms, + lineSDF: lineSDFUniforms, + raster: rasterUniforms, + symbolIcon: symbolIconUniforms, + symbolSDF: symbolSDFUniforms, + symbolTextAndIcon: symbolTextAndIconUniforms, + background: backgroundUniforms, + backgroundPattern: backgroundPatternUniforms, + terrainRaster: terrainRasterUniforms, + terrainDepth: terrainRasterUniforms, + skybox: skyboxUniforms, + skyboxGradient: skyboxGradientUniforms, + skyboxCapture: skyboxCaptureUniforms +}; + +let quadTriangles; +function drawCollisionDebug(painter, sourceCache, layer, coords, translate, translateAnchor, isText) { + const context = painter.context; + const gl = context.gl; + const program = painter.useProgram('collisionBox'); + const tileBatches = []; + let circleCount = 0; + let circleOffset = 0; + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; + const tile = sourceCache.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + let posMatrix = coord.posMatrix; + if (translate[0] !== 0 || translate[1] !== 0) { + posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor); + } + const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox; + const circleArray = bucket.collisionCircleArray; + if (circleArray.length > 0) { + const invTransform = ref_properties.create(); + const transform = posMatrix; + ref_properties.mul(invTransform, bucket.placementInvProjMatrix, painter.transform.glCoordMatrix); + ref_properties.mul(invTransform, invTransform, bucket.placementViewportMatrix); + tileBatches.push({ + circleArray, + circleOffset, + transform, + invTransform + }); + circleCount += circleArray.length / 4; + circleOffset = circleCount; + } + if (!buffers) + continue; + if (painter.terrain) + painter.terrain.setupElevationDraw(tile, program); + program.draw(context, gl.LINES, ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.disabled, collisionUniformValues(posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, buffers.collisionVertexBuffer, buffers.collisionVertexBufferExt); + } + if (!isText || !tileBatches.length) { + return; + } + const circleProgram = painter.useProgram('collisionCircle'); + const vertexData = new ref_properties.StructArrayLayout2f1f2i16(); + vertexData.resize(circleCount * 4); + vertexData._trim(); + let vertexOffset = 0; + for (const batch of tileBatches) { + for (let i = 0; i < batch.circleArray.length / 4; i++) { + const circleIdx = i * 4; + const x = batch.circleArray[circleIdx + 0]; + const y = batch.circleArray[circleIdx + 1]; + const radius = batch.circleArray[circleIdx + 2]; + const collision = batch.circleArray[circleIdx + 3]; + vertexData.emplace(vertexOffset++, x, y, radius, collision, 0); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 1); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 2); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 3); + } + } + if (!quadTriangles || quadTriangles.length < circleCount * 2) { + quadTriangles = createQuadTriangles(circleCount); + } + const indexBuffer = context.createIndexBuffer(quadTriangles, true); + const vertexBuffer = context.createVertexBuffer(vertexData, ref_properties.collisionCircleLayout.members, true); + for (const batch of tileBatches) { + const uniforms = collisionCircleUniformValues(batch.transform, batch.invTransform, painter.transform); + circleProgram.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.disabled, uniforms, layer.id, vertexBuffer, indexBuffer, ref_properties.SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2), null, painter.transform.zoom, null, null, null); + } + vertexBuffer.destroy(); + indexBuffer.destroy(); +} +function createQuadTriangles(quadCount) { + const triCount = quadCount * 2; + const array = new ref_properties.StructArrayLayout3ui6(); + array.resize(triCount); + array._trim(); + for (let i = 0; i < triCount; i++) { + const idx = i * 6; + array.uint16[idx + 0] = i * 4 + 0; + array.uint16[idx + 1] = i * 4 + 1; + array.uint16[idx + 2] = i * 4 + 2; + array.uint16[idx + 3] = i * 4 + 2; + array.uint16[idx + 4] = i * 4 + 3; + array.uint16[idx + 5] = i * 4 + 0; + } + return array; +} + +const identityMat4 = ref_properties.identity(new Float32Array(16)); +function drawSymbols(painter, sourceCache, layer, coords, variableOffsets) { + if (painter.renderPass !== 'translucent') + return; + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const variablePlacement = layer.layout.get('text-variable-anchor'); + if (variablePlacement) { + updateVariableAnchors(coords, painter, layer, sourceCache, layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), variableOffsets); + } + if (layer.paint.get('icon-opacity').constantOr(1) !== 0) { + drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode); + } + if (layer.paint.get('text-opacity').constantOr(1) !== 0) { + drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), stencilMode, colorMode); + } + if (sourceCache.map.showCollisionBoxes) { + drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), true); + drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), false); + } +} +function calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize) { + const {horizontalAlign, verticalAlign} = ref_properties.getAnchorAlignment(anchor); + const shiftX = -(horizontalAlign - 0.5) * width; + const shiftY = -(verticalAlign - 0.5) * height; + const variableOffset = ref_properties.evaluateVariableOffset(anchor, textOffset); + return new ref_properties.Point((shiftX / textBoxScale + variableOffset[0]) * renderTextSize, (shiftY / textBoxScale + variableOffset[1]) * renderTextSize); +} +function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) { + const tr = painter.transform; + const rotateWithMap = rotationAlignment === 'map'; + const pitchWithMap = pitchAlignment === 'map'; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket || !bucket.text || !bucket.text.segments.get().length) + continue; + const sizeData = bucket.textSizeData; + const size = ref_properties.evaluateSizeForZoom(sizeData, tr.zoom); + const pixelToTileScale = pixelsToTileUnits(tile, 1, painter.transform.zoom); + const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, pixelToTileScale); + const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData(); + if (size) { + const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); + const elevation = tr.elevation; + const getElevation = elevation ? p => elevation.getAtTileOffset(coord, p.x, p.y) : _ => 0; + updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, ref_properties.symbolSize, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size, updateTextFitIcon, getElevation); + } + } +} +function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, transform, labelPlaneMatrix, posMatrix, tileScale, size, updateTextFitIcon, getElevation) { + const placedSymbols = bucket.text.placedSymbolArray; + const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; + const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray; + const placedTextShifts = {}; + dynamicTextLayoutVertexArray.clear(); + for (let s = 0; s < placedSymbols.length; s++) { + const symbol = placedSymbols.get(s); + const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation; + const variableOffset = !symbol.hidden && symbol.crossTileID && !skipOrientation ? variableOffsets[symbol.crossTileID] : null; + if (!variableOffset) { + hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray); + } else { + const tileAnchor = new ref_properties.Point(symbol.anchorX, symbol.anchorY); + const elevation = getElevation(tileAnchor); + const projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix, elevation); + const perspectiveRatio = getPerspectiveRatio(transform.cameraToCenterDistance, projectedAnchor.signedDistanceFromCamera); + let renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / ref_properties.ONE_EM; + if (pitchWithMap) { + renderTextSize *= bucket.tilePixelRatio / tileScale; + } + const {width, height, anchor, textOffset, textBoxScale} = variableOffset; + const shift = calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize); + const shiftedAnchor = pitchWithMap ? project(tileAnchor.add(shift), labelPlaneMatrix, elevation).point : projectedAnchor.point.add(rotateWithMap ? shift.rotate(-transform.angle) : shift); + const angle = bucket.allowVerticalPlacement && symbol.placedOrientation === ref_properties.WritingMode.vertical ? Math.PI / 2 : 0; + for (let g = 0; g < symbol.numGlyphs; g++) { + ref_properties.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor, angle); + } + if (updateTextFitIcon && symbol.associatedIconIndex >= 0) { + placedTextShifts[symbol.associatedIconIndex] = { + shiftedAnchor, + angle + }; + } + } + } + if (updateTextFitIcon) { + dynamicIconLayoutVertexArray.clear(); + const placedIcons = bucket.icon.placedSymbolArray; + for (let i = 0; i < placedIcons.length; i++) { + const placedIcon = placedIcons.get(i); + if (placedIcon.hidden) { + hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); + } else { + const shift = placedTextShifts[i]; + if (!shift) { + hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); + } else { + for (let g = 0; g < placedIcon.numGlyphs; g++) { + ref_properties.addDynamicAttributes(dynamicIconLayoutVertexArray, shift.shiftedAnchor, shift.angle); + } + } + } + } + bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray); + } + bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray); +} +function getSymbolProgramName(isSDF, isText, bucket) { + if (bucket.iconsInText && isText) { + return 'symbolTextAndIcon'; + } else if (isSDF) { + return 'symbolSDF'; + } else { + return 'symbolIcon'; + } +} +function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; + const rotateWithMap = rotationAlignment === 'map'; + const pitchWithMap = pitchAlignment === 'map'; + const alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; + const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; + const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + let sortFeaturesByKey = false; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const variablePlacement = layer.layout.get('text-variable-anchor'); + const tileRenderState = []; + const defines = painter.terrain && pitchWithMap ? ['PITCH_WITH_MAP_TERRAIN'] : null; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + const buffers = isText ? bucket.text : bucket.icon; + if (!buffers || !buffers.segments.get().length) + continue; + const programConfiguration = buffers.programConfigurations.get(layer.id); + const isSDF = isText || bucket.sdfIcons; + const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; + const transformed = pitchWithMap || tr.pitch !== 0; + const program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration, defines); + const size = ref_properties.evaluateSizeForZoom(sizeData, tr.zoom); + let texSize; + let texSizeIcon = [ + 0, + 0 + ]; + let atlasTexture; + let atlasInterpolation; + let atlasTextureIcon = null; + let atlasInterpolationIcon; + if (isText) { + atlasTexture = tile.glyphAtlasTexture; + atlasInterpolation = gl.LINEAR; + texSize = tile.glyphAtlasTexture.size; + if (bucket.iconsInText) { + texSizeIcon = tile.imageAtlasTexture.size; + atlasTextureIcon = tile.imageAtlasTexture; + const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera'; + atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST; + } + } else { + const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; + atlasTexture = tile.imageAtlasTexture; + atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ? gl.LINEAR : gl.NEAREST; + texSize = tile.imageAtlasTexture.size; + } + const s = pixelsToTileUnits(tile, 1, painter.transform.zoom); + const labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); + const labelPlaneMatrixInv = painter.terrain && pitchWithMap && alongLine ? ref_properties.invert(new Float32Array(16), labelPlaneMatrix) : identityMat4; + const glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); + const hasVariableAnchors = variablePlacement && bucket.hasTextData(); + const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && hasVariableAnchors && bucket.hasIconData(); + if (alongLine) { + const elevation = tr.elevation; + const getElevation = elevation ? p => elevation.getAtTileOffset(coord, p.x, p.y) : null; + updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, getElevation); + } + const matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = alongLine || isText && variablePlacement || updateTextFitIcon ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); + const hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; + let uniformValues; + if (isSDF) { + if (!bucket.iconsInText) { + uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true); + } else { + uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon); + } + } else { + uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize); + } + const state = { + program, + buffers, + uniformValues, + atlasTexture, + atlasTextureIcon, + atlasInterpolation, + atlasInterpolationIcon, + isSDF, + hasHalo, + tile, + labelPlaneMatrixInv + }; + if (hasSortKey && bucket.canOverlap) { + sortFeaturesByKey = true; + const oldSegments = buffers.segments.get(); + for (const segment of oldSegments) { + tileRenderState.push({ + segments: new ref_properties.SegmentVector([segment]), + sortKey: segment.sortKey, + state + }); + } + } else { + tileRenderState.push({ + segments: buffers.segments, + sortKey: 0, + state + }); + } + } + if (sortFeaturesByKey) { + tileRenderState.sort((a, b) => a.sortKey - b.sortKey); + } + for (const segmentState of tileRenderState) { + const state = segmentState.state; + if (painter.terrain) + painter.terrain.setupElevationDraw(state.tile, state.program, { + useDepthForOcclusion: true, + labelPlaneMatrixInv: state.labelPlaneMatrixInv + }); + context.activeTexture.set(gl.TEXTURE0); + state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE); + if (state.atlasTextureIcon) { + context.activeTexture.set(gl.TEXTURE1); + if (state.atlasTextureIcon) { + state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE); + } + } + if (state.isSDF) { + const uniformValues = state.uniformValues; + if (state.hasHalo) { + uniformValues['u_is_halo'] = 1; + drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues); + } + uniformValues['u_is_halo'] = 0; + } + drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues); + } +} +function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { + const context = painter.context; + const gl = context.gl; + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); +} + +function drawCircles(painter, sourceCache, layer, coords) { + if (painter.renderPass !== 'translucent') + return; + const opacity = layer.paint.get('circle-opacity'); + const strokeWidth = layer.paint.get('circle-stroke-width'); + const strokeOpacity = layer.paint.get('circle-stroke-opacity'); + const sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined; + if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { + return; + } + const context = painter.context; + const gl = context.gl; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const segmentsRenderStates = []; + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; + const tile = sourceCache.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + const programConfiguration = bucket.programConfigurations.get(layer.id); + const definesValues = circleDefinesValues(layer); + const program = painter.useProgram('circle', programConfiguration, definesValues); + const layoutVertexBuffer = bucket.layoutVertexBuffer; + const indexBuffer = bucket.indexBuffer; + const uniformValues = circleUniformValues(painter, coord, tile, layer); + const state = { + programConfiguration, + program, + layoutVertexBuffer, + indexBuffer, + uniformValues, + tile + }; + if (sortFeaturesByKey) { + const oldSegments = bucket.segments.get(); + for (const segment of oldSegments) { + segmentsRenderStates.push({ + segments: new ref_properties.SegmentVector([segment]), + sortKey: segment.sortKey, + state + }); + } + } else { + segmentsRenderStates.push({ + segments: bucket.segments, + sortKey: 0, + state + }); + } + } + if (sortFeaturesByKey) { + segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey); + } + for (const segmentsState of segmentsRenderStates) { + const {programConfiguration, program, layoutVertexBuffer, indexBuffer, uniformValues, tile} = segmentsState.state; + const segments = segmentsState.segments; + if (painter.terrain) + painter.terrain.setupElevationDraw(tile, program, { useDepthForOcclusion: true }); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration); + } +} + +function drawHeatmap(painter, sourceCache, layer, coords) { + if (layer.paint.get('heatmap-opacity') === 0) { + return; + } + if (painter.renderPass === 'offscreen') { + const context = painter.context; + const gl = context.gl; + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = new ref_properties.ColorMode([ + gl.ONE, + gl.ONE + ], ref_properties.Color.transparent, [ + true, + true, + true, + true + ]); + bindFramebuffer(context, painter, layer); + context.clear({ color: ref_properties.Color.transparent }); + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; + if (sourceCache.hasRenderableParent(coord)) + continue; + const tile = sourceCache.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram('heatmap', programConfiguration); + const {zoom} = painter.transform; + if (painter.terrain) + painter.terrain.setupElevationDraw(tile, program); + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); + } + context.viewport.set([ + 0, + 0, + painter.width, + painter.height + ]); + } else if (painter.renderPass === 'translucent') { + painter.context.setColorMode(painter.colorModeForRenderPass()); + renderTextureToMap(painter, layer); + } +} +function bindFramebuffer(context, painter, layer) { + const gl = context.gl; + context.activeTexture.set(gl.TEXTURE1); + context.viewport.set([ + 0, + 0, + painter.width / 4, + painter.height / 4 + ]); + let fbo = layer.heatmapFbo; + if (!fbo) { + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4, false); + bindTextureToFramebuffer(context, painter, texture, fbo); + } else { + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); + context.bindFramebuffer.set(fbo.framebuffer); + } +} +function bindTextureToFramebuffer(context, painter, texture, fbo) { + const gl = context.gl; + const internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE; + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, internalFormat, null); + fbo.colorAttachment.set(texture); +} +function renderTextureToMap(painter, layer) { + const context = painter.context; + const gl = context.gl; + const fbo = layer.heatmapFbo; + if (!fbo) + return; + context.activeTexture.set(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); + context.activeTexture.set(gl.TEXTURE1); + let colorRampTexture = layer.colorRampTexture; + if (!colorRampTexture) { + colorRampTexture = layer.colorRampTexture = new ref_properties.Texture(context, layer.colorRamp, gl.RGBA); + } + colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom); +} + +function drawLine(painter, sourceCache, layer, coords) { + if (painter.renderPass !== 'translucent') + return; + const opacity = layer.paint.get('line-opacity'); + const width = layer.paint.get('line-width'); + if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) + return; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); + const dasharray = layer.paint.get('line-dasharray'); + const patternProperty = layer.paint.get('line-pattern'); + const image = patternProperty.constantOr(1); + const gradient = layer.paint.get('line-gradient'); + const crossfade = layer.getCrossfadeParameters(); + const programId = image ? 'linePattern' : dasharray ? 'lineSDF' : gradient ? 'lineGradient' : 'line'; + const context = painter.context; + const gl = context.gl; + let firstTile = true; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (image && !tile.patternsLoaded()) + continue; + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + painter.prepareDrawTile(coord); + const programConfiguration = bucket.programConfigurations.get(layer.id); + const prevProgram = painter.context.program.get(); + const program = painter.useProgram(programId, programConfiguration); + const programChanged = firstTile || program.program !== prevProgram; + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) + programConfiguration.setConstantPatternPositions(posTo, posFrom); + } + const matrix = painter.terrain ? coord.posMatrix : null; + const uniformValues = image ? linePatternUniformValues(painter, tile, layer, crossfade, matrix) : dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade, matrix) : gradient ? lineGradientUniformValues(painter, tile, layer, matrix, bucket.lineClipsArray.length) : lineUniformValues(painter, tile, layer, matrix); + if (image) { + context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); + } else if (dasharray && (programChanged || painter.lineAtlas.dirty)) { + context.activeTexture.set(gl.TEXTURE0); + painter.lineAtlas.bind(context); + } else if (gradient) { + const layerGradient = bucket.gradients[layer.id]; + let gradientTexture = layerGradient.texture; + if (layer.gradientVersion !== layerGradient.version) { + let textureResolution = 256; + if (layer.stepInterpolant) { + const sourceMaxZoom = sourceCache.getSource().maxzoom; + const potentialOverzoom = coord.canonical.z === sourceMaxZoom ? Math.ceil(1 << painter.transform.maxZoom - coord.canonical.z) : 1; + const lineLength = bucket.maxLineLength / ref_properties.EXTENT; + const maxTilePixelSize = 1024; + const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom; + textureResolution = ref_properties.clamp(ref_properties.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize); + } + layerGradient.gradient = ref_properties.renderColorRamp({ + expression: layer.gradientExpression(), + evaluationKey: 'lineProgress', + resolution: textureResolution, + image: layerGradient.gradient || undefined, + clips: bucket.lineClipsArray + }); + if (layerGradient.texture) { + layerGradient.texture.update(layerGradient.gradient); + } else { + layerGradient.texture = new ref_properties.Texture(context, layerGradient.gradient, gl.RGBA); + } + layerGradient.version = layer.gradientVersion; + gradientTexture = layerGradient.texture; + } + context.activeTexture.set(gl.TEXTURE0); + gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE); + } + program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2); + firstTile = false; + } +} + +function drawFill(painter, sourceCache, layer, coords) { + const color = layer.paint.get('fill-color'); + const opacity = layer.paint.get('fill-opacity'); + if (opacity.constantOr(1) === 0) { + return; + } + const colorMode = painter.colorModeForRenderPass(); + const pattern = layer.paint.get('fill-pattern'); + const pass = painter.opaquePassEnabledForLayer() && (!pattern.constantOr(1) && color.constantOr(ref_properties.Color.transparent).a === 1 && opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; + if (painter.renderPass === pass) { + const depthMode = painter.depthModeForSublayer(1, painter.renderPass === 'opaque' ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly); + drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); + } + if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { + const depthMode = painter.depthModeForSublayer(layer.getPaintProperty('fill-outline-color') ? 2 : 0, ref_properties.DepthMode.ReadOnly); + drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true); + } +} +function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { + const gl = painter.context.gl; + const patternProperty = layer.paint.get('fill-pattern'); + const image = patternProperty && patternProperty.constantOr(1); + const crossfade = layer.getCrossfadeParameters(); + let drawMode, programName, uniformValues, indexBuffer, segments; + if (!isOutline) { + programName = image ? 'fillPattern' : 'fill'; + drawMode = gl.TRIANGLES; + } else { + programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'; + drawMode = gl.LINES; + } + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (image && !tile.patternsLoaded()) + continue; + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + painter.prepareDrawTile(coord); + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram(programName, programConfiguration); + if (image) { + painter.context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); + } + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) + programConfiguration.setConstantPatternPositions(posTo, posFrom); + } + const tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); + if (!isOutline) { + indexBuffer = bucket.indexBuffer; + segments = bucket.segments; + uniformValues = image ? fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : fillUniformValues(tileMatrix); + } else { + indexBuffer = bucket.indexBuffer2; + segments = bucket.segments2; + const drawingBufferSize = painter.terrain && painter.terrain.renderingToTexture ? painter.terrain.drapeBufferSize : [ + gl.drawingBufferWidth, + gl.drawingBufferHeight + ]; + uniformValues = programName === 'fillOutlinePattern' && image ? fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : fillOutlineUniformValues(tileMatrix, drawingBufferSize); + } + program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration); + } +} + +function draw(painter, source, layer, coords) { + const opacity = layer.paint.get('fill-extrusion-opacity'); + if (opacity === 0) { + return; + } + if (painter.renderPass === 'translucent') { + const depthMode = new ref_properties.DepthMode(painter.context.gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); + if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr(1)) { + const colorMode = painter.colorModeForRenderPass(); + drawExtrusionTiles(painter, source, layer, coords, depthMode, ref_properties.StencilMode.disabled, colorMode); + } else { + drawExtrusionTiles(painter, source, layer, coords, depthMode, ref_properties.StencilMode.disabled, ref_properties.ColorMode.disabled); + drawExtrusionTiles(painter, source, layer, coords, depthMode, painter.stencilModeFor3D(), painter.colorModeForRenderPass()); + } + } +} +function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const patternProperty = layer.paint.get('fill-extrusion-pattern'); + const image = patternProperty.constantOr(1); + const crossfade = layer.getCrossfadeParameters(); + const opacity = layer.paint.get('fill-extrusion-opacity'); + for (const coord of coords) { + const tile = source.getTile(coord); + const bucket = tile.getBucket(layer); + if (!bucket) + continue; + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); + if (painter.terrain) { + const terrain = painter.terrain; + if (!bucket.enableTerrain) + continue; + terrain.setupElevationDraw(tile, program, { useMeterToDem: true }); + flatRoofsUpdate(context, source, coord, bucket, layer, terrain); + if (!bucket.centroidVertexBuffer) { + const attrIndex = program.attributes['a_centroid_pos']; + if (attrIndex !== undefined) + gl.vertexAttrib2f(attrIndex, 0, 0); + } + } + if (image) { + painter.context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); + } + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) + programConfiguration.setConstantPatternPositions(posTo, posFrom); + } + const matrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor')); + const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); + const uniformValues = image ? fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) : fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity); + program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration, painter.terrain ? bucket.centroidVertexBuffer : null); + } +} +function flatRoofsUpdate(context, source, coord, bucket, layer, terrain) { + const neighborCoord = [ + coord => { + let x = coord.canonical.x - 1; + let w = coord.wrap; + if (x < 0) { + x = (1 << coord.canonical.z) - 1; + w--; + } + return new ref_properties.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); + }, + coord => { + let x = coord.canonical.x + 1; + let w = coord.wrap; + if (x === 1 << coord.canonical.z) { + x = 0; + w++; + } + return new ref_properties.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); + }, + coord => new ref_properties.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, (coord.canonical.y === 0 ? 1 << coord.canonical.z : coord.canonical.y) - 1), + coord => new ref_properties.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, coord.canonical.y === (1 << coord.canonical.z) - 1 ? 0 : coord.canonical.y + 1) + ]; + const getLoadedBucket = nid => { + const maxzoom = source.getSource().maxzoom; + for (const j of [ + 0, + -1, + 1 + ]) { + if (nid.overscaledZ + j < maxzoom) + continue; + if (j > 0 && nid.overscaledZ < maxzoom) + continue; + const n = source.getTileByID(nid.calculateScaledKey(nid.overscaledZ + j)); + if (n && n.hasData()) { + const nBucket = n.getBucket(layer); + if (nBucket) + return nBucket; + } + } + }; + const projectedToBorder = [ + 0, + 0, + 0 + ]; + const xjoin = (a, b) => { + projectedToBorder[0] = Math.min(a.min.y, b.min.y); + projectedToBorder[1] = Math.max(a.max.y, b.max.y); + projectedToBorder[2] = ref_properties.EXTENT - b.min.x > a.max.x ? b.min.x - ref_properties.EXTENT : a.max.x; + return projectedToBorder; + }; + const yjoin = (a, b) => { + projectedToBorder[0] = Math.min(a.min.x, b.min.x); + projectedToBorder[1] = Math.max(a.max.x, b.max.x); + projectedToBorder[2] = ref_properties.EXTENT - b.min.y > a.max.y ? b.min.y - ref_properties.EXTENT : a.max.y; + return projectedToBorder; + }; + const projectCombinedSpanToBorder = [ + (a, b) => xjoin(a, b), + (a, b) => xjoin(b, a), + (a, b) => yjoin(a, b), + (a, b) => yjoin(b, a) + ]; + const centroid = new ref_properties.Point(0, 0); + const error = 3; + let demTile, neighborDEMTile, neighborTileID; + const flatBase = (min, max, edge, verticalEdge, maxOffsetFromBorder) => { + const points = [ + [ + verticalEdge ? edge : min, + verticalEdge ? min : edge, + 0 + ], + [ + verticalEdge ? edge : max, + verticalEdge ? max : edge, + 0 + ] + ]; + const coord3 = maxOffsetFromBorder < 0 ? ref_properties.EXTENT + maxOffsetFromBorder : maxOffsetFromBorder; + const thirdPoint = [ + verticalEdge ? coord3 : (min + max) / 2, + verticalEdge ? (min + max) / 2 : coord3, + 0 + ]; + if (edge === 0 && maxOffsetFromBorder < 0 || edge !== 0 && maxOffsetFromBorder > 0) { + terrain.getForTilePoints(neighborTileID, [thirdPoint], true, neighborDEMTile); + } else { + points.push(thirdPoint); + } + terrain.getForTilePoints(coord, points, true, demTile); + return Math.max(points[0][2], points[1][2], thirdPoint[2]) / terrain.exaggeration(); + }; + for (let i = 0; i < 4; i++) { + const a = bucket.borders[i]; + if (a.length === 0) { + bucket.borderDone[i] = true; + } + if (bucket.borderDone[i]) + continue; + const nid = neighborTileID = neighborCoord[i](coord); + const nBucket = getLoadedBucket(nid); + if (!nBucket || !nBucket.enableTerrain) + continue; + neighborDEMTile = terrain.findDEMTileFor(nid); + if (!neighborDEMTile || !neighborDEMTile.dem) + continue; + if (!demTile) { + const dem = terrain.findDEMTileFor(coord); + if (!(dem && dem.dem)) + return; + demTile = dem; + } + const j = (i < 2 ? 1 : 5) - i; + const b = nBucket.borders[j]; + let ib = 0; + for (let ia = 0; ia < a.length; ia++) { + const parta = bucket.featuresOnBorder[a[ia]]; + const partABorderRange = parta.borders[i]; + let partb; + while (ib < b.length) { + partb = nBucket.featuresOnBorder[b[ib]]; + const partBBorderRange = partb.borders[j]; + if (partBBorderRange[1] > partABorderRange[0] + error) + break; + if (!nBucket.borderDone[j]) + nBucket.encodeCentroid(undefined, partb, false); + ib++; + } + if (partb && ib < b.length) { + const saveIb = ib; + let count = 0; + while (true) { + const partBBorderRange = partb.borders[j]; + if (partBBorderRange[0] > partABorderRange[1] - error) + break; + count++; + if (++ib === b.length) + break; + partb = nBucket.featuresOnBorder[b[ib]]; + } + partb = nBucket.featuresOnBorder[b[saveIb]]; + if (parta.intersectsCount() > 1 || partb.intersectsCount() > 1 || count !== 1) { + if (count !== 1) { + ib = saveIb; + } + bucket.encodeCentroid(undefined, parta, false); + if (!nBucket.borderDone[j]) + nBucket.encodeCentroid(undefined, partb, false); + continue; + } + const span = projectCombinedSpanToBorder[i](parta, partb); + const edge = i % 2 ? ref_properties.EXTENT - 1 : 0; + centroid.x = flatBase(span[0], Math.min(ref_properties.EXTENT - 1, span[1]), edge, i < 2, span[2]); + centroid.y = 0; + bucket.encodeCentroid(centroid, parta, false); + if (!nBucket.borderDone[j]) + nBucket.encodeCentroid(centroid, partb, false); + } else { + bucket.encodeCentroid(undefined, parta, false); + } + } + bucket.borderDone[i] = bucket.needsCentroidUpdate = true; + if (!nBucket.borderDone[j]) { + nBucket.borderDone[j] = nBucket.needsCentroidUpdate = true; + } + } + if (bucket.needsCentroidUpdate || !bucket.centroidVertexBuffer && bucket.centroidVertexArray.length !== 0) { + bucket.uploadCentroid(context); + } +} + +function drawRaster(painter, sourceCache, layer, tileIDs, variableOffsets, isInitialLoad) { + if (painter.renderPass !== 'translucent') + return; + if (layer.paint.get('raster-opacity') === 0) + return; + if (!tileIDs.length) + return; + const context = painter.context; + const gl = context.gl; + const source = sourceCache.getSource(); + const program = painter.useProgram('raster'); + const colorMode = painter.colorModeForRenderPass(); + const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; + const [stencilModes, coords] = source instanceof ImageSource || renderingToTexture ? [ + {}, + tileIDs + ] : painter.stencilConfigForOverlap(tileIDs); + const minTileZ = coords[coords.length - 1].overscaledZ; + const align = !painter.options.moving; + for (const coord of coords) { + const depthMode = renderingToTexture ? ref_properties.DepthMode.disabled : painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly, gl.LESS); + const tile = sourceCache.getTile(coord); + if (renderingToTexture && !(tile && tile.hasData())) + continue; + const posMatrix = renderingToTexture ? coord.posMatrix : painter.transform.calculatePosMatrix(coord.toUnwrapped(), align); + const stencilMode = painter.terrain && renderingToTexture ? painter.terrain.stencilModeForRTTOverlap(coord) : stencilModes[coord.overscaledZ]; + const rasterFadeDuration = isInitialLoad ? 0 : layer.paint.get('raster-fade-duration'); + tile.registerFadeDuration(rasterFadeDuration); + const parentTile = sourceCache.findLoadedParent(coord, 0); + const fade = rasterFade(tile, parentTile, sourceCache, painter.transform, rasterFadeDuration); + if (painter.terrain) + painter.terrain.prepareDrawTile(coord); + let parentScaleBy, parentTL; + const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + context.activeTexture.set(gl.TEXTURE1); + if (parentTile) { + parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); + parentTL = [ + tile.tileID.canonical.x * parentScaleBy % 1, + tile.tileID.canonical.y * parentScaleBy % 1 + ]; + } else { + tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + } + const uniformValues = rasterUniformValues(posMatrix, parentTL || [ + 0, + 0 + ], parentScaleBy || 1, fade, layer); + if (source instanceof ImageSource) { + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments); + } else { + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); + } + } +} + +function drawBackground(painter, sourceCache, layer, coords) { + const color = layer.paint.get('background-color'); + const opacity = layer.paint.get('background-opacity'); + if (opacity === 0) + return; + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const tileSize = transform.tileSize; + const image = layer.paint.get('background-pattern'); + if (painter.isPatternMissing(image)) + return; + const pass = !image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer() ? 'opaque' : 'translucent'; + if (painter.renderPass !== pass) + return; + const stencilMode = ref_properties.StencilMode.disabled; + const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); + const program = painter.useProgram(image ? 'backgroundPattern' : 'background'); + const tileIDs = coords ? coords : transform.coveringTiles({ tileSize }); + if (image) { + context.activeTexture.set(gl.TEXTURE0); + painter.imageManager.bind(painter.context); + } + const crossfade = layer.getCrossfadeParameters(); + for (const tileID of tileIDs) { + const matrix = coords ? tileID.posMatrix : painter.transform.calculatePosMatrix(tileID.toUnwrapped()); + painter.prepareDrawTile(tileID); + const uniformValues = image ? backgroundPatternUniformValues(matrix, opacity, painter, image, { + tileID, + tileSize + }, crossfade) : backgroundUniformValues(matrix, opacity, color); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments); + } +} + +const topColor = new ref_properties.Color(1, 0, 0, 1); +const btmColor = new ref_properties.Color(0, 1, 0, 1); +const leftColor = new ref_properties.Color(0, 0, 1, 1); +const rightColor = new ref_properties.Color(1, 0, 1, 1); +const centerColor = new ref_properties.Color(0, 1, 1, 1); +function drawDebugPadding(painter) { + const padding = painter.transform.padding; + const lineWidth = 3; + drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor); + drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor); + drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor); + drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor); + const center = painter.transform.centerPoint; + drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor); +} +function drawCrosshair(painter, x, y, color) { + const size = 20; + const lineWidth = 2; + drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color); + drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color); +} +function drawHorizontalLine(painter, y, lineWidth, color) { + drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color); +} +function drawVerticalLine(painter, x, lineWidth, color) { + drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color); +} +function drawDebugSSRect(painter, x, y, width, height, color) { + const context = painter.context; + const gl = context.gl; + gl.enable(gl.SCISSOR_TEST); + gl.scissor(x * ref_properties.browser.devicePixelRatio, y * ref_properties.browser.devicePixelRatio, width * ref_properties.browser.devicePixelRatio, height * ref_properties.browser.devicePixelRatio); + context.clear({ color }); + gl.disable(gl.SCISSOR_TEST); +} +function drawDebug(painter, sourceCache, coords) { + for (let i = 0; i < coords.length; i++) { + drawDebugTile(painter, sourceCache, coords[i]); + } +} +function drawDebugTile(painter, sourceCache, coord) { + const context = painter.context; + const gl = context.gl; + const posMatrix = coord.posMatrix; + const program = painter.useProgram('debug'); + const tile = sourceCache.getTileByID(coord.key); + if (painter.terrain) + painter.terrain.setupElevationDraw(tile, program); + const depthMode = ref_properties.DepthMode.disabled; + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const id = '$debug'; + context.activeTexture.set(gl.TEXTURE0); + painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, debugUniformValues(posMatrix, ref_properties.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments); + const tileRawData = tile.latestRawTileData; + const tileByteLength = tileRawData && tileRawData.byteLength || 0; + const tileSizeKb = Math.floor(tileByteLength / 1024); + const tileSize = sourceCache.getTile(coord).tileSize; + const scaleRatio = 512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom) * 0.5; + let tileIdText = coord.canonical.toString(); + if (coord.overscaledZ !== coord.canonical.z) { + tileIdText += ` => ${ coord.overscaledZ }`; + } + const tileLabel = `${ tileIdText } ${ tileSizeKb }kb`; + drawTextToOverlay(painter, tileLabel); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, ref_properties.ColorMode.alphaBlended, ref_properties.CullFaceMode.disabled, debugUniformValues(posMatrix, ref_properties.Color.transparent, scaleRatio), id, painter.debugBuffer, painter.quadTriangleIndexBuffer, painter.debugSegments); +} +function drawTextToOverlay(painter, text) { + painter.initDebugOverlayCanvas(); + const canvas = painter.debugOverlayCanvas; + const gl = painter.context.gl; + const ctx2d = painter.debugOverlayCanvas.getContext('2d'); + ctx2d.clearRect(0, 0, canvas.width, canvas.height); + ctx2d.shadowColor = 'white'; + ctx2d.shadowBlur = 2; + ctx2d.lineWidth = 1.5; + ctx2d.strokeStyle = 'white'; + ctx2d.textBaseline = 'top'; + ctx2d.font = `bold ${ 36 }px Open Sans, sans-serif`; + ctx2d.fillText(text, 5, 5); + ctx2d.strokeText(text, 5, 5); + painter.debugOverlayTexture.update(canvas); + painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); +} + +function drawCustom(painter, sourceCache, layer) { + const context = painter.context; + const implementation = layer.implementation; + if (painter.renderPass === 'offscreen') { + const prerender = implementation.prerender; + if (prerender) { + painter.setCustomLayerDefaults(); + context.setColorMode(painter.colorModeForRenderPass()); + prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); + context.setDirty(); + painter.setBaseState(); + } + } else if (painter.renderPass === 'translucent') { + painter.setCustomLayerDefaults(); + context.setColorMode(painter.colorModeForRenderPass()); + context.setStencilMode(ref_properties.StencilMode.disabled); + const depthMode = implementation.renderingMode === '3d' ? new ref_properties.DepthMode(painter.context.gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D) : painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + context.setDepthMode(depthMode); + implementation.render(context.gl, painter.transform.customLayerMatrix()); + context.setDirty(); + painter.setBaseState(); + context.bindFramebuffer.set(null); + } +} + +const skyboxAttributes = ref_properties.createLayout([{ + name: 'a_pos_3f', + components: 3, + type: 'Float32' + }]); +const {members, size, alignment} = skyboxAttributes; + +function addVertex(vertexArray, x, y, z) { + vertexArray.emplaceBack(x, y, z); +} +class SkyboxGeometry { + constructor(context) { + this.vertexArray = new ref_properties.StructArrayLayout3f12(); + this.indices = new ref_properties.StructArrayLayout3ui6(); + addVertex(this.vertexArray, -1, -1, 1); + addVertex(this.vertexArray, 1, -1, 1); + addVertex(this.vertexArray, -1, 1, 1); + addVertex(this.vertexArray, 1, 1, 1); + addVertex(this.vertexArray, -1, -1, -1); + addVertex(this.vertexArray, 1, -1, -1); + addVertex(this.vertexArray, -1, 1, -1); + addVertex(this.vertexArray, 1, 1, -1); + this.indices.emplaceBack(5, 1, 3); + this.indices.emplaceBack(3, 7, 5); + this.indices.emplaceBack(6, 2, 0); + this.indices.emplaceBack(0, 4, 6); + this.indices.emplaceBack(2, 6, 7); + this.indices.emplaceBack(7, 3, 2); + this.indices.emplaceBack(5, 4, 0); + this.indices.emplaceBack(0, 1, 5); + this.indices.emplaceBack(0, 2, 3); + this.indices.emplaceBack(3, 1, 0); + this.indices.emplaceBack(7, 6, 4); + this.indices.emplaceBack(4, 5, 7); + this.vertexBuffer = context.createVertexBuffer(this.vertexArray, members); + this.indexBuffer = context.createIndexBuffer(this.indices); + this.segment = ref_properties.SegmentVector.simpleSegment(0, 0, 36, 12); + } +} + +function drawSky(painter, sourceCache, layer) { + const opacity = layer.paint.get('sky-opacity'); + if (opacity === 0) { + return; + } + const context = painter.context; + const type = layer.paint.get('sky-type'); + const depthMode = new ref_properties.DepthMode(context.gl.LEQUAL, ref_properties.DepthMode.ReadOnly, [ + 0, + 1 + ]); + const temporalOffset = painter.frameCounter / 1000 % 1; + if (type === 'atmosphere') { + if (painter.renderPass === 'offscreen') { + if (layer.needsSkyboxCapture(painter)) { + captureSkybox(painter, layer, 32, 32); + layer.markSkyboxValid(painter); + } + } else if (painter.renderPass === 'sky') { + drawSkyboxFromCapture(painter, layer, depthMode, opacity, temporalOffset); + } + } else if (type === 'gradient') { + if (painter.renderPass === 'sky') { + drawSkyboxGradient(painter, layer, depthMode, opacity, temporalOffset); + } + } +} +function drawSkyboxGradient(painter, layer, depthMode, opacity, temporalOffset) { + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const program = painter.useProgram('skyboxGradient'); + if (!layer.skyboxGeometry) { + layer.skyboxGeometry = new SkyboxGeometry(context); + } + context.activeTexture.set(gl.TEXTURE0); + let colorRampTexture = layer.colorRampTexture; + if (!colorRampTexture) { + colorRampTexture = layer.colorRampTexture = new ref_properties.Texture(context, layer.colorRamp, gl.RGBA); + } + colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + const uniformValues = skyboxGradientUniformValues(transform.skyboxMatrix, layer.getCenter(painter, false), layer.paint.get('sky-gradient-radius'), opacity, temporalOffset); + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.backCW, uniformValues, 'skyboxGradient', layer.skyboxGeometry.vertexBuffer, layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} +function drawSkyboxFromCapture(painter, layer, depthMode, opacity, temporalOffset) { + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const program = painter.useProgram('skybox'); + context.activeTexture.set(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); + const uniformValues = skyboxUniformValues(transform.skyboxMatrix, layer.getCenter(painter, false), 0, opacity, temporalOffset); + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.backCW, uniformValues, 'skybox', layer.skyboxGeometry.vertexBuffer, layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} +function drawSkyboxFace(context, layer, program, faceRotate, sunDirection, i) { + const gl = context.gl; + const atmosphereColor = layer.paint.get('sky-atmosphere-color'); + const atmosphereHaloColor = layer.paint.get('sky-atmosphere-halo-color'); + const sunIntensity = layer.paint.get('sky-atmosphere-sun-intensity'); + const uniformValues = skyboxCaptureUniformValues(ref_properties.fromMat4([], faceRotate), sunDirection, sunIntensity, atmosphereColor, atmosphereHaloColor); + const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, glFace, layer.skyboxTexture, 0); + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, ref_properties.ColorMode.unblended, ref_properties.CullFaceMode.frontCW, uniformValues, 'skyboxCapture', layer.skyboxGeometry.vertexBuffer, layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} +function captureSkybox(painter, layer, width, height) { + const context = painter.context; + const gl = context.gl; + let fbo = layer.skyboxFbo; + if (!fbo) { + fbo = layer.skyboxFbo = context.createFramebuffer(width, height, false); + layer.skyboxGeometry = new SkyboxGeometry(context); + layer.skyboxTexture = context.gl.createTexture(); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + for (let i = 0; i < 6; ++i) { + const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; + gl.texImage2D(glFace, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + } + context.bindFramebuffer.set(fbo.framebuffer); + context.viewport.set([ + 0, + 0, + width, + height + ]); + const sunDirection = layer.getCenter(painter, true); + const program = painter.useProgram('skyboxCapture'); + const faceRotate = new Float64Array(16); + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, -Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 0); + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 1); + ref_properties.identity(faceRotate); + ref_properties.rotateX(faceRotate, faceRotate, -Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 2); + ref_properties.identity(faceRotate); + ref_properties.rotateX(faceRotate, faceRotate, Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 3); + ref_properties.identity(faceRotate); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 4); + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, Math.PI); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 5); + context.viewport.set([ + 0, + 0, + painter.width, + painter.height + ]); +} + +const draw$1 = { + symbol: drawSymbols, + circle: drawCircles, + heatmap: drawHeatmap, + line: drawLine, + fill: drawFill, + 'fill-extrusion': draw, + hillshade: drawHillshade, + raster: drawRaster, + background: drawBackground, + sky: drawSky, + debug: drawDebug, + custom: drawCustom +}; +class Painter { + constructor(gl, transform) { + this.context = new ref_properties.Context(gl); + this.transform = transform; + this._tileTextures = {}; + this.frameCopies = []; + this.loadTimeStamps = []; + this.setup(); + this.numSublayers = ref_properties.SourceCache.maxUnderzooming + ref_properties.SourceCache.maxOverzooming + 1; + this.depthEpsilon = 1 / Math.pow(2, 16); + this.crossTileSymbolIndex = new CrossTileSymbolIndex(); + this.gpuTimers = {}; + this.frameCounter = 0; + } + updateTerrain(style, cameraChanging) { + const enabled = !!style && !!style.terrain; + if (!enabled && (!this._terrain || !this._terrain.enabled)) + return; + if (!this._terrain) { + this._terrain = new Terrain$1(this, style); + } + const terrain = this._terrain; + this.transform.elevation = enabled ? terrain : null; + terrain.update(style, this.transform, cameraChanging); + } + get terrain() { + return this._terrain && this._terrain.enabled ? this._terrain : null; + } + resize(width, height) { + this.width = width * ref_properties.browser.devicePixelRatio; + this.height = height * ref_properties.browser.devicePixelRatio; + this.context.viewport.set([ + 0, + 0, + this.width, + this.height + ]); + if (this.style) { + for (const layerId of this.style.order) { + this.style._layers[layerId].resize(); + } + } + } + setup() { + const context = this.context; + const tileExtentArray = new ref_properties.StructArrayLayout2i4(); + tileExtentArray.emplaceBack(0, 0); + tileExtentArray.emplaceBack(ref_properties.EXTENT, 0); + tileExtentArray.emplaceBack(0, ref_properties.EXTENT); + tileExtentArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT); + this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, ref_properties.posAttributes.members); + this.tileExtentSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + const debugArray = new ref_properties.StructArrayLayout2i4(); + debugArray.emplaceBack(0, 0); + debugArray.emplaceBack(ref_properties.EXTENT, 0); + debugArray.emplaceBack(0, ref_properties.EXTENT); + debugArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT); + this.debugBuffer = context.createVertexBuffer(debugArray, ref_properties.posAttributes.members); + this.debugSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 5); + const rasterBoundsArray = new ref_properties.StructArrayLayout4i8(); + rasterBoundsArray.emplaceBack(0, 0, 0, 0); + rasterBoundsArray.emplaceBack(ref_properties.EXTENT, 0, ref_properties.EXTENT, 0); + rasterBoundsArray.emplaceBack(0, ref_properties.EXTENT, 0, ref_properties.EXTENT); + rasterBoundsArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT, ref_properties.EXTENT, ref_properties.EXTENT); + this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, rasterBoundsAttributes.members); + this.rasterBoundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + const viewportArray = new ref_properties.StructArrayLayout2i4(); + viewportArray.emplaceBack(0, 0); + viewportArray.emplaceBack(1, 0); + viewportArray.emplaceBack(0, 1); + viewportArray.emplaceBack(1, 1); + this.viewportBuffer = context.createVertexBuffer(viewportArray, ref_properties.posAttributes.members); + this.viewportSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + const tileLineStripIndices = new ref_properties.StructArrayLayout1ui2(); + tileLineStripIndices.emplaceBack(0); + tileLineStripIndices.emplaceBack(1); + tileLineStripIndices.emplaceBack(3); + tileLineStripIndices.emplaceBack(2); + tileLineStripIndices.emplaceBack(0); + this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices); + const quadTriangleIndices = new ref_properties.StructArrayLayout3ui6(); + quadTriangleIndices.emplaceBack(0, 1, 2); + quadTriangleIndices.emplaceBack(2, 1, 3); + this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); + this.emptyTexture = new ref_properties.Texture(context, { + width: 1, + height: 1, + data: new Uint8Array([ + 0, + 0, + 0, + 0 + ]) + }, context.gl.RGBA); + const gl = this.context.gl; + this.stencilClearMode = new ref_properties.StencilMode({ + func: gl.ALWAYS, + mask: 0 + }, 0, 255, gl.ZERO, gl.ZERO, gl.ZERO); + this.loadTimeStamps.push(ref_properties.window.performance.now()); + } + clearStencil() { + const context = this.context; + const gl = context.gl; + this.nextStencilID = 1; + this.currentStencilSource = undefined; + const matrix = ref_properties.create(); + ref_properties.ortho(matrix, 0, this.width, this.height, 0, 0, 1); + ref_properties.scale(matrix, matrix, [ + gl.drawingBufferWidth, + gl.drawingBufferHeight, + 0 + ]); + this.useProgram('clippingMask').draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, this.stencilClearMode, ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments); + } + _renderTileClippingMasks(layer, sourceCache, tileIDs) { + if (!sourceCache || this.currentStencilSource === sourceCache.id || !layer.isTileClipped() || !tileIDs || !tileIDs.length) + return; + this.currentStencilSource = sourceCache.id; + const context = this.context; + const gl = context.gl; + if (this.nextStencilID + tileIDs.length > 256) { + this.clearStencil(); + } + context.setColorMode(ref_properties.ColorMode.disabled); + context.setDepthMode(ref_properties.DepthMode.disabled); + const program = this.useProgram('clippingMask'); + this._tileClippingMaskIDs = {}; + for (const tileID of tileIDs) { + const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, new ref_properties.StencilMode({ + func: gl.ALWAYS, + mask: 0 + }, id, 255, gl.KEEP, gl.KEEP, gl.REPLACE), ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments); + } + } + stencilModeFor3D() { + this.currentStencilSource = undefined; + if (this.nextStencilID + 1 > 256) { + this.clearStencil(); + } + const id = this.nextStencilID++; + const gl = this.context.gl; + return new ref_properties.StencilMode({ + func: gl.NOTEQUAL, + mask: 255 + }, id, 255, gl.KEEP, gl.KEEP, gl.REPLACE); + } + stencilModeForClipping(tileID) { + if (this.terrain) + return this.terrain.stencilModeForRTTOverlap(tileID); + const gl = this.context.gl; + return new ref_properties.StencilMode({ + func: gl.EQUAL, + mask: 255 + }, this._tileClippingMaskIDs[tileID.key], 0, gl.KEEP, gl.KEEP, gl.REPLACE); + } + stencilConfigForOverlap(tileIDs) { + const gl = this.context.gl; + const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ); + const minTileZ = coords[coords.length - 1].overscaledZ; + const stencilValues = coords[0].overscaledZ - minTileZ + 1; + if (stencilValues > 1) { + this.currentStencilSource = undefined; + if (this.nextStencilID + stencilValues > 256) { + this.clearStencil(); + } + const zToStencilMode = {}; + for (let i = 0; i < stencilValues; i++) { + zToStencilMode[i + minTileZ] = new ref_properties.StencilMode({ + func: gl.GEQUAL, + mask: 255 + }, i + this.nextStencilID, 255, gl.KEEP, gl.KEEP, gl.REPLACE); + } + this.nextStencilID += stencilValues; + return [ + zToStencilMode, + coords + ]; + } + return [ + { [minTileZ]: ref_properties.StencilMode.disabled }, + coords + ]; + } + colorModeForRenderPass() { + const gl = this.context.gl; + if (this._showOverdrawInspector) { + const numOverdrawSteps = 8; + const a = 1 / numOverdrawSteps; + return new ref_properties.ColorMode([ + gl.CONSTANT_COLOR, + gl.ONE + ], new ref_properties.Color(a, a, a, 0), [ + true, + true, + true, + true + ]); + } else if (this.renderPass === 'opaque') { + return ref_properties.ColorMode.unblended; + } else { + return ref_properties.ColorMode.alphaBlended; + } + } + depthModeForSublayer(n, mask, func) { + if (!this.opaquePassEnabledForLayer()) + return ref_properties.DepthMode.disabled; + const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; + return new ref_properties.DepthMode(func || this.context.gl.LEQUAL, mask, [ + depth, + depth + ]); + } + opaquePassEnabledForLayer() { + return this.currentLayer < this.opaquePassCutoff; + } + render(style, options) { + this.style = style; + this.options = options; + this.lineAtlas = style.lineAtlas; + this.imageManager = style.imageManager; + this.glyphManager = style.glyphManager; + this.symbolFadeChange = style.placement.symbolFadeChange(ref_properties.browser.now()); + this.imageManager.beginFrame(); + const layerIds = this.style.order; + const sourceCaches = this.style._sourceCaches; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + if (sourceCache.used) { + sourceCache.prepare(this.context); + } + } + const coordsAscending = {}; + const coordsDescending = {}; + const coordsDescendingSymbol = {}; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + coordsAscending[id] = sourceCache.getVisibleCoordinates(); + coordsDescending[id] = coordsAscending[id].slice().reverse(); + coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse(); + } + this.opaquePassCutoff = Infinity; + for (let i = 0; i < layerIds.length; i++) { + const layerId = layerIds[i]; + if (this.style._layers[layerId].is3D()) { + this.opaquePassCutoff = i; + break; + } + } + if (this.terrain) { + this.terrain.updateTileBinding(coordsDescendingSymbol); + this.opaquePassCutoff = 0; + } + this.renderPass = 'offscreen'; + for (const layerId of layerIds) { + const layer = this.style._layers[layerId]; + const sourceCache = style._getLayerSourceCache(layer); + if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) + continue; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + if (!(layer.type === 'custom' || layer.isSky()) && !(coords && coords.length)) + continue; + this.renderLayer(this, sourceCache, layer, coords); + } + this.depthRangeFor3D = [ + 0, + 1 - (style.order.length + 2) * this.numSublayers * this.depthEpsilon + ]; + if (this.terrain && (this.style.hasSymbolLayers() || this.style.hasCircleLayers())) { + this.terrain.drawDepth(); + } + this.context.bindFramebuffer.set(null); + this.context.viewport.set([ + 0, + 0, + this.width, + this.height + ]); + this.context.clear({ + color: options.showOverdrawInspector ? ref_properties.Color.black : ref_properties.Color.transparent, + depth: 1 + }); + this.clearStencil(); + this._showOverdrawInspector = options.showOverdrawInspector; + this.renderPass = 'opaque'; + if (!this.terrain) { + for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); + if (layer.isSky()) + continue; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + this._renderTileClippingMasks(layer, sourceCache, coords); + this.renderLayer(this, sourceCache, layer, coords); + } + } + this.renderPass = 'sky'; + if (this.transform.isHorizonVisible()) { + for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); + if (!layer.isSky()) + continue; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + this.renderLayer(this, sourceCache, layer, coords); + } + } + this.renderPass = 'translucent'; + this.currentLayer = 0; + while (this.currentLayer < layerIds.length) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); + if (layer.isSky()) { + ++this.currentLayer; + continue; + } + if (this.terrain && this.style.isLayerDraped(layer)) { + if (layer.isHidden(this.transform.zoom)) { + ++this.currentLayer; + continue; + } + const terrain = this.terrain; + const prevLayer = this.currentLayer; + this.currentLayer = terrain.renderBatch(this.currentLayer); + continue; + } + const coords = sourceCache ? (layer.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[sourceCache.id] : undefined; + this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined); + this.renderLayer(this, sourceCache, layer, coords); + ++this.currentLayer; + } + if (this.terrain) { + this.terrain.postRender(); + } + if (this.options.showTileBoundaries || this.options.showQueryGeometry) { + let selectedSource = null; + const layers = ref_properties.values(this.style._layers); + layers.forEach(layer => { + const sourceCache = style._getLayerSourceCache(layer); + if (sourceCache && !layer.isHidden(this.transform.zoom)) { + if (!selectedSource || selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom) { + selectedSource = sourceCache; + } + } + }); + if (selectedSource) { + if (this.options.showTileBoundaries) { + draw$1.debug(this, selectedSource, selectedSource.getVisibleCoordinates()); + } + } + } + if (this.options.showPadding) { + drawDebugPadding(this); + } + this.context.setDefault(); + this.frameCounter = (this.frameCounter + 1) % ref_properties.MAX_SAFE_INTEGER; + if (this.tileLoaded && this.options.speedIndexTiming) { + this.loadTimeStamps.push(ref_properties.window.performance.now()); + this.saveCanvasCopy(); + } + } + renderLayer(painter, sourceCache, layer, coords) { + if (layer.isHidden(this.transform.zoom)) + return; + if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'custom' && !(coords && coords.length)) + return; + this.id = layer.id; + this.gpuTimingStart(layer); + draw$1[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets, this.options.isInitialLoad); + this.gpuTimingEnd(); + } + gpuTimingStart(layer) { + if (!this.options.gpuTiming) + return; + const ext = this.context.extTimerQuery; + let layerTimer = this.gpuTimers[layer.id]; + if (!layerTimer) { + layerTimer = this.gpuTimers[layer.id] = { + calls: 0, + cpuTime: 0, + query: ext.createQueryEXT() + }; + } + layerTimer.calls++; + ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query); + } + gpuTimingEnd() { + if (!this.options.gpuTiming) + return; + const ext = this.context.extTimerQuery; + ext.endQueryEXT(ext.TIME_ELAPSED_EXT); + } + collectGpuTimers() { + const currentLayerTimers = this.gpuTimers; + this.gpuTimers = {}; + return currentLayerTimers; + } + queryGpuTimers(gpuTimers) { + const layers = {}; + for (const layerId in gpuTimers) { + const gpuTimer = gpuTimers[layerId]; + const ext = this.context.extTimerQuery; + const gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000); + ext.deleteQueryEXT(gpuTimer.query); + layers[layerId] = gpuTime; + } + return layers; + } + translatePosMatrix(matrix, tile, translate, translateAnchor, inViewportPixelUnitsUnits) { + if (!translate[0] && !translate[1]) + return matrix; + const angle = inViewportPixelUnitsUnits ? translateAnchor === 'map' ? this.transform.angle : 0 : translateAnchor === 'viewport' ? -this.transform.angle : 0; + if (angle) { + const sinA = Math.sin(angle); + const cosA = Math.cos(angle); + translate = [ + translate[0] * cosA - translate[1] * sinA, + translate[0] * sinA + translate[1] * cosA + ]; + } + const translation = [ + inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), + inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), + 0 + ]; + const translatedMatrix = new Float32Array(16); + ref_properties.translate(translatedMatrix, matrix, translation); + return translatedMatrix; + } + saveTileTexture(texture) { + const textures = this._tileTextures[texture.size[0]]; + if (!textures) { + this._tileTextures[texture.size[0]] = [texture]; + } else { + textures.push(texture); + } + } + getTileTexture(size) { + const textures = this._tileTextures[size]; + return textures && textures.length > 0 ? textures.pop() : null; + } + isPatternMissing(image) { + if (!image) + return false; + if (!image.from || !image.to) + return true; + const imagePosA = this.imageManager.getPattern(image.from.toString()); + const imagePosB = this.imageManager.getPattern(image.to.toString()); + return !imagePosA || !imagePosB; + } + currentGlobalDefines() { + const terrain = this.terrain && !this.terrain.renderingToTexture; + const rtt = this.terrain && this.terrain.renderingToTexture; + const defines = []; + if (terrain) + defines.push('TERRAIN'); + if (rtt) + defines.push('RENDER_TO_TEXTURE'); + if (this._showOverdrawInspector) + defines.push('OVERDRAW_INSPECTOR'); + return defines; + } + useProgram(name, programConfiguration, fixedDefines) { + this.cache = this.cache || {}; + const defines = fixedDefines || []; + const globalDefines = this.currentGlobalDefines(); + const allDefines = globalDefines.concat(defines); + const key = Program.cacheKey(name, allDefines, programConfiguration); + if (!this.cache[key]) { + this.cache[key] = new Program(this.context, name, shaders[name], programConfiguration, programUniforms[name], allDefines); + } + return this.cache[key]; + } + setCustomLayerDefaults() { + this.context.unbindVAO(); + this.context.cullFace.setDefault(); + this.context.activeTexture.setDefault(); + this.context.pixelStoreUnpack.setDefault(); + this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); + this.context.pixelStoreUnpackFlipY.setDefault(); + } + setBaseState() { + const gl = this.context.gl; + this.context.cullFace.set(false); + this.context.viewport.set([ + 0, + 0, + this.width, + this.height + ]); + this.context.blendEquation.set(gl.FUNC_ADD); + } + initDebugOverlayCanvas() { + if (this.debugOverlayCanvas == null) { + this.debugOverlayCanvas = ref_properties.window.document.createElement('canvas'); + this.debugOverlayCanvas.width = 512; + this.debugOverlayCanvas.height = 512; + const gl = this.context.gl; + this.debugOverlayTexture = new ref_properties.Texture(this.context, this.debugOverlayCanvas, gl.RGBA); + } + } + destroy() { + if (this._terrain) { + this._terrain.destroy(); + } + this.emptyTexture.destroy(); + if (this.debugOverlayTexture) { + this.debugOverlayTexture.destroy(); + } + } + prepareDrawTile(tileID) { + if (this.terrain) { + this.terrain.prepareDrawTile(tileID); + } + } + setTileLoadedFlag(flag) { + this.tileLoaded = flag; + } + saveCanvasCopy() { + this.frameCopies.push(this.canvasCopy()); + this.tileLoaded = false; + } + canvasCopy() { + const gl = this.context.gl; + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, 0); + return texture; + } + getCanvasCopiesAndTimestamps() { + return { + canvasCopies: this.frameCopies, + timeStamps: this.loadTimeStamps + }; + } +} + +class EdgeInsets { + constructor(top = 0, bottom = 0, left = 0, right = 0) { + if (isNaN(top) || top < 0 || isNaN(bottom) || bottom < 0 || isNaN(left) || left < 0 || isNaN(right) || right < 0) { + throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers'); + } + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; + } + interpolate(start, target, t) { + if (target.top != null && start.top != null) + this.top = ref_properties.number(start.top, target.top, t); + if (target.bottom != null && start.bottom != null) + this.bottom = ref_properties.number(start.bottom, target.bottom, t); + if (target.left != null && start.left != null) + this.left = ref_properties.number(start.left, target.left, t); + if (target.right != null && start.right != null) + this.right = ref_properties.number(start.right, target.right, t); + return this; + } + getCenter(width, height) { + const x = ref_properties.clamp((this.left + width - this.right) / 2, 0, width); + const y = ref_properties.clamp((this.top + height - this.bottom) / 2, 0, height); + return new ref_properties.Point(x, y); + } + equals(other) { + return this.top === other.top && this.bottom === other.bottom && this.left === other.left && this.right === other.right; + } + clone() { + return new EdgeInsets(this.top, this.bottom, this.left, this.right); + } + toJSON() { + return { + top: this.top, + bottom: this.bottom, + left: this.left, + right: this.right + }; + } +} + +function getColumn(matrix, col) { + return [ + matrix[col * 4], + matrix[col * 4 + 1], + matrix[col * 4 + 2], + matrix[col * 4 + 3] + ]; +} +function setColumn(matrix, col, values) { + matrix[col * 4 + 0] = values[0]; + matrix[col * 4 + 1] = values[1]; + matrix[col * 4 + 2] = values[2]; + matrix[col * 4 + 3] = values[3]; +} +function updateTransformOrientation(matrix, orientation) { + const position = getColumn(matrix, 3); + ref_properties.fromQuat(matrix, orientation); + setColumn(matrix, 3, position); +} +function updateTransformPosition(matrix, position) { + setColumn(matrix, 3, [ + position[0], + position[1], + position[2], + 1 + ]); +} +function wrapCameraPosition(position) { + if (!position) + return; + const mercatorCoordinate = Array.isArray(position) ? new ref_properties.MercatorCoordinate(position[0], position[1], position[2]) : position; + mercatorCoordinate.x = ref_properties.wrap(mercatorCoordinate.x, 0, 1); + return mercatorCoordinate; +} +function orientationFromPitchBearing(pitch, bearing) { + const orientation = ref_properties.identity$1([]); + ref_properties.rotateZ$1(orientation, orientation, -bearing); + ref_properties.rotateX$1(orientation, orientation, -pitch); + return orientation; +} +function orientationFromFrame(forward, up) { + const xyForward = [ + forward[0], + forward[1], + 0 + ]; + const xyUp = [ + up[0], + up[1], + 0 + ]; + const epsilon = 1e-15; + if (ref_properties.length(xyForward) >= epsilon) { + const xyDir = ref_properties.normalize([], xyForward); + ref_properties.scale$2(xyUp, xyDir, ref_properties.dot(xyUp, xyDir)); + up[0] = xyUp[0]; + up[1] = xyUp[1]; + } + const right = ref_properties.cross([], up, forward); + if (ref_properties.len(right) < epsilon) { + return null; + } + const bearing = Math.atan2(-right[1], right[0]); + const pitch = Math.atan2(Math.sqrt(forward[0] * forward[0] + forward[1] * forward[1]), -forward[2]); + return orientationFromPitchBearing(pitch, bearing); +} +class FreeCameraOptions { + constructor(position, orientation) { + this.position = position; + this.orientation = orientation; + } + get position() { + return this._position; + } + set position(position) { + this._position = this._renderWorldCopies ? wrapCameraPosition(position) : position; + } + lookAtPoint(location, up) { + this.orientation = null; + if (!this.position) { + return; + } + const altitude = this._elevation ? this._elevation.getAtPoint(ref_properties.MercatorCoordinate.fromLngLat(location)) : 0; + const pos = this.position; + const target = ref_properties.MercatorCoordinate.fromLngLat(location, altitude); + const forward = [ + target.x - pos.x, + target.y - pos.y, + target.z - pos.z + ]; + if (!up) + up = [ + 0, + 0, + 1 + ]; + up[2] = Math.abs(up[2]); + this.orientation = orientationFromFrame(forward, up); + } + setPitchBearing(pitch, bearing) { + this.orientation = orientationFromPitchBearing(ref_properties.degToRad(pitch), ref_properties.degToRad(-bearing)); + } +} +class FreeCamera { + constructor(position, orientation) { + this._transform = ref_properties.identity([]); + this._orientation = ref_properties.identity$1([]); + if (orientation) { + this._orientation = orientation; + updateTransformOrientation(this._transform, this._orientation); + } + if (position) { + updateTransformPosition(this._transform, position); + } + } + get mercatorPosition() { + const pos = this.position; + return new ref_properties.MercatorCoordinate(pos[0], pos[1], pos[2]); + } + get position() { + const col = getColumn(this._transform, 3); + return [ + col[0], + col[1], + col[2] + ]; + } + set position(value) { + updateTransformPosition(this._transform, value); + } + get orientation() { + return this._orientation; + } + set orientation(value) { + this._orientation = value; + updateTransformOrientation(this._transform, this._orientation); + } + getPitchBearing() { + const f = this.forward(); + const r = this.right(); + return { + bearing: Math.atan2(-r[1], r[0]), + pitch: Math.atan2(Math.sqrt(f[0] * f[0] + f[1] * f[1]), -f[2]) + }; + } + setPitchBearing(pitch, bearing) { + this._orientation = orientationFromPitchBearing(pitch, bearing); + updateTransformOrientation(this._transform, this._orientation); + } + forward() { + const col = getColumn(this._transform, 2); + return [ + -col[0], + -col[1], + -col[2] + ]; + } + up() { + const col = getColumn(this._transform, 1); + return [ + -col[0], + -col[1], + -col[2] + ]; + } + right() { + const col = getColumn(this._transform, 0); + return [ + col[0], + col[1], + col[2] + ]; + } + getCameraToWorld(worldSize, pixelsPerMeter) { + const cameraToWorld = new Float64Array(16); + ref_properties.invert(cameraToWorld, this.getWorldToCamera(worldSize, pixelsPerMeter)); + return cameraToWorld; + } + getWorldToCamera(worldSize, pixelsPerMeter) { + const matrix = new Float64Array(16); + const invOrientation = new Float64Array(4); + const invPosition = this.position; + ref_properties.conjugate(invOrientation, this._orientation); + ref_properties.scale$2(invPosition, invPosition, -worldSize); + ref_properties.fromQuat(matrix, invOrientation); + ref_properties.translate(matrix, matrix, invPosition); + matrix[1] *= -1; + matrix[5] *= -1; + matrix[9] *= -1; + matrix[13] *= -1; + matrix[8] *= pixelsPerMeter; + matrix[9] *= pixelsPerMeter; + matrix[10] *= pixelsPerMeter; + matrix[11] *= pixelsPerMeter; + return matrix; + } + getCameraToClipPerspective(fovy, aspectRatio, nearZ, farZ) { + const matrix = new Float64Array(16); + ref_properties.perspective(matrix, fovy, aspectRatio, nearZ, farZ); + return matrix; + } + clone() { + return new FreeCamera([...this.position], [...this.orientation]); + } +} + +const NUM_WORLD_COPIES = 3; +const DEFAULT_MIN_ZOOM = 0; +class Transform { + constructor(minZoom, maxZoom, minPitch, maxPitch, renderWorldCopies) { + this.tileSize = 512; + this.maxValidLatitude = 85.051129; + this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; + this._minZoom = minZoom || DEFAULT_MIN_ZOOM; + this._maxZoom = maxZoom || 22; + this._minPitch = minPitch === undefined || minPitch === null ? 0 : minPitch; + this._maxPitch = maxPitch === undefined || maxPitch === null ? 60 : maxPitch; + this.setMaxBounds(); + this.width = 0; + this.height = 0; + this._center = new ref_properties.LngLat(0, 0); + this.zoom = 0; + this.angle = 0; + this._fov = 0.6435011087932844; + this._pitch = 0; + this._unmodified = true; + this._edgeInsets = new EdgeInsets(); + this._posMatrixCache = {}; + this._alignedPosMatrixCache = {}; + this._camera = new FreeCamera(); + this._centerAltitude = 0; + this.cameraElevationReference = 'ground'; + this._horizonShift = 0.1; + } + clone() { + const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies); + clone._elevation = this._elevation; + clone._centerAltitude = this._centerAltitude; + clone.tileSize = this.tileSize; + clone.latRange = this.latRange; + clone.width = this.width; + clone.height = this.height; + clone.cameraElevationReference = this.cameraElevationReference; + clone._center = this._center; + clone._setZoom(this.zoom); + clone._cameraZoom = this._cameraZoom; + clone.angle = this.angle; + clone._fov = this._fov; + clone._pitch = this._pitch; + clone._unmodified = this._unmodified; + clone._edgeInsets = this._edgeInsets.clone(); + clone._camera = this._camera.clone(); + clone._calcMatrices(); + clone.freezeTileCoverage = this.freezeTileCoverage; + return clone; + } + get elevation() { + return this._elevation; + } + set elevation(elevation) { + if (this._elevation === elevation) + return; + this._elevation = elevation; + if (!elevation) { + this._cameraZoom = null; + this._centerAltitude = 0; + } else { + if (this._updateCenterElevation()) + this._updateCameraOnTerrain(); + } + this._calcMatrices(); + } + updateElevation(constrainCameraOverTerrain) { + if (this._terrainEnabled() && this._cameraZoom == null) { + if (this._updateCenterElevation()) + this._updateCameraOnTerrain(); + } + if (constrainCameraOverTerrain) { + this._constrainCameraAltitude(); + } + this._calcMatrices(); + } + get minZoom() { + return this._minZoom; + } + set minZoom(zoom) { + if (this._minZoom === zoom) + return; + this._minZoom = zoom; + this.zoom = Math.max(this.zoom, zoom); + } + get maxZoom() { + return this._maxZoom; + } + set maxZoom(zoom) { + if (this._maxZoom === zoom) + return; + this._maxZoom = zoom; + this.zoom = Math.min(this.zoom, zoom); + } + get minPitch() { + return this._minPitch; + } + set minPitch(pitch) { + if (this._minPitch === pitch) + return; + this._minPitch = pitch; + this.pitch = Math.max(this.pitch, pitch); + } + get maxPitch() { + return this._maxPitch; + } + set maxPitch(pitch) { + if (this._maxPitch === pitch) + return; + this._maxPitch = pitch; + this.pitch = Math.min(this.pitch, pitch); + } + get renderWorldCopies() { + return this._renderWorldCopies; + } + set renderWorldCopies(renderWorldCopies) { + if (renderWorldCopies === undefined) { + renderWorldCopies = true; + } else if (renderWorldCopies === null) { + renderWorldCopies = false; + } + this._renderWorldCopies = renderWorldCopies; + } + get worldSize() { + return this.tileSize * this.scale; + } + get centerOffset() { + return this.centerPoint._sub(this.size._div(2)); + } + get size() { + return new ref_properties.Point(this.width, this.height); + } + get bearing() { + return -this.angle / Math.PI * 180; + } + set bearing(bearing) { + const b = -ref_properties.wrap(bearing, -180, 180) * Math.PI / 180; + if (this.angle === b) + return; + this._unmodified = false; + this.angle = b; + this._calcMatrices(); + this.rotationMatrix = ref_properties.create$2(); + ref_properties.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); + } + get pitch() { + return this._pitch / Math.PI * 180; + } + set pitch(pitch) { + const p = ref_properties.clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI; + if (this._pitch === p) + return; + this._unmodified = false; + this._pitch = p; + this._calcMatrices(); + } + get fov() { + return this._fov / Math.PI * 180; + } + set fov(fov) { + fov = Math.max(0.01, Math.min(60, fov)); + if (this._fov === fov) + return; + this._unmodified = false; + this._fov = fov / 180 * Math.PI; + this._calcMatrices(); + } + get zoom() { + return this._zoom; + } + set zoom(zoom) { + const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); + if (this._zoom === z) + return; + this._unmodified = false; + this._setZoom(z); + if (this._terrainEnabled()) { + this._updateCameraOnTerrain(); + } + this._constrain(); + this._calcMatrices(); + } + _setZoom(z) { + this._zoom = z; + this.scale = this.zoomScale(z); + this.tileZoom = Math.floor(z); + this.zoomFraction = z - this.tileZoom; + } + _updateCenterElevation() { + if (!this._elevation) + return false; + const elevationAtCenter = this._elevation.getAtPoint(ref_properties.MercatorCoordinate.fromLngLat(this.center), -1); + if (elevationAtCenter === -1) { + this._cameraZoom = null; + return false; + } + this._centerAltitude = elevationAtCenter; + return true; + } + _updateCameraOnTerrain() { + const height = this.cameraToCenterDistance / this.worldSize; + const terrainElevation = ref_properties.mercatorZfromAltitude(this._centerAltitude, this.center.lat); + this._cameraZoom = this._zoomFromMercatorZ(terrainElevation + height); + } + get center() { + return this._center; + } + set center(center) { + if (center.lat === this._center.lat && center.lng === this._center.lng) + return; + this._unmodified = false; + this._center = center; + if (this._terrainEnabled()) { + if (this.cameraElevationReference === 'ground') { + if (this._updateCenterElevation()) + this._updateCameraOnTerrain(); + else + this._cameraZoom = null; + } else { + this._updateZoomFromElevation(); + } + } + this._constrain(); + this._calcMatrices(); + } + _updateZoomFromElevation() { + if (this._cameraZoom == null || !this._elevation) + return; + const cameraZoom = this._cameraZoom; + const elevationAtCenter = this._elevation.getAtPoint(ref_properties.MercatorCoordinate.fromLngLat(this.center)); + const mercatorElevation = ref_properties.mercatorZfromAltitude(elevationAtCenter, this.center.lat); + const altitude = this._mercatorZfromZoom(cameraZoom); + const minHeight = this._mercatorZfromZoom(this._maxZoom); + const height = Math.max(altitude - mercatorElevation, minHeight); + this._setZoom(this._zoomFromMercatorZ(height)); + } + get padding() { + return this._edgeInsets.toJSON(); + } + set padding(padding) { + if (this._edgeInsets.equals(padding)) + return; + this._unmodified = false; + this._edgeInsets.interpolate(this._edgeInsets, padding, 1); + this._calcMatrices(); + } + computeZoomRelativeTo(position) { + const centerOnTargetAltitude = this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint, position.toAltitude())); + let targetPosition; + if (position.z < this._camera.position[2]) { + targetPosition = [ + centerOnTargetAltitude.x, + centerOnTargetAltitude.y, + centerOnTargetAltitude.z + ]; + } else { + targetPosition = [ + position.x, + position.y, + position.z + ]; + } + const distToTarget = ref_properties.length(ref_properties.sub([], this._camera.position, targetPosition)); + return ref_properties.clamp(this._zoomFromMercatorZ(distToTarget), this._minZoom, this._maxZoom); + } + setFreeCameraOptions(options) { + if (!this.height) + return; + if (!options.position && !options.orientation) + return; + this._updateCameraState(); + let changed = false; + if (options.orientation && !ref_properties.exactEquals(options.orientation, this._camera.orientation)) { + changed = this._setCameraOrientation(options.orientation); + } + if (options.position) { + const newPosition = [ + options.position.x, + options.position.y, + options.position.z + ]; + if (!ref_properties.exactEquals$1(newPosition, this._camera.position)) { + this._setCameraPosition(newPosition); + changed = true; + } + } + if (changed) { + this._updateStateFromCamera(); + this.recenterOnTerrain(); + } + } + getFreeCameraOptions() { + this._updateCameraState(); + const pos = this._camera.position; + const options = new FreeCameraOptions(); + options.position = new ref_properties.MercatorCoordinate(pos[0], pos[1], pos[2]); + options.orientation = this._camera.orientation; + options._elevation = this.elevation; + options._renderWorldCopies = this._renderWorldCopies; + return options; + } + _setCameraOrientation(orientation) { + if (!ref_properties.length$1(orientation)) + return false; + ref_properties.normalize$1(orientation, orientation); + const forward = ref_properties.transformQuat([], [ + 0, + 0, + -1 + ], orientation); + const up = ref_properties.transformQuat([], [ + 0, + -1, + 0 + ], orientation); + if (up[2] < 0) + return false; + const updatedOrientation = orientationFromFrame(forward, up); + if (!updatedOrientation) + return false; + this._camera.orientation = updatedOrientation; + return true; + } + _setCameraPosition(position) { + const minWorldSize = this.zoomScale(this.minZoom) * this.tileSize; + const maxWorldSize = this.zoomScale(this.maxZoom) * this.tileSize; + const distToCenter = this.cameraToCenterDistance; + position[2] = ref_properties.clamp(position[2], distToCenter / maxWorldSize, distToCenter / minWorldSize); + this._camera.position = position; + } + get centerPoint() { + return this._edgeInsets.getCenter(this.width, this.height); + } + get fovAboveCenter() { + return this._fov * (0.5 + this.centerOffset.y / this.height); + } + isPaddingEqual(padding) { + return this._edgeInsets.equals(padding); + } + interpolatePadding(start, target, t) { + this._unmodified = false; + this._edgeInsets.interpolate(start, target, t); + this._constrain(); + this._calcMatrices(); + } + coveringZoomLevel(options) { + const z = (options.roundZoom ? Math.round : Math.floor)(this.zoom + this.scaleZoom(this.tileSize / options.tileSize)); + return Math.max(0, z); + } + getVisibleUnwrappedCoordinates(tileID) { + const result = [new ref_properties.UnwrappedTileID(0, tileID)]; + if (this._renderWorldCopies) { + const utl = this.pointCoordinate(new ref_properties.Point(0, 0)); + const utr = this.pointCoordinate(new ref_properties.Point(this.width, 0)); + const ubl = this.pointCoordinate(new ref_properties.Point(this.width, this.height)); + const ubr = this.pointCoordinate(new ref_properties.Point(0, this.height)); + const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); + const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x)); + const extraWorldCopy = 1; + for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { + if (w === 0) + continue; + result.push(new ref_properties.UnwrappedTileID(w, tileID)); + } + } + return result; + } + coveringTiles(options) { + let z = this.coveringZoomLevel(options); + const actualZ = z; + const useElevationData = !!options.useElevationData; + if (options.minzoom !== undefined && z < options.minzoom) + return []; + if (options.maxzoom !== undefined && z > options.maxzoom) + z = options.maxzoom; + const centerCoord = ref_properties.MercatorCoordinate.fromLngLat(this.center); + const numTiles = 1 << z; + const centerPoint = [ + numTiles * centerCoord.x, + numTiles * centerCoord.y, + 0 + ]; + const cameraFrustum = ref_properties.Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z); + const cameraCoord = this.pointCoordinate(this.getCameraPoint()); + const meterToTile = numTiles * ref_properties.mercatorZfromAltitude(1, this.center.lat); + const cameraAltitude = this._camera.position[2] / ref_properties.mercatorZfromAltitude(1, this.center.lat); + const cameraPoint = [ + numTiles * cameraCoord.x, + numTiles * cameraCoord.y, + cameraAltitude + ]; + const zoomSplitDistance = this.cameraToCenterDistance / options.tileSize * (options.roundZoom ? 1 : 0.502); + const minZoom = this.pitch <= 60 && this._edgeInsets.top <= this._edgeInsets.bottom && !this._elevation ? z : 0; + const maxRange = this.elevation ? this.elevation.exaggeration() * 10000 : 0; + const newRootTile = wrap => { + const max = maxRange; + const min = -maxRange; + return { + aabb: new ref_properties.Aabb([ + wrap * numTiles, + 0, + min + ], [ + (wrap + 1) * numTiles, + numTiles, + max + ]), + zoom: 0, + x: 0, + y: 0, + wrap, + fullyVisible: false + }; + }; + const stack = []; + const result = []; + const maxZoom = z; + const overscaledZ = options.reparseOverscaled ? actualZ : z; + const getAABBFromElevation = (aabb, tileID) => { + if (!this._elevation) + return; + const minmax = this._elevation.getMinMaxForTile(tileID); + if (minmax) { + aabb.min[2] = minmax.min; + aabb.max[2] = minmax.max; + aabb.center[2] = (aabb.min[2] + aabb.max[2]) / 2; + } + }; + const square = a => a * a; + const cameraHeightSqr = square((cameraAltitude - this._centerAltitude) * meterToTile); + const distToSplitScale = (dzSqr, dSqr) => { + const acuteAngleThresholdSin = 0.707; + const stretchTile = 1.1; + if (dSqr * square(acuteAngleThresholdSin) < dzSqr) + return 1; + const r = Math.sqrt(dSqr / dzSqr); + const k = r - 1 / acuteAngleThresholdSin; + return r / (1 / acuteAngleThresholdSin + (Math.pow(stretchTile, k + 1) - 1) / (stretchTile - 1) - 1); + }; + if (this._renderWorldCopies) { + for (let i = 1; i <= NUM_WORLD_COPIES; i++) { + stack.push(newRootTile(-i)); + stack.push(newRootTile(i)); + } + } + stack.push(newRootTile(0)); + while (stack.length > 0) { + const it = stack.pop(); + const x = it.x; + const y = it.y; + let fullyVisible = it.fullyVisible; + if (!fullyVisible) { + const intersectResult = it.aabb.intersects(cameraFrustum); + if (intersectResult === 0) + continue; + fullyVisible = intersectResult === 2; + } + let shouldSplit = true; + if (minZoom <= it.zoom && it.zoom < maxZoom) { + const dx = it.aabb.distanceX(cameraPoint); + const dy = it.aabb.distanceY(cameraPoint); + let dzSqr = cameraHeightSqr; + if (useElevationData) { + dzSqr = square(it.aabb.distanceZ(cameraPoint) * meterToTile); + } + const distanceSqr = dx * dx + dy * dy + dzSqr; + const distToSplit = (1 << maxZoom - it.zoom) * zoomSplitDistance; + const distToSplitSqr = square(distToSplit * distToSplitScale(Math.max(dzSqr, cameraHeightSqr), distanceSqr)); + shouldSplit = distanceSqr < distToSplitSqr; + } + if (it.zoom === maxZoom || !shouldSplit) { + const tileZoom = it.zoom === maxZoom ? overscaledZ : it.zoom; + if (!!options.minzoom && options.minzoom > tileZoom) { + continue; + } + const dx = centerPoint[0] - (0.5 + x + (it.wrap << it.zoom)) * (1 << z - it.zoom); + const dy = centerPoint[1] - 0.5 - y; + const id = it.tileID ? it.tileID : new ref_properties.OverscaledTileID(tileZoom, it.wrap, it.zoom, x, y); + result.push({ + tileID: id, + distanceSq: dx * dx + dy * dy + }); + continue; + } + for (let i = 0; i < 4; i++) { + const childX = (x << 1) + i % 2; + const childY = (y << 1) + (i >> 1); + const aabb = it.aabb.quadrant(i); + let tileID = null; + if (useElevationData && it.zoom > maxZoom - 6) { + tileID = new ref_properties.OverscaledTileID(it.zoom + 1 === maxZoom ? overscaledZ : it.zoom + 1, it.wrap, it.zoom + 1, childX, childY); + getAABBFromElevation(aabb, tileID); + } + stack.push({ + aabb, + zoom: it.zoom + 1, + x: childX, + y: childY, + wrap: it.wrap, + fullyVisible, + tileID + }); + } + } + const cover = result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID); + return cover; + } + resize(width, height) { + this.width = width; + this.height = height; + this.pixelsToGLUnits = [ + 2 / width, + -2 / height + ]; + this._constrain(); + this._calcMatrices(); + } + get unmodified() { + return this._unmodified; + } + zoomScale(zoom) { + return Math.pow(2, zoom); + } + scaleZoom(scale) { + return Math.log(scale) / Math.LN2; + } + project(lnglat) { + const lat = ref_properties.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude); + return new ref_properties.Point(ref_properties.mercatorXfromLng(lnglat.lng) * this.worldSize, ref_properties.mercatorYfromLat(lat) * this.worldSize); + } + unproject(point) { + return new ref_properties.MercatorCoordinate(point.x / this.worldSize, point.y / this.worldSize).toLngLat(); + } + get point() { + return this.project(this.center); + } + setLocationAtPoint(lnglat, point) { + const a = this.pointCoordinate(point); + const b = this.pointCoordinate(this.centerPoint); + const loc = this.locationCoordinate(lnglat); + const newCenter = new ref_properties.MercatorCoordinate(loc.x - (a.x - b.x), loc.y - (a.y - b.y)); + this.center = this.coordinateLocation(newCenter); + if (this._renderWorldCopies) { + this.center = this.center.wrap(); + } + } + setLocation(location) { + this.center = this.coordinateLocation(location); + if (this._renderWorldCopies) { + this.center = this.center.wrap(); + } + } + locationPoint(lnglat) { + return this._coordinatePoint(this.locationCoordinate(lnglat), false); + } + locationPoint3D(lnglat) { + return this._coordinatePoint(this.locationCoordinate(lnglat), true); + } + pointLocation(p) { + return this.coordinateLocation(this.pointCoordinate(p)); + } + pointLocation3D(p) { + return this.coordinateLocation(this.pointCoordinate3D(p)); + } + locationCoordinate(lnglat) { + return ref_properties.MercatorCoordinate.fromLngLat(lnglat); + } + coordinateLocation(coord) { + return coord.toLngLat(); + } + pointRayIntersection(p, z) { + const targetZ = z !== undefined && z !== null ? z : this._centerAltitude; + const p0 = [ + p.x, + p.y, + 0, + 1 + ]; + const p1 = [ + p.x, + p.y, + 1, + 1 + ]; + ref_properties.transformMat4(p0, p0, this.pixelMatrixInverse); + ref_properties.transformMat4(p1, p1, this.pixelMatrixInverse); + const w0 = p0[3]; + const w1 = p1[3]; + ref_properties.scale$1(p0, p0, 1 / w0); + ref_properties.scale$1(p1, p1, 1 / w1); + const z0 = p0[2]; + const z1 = p1[2]; + const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); + return { + p0, + p1, + t + }; + } + screenPointToMercatorRay(p) { + const p0 = [ + p.x, + p.y, + 0, + 1 + ]; + const p1 = [ + p.x, + p.y, + 1, + 1 + ]; + ref_properties.transformMat4(p0, p0, this.pixelMatrixInverse); + ref_properties.transformMat4(p1, p1, this.pixelMatrixInverse); + ref_properties.scale$1(p0, p0, 1 / p0[3]); + ref_properties.scale$1(p1, p1, 1 / p1[3]); + p0[2] = ref_properties.mercatorZfromAltitude(p0[2], this._center.lat) * this.worldSize; + p1[2] = ref_properties.mercatorZfromAltitude(p1[2], this._center.lat) * this.worldSize; + ref_properties.scale$1(p0, p0, 1 / this.worldSize); + ref_properties.scale$1(p1, p1, 1 / this.worldSize); + return new ref_properties.Ray([ + p0[0], + p0[1], + p0[2] + ], ref_properties.normalize([], ref_properties.sub([], p1, p0))); + } + rayIntersectionCoordinate(rayIntersection) { + const {p0, p1, t} = rayIntersection; + const z0 = ref_properties.mercatorZfromAltitude(p0[2], this._center.lat); + const z1 = ref_properties.mercatorZfromAltitude(p1[2], this._center.lat); + return new ref_properties.MercatorCoordinate(ref_properties.number(p0[0], p1[0], t) / this.worldSize, ref_properties.number(p0[1], p1[1], t) / this.worldSize, ref_properties.number(z0, z1, t)); + } + pointCoordinate(p) { + const horizonOffset = this.horizonLineFromTop(false); + const clamped = new ref_properties.Point(p.x, Math.max(horizonOffset, p.y)); + return this.rayIntersectionCoordinate(this.pointRayIntersection(clamped)); + } + pointCoordinate3D(p) { + if (!this.elevation) + return this.pointCoordinate(p); + const elevation = this.elevation; + let raycast = this.elevation.pointCoordinate(p); + if (raycast) + return new ref_properties.MercatorCoordinate(raycast[0], raycast[1], raycast[2]); + let start = 0, end = this.horizonLineFromTop(); + if (p.y > end) + return this.pointCoordinate(p); + const samples = 10; + const threshold = 0.02 * end; + const r = p.clone(); + for (let i = 0; i < samples && end - start > threshold; i++) { + r.y = ref_properties.number(start, end, 0.66); + const rCast = elevation.pointCoordinate(r); + if (rCast) { + end = r.y; + raycast = rCast; + } else { + start = r.y; + } + } + return raycast ? new ref_properties.MercatorCoordinate(raycast[0], raycast[1], raycast[2]) : this.pointCoordinate(p); + } + isPointAboveHorizon(p) { + if (!this.elevation) { + const horizon = this.horizonLineFromTop(); + return p.y < horizon; + } else { + return !this.elevation.pointCoordinate(p); + } + } + _coordinatePoint(coord, sampleTerrainIn3D) { + const elevation = sampleTerrainIn3D && this.elevation ? this.elevation.getAtPoint(coord, this._centerAltitude) : this._centerAltitude; + const p = [ + coord.x * this.worldSize, + coord.y * this.worldSize, + elevation + coord.toAltitude(), + 1 + ]; + ref_properties.transformMat4(p, p, this.pixelMatrix); + return p[3] > 0 ? new ref_properties.Point(p[0] / p[3], p[1] / p[3]) : new ref_properties.Point(Number.MAX_VALUE, Number.MAX_VALUE); + } + getBounds() { + if (this._terrainEnabled()) + return this._getBounds3D(); + return new ref_properties.LngLatBounds().extend(this.pointLocation(new ref_properties.Point(0, 0))).extend(this.pointLocation(new ref_properties.Point(this.width, 0))).extend(this.pointLocation(new ref_properties.Point(this.width, this.height))).extend(this.pointLocation(new ref_properties.Point(0, this.height))); + } + _getBounds3D() { + const elevation = this.elevation; + const minmax = elevation.visibleDemTiles.reduce((acc, t) => { + if (t.dem) { + const tree = t.dem.tree; + acc.min = Math.min(acc.min, tree.minimums[0]); + acc.max = Math.max(acc.max, tree.maximums[0]); + } + return acc; + }, { + min: Number.MAX_VALUE, + max: 0 + }); + minmax.min *= elevation.exaggeration(); + minmax.max *= elevation.exaggeration(); + const top = this.horizonLineFromTop(); + return [ + new ref_properties.Point(0, top), + new ref_properties.Point(this.width, top), + new ref_properties.Point(this.width, this.height), + new ref_properties.Point(0, this.height) + ].reduce((acc, p) => { + return acc.extend(this.coordinateLocation(this.rayIntersectionCoordinate(this.pointRayIntersection(p, minmax.min)))).extend(this.coordinateLocation(this.rayIntersectionCoordinate(this.pointRayIntersection(p, minmax.max)))); + }, new ref_properties.LngLatBounds()); + } + horizonLineFromTop(clampToTop = true) { + const h = this.height / 2 / Math.tan(this._fov / 2) / Math.tan(Math.max(this._pitch, 0.1)) + this.centerOffset.y; + const horizonEpsilon = 0.03; + const offset = this.height / 2 - h * (1 - horizonEpsilon); + return clampToTop ? Math.max(0, offset) : offset; + } + getMaxBounds() { + if (!this.latRange || this.latRange.length !== 2 || !this.lngRange || this.lngRange.length !== 2) + return null; + return new ref_properties.LngLatBounds([ + this.lngRange[0], + this.latRange[0] + ], [ + this.lngRange[1], + this.latRange[1] + ]); + } + setMaxBounds(bounds) { + if (bounds) { + this.lngRange = [ + bounds.getWest(), + bounds.getEast() + ]; + this.latRange = [ + bounds.getSouth(), + bounds.getNorth() + ]; + this._constrain(); + } else { + this.lngRange = null; + this.latRange = [ + -this.maxValidLatitude, + this.maxValidLatitude + ]; + } + } + calculatePosMatrix(unwrappedTileID, aligned = false) { + const posMatrixKey = unwrappedTileID.key; + const cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache; + if (cache[posMatrixKey]) { + return cache[posMatrixKey]; + } + const canonical = unwrappedTileID.canonical; + const scale = this.worldSize / this.zoomScale(canonical.z); + const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; + const posMatrix = ref_properties.identity(new Float64Array(16)); + ref_properties.translate(posMatrix, posMatrix, [ + unwrappedX * scale, + canonical.y * scale, + 0 + ]); + ref_properties.scale(posMatrix, posMatrix, [ + scale / ref_properties.EXTENT, + scale / ref_properties.EXTENT, + 1 + ]); + ref_properties.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix); + cache[posMatrixKey] = new Float32Array(posMatrix); + return cache[posMatrixKey]; + } + customLayerMatrix() { + return this.mercatorMatrix.slice(); + } + recenterOnTerrain() { + if (!this._elevation) + return; + const elevation = this._elevation; + this._updateCameraState(); + const start = this._camera.position; + const dir = this._camera.forward(); + if (start.z <= 0 || dir[2] >= 0) + return; + const metersToMerc = ref_properties.mercatorZfromAltitude(1, this._center.lat); + start[2] /= metersToMerc; + dir[2] /= metersToMerc; + ref_properties.normalize(dir, dir); + const t = elevation.raycast(start, dir, elevation.exaggeration()); + if (t) { + const point = ref_properties.scaleAndAdd([], start, dir, t); + const newCenter = new ref_properties.MercatorCoordinate(point[0], point[1], ref_properties.mercatorZfromAltitude(point[2], ref_properties.latFromMercatorY(point[1]))); + const pos = this._camera.position; + const camToNew = [ + newCenter.x - pos[0], + newCenter.y - pos[1], + newCenter.z - pos[2] + ]; + const maxAltitude = newCenter.z + ref_properties.length(camToNew); + this._cameraZoom = this._zoomFromMercatorZ(maxAltitude); + this._centerAltitude = newCenter.toAltitude(); + this._center = newCenter.toLngLat(); + this._updateZoomFromElevation(); + this._constrain(); + this._calcMatrices(); + } + } + _constrainCameraAltitude() { + if (!this._elevation) + return; + const elevation = this._elevation; + this._updateCameraState(); + const elevationAtCamera = elevation.getAtPoint(this._camera.mercatorPosition); + const minHeight = this._minimumHeightOverTerrain() * Math.cos(ref_properties.degToRad(this._maxPitch)); + const terrainElevation = ref_properties.mercatorZfromAltitude(elevationAtCamera, this._center.lat); + const cameraHeight = this._camera.position[2] - terrainElevation; + if (cameraHeight < minHeight) { + const center = ref_properties.MercatorCoordinate.fromLngLat(this._center, this._centerAltitude); + const cameraPos = this._camera.mercatorPosition; + const cameraToCenter = [ + center.x - cameraPos.x, + center.y - cameraPos.y, + center.z - cameraPos.z + ]; + const prevDistToCamera = ref_properties.length(cameraToCenter); + cameraToCenter[2] -= minHeight - cameraHeight; + const newDistToCamera = ref_properties.length(cameraToCenter); + if (newDistToCamera === 0) + return; + ref_properties.scale$2(cameraToCenter, cameraToCenter, prevDistToCamera / newDistToCamera); + this._camera.position = [ + center.x - cameraToCenter[0], + center.y - cameraToCenter[1], + center.z - cameraToCenter[2] + ]; + this._camera.orientation = orientationFromFrame(cameraToCenter, this._camera.up()); + this._updateStateFromCamera(); + } + } + _constrain() { + if (!this.center || !this.width || !this.height || this._constraining) + return; + this._constraining = true; + let minY = -90; + let maxY = 90; + let minX = -180; + let maxX = 180; + let sy, sx, x2, y2; + const size = this.size, unmodified = this._unmodified; + if (this.latRange) { + const latRange = this.latRange; + minY = ref_properties.mercatorYfromLat(latRange[1]) * this.worldSize; + maxY = ref_properties.mercatorYfromLat(latRange[0]) * this.worldSize; + sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; + } + if (this.lngRange) { + const lngRange = this.lngRange; + minX = ref_properties.mercatorXfromLng(lngRange[0]) * this.worldSize; + maxX = ref_properties.mercatorXfromLng(lngRange[1]) * this.worldSize; + sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; + } + const point = this.point; + const s = Math.max(sx || 0, sy || 0); + if (s) { + this.center = this.unproject(new ref_properties.Point(sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y)); + this.zoom += this.scaleZoom(s); + this._unmodified = unmodified; + this._constraining = false; + return; + } + if (this.latRange) { + const y = point.y, h2 = size.y / 2; + if (y - h2 < minY) + y2 = minY + h2; + if (y + h2 > maxY) + y2 = maxY - h2; + } + if (this.lngRange) { + const x = point.x, w2 = size.x / 2; + if (x - w2 < minX) + x2 = minX + w2; + if (x + w2 > maxX) + x2 = maxX - w2; + } + if (x2 !== undefined || y2 !== undefined) { + this.center = this.unproject(new ref_properties.Point(x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y)); + } + this._constrainCameraAltitude(); + this._unmodified = unmodified; + this._constraining = false; + } + _minZoomForBounds() { + const minZoomForDim = (dim, range) => { + return Math.log2(dim / (this.tileSize * Math.abs(range[1] - range[0]))); + }; + let minLatZoom = DEFAULT_MIN_ZOOM; + if (this.latRange) { + const latRange = this.latRange; + minLatZoom = minZoomForDim(this.height, [ + ref_properties.mercatorYfromLat(latRange[0]), + ref_properties.mercatorYfromLat(latRange[1]) + ]); + } + let minLngZoom = DEFAULT_MIN_ZOOM; + if (this.lngRange) { + const lngRange = this.lngRange; + minLngZoom = minZoomForDim(this.width, [ + ref_properties.mercatorXfromLng(lngRange[0]), + ref_properties.mercatorXfromLng(lngRange[1]) + ]); + } + return Math.max(minLatZoom, minLngZoom); + } + _maxCameraBoundsDistance() { + return this._mercatorZfromZoom(this._minZoomForBounds()); + } + _calcMatrices() { + if (!this.height) + return; + const halfFov = this._fov / 2; + const offset = this.centerOffset; + this.cameraToCenterDistance = 0.5 / Math.tan(halfFov) * this.height; + const pixelsPerMeter = ref_properties.mercatorZfromAltitude(1, this.center.lat) * this.worldSize; + this._updateCameraState(); + const groundAngle = Math.PI / 2 + this._pitch; + const fovAboveCenter = this.fovAboveCenter; + const cameraToSeaLevelDistance = this._camera.position[2] * this.worldSize / Math.cos(this._pitch); + const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(ref_properties.clamp(Math.PI - groundAngle - fovAboveCenter, 0.01, Math.PI - 0.01)); + const point = this.point; + const x = point.x, y = point.y; + const furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance; + const horizonDistance = cameraToSeaLevelDistance * (1 / this._horizonShift); + const farZ = Math.min(furthestDistance * 1.01, horizonDistance); + const nearZ = this.height / 50; + const worldToCamera = this._camera.getWorldToCamera(this.worldSize, pixelsPerMeter); + const cameraToClip = this._camera.getCameraToClipPerspective(this._fov, this.width / this.height, nearZ, farZ); + cameraToClip[8] = -offset.x * 2 / this.width; + cameraToClip[9] = offset.y * 2 / this.height; + let m = ref_properties.mul([], cameraToClip, worldToCamera); + this.mercatorMatrix = ref_properties.scale([], m, [ + this.worldSize, + this.worldSize, + this.worldSize / pixelsPerMeter + ]); + this.projMatrix = m; + this.invProjMatrix = ref_properties.invert(new Float64Array(16), this.projMatrix); + const view = new Float32Array(16); + ref_properties.identity(view); + ref_properties.scale(view, view, [ + 1, + -1, + 1 + ]); + ref_properties.rotateX(view, view, this._pitch); + ref_properties.rotateZ(view, view, this.angle); + const projection = ref_properties.perspective(new Float32Array(16), this._fov, this.width / this.height, nearZ, farZ); + const skyboxHorizonShift = (Math.PI / 2 - this._pitch) * (this.height / this._fov) * this._horizonShift; + projection[8] = -offset.x * 2 / this.width; + projection[9] = (offset.y + skyboxHorizonShift) * 2 / this.height; + this.skyboxMatrix = ref_properties.multiply(view, projection, view); + const xShift = this.width % 2 / 2, yShift = this.height % 2 / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift; + const alignedM = new Float64Array(m); + ref_properties.translate(alignedM, alignedM, [ + dx > 0.5 ? dx - 1 : dx, + dy > 0.5 ? dy - 1 : dy, + 0 + ]); + this.alignedProjMatrix = alignedM; + m = ref_properties.create(); + ref_properties.scale(m, m, [ + this.width / 2, + -this.height / 2, + 1 + ]); + ref_properties.translate(m, m, [ + 1, + -1, + 0 + ]); + this.labelPlaneMatrix = m; + m = ref_properties.create(); + ref_properties.scale(m, m, [ + 1, + -1, + 1 + ]); + ref_properties.translate(m, m, [ + -1, + -1, + 0 + ]); + ref_properties.scale(m, m, [ + 2 / this.width, + 2 / this.height, + 1 + ]); + this.glCoordMatrix = m; + this.pixelMatrix = ref_properties.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); + m = ref_properties.invert(new Float64Array(16), this.pixelMatrix); + if (!m) + throw new Error('failed to invert matrix'); + this.pixelMatrixInverse = m; + this._posMatrixCache = {}; + this._alignedPosMatrixCache = {}; + } + _updateCameraState() { + if (!this.height) + return; + this._camera.setPitchBearing(this._pitch, this.angle); + const dir = this._camera.forward(); + const distance = this.cameraToCenterDistance; + const center = this.point; + const zoom = this._cameraZoom ? this._cameraZoom : this._zoom; + const altitude = this._mercatorZfromZoom(zoom); + const height = altitude - ref_properties.mercatorZfromAltitude(this._centerAltitude, this.center.lat); + const updatedWorldSize = this.cameraToCenterDistance / height; + this._camera.position = [ + center.x / this.worldSize - dir[0] * distance / updatedWorldSize, + center.y / this.worldSize - dir[1] * distance / updatedWorldSize, + ref_properties.mercatorZfromAltitude(this._centerAltitude, this._center.lat) + -dir[2] * distance / updatedWorldSize + ]; + } + _translateCameraConstrained(translation) { + const maxDistance = this._maxCameraBoundsDistance(); + const maxZ = maxDistance * Math.cos(this._pitch); + const z = this._camera.position[2]; + const deltaZ = translation[2]; + let t = 1; + if (deltaZ > 0) { + t = Math.min((maxZ - z) / deltaZ, 1); + } + this._camera.position = ref_properties.scaleAndAdd([], this._camera.position, translation, t); + this._updateStateFromCamera(); + } + _updateStateFromCamera() { + const position = this._camera.position; + const dir = this._camera.forward(); + const {pitch, bearing} = this._camera.getPitchBearing(); + const centerAltitude = ref_properties.mercatorZfromAltitude(this._centerAltitude, this.center.lat); + const minHeight = this._mercatorZfromZoom(this._maxZoom) * Math.cos(ref_properties.degToRad(this._maxPitch)); + const height = Math.max((position[2] - centerAltitude) / Math.cos(pitch), minHeight); + const zoom = this._zoomFromMercatorZ(height); + ref_properties.scaleAndAdd(position, position, dir, height); + this._pitch = ref_properties.clamp(pitch, ref_properties.degToRad(this.minPitch), ref_properties.degToRad(this.maxPitch)); + this.angle = ref_properties.wrap(bearing, -Math.PI, Math.PI); + this._setZoom(ref_properties.clamp(zoom, this._minZoom, this._maxZoom)); + if (this._terrainEnabled()) + this._updateCameraOnTerrain(); + this._center = new ref_properties.MercatorCoordinate(position[0], position[1], position[2]).toLngLat(); + this._unmodified = false; + this._constrain(); + this._calcMatrices(); + } + _worldSizeFromZoom(zoom) { + return Math.pow(2, zoom) * this.tileSize; + } + _mercatorZfromZoom(zoom) { + return this.cameraToCenterDistance / this._worldSizeFromZoom(zoom); + } + _minimumHeightOverTerrain() { + const MAX_DRAPE_OVERZOOM = 2; + const zoom = Math.min((this._cameraZoom != null ? this._cameraZoom : this._zoom) + MAX_DRAPE_OVERZOOM, this._maxZoom); + return this._mercatorZfromZoom(zoom); + } + _zoomFromMercatorZ(z) { + return this.scaleZoom(this.cameraToCenterDistance / (z * this.tileSize)); + } + _terrainEnabled() { + return !!this._elevation; + } + isHorizonVisibleForPoints(p0, p1) { + const minX = Math.min(p0.x, p1.x); + const maxX = Math.max(p0.x, p1.x); + const minY = Math.min(p0.y, p1.y); + const maxY = Math.max(p0.y, p1.y); + const min = new ref_properties.Point(minX, minY); + const max = new ref_properties.Point(maxX, maxY); + const corners = [ + min, + max, + new ref_properties.Point(minX, maxY), + new ref_properties.Point(maxX, minY) + ]; + const minWX = this._renderWorldCopies ? -NUM_WORLD_COPIES : 0; + const maxWX = this._renderWorldCopies ? 1 + NUM_WORLD_COPIES : 1; + const minWY = 0; + const maxWY = 1; + for (const corner of corners) { + const rayIntersection = this.pointRayIntersection(corner); + if (rayIntersection.t < 0) { + return true; + } + const coordinate = this.rayIntersectionCoordinate(rayIntersection); + if (coordinate.x < minWX || coordinate.y < minWY || coordinate.x > maxWX || coordinate.y > maxWY) { + return true; + } + } + return false; + } + isHorizonVisible() { + const horizonAngleEpsilon = 2; + if (this.pitch + ref_properties.radToDeg(this.fovAboveCenter) > 90 - horizonAngleEpsilon) { + return true; + } + return this.isHorizonVisibleForPoints(new ref_properties.Point(0, 0), new ref_properties.Point(this.width, this.height)); + } + zoomDeltaToMovement(center, zoomDelta) { + const distance = ref_properties.length(ref_properties.sub([], this._camera.position, center)); + const relativeZoom = this._zoomFromMercatorZ(distance) + zoomDelta; + return distance - this._mercatorZfromZoom(relativeZoom); + } + getCameraPoint() { + const pitch = this._pitch; + const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); + return this.centerPoint.add(new ref_properties.Point(0, yOffset)); + } +} + +function throttle(fn, time) { + let pending = false; + let timerId = null; + const later = () => { + timerId = null; + if (pending) { + fn(); + timerId = setTimeout(later, time); + pending = false; + } + }; + return () => { + pending = true; + if (!timerId) { + later(); + } + return timerId; + }; +} + +class Hash { + constructor(hashName) { + this._hashName = hashName && encodeURIComponent(hashName); + ref_properties.bindAll([ + '_getCurrentHash', + '_onHashChange', + '_updateHash' + ], this); + this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100); + } + addTo(map) { + this._map = map; + ref_properties.window.addEventListener('hashchange', this._onHashChange, false); + this._map.on('moveend', this._updateHash); + return this; + } + remove() { + ref_properties.window.removeEventListener('hashchange', this._onHashChange, false); + this._map.off('moveend', this._updateHash); + clearTimeout(this._updateHash()); + delete this._map; + return this; + } + getHashString(mapFeedback) { + const center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100, precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch(); + let hash = ''; + if (mapFeedback) { + hash += `/${ lng }/${ lat }/${ zoom }`; + } else { + hash += `${ zoom }/${ lat }/${ lng }`; + } + if (bearing || pitch) + hash += `/${ Math.round(bearing * 10) / 10 }`; + if (pitch) + hash += `/${ Math.round(pitch) }`; + if (this._hashName) { + const hashName = this._hashName; + let found = false; + const parts = ref_properties.window.location.hash.slice(1).split('&').map(part => { + const key = part.split('=')[0]; + if (key === hashName) { + found = true; + return `${ key }=${ hash }`; + } + return part; + }).filter(a => a); + if (!found) { + parts.push(`${ hashName }=${ hash }`); + } + return `#${ parts.join('&') }`; + } + return `#${ hash }`; + } + _getCurrentHash() { + const hash = ref_properties.window.location.hash.replace('#', ''); + if (this._hashName) { + let keyval; + hash.split('&').map(part => part.split('=')).forEach(part => { + if (part[0] === this._hashName) { + keyval = part; + } + }); + return (keyval ? keyval[1] || '' : '').split('/'); + } + return hash.split('/'); + } + _onHashChange() { + const loc = this._getCurrentHash(); + if (loc.length >= 3 && !loc.some(v => isNaN(v))) { + const bearing = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : this._map.getBearing(); + this._map.jumpTo({ + center: [ + +loc[2], + +loc[1] + ], + zoom: +loc[0], + bearing, + pitch: +(loc[4] || 0) + }); + return true; + } + return false; + } + _updateHashUnthrottled() { + const location = ref_properties.window.location.href.replace(/(#.+)?$/, this.getHashString()); + ref_properties.window.history.replaceState(ref_properties.window.history.state, null, location); + } +} + +const defaultInertiaOptions = { + linearity: 0.3, + easing: ref_properties.bezier(0, 0, 0.3, 1) +}; +const defaultPanInertiaOptions = ref_properties.extend({ + deceleration: 2500, + maxSpeed: 1400 +}, defaultInertiaOptions); +const defaultZoomInertiaOptions = ref_properties.extend({ + deceleration: 20, + maxSpeed: 1400 +}, defaultInertiaOptions); +const defaultBearingInertiaOptions = ref_properties.extend({ + deceleration: 1000, + maxSpeed: 360 +}, defaultInertiaOptions); +const defaultPitchInertiaOptions = ref_properties.extend({ + deceleration: 1000, + maxSpeed: 90 +}, defaultInertiaOptions); +class HandlerInertia { + constructor(map) { + this._map = map; + this.clear(); + } + clear() { + this._inertiaBuffer = []; + } + record(settings) { + this._drainInertiaBuffer(); + this._inertiaBuffer.push({ + time: ref_properties.browser.now(), + settings + }); + } + _drainInertiaBuffer() { + const inertia = this._inertiaBuffer, now = ref_properties.browser.now(), cutoff = 160; + while (inertia.length > 0 && now - inertia[0].time > cutoff) + inertia.shift(); + } + _onMoveEnd(panInertiaOptions) { + this._drainInertiaBuffer(); + if (this._inertiaBuffer.length < 2) { + return; + } + const deltas = { + zoom: 0, + bearing: 0, + pitch: 0, + pan: new ref_properties.Point(0, 0), + pinchAround: undefined, + around: undefined + }; + for (const {settings} of this._inertiaBuffer) { + deltas.zoom += settings.zoomDelta || 0; + deltas.bearing += settings.bearingDelta || 0; + deltas.pitch += settings.pitchDelta || 0; + if (settings.panDelta) + deltas.pan._add(settings.panDelta); + if (settings.around) + deltas.around = settings.around; + if (settings.pinchAround) + deltas.pinchAround = settings.pinchAround; + } + const lastEntry = this._inertiaBuffer[this._inertiaBuffer.length - 1]; + const duration = lastEntry.time - this._inertiaBuffer[0].time; + const easeOptions = {}; + if (deltas.pan.mag()) { + const result = calculateEasing(deltas.pan.mag(), duration, ref_properties.extend({}, defaultPanInertiaOptions, panInertiaOptions || {})); + easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag()); + easeOptions.center = this._map.transform.center; + extendDuration(easeOptions, result); + } + if (deltas.zoom) { + const result = calculateEasing(deltas.zoom, duration, defaultZoomInertiaOptions); + easeOptions.zoom = this._map.transform.zoom + result.amount; + extendDuration(easeOptions, result); + } + if (deltas.bearing) { + const result = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions); + easeOptions.bearing = this._map.transform.bearing + ref_properties.clamp(result.amount, -179, 179); + extendDuration(easeOptions, result); + } + if (deltas.pitch) { + const result = calculateEasing(deltas.pitch, duration, defaultPitchInertiaOptions); + easeOptions.pitch = this._map.transform.pitch + result.amount; + extendDuration(easeOptions, result); + } + if (easeOptions.zoom || easeOptions.bearing) { + const last = deltas.pinchAround === undefined ? deltas.around : deltas.pinchAround; + easeOptions.around = last ? this._map.unproject(last) : this._map.getCenter(); + } + this.clear(); + return ref_properties.extend(easeOptions, { noMoveStart: true }); + } +} +function extendDuration(easeOptions, result) { + if (!easeOptions.duration || easeOptions.duration < result.duration) { + easeOptions.duration = result.duration; + easeOptions.easing = result.easing; + } +} +function calculateEasing(amount, inertiaDuration, inertiaOptions) { + const {maxSpeed, linearity, deceleration} = inertiaOptions; + const speed = ref_properties.clamp(amount * linearity / (inertiaDuration / 1000), -maxSpeed, maxSpeed); + const duration = Math.abs(speed) / (deceleration * linearity); + return { + easing: inertiaOptions.easing, + duration: duration * 1000, + amount: speed * (duration / 2) + }; +} + +class MapMouseEvent extends ref_properties.Event { + preventDefault() { + this._defaultPrevented = true; + } + get defaultPrevented() { + return this._defaultPrevented; + } + constructor(type, map, originalEvent, data = {}) { + const point = DOM.mousePos(map.getCanvasContainer(), originalEvent); + const lngLat = map.unproject(point); + super(type, ref_properties.extend({ + point, + lngLat, + originalEvent + }, data)); + this._defaultPrevented = false; + this.target = map; + } +} +class MapTouchEvent extends ref_properties.Event { + preventDefault() { + this._defaultPrevented = true; + } + get defaultPrevented() { + return this._defaultPrevented; + } + constructor(type, map, originalEvent) { + const touches = type === 'touchend' ? originalEvent.changedTouches : originalEvent.touches; + const points = DOM.touchPos(map.getCanvasContainer(), touches); + const lngLats = points.map(t => map.unproject(t)); + const point = points.reduce((prev, curr, i, arr) => { + return prev.add(curr.div(arr.length)); + }, new ref_properties.Point(0, 0)); + const lngLat = map.unproject(point); + super(type, { + points, + point, + lngLats, + lngLat, + originalEvent + }); + this._defaultPrevented = false; + } +} +class MapWheelEvent extends ref_properties.Event { + preventDefault() { + this._defaultPrevented = true; + } + get defaultPrevented() { + return this._defaultPrevented; + } + constructor(type, map, originalEvent) { + super(type, { originalEvent }); + this._defaultPrevented = false; + } +} + +class MapEventHandler { + constructor(map, options) { + this._map = map; + this._clickTolerance = options.clickTolerance; + } + reset() { + delete this._mousedownPos; + } + wheel(e) { + return this._firePreventable(new MapWheelEvent(e.type, this._map, e)); + } + mousedown(e, point) { + this._mousedownPos = point; + return this._firePreventable(new MapMouseEvent(e.type, this._map, e)); + } + mouseup(e) { + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + click(e, point) { + if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance) + return; + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + dblclick(e) { + return this._firePreventable(new MapMouseEvent(e.type, this._map, e)); + } + mouseover(e) { + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + mouseout(e) { + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + touchstart(e) { + return this._firePreventable(new MapTouchEvent(e.type, this._map, e)); + } + touchmove(e) { + this._map.fire(new MapTouchEvent(e.type, this._map, e)); + } + touchend(e) { + this._map.fire(new MapTouchEvent(e.type, this._map, e)); + } + touchcancel(e) { + this._map.fire(new MapTouchEvent(e.type, this._map, e)); + } + _firePreventable(mapEvent) { + this._map.fire(mapEvent); + if (mapEvent.defaultPrevented) { + return {}; + } + } + isEnabled() { + return true; + } + isActive() { + return false; + } + enable() { + } + disable() { + } +} +class BlockableMapEventHandler { + constructor(map) { + this._map = map; + } + reset() { + this._delayContextMenu = false; + delete this._contextMenuEvent; + } + mousemove(e) { + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + mousedown() { + this._delayContextMenu = true; + } + mouseup() { + this._delayContextMenu = false; + if (this._contextMenuEvent) { + this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent)); + delete this._contextMenuEvent; + } + } + contextmenu(e) { + if (this._delayContextMenu) { + this._contextMenuEvent = e; + } else { + this._map.fire(new MapMouseEvent(e.type, this._map, e)); + } + if (this._map.listens('contextmenu')) { + e.preventDefault(); + } + } + isEnabled() { + return true; + } + isActive() { + return false; + } + enable() { + } + disable() { + } +} + +class BoxZoomHandler { + constructor(map, options) { + this._map = map; + this._el = map.getCanvasContainer(); + this._container = map.getContainer(); + this._clickTolerance = options.clickTolerance || 1; + } + isEnabled() { + return !!this._enabled; + } + isActive() { + return !!this._active; + } + enable() { + if (this.isEnabled()) + return; + this._enabled = true; + } + disable() { + if (!this.isEnabled()) + return; + this._enabled = false; + } + mousedown(e, point) { + if (!this.isEnabled()) + return; + if (!(e.shiftKey && e.button === 0)) + return; + DOM.disableDrag(); + this._startPos = this._lastPos = point; + this._active = true; + } + mousemoveWindow(e, point) { + if (!this._active) + return; + const pos = point; + if (this._lastPos.equals(pos) || !this._box && pos.dist(this._startPos) < this._clickTolerance) { + return; + } + const p0 = this._startPos; + this._lastPos = pos; + if (!this._box) { + this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); + this._container.classList.add('mapboxgl-crosshair'); + this._fireEvent('boxzoomstart', e); + } + const minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y); + DOM.setTransform(this._box, `translate(${ minX }px,${ minY }px)`); + this._box.style.width = `${ maxX - minX }px`; + this._box.style.height = `${ maxY - minY }px`; + } + mouseupWindow(e, point) { + if (!this._active) + return; + if (e.button !== 0) + return; + const p0 = this._startPos, p1 = point; + this.reset(); + DOM.suppressClick(); + if (p0.x === p1.x && p0.y === p1.y) { + this._fireEvent('boxzoomcancel', e); + } else { + this._map.fire(new ref_properties.Event('boxzoomend', { originalEvent: e })); + return { cameraAnimation: map => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), { linear: false }) }; + } + } + keydown(e) { + if (!this._active) + return; + if (e.keyCode === 27) { + this.reset(); + this._fireEvent('boxzoomcancel', e); + } + } + reset() { + this._active = false; + this._container.classList.remove('mapboxgl-crosshair'); + if (this._box) { + DOM.remove(this._box); + this._box = null; + } + DOM.enableDrag(); + delete this._startPos; + delete this._lastPos; + } + _fireEvent(type, e) { + return this._map.fire(new ref_properties.Event(type, { originalEvent: e })); + } +} + +function indexTouches(touches, points) { + const obj = {}; + for (let i = 0; i < touches.length; i++) { + obj[touches[i].identifier] = points[i]; + } + return obj; +} + +function getCentroid(points) { + const sum = new ref_properties.Point(0, 0); + for (const point of points) { + sum._add(point); + } + return sum.div(points.length); +} +const MAX_TAP_INTERVAL = 500; +const MAX_TOUCH_TIME = 500; +const MAX_DIST = 30; +class SingleTapRecognizer { + constructor(options) { + this.reset(); + this.numTouches = options.numTouches; + } + reset() { + delete this.centroid; + delete this.startTime; + delete this.touches; + this.aborted = false; + } + touchstart(e, points, mapTouches) { + if (this.centroid || mapTouches.length > this.numTouches) { + this.aborted = true; + } + if (this.aborted) { + return; + } + if (this.startTime === undefined) { + this.startTime = e.timeStamp; + } + if (mapTouches.length === this.numTouches) { + this.centroid = getCentroid(points); + this.touches = indexTouches(mapTouches, points); + } + } + touchmove(e, points, mapTouches) { + if (this.aborted || !this.centroid) + return; + const newTouches = indexTouches(mapTouches, points); + for (const id in this.touches) { + const prevPos = this.touches[id]; + const pos = newTouches[id]; + if (!pos || pos.dist(prevPos) > MAX_DIST) { + this.aborted = true; + } + } + } + touchend(e, points, mapTouches) { + if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) { + this.aborted = true; + } + if (mapTouches.length === 0) { + const centroid = !this.aborted && this.centroid; + this.reset(); + if (centroid) + return centroid; + } + } +} +class TapRecognizer { + constructor(options) { + this.singleTap = new SingleTapRecognizer(options); + this.numTaps = options.numTaps; + this.reset(); + } + reset() { + this.lastTime = Infinity; + delete this.lastTap; + this.count = 0; + this.singleTap.reset(); + } + touchstart(e, points, mapTouches) { + this.singleTap.touchstart(e, points, mapTouches); + } + touchmove(e, points, mapTouches) { + this.singleTap.touchmove(e, points, mapTouches); + } + touchend(e, points, mapTouches) { + const tap = this.singleTap.touchend(e, points, mapTouches); + if (tap) { + const soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL; + const closeEnough = !this.lastTap || this.lastTap.dist(tap) < MAX_DIST; + if (!soonEnough || !closeEnough) { + this.reset(); + } + this.count++; + this.lastTime = e.timeStamp; + this.lastTap = tap; + if (this.count === this.numTaps) { + this.reset(); + return tap; + } + } + } +} + +class TapZoomHandler { + constructor() { + this._zoomIn = new TapRecognizer({ + numTouches: 1, + numTaps: 2 + }); + this._zoomOut = new TapRecognizer({ + numTouches: 2, + numTaps: 1 + }); + this.reset(); + } + reset() { + this._active = false; + this._zoomIn.reset(); + this._zoomOut.reset(); + } + touchstart(e, points, mapTouches) { + this._zoomIn.touchstart(e, points, mapTouches); + this._zoomOut.touchstart(e, points, mapTouches); + } + touchmove(e, points, mapTouches) { + this._zoomIn.touchmove(e, points, mapTouches); + this._zoomOut.touchmove(e, points, mapTouches); + } + touchend(e, points, mapTouches) { + const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches); + const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches); + if (zoomInPoint) { + this._active = true; + e.preventDefault(); + setTimeout(() => this.reset(), 0); + return { + cameraAnimation: map => map.easeTo({ + duration: 300, + zoom: map.getZoom() + 1, + around: map.unproject(zoomInPoint) + }, { originalEvent: e }) + }; + } else if (zoomOutPoint) { + this._active = true; + e.preventDefault(); + setTimeout(() => this.reset(), 0); + return { + cameraAnimation: map => map.easeTo({ + duration: 300, + zoom: map.getZoom() - 1, + around: map.unproject(zoomOutPoint) + }, { originalEvent: e }) + }; + } + } + touchcancel() { + this.reset(); + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} + +const LEFT_BUTTON = 0; +const RIGHT_BUTTON = 2; +const BUTTONS_FLAGS = { + [LEFT_BUTTON]: 1, + [RIGHT_BUTTON]: 2 +}; +function buttonStillPressed(e, button) { + const flag = BUTTONS_FLAGS[button]; + return e.buttons === undefined || (e.buttons & flag) !== flag; +} +class MouseHandler { + constructor(options) { + this.reset(); + this._clickTolerance = options.clickTolerance || 1; + } + reset() { + this._active = false; + this._moved = false; + delete this._lastPoint; + delete this._eventButton; + } + _correctButton(e, button) { + return false; + } + _move(lastPoint, point) { + return {}; + } + mousedown(e, point) { + if (this._lastPoint) + return; + const eventButton = DOM.mouseButton(e); + if (!this._correctButton(e, eventButton)) + return; + this._lastPoint = point; + this._eventButton = eventButton; + } + mousemoveWindow(e, point) { + const lastPoint = this._lastPoint; + if (!lastPoint) + return; + e.preventDefault(); + if (buttonStillPressed(e, this._eventButton)) { + this.reset(); + return; + } + if (!this._moved && point.dist(lastPoint) < this._clickTolerance) + return; + this._moved = true; + this._lastPoint = point; + return this._move(lastPoint, point); + } + mouseupWindow(e) { + if (!this._lastPoint) + return; + const eventButton = DOM.mouseButton(e); + if (eventButton !== this._eventButton) + return; + if (this._moved) + DOM.suppressClick(); + this.reset(); + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} +class MousePanHandler extends MouseHandler { + mousedown(e, point) { + super.mousedown(e, point); + if (this._lastPoint) + this._active = true; + } + _correctButton(e, button) { + return button === LEFT_BUTTON && !e.ctrlKey; + } + _move(lastPoint, point) { + return { + around: point, + panDelta: point.sub(lastPoint) + }; + } +} +class MouseRotateHandler extends MouseHandler { + _correctButton(e, button) { + return button === LEFT_BUTTON && e.ctrlKey || button === RIGHT_BUTTON; + } + _move(lastPoint, point) { + const degreesPerPixelMoved = 0.8; + const bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved; + if (bearingDelta) { + this._active = true; + return { bearingDelta }; + } + } + contextmenu(e) { + e.preventDefault(); + } +} +class MousePitchHandler extends MouseHandler { + _correctButton(e, button) { + return button === LEFT_BUTTON && e.ctrlKey || button === RIGHT_BUTTON; + } + _move(lastPoint, point) { + const degreesPerPixelMoved = -0.5; + const pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved; + if (pitchDelta) { + this._active = true; + return { pitchDelta }; + } + } + contextmenu(e) { + e.preventDefault(); + } +} + +class TouchPanHandler { + constructor(options) { + this._minTouches = 1; + this._clickTolerance = options.clickTolerance || 1; + this.reset(); + } + reset() { + this._active = false; + this._touches = {}; + this._sum = new ref_properties.Point(0, 0); + } + touchstart(e, points, mapTouches) { + return this._calculateTransform(e, points, mapTouches); + } + touchmove(e, points, mapTouches) { + if (!this._active || mapTouches.length < this._minTouches) + return; + e.preventDefault(); + return this._calculateTransform(e, points, mapTouches); + } + touchend(e, points, mapTouches) { + this._calculateTransform(e, points, mapTouches); + if (this._active && mapTouches.length < this._minTouches) { + this.reset(); + } + } + touchcancel() { + this.reset(); + } + _calculateTransform(e, points, mapTouches) { + if (mapTouches.length > 0) + this._active = true; + const touches = indexTouches(mapTouches, points); + const touchPointSum = new ref_properties.Point(0, 0); + const touchDeltaSum = new ref_properties.Point(0, 0); + let touchDeltaCount = 0; + for (const identifier in touches) { + const point = touches[identifier]; + const prevPoint = this._touches[identifier]; + if (prevPoint) { + touchPointSum._add(point); + touchDeltaSum._add(point.sub(prevPoint)); + touchDeltaCount++; + touches[identifier] = point; + } + } + this._touches = touches; + if (touchDeltaCount < this._minTouches || !touchDeltaSum.mag()) + return; + const panDelta = touchDeltaSum.div(touchDeltaCount); + this._sum._add(panDelta); + if (this._sum.mag() < this._clickTolerance) + return; + const around = touchPointSum.div(touchDeltaCount); + return { + around, + panDelta + }; + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} + +class TwoTouchHandler { + constructor() { + this.reset(); + } + reset() { + this._active = false; + delete this._firstTwoTouches; + } + _start(points) { + } + _move(points, pinchAround, e) { + return {}; + } + touchstart(e, points, mapTouches) { + if (this._firstTwoTouches || mapTouches.length < 2) + return; + this._firstTwoTouches = [ + mapTouches[0].identifier, + mapTouches[1].identifier + ]; + this._start([ + points[0], + points[1] + ]); + } + touchmove(e, points, mapTouches) { + if (!this._firstTwoTouches) + return; + e.preventDefault(); + const [idA, idB] = this._firstTwoTouches; + const a = getTouchById(mapTouches, points, idA); + const b = getTouchById(mapTouches, points, idB); + if (!a || !b) + return; + const pinchAround = this._aroundCenter ? null : a.add(b).div(2); + return this._move([ + a, + b + ], pinchAround, e); + } + touchend(e, points, mapTouches) { + if (!this._firstTwoTouches) + return; + const [idA, idB] = this._firstTwoTouches; + const a = getTouchById(mapTouches, points, idA); + const b = getTouchById(mapTouches, points, idB); + if (a && b) + return; + if (this._active) + DOM.suppressClick(); + this.reset(); + } + touchcancel() { + this.reset(); + } + enable(options) { + this._enabled = true; + this._aroundCenter = !!options && options.around === 'center'; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} +function getTouchById(mapTouches, points, identifier) { + for (let i = 0; i < mapTouches.length; i++) { + if (mapTouches[i].identifier === identifier) + return points[i]; + } +} +const ZOOM_THRESHOLD = 0.1; +function getZoomDelta(distance, lastDistance) { + return Math.log(distance / lastDistance) / Math.LN2; +} +class TouchZoomHandler extends TwoTouchHandler { + reset() { + super.reset(); + delete this._distance; + delete this._startDistance; + } + _start(points) { + this._startDistance = this._distance = points[0].dist(points[1]); + } + _move(points, pinchAround) { + const lastDistance = this._distance; + this._distance = points[0].dist(points[1]); + if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD) + return; + this._active = true; + return { + zoomDelta: getZoomDelta(this._distance, lastDistance), + pinchAround + }; + } +} +const ROTATION_THRESHOLD = 25; +function getBearingDelta(a, b) { + return a.angleWith(b) * 180 / Math.PI; +} +class TouchRotateHandler extends TwoTouchHandler { + reset() { + super.reset(); + delete this._minDiameter; + delete this._startVector; + delete this._vector; + } + _start(points) { + this._startVector = this._vector = points[0].sub(points[1]); + this._minDiameter = points[0].dist(points[1]); + } + _move(points, pinchAround) { + const lastVector = this._vector; + this._vector = points[0].sub(points[1]); + if (!this._active && this._isBelowThreshold(this._vector)) + return; + this._active = true; + return { + bearingDelta: getBearingDelta(this._vector, lastVector), + pinchAround + }; + } + _isBelowThreshold(vector) { + this._minDiameter = Math.min(this._minDiameter, vector.mag()); + const circumference = Math.PI * this._minDiameter; + const threshold = ROTATION_THRESHOLD / circumference * 360; + const bearingDeltaSinceStart = getBearingDelta(vector, this._startVector); + return Math.abs(bearingDeltaSinceStart) < threshold; + } +} +function isVertical(vector) { + return Math.abs(vector.y) > Math.abs(vector.x); +} +const ALLOWED_SINGLE_TOUCH_TIME = 100; +class TouchPitchHandler extends TwoTouchHandler { + reset() { + super.reset(); + this._valid = undefined; + delete this._firstMove; + delete this._lastPoints; + } + _start(points) { + this._lastPoints = points; + if (isVertical(points[0].sub(points[1]))) { + this._valid = false; + } + } + _move(points, center, e) { + const vectorA = points[0].sub(this._lastPoints[0]); + const vectorB = points[1].sub(this._lastPoints[1]); + this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp); + if (!this._valid) + return; + this._lastPoints = points; + this._active = true; + const yDeltaAverage = (vectorA.y + vectorB.y) / 2; + const degreesPerPixelMoved = -0.5; + return { pitchDelta: yDeltaAverage * degreesPerPixelMoved }; + } + gestureBeginsVertically(vectorA, vectorB, timeStamp) { + if (this._valid !== undefined) + return this._valid; + const threshold = 2; + const movedA = vectorA.mag() >= threshold; + const movedB = vectorB.mag() >= threshold; + if (!movedA && !movedB) + return; + if (!movedA || !movedB) { + if (this._firstMove === undefined) { + this._firstMove = timeStamp; + } + if (timeStamp - this._firstMove < ALLOWED_SINGLE_TOUCH_TIME) { + return undefined; + } else { + return false; + } + } + const isSameDirection = vectorA.y > 0 === vectorB.y > 0; + return isVertical(vectorA) && isVertical(vectorB) && isSameDirection; + } +} + +const defaultOptions = { + panStep: 100, + bearingStep: 15, + pitchStep: 10 +}; +class KeyboardHandler { + constructor() { + const stepOptions = defaultOptions; + this._panStep = stepOptions.panStep; + this._bearingStep = stepOptions.bearingStep; + this._pitchStep = stepOptions.pitchStep; + this._rotationDisabled = false; + } + reset() { + this._active = false; + } + keydown(e) { + if (e.altKey || e.ctrlKey || e.metaKey) + return; + let zoomDir = 0; + let bearingDir = 0; + let pitchDir = 0; + let xDir = 0; + let yDir = 0; + switch (e.keyCode) { + case 61: + case 107: + case 171: + case 187: + zoomDir = 1; + break; + case 189: + case 109: + case 173: + zoomDir = -1; + break; + case 37: + if (e.shiftKey) { + bearingDir = -1; + } else { + e.preventDefault(); + xDir = -1; + } + break; + case 39: + if (e.shiftKey) { + bearingDir = 1; + } else { + e.preventDefault(); + xDir = 1; + } + break; + case 38: + if (e.shiftKey) { + pitchDir = 1; + } else { + e.preventDefault(); + yDir = -1; + } + break; + case 40: + if (e.shiftKey) { + pitchDir = -1; + } else { + e.preventDefault(); + yDir = 1; + } + break; + default: + return; + } + if (this._rotationDisabled) { + bearingDir = 0; + pitchDir = 0; + } + return { + cameraAnimation: map => { + const zoom = map.getZoom(); + map.easeTo({ + duration: 300, + easeId: 'keyboardHandler', + easing: easeOut, + zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, + bearing: map.getBearing() + bearingDir * this._bearingStep, + pitch: map.getPitch() + pitchDir * this._pitchStep, + offset: [ + -xDir * this._panStep, + -yDir * this._panStep + ], + center: map.getCenter() + }, { originalEvent: e }); + } + }; + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } + disableRotation() { + this._rotationDisabled = true; + } + enableRotation() { + this._rotationDisabled = false; + } +} +function easeOut(t) { + return t * (2 - t); +} + +const wheelZoomDelta = 4.000244140625; +const defaultZoomRate = 1 / 100; +const wheelZoomRate = 1 / 450; +const maxScalePerFrame = 2; +class ScrollZoomHandler { + constructor(map, handler) { + this._map = map; + this._el = map.getCanvasContainer(); + this._handler = handler; + this._delta = 0; + this._defaultZoomRate = defaultZoomRate; + this._wheelZoomRate = wheelZoomRate; + ref_properties.bindAll(['_onTimeout'], this); + } + setZoomRate(zoomRate) { + this._defaultZoomRate = zoomRate; + } + setWheelZoomRate(wheelZoomRate) { + this._wheelZoomRate = wheelZoomRate; + } + isEnabled() { + return !!this._enabled; + } + isActive() { + return !!this._active || this._finishTimeout !== undefined; + } + isZooming() { + return !!this._zooming; + } + enable(options) { + if (this.isEnabled()) + return; + this._enabled = true; + this._aroundCenter = options && options.around === 'center'; + } + disable() { + if (!this.isEnabled()) + return; + this._enabled = false; + } + wheel(e) { + if (!this.isEnabled()) + return; + let value = e.deltaMode === ref_properties.window.WheelEvent.DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; + const now = ref_properties.browser.now(), timeDelta = now - (this._lastWheelEventTime || 0); + this._lastWheelEventTime = now; + if (value !== 0 && value % wheelZoomDelta === 0) { + this._type = 'wheel'; + } else if (value !== 0 && Math.abs(value) < 4) { + this._type = 'trackpad'; + } else if (timeDelta > 400) { + this._type = null; + this._lastValue = value; + this._timeout = setTimeout(this._onTimeout, 40, e); + } else if (!this._type) { + this._type = Math.abs(timeDelta * value) < 200 ? 'trackpad' : 'wheel'; + if (this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + value += this._lastValue; + } + } + if (e.shiftKey && value) + value = value / 4; + if (this._type) { + this._lastWheelEvent = e; + this._delta -= value; + if (!this._active) { + this._start(e); + } + } + e.preventDefault(); + } + _onTimeout(initialEvent) { + this._type = 'wheel'; + this._delta -= this._lastValue; + if (!this._active) { + this._start(initialEvent); + } + } + _start(e) { + if (!this._delta) + return; + if (this._frameId) { + this._frameId = null; + } + this._active = true; + if (!this.isZooming()) { + this._zooming = true; + } + if (this._finishTimeout) { + clearTimeout(this._finishTimeout); + delete this._finishTimeout; + } + const pos = DOM.mousePos(this._el, e); + this._aroundPoint = this._aroundCenter ? this._map.transform.centerPoint : pos; + this._aroundCoord = this._map.transform.pointCoordinate3D(this._aroundPoint); + this._targetZoom = undefined; + if (!this._frameId) { + this._frameId = true; + this._handler._triggerRenderFrame(); + } + } + renderFrame() { + if (!this._frameId) + return; + this._frameId = null; + if (!this.isActive()) + return; + const tr = this._map.transform; + const startingZoom = () => { + return tr._terrainEnabled() ? tr.computeZoomRelativeTo(this._aroundCoord) : tr.zoom; + }; + if (this._delta !== 0) { + const zoomRate = this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta ? this._wheelZoomRate : this._defaultZoomRate; + let scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate))); + if (this._delta < 0 && scale !== 0) { + scale = 1 / scale; + } + const startZoom = startingZoom(); + const startScale = Math.pow(2, startZoom); + const fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : startScale; + this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale))); + if (this._type === 'wheel') { + this._startZoom = startingZoom(); + this._easing = this._smoothOutEasing(200); + } + this._delta = 0; + } + const targetZoom = typeof this._targetZoom === 'number' ? this._targetZoom : startingZoom(); + const startZoom = this._startZoom; + const easing = this._easing; + let finished = false; + let zoom; + if (this._type === 'wheel' && startZoom && easing) { + const t = Math.min((ref_properties.browser.now() - this._lastWheelEventTime) / 200, 1); + const k = easing(t); + zoom = ref_properties.number(startZoom, targetZoom, k); + if (t < 1) { + if (!this._frameId) { + this._frameId = true; + } + } else { + finished = true; + } + } else { + zoom = targetZoom; + finished = true; + } + this._active = true; + if (finished) { + this._active = false; + this._finishTimeout = setTimeout(() => { + this._zooming = false; + this._handler._triggerRenderFrame(); + delete this._targetZoom; + delete this._finishTimeout; + }, 200); + } + return { + noInertia: true, + needsRenderFrame: !finished, + zoomDelta: zoom - startingZoom(), + around: this._aroundPoint, + aroundCoord: this._aroundCoord, + originalEvent: this._lastWheelEvent + }; + } + _smoothOutEasing(duration) { + let easing = ref_properties.ease; + if (this._prevEase) { + const ease = this._prevEase, t = (ref_properties.browser.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t), x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x); + easing = ref_properties.bezier(x, y, 0.25, 1); + } + this._prevEase = { + start: ref_properties.browser.now(), + duration, + easing + }; + return easing; + } + reset() { + this._active = false; + } +} + +class DoubleClickZoomHandler { + constructor(clickZoom, TapZoom) { + this._clickZoom = clickZoom; + this._tapZoom = TapZoom; + } + enable() { + this._clickZoom.enable(); + this._tapZoom.enable(); + } + disable() { + this._clickZoom.disable(); + this._tapZoom.disable(); + } + isEnabled() { + return this._clickZoom.isEnabled() && this._tapZoom.isEnabled(); + } + isActive() { + return this._clickZoom.isActive() || this._tapZoom.isActive(); + } +} + +class ClickZoomHandler { + constructor() { + this.reset(); + } + reset() { + this._active = false; + } + dblclick(e, point) { + e.preventDefault(); + return { + cameraAnimation: map => { + map.easeTo({ + duration: 300, + zoom: map.getZoom() + (e.shiftKey ? -1 : 1), + around: map.unproject(point) + }, { originalEvent: e }); + } + }; + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} + +class TapDragZoomHandler { + constructor() { + this._tap = new TapRecognizer({ + numTouches: 1, + numTaps: 1 + }); + this.reset(); + } + reset() { + this._active = false; + delete this._swipePoint; + delete this._swipeTouch; + delete this._tapTime; + this._tap.reset(); + } + touchstart(e, points, mapTouches) { + if (this._swipePoint) + return; + if (this._tapTime && e.timeStamp - this._tapTime > MAX_TAP_INTERVAL) { + this.reset(); + } + if (!this._tapTime) { + this._tap.touchstart(e, points, mapTouches); + } else if (mapTouches.length > 0) { + this._swipePoint = points[0]; + this._swipeTouch = mapTouches[0].identifier; + } + } + touchmove(e, points, mapTouches) { + if (!this._tapTime) { + this._tap.touchmove(e, points, mapTouches); + } else if (this._swipePoint) { + if (mapTouches[0].identifier !== this._swipeTouch) { + return; + } + const newSwipePoint = points[0]; + const dist = newSwipePoint.y - this._swipePoint.y; + this._swipePoint = newSwipePoint; + e.preventDefault(); + this._active = true; + return { zoomDelta: dist / 128 }; + } + } + touchend(e, points, mapTouches) { + if (!this._tapTime) { + const point = this._tap.touchend(e, points, mapTouches); + if (point) { + this._tapTime = e.timeStamp; + } + } else if (this._swipePoint) { + if (mapTouches.length === 0) { + this.reset(); + } + } + } + touchcancel() { + this.reset(); + } + enable() { + this._enabled = true; + } + disable() { + this._enabled = false; + this.reset(); + } + isEnabled() { + return this._enabled; + } + isActive() { + return this._active; + } +} + +class DragPanHandler { + constructor(el, mousePan, touchPan) { + this._el = el; + this._mousePan = mousePan; + this._touchPan = touchPan; + } + enable(options) { + this._inertiaOptions = options || {}; + this._mousePan.enable(); + this._touchPan.enable(); + this._el.classList.add('mapboxgl-touch-drag-pan'); + } + disable() { + this._mousePan.disable(); + this._touchPan.disable(); + this._el.classList.remove('mapboxgl-touch-drag-pan'); + } + isEnabled() { + return this._mousePan.isEnabled() && this._touchPan.isEnabled(); + } + isActive() { + return this._mousePan.isActive() || this._touchPan.isActive(); + } +} + +class DragRotateHandler { + constructor(options, mouseRotate, mousePitch) { + this._pitchWithRotate = options.pitchWithRotate; + this._mouseRotate = mouseRotate; + this._mousePitch = mousePitch; + } + enable() { + this._mouseRotate.enable(); + if (this._pitchWithRotate) + this._mousePitch.enable(); + } + disable() { + this._mouseRotate.disable(); + this._mousePitch.disable(); + } + isEnabled() { + return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled()); + } + isActive() { + return this._mouseRotate.isActive() || this._mousePitch.isActive(); + } +} + +class TouchZoomRotateHandler { + constructor(el, touchZoom, touchRotate, tapDragZoom) { + this._el = el; + this._touchZoom = touchZoom; + this._touchRotate = touchRotate; + this._tapDragZoom = tapDragZoom; + this._rotationDisabled = false; + this._enabled = true; + } + enable(options) { + this._touchZoom.enable(options); + if (!this._rotationDisabled) + this._touchRotate.enable(options); + this._tapDragZoom.enable(); + this._el.classList.add('mapboxgl-touch-zoom-rotate'); + } + disable() { + this._touchZoom.disable(); + this._touchRotate.disable(); + this._tapDragZoom.disable(); + this._el.classList.remove('mapboxgl-touch-zoom-rotate'); + } + isEnabled() { + return this._touchZoom.isEnabled() && (this._rotationDisabled || this._touchRotate.isEnabled()) && this._tapDragZoom.isEnabled(); + } + isActive() { + return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive(); + } + disableRotation() { + this._rotationDisabled = true; + this._touchRotate.disable(); + } + enableRotation() { + this._rotationDisabled = false; + if (this._touchZoom.isEnabled()) + this._touchRotate.enable(); + } +} + +const isMoving = p => p.zoom || p.drag || p.pitch || p.rotate; +class RenderFrameEvent extends ref_properties.Event { +} +class TrackingEllipsoid { + constructor() { + this.constants = [ + 1, + 1, + 0.01 + ]; + this.radius = 0; + } + setup(center, pointOnSurface) { + const centerToSurface = ref_properties.sub([], pointOnSurface, center); + if (centerToSurface[2] < 0) { + this.radius = ref_properties.length(ref_properties.div([], centerToSurface, this.constants)); + } else { + this.radius = ref_properties.length([ + centerToSurface[0], + centerToSurface[1], + 0 + ]); + } + } + projectRay(dir) { + ref_properties.div(dir, dir, this.constants); + ref_properties.normalize(dir, dir); + ref_properties.mul$1(dir, dir, this.constants); + const intersection = ref_properties.scale$2([], dir, this.radius); + if (intersection[2] > 0) { + const h = ref_properties.scale$2([], [ + 0, + 0, + 1 + ], ref_properties.dot(intersection, [ + 0, + 0, + 1 + ])); + const r = ref_properties.scale$2([], ref_properties.normalize([], [ + intersection[0], + intersection[1], + 0 + ]), this.radius); + const p = ref_properties.add([], intersection, ref_properties.scale$2([], ref_properties.sub([], ref_properties.add([], r, h), intersection), 2)); + intersection[0] = p[0]; + intersection[1] = p[1]; + } + return intersection; + } +} +function hasChange(result) { + return result.panDelta && result.panDelta.mag() || result.zoomDelta || result.bearingDelta || result.pitchDelta; +} +class HandlerManager { + constructor(map, options) { + this._map = map; + this._el = this._map.getCanvasContainer(); + this._handlers = []; + this._handlersById = {}; + this._changes = []; + this._inertia = new HandlerInertia(map); + this._bearingSnap = options.bearingSnap; + this._previousActiveHandlers = {}; + this._trackingEllipsoid = new TrackingEllipsoid(); + this._dragOrigin = null; + this._eventsInProgress = {}; + this._addDefaultHandlers(options); + ref_properties.bindAll([ + 'handleEvent', + 'handleWindowEvent' + ], this); + const el = this._el; + this._listeners = [ + [ + el, + 'touchstart', + { passive: true } + ], + [ + el, + 'touchmove', + { passive: false } + ], + [ + el, + 'touchend', + undefined + ], + [ + el, + 'touchcancel', + undefined + ], + [ + el, + 'mousedown', + undefined + ], + [ + el, + 'mousemove', + undefined + ], + [ + el, + 'mouseup', + undefined + ], + [ + ref_properties.window.document, + 'mousemove', + { capture: true } + ], + [ + ref_properties.window.document, + 'mouseup', + undefined + ], + [ + el, + 'mouseover', + undefined + ], + [ + el, + 'mouseout', + undefined + ], + [ + el, + 'dblclick', + undefined + ], + [ + el, + 'click', + undefined + ], + [ + el, + 'keydown', + { capture: false } + ], + [ + el, + 'keyup', + undefined + ], + [ + el, + 'wheel', + { passive: false } + ], + [ + el, + 'contextmenu', + undefined + ], + [ + ref_properties.window, + 'blur', + undefined + ] + ]; + for (const [target, type, listenerOptions] of this._listeners) { + DOM.addEventListener(target, type, target === ref_properties.window.document ? this.handleWindowEvent : this.handleEvent, listenerOptions); + } + } + destroy() { + for (const [target, type, listenerOptions] of this._listeners) { + DOM.removeEventListener(target, type, target === ref_properties.window.document ? this.handleWindowEvent : this.handleEvent, listenerOptions); + } + } + _addDefaultHandlers(options) { + const map = this._map; + const el = map.getCanvasContainer(); + this._add('mapEvent', new MapEventHandler(map, options)); + const boxZoom = map.boxZoom = new BoxZoomHandler(map, options); + this._add('boxZoom', boxZoom); + const tapZoom = new TapZoomHandler(); + const clickZoom = new ClickZoomHandler(); + map.doubleClickZoom = new DoubleClickZoomHandler(clickZoom, tapZoom); + this._add('tapZoom', tapZoom); + this._add('clickZoom', clickZoom); + const tapDragZoom = new TapDragZoomHandler(); + this._add('tapDragZoom', tapDragZoom); + const touchPitch = map.touchPitch = new TouchPitchHandler(); + this._add('touchPitch', touchPitch); + const mouseRotate = new MouseRotateHandler(options); + const mousePitch = new MousePitchHandler(options); + map.dragRotate = new DragRotateHandler(options, mouseRotate, mousePitch); + this._add('mouseRotate', mouseRotate, ['mousePitch']); + this._add('mousePitch', mousePitch, ['mouseRotate']); + const mousePan = new MousePanHandler(options); + const touchPan = new TouchPanHandler(options); + map.dragPan = new DragPanHandler(el, mousePan, touchPan); + this._add('mousePan', mousePan); + this._add('touchPan', touchPan, [ + 'touchZoom', + 'touchRotate' + ]); + const touchRotate = new TouchRotateHandler(); + const touchZoom = new TouchZoomHandler(); + map.touchZoomRotate = new TouchZoomRotateHandler(el, touchZoom, touchRotate, tapDragZoom); + this._add('touchRotate', touchRotate, [ + 'touchPan', + 'touchZoom' + ]); + this._add('touchZoom', touchZoom, [ + 'touchPan', + 'touchRotate' + ]); + this._add('blockableMapEvent', new BlockableMapEventHandler(map)); + const scrollZoom = map.scrollZoom = new ScrollZoomHandler(map, this); + this._add('scrollZoom', scrollZoom, ['mousePan']); + const keyboard = map.keyboard = new KeyboardHandler(); + this._add('keyboard', keyboard); + for (const name of [ + 'boxZoom', + 'doubleClickZoom', + 'tapDragZoom', + 'touchPitch', + 'dragRotate', + 'dragPan', + 'touchZoomRotate', + 'scrollZoom', + 'keyboard' + ]) { + if (options.interactive && options[name]) { + map[name].enable(options[name]); + } + } + } + _add(handlerName, handler, allowed) { + this._handlers.push({ + handlerName, + handler, + allowed + }); + this._handlersById[handlerName] = handler; + } + stop(allowEndAnimation) { + if (this._updatingCamera) + return; + for (const {handler} of this._handlers) { + handler.reset(); + } + this._inertia.clear(); + this._fireEvents({}, {}, allowEndAnimation); + this._changes = []; + } + isActive() { + for (const {handler} of this._handlers) { + if (handler.isActive()) + return true; + } + return false; + } + isZooming() { + return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming(); + } + isRotating() { + return !!this._eventsInProgress.rotate; + } + isMoving() { + return Boolean(isMoving(this._eventsInProgress)) || this.isZooming(); + } + _blockedByActive(activeHandlers, allowed, myName) { + for (const name in activeHandlers) { + if (name === myName) + continue; + if (!allowed || allowed.indexOf(name) < 0) { + return true; + } + } + return false; + } + handleWindowEvent(e) { + this.handleEvent(e, `${ e.type }Window`); + } + _getMapTouches(touches) { + const mapTouches = []; + for (const t of touches) { + const target = t.target; + if (this._el.contains(target)) { + mapTouches.push(t); + } + } + return mapTouches; + } + handleEvent(e, eventName) { + if (e.type === 'blur') { + this.stop(true); + return; + } + this._updatingCamera = true; + const inputEvent = e.type === 'renderFrame' ? undefined : e; + const mergedHandlerResult = { needsRenderFrame: false }; + const eventsInProgress = {}; + const activeHandlers = {}; + const mapTouches = e.touches ? this._getMapTouches(e.touches) : undefined; + const points = mapTouches ? DOM.touchPos(this._el, mapTouches) : DOM.mousePos(this._el, e); + for (const {handlerName, handler, allowed} of this._handlers) { + if (!handler.isEnabled()) + continue; + let data; + if (this._blockedByActive(activeHandlers, allowed, handlerName)) { + handler.reset(); + } else { + if (handler[eventName || e.type]) { + data = handler[eventName || e.type](e, points, mapTouches); + this.mergeHandlerResult(mergedHandlerResult, eventsInProgress, data, handlerName, inputEvent); + if (data && data.needsRenderFrame) { + this._triggerRenderFrame(); + } + } + } + if (data || handler.isActive()) { + activeHandlers[handlerName] = handler; + } + } + const deactivatedHandlers = {}; + for (const name in this._previousActiveHandlers) { + if (!activeHandlers[name]) { + deactivatedHandlers[name] = inputEvent; + } + } + this._previousActiveHandlers = activeHandlers; + if (Object.keys(deactivatedHandlers).length || hasChange(mergedHandlerResult)) { + this._changes.push([ + mergedHandlerResult, + eventsInProgress, + deactivatedHandlers + ]); + this._triggerRenderFrame(); + } + if (Object.keys(activeHandlers).length || hasChange(mergedHandlerResult)) { + this._map._stop(true); + } + this._updatingCamera = false; + const {cameraAnimation} = mergedHandlerResult; + if (cameraAnimation) { + this._inertia.clear(); + this._fireEvents({}, {}, true); + this._changes = []; + cameraAnimation(this._map); + } + } + mergeHandlerResult(mergedHandlerResult, eventsInProgress, handlerResult, name, e) { + if (!handlerResult) + return; + ref_properties.extend(mergedHandlerResult, handlerResult); + const eventData = { + handlerName: name, + originalEvent: handlerResult.originalEvent || e + }; + if (handlerResult.zoomDelta !== undefined) { + eventsInProgress.zoom = eventData; + } + if (handlerResult.panDelta !== undefined) { + eventsInProgress.drag = eventData; + } + if (handlerResult.pitchDelta !== undefined) { + eventsInProgress.pitch = eventData; + } + if (handlerResult.bearingDelta !== undefined) { + eventsInProgress.rotate = eventData; + } + } + _applyChanges() { + const combined = {}; + const combinedEventsInProgress = {}; + const combinedDeactivatedHandlers = {}; + for (const [change, eventsInProgress, deactivatedHandlers] of this._changes) { + if (change.panDelta) + combined.panDelta = (combined.panDelta || new ref_properties.Point(0, 0))._add(change.panDelta); + if (change.zoomDelta) + combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta; + if (change.bearingDelta) + combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta; + if (change.pitchDelta) + combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta; + if (change.around !== undefined) + combined.around = change.around; + if (change.aroundCoord !== undefined) + combined.aroundCoord = change.aroundCoord; + if (change.pinchAround !== undefined) + combined.pinchAround = change.pinchAround; + if (change.noInertia) + combined.noInertia = change.noInertia; + ref_properties.extend(combinedEventsInProgress, eventsInProgress); + ref_properties.extend(combinedDeactivatedHandlers, deactivatedHandlers); + } + this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers); + this._changes = []; + } + _updateMapTransform(combinedResult, combinedEventsInProgress, deactivatedHandlers) { + const map = this._map; + const tr = map.transform; + const eventStarted = type => { + const newEvent = combinedEventsInProgress[type]; + return newEvent && !this._eventsInProgress[type]; + }; + const eventEnded = type => { + const event = this._eventsInProgress[type]; + return event && !this._handlersById[event.handlerName].isActive(); + }; + const toVec3 = p => [ + p.x, + p.y, + p.z + ]; + if (eventEnded('drag') && !hasChange(combinedResult)) { + const preZoom = tr.zoom; + tr.cameraElevationReference = 'sea'; + tr.recenterOnTerrain(); + tr.cameraElevationReference = 'ground'; + if (preZoom !== tr.zoom) + this._map._update(true); + } + if (!hasChange(combinedResult)) { + return this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); + } + let {panDelta, zoomDelta, bearingDelta, pitchDelta, around, aroundCoord, pinchAround} = combinedResult; + if (pinchAround !== undefined) { + around = pinchAround; + } + if (eventStarted('drag') && around) { + this._dragOrigin = toVec3(tr.pointCoordinate3D(around)); + this._trackingEllipsoid.setup(tr._camera.position, this._dragOrigin); + } + tr.cameraElevationReference = 'sea'; + map._stop(true); + around = around || map.transform.centerPoint; + if (bearingDelta) + tr.bearing += bearingDelta; + if (pitchDelta) + tr.pitch += pitchDelta; + tr._updateCameraState(); + const panVec = [ + 0, + 0, + 0 + ]; + if (panDelta) { + const startRay = tr.screenPointToMercatorRay(around); + const endRay = tr.screenPointToMercatorRay(around.sub(panDelta)); + const startPoint = this._trackingEllipsoid.projectRay(startRay.dir); + const endPoint = this._trackingEllipsoid.projectRay(endRay.dir); + panVec[0] = endPoint[0] - startPoint[0]; + panVec[1] = endPoint[1] - startPoint[1]; + } + const originalZoom = tr.zoom; + const zoomVec = [ + 0, + 0, + 0 + ]; + if (zoomDelta) { + const pickedPosition = aroundCoord ? toVec3(aroundCoord) : toVec3(tr.pointCoordinate3D(around)); + const aroundRay = { dir: ref_properties.normalize([], ref_properties.sub([], pickedPosition, tr._camera.position)) }; + const centerRay = tr.screenPointToMercatorRay(tr.centerPoint); + if (aroundRay.dir[2] < 0) { + const pickedAltitude = ref_properties.altitudeFromMercatorZ(pickedPosition[2], pickedPosition[1]); + const centerOnTargetPlane = tr.rayIntersectionCoordinate(tr.pointRayIntersection(tr.centerPoint, pickedAltitude)); + const movement = tr.zoomDeltaToMovement(toVec3(centerOnTargetPlane), zoomDelta) * (centerRay.dir[2] / aroundRay.dir[2]); + ref_properties.scale$2(zoomVec, aroundRay.dir, movement); + } else if (tr._terrainEnabled()) { + const movement = tr.zoomDeltaToMovement(pickedPosition, zoomDelta); + ref_properties.scale$2(zoomVec, aroundRay.dir, movement); + } + } + const translation = ref_properties.add(panVec, panVec, zoomVec); + tr._translateCameraConstrained(translation); + if (zoomDelta && Math.abs(tr.zoom - originalZoom) > 0.0001) { + tr.recenterOnTerrain(); + } + tr.cameraElevationReference = 'ground'; + this._map._update(); + if (!combinedResult.noInertia) + this._inertia.record(combinedResult); + this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); + } + _fireEvents(newEventsInProgress, deactivatedHandlers, allowEndAnimation) { + const wasMoving = isMoving(this._eventsInProgress); + const nowMoving = isMoving(newEventsInProgress); + const startEvents = {}; + for (const eventName in newEventsInProgress) { + const {originalEvent} = newEventsInProgress[eventName]; + if (!this._eventsInProgress[eventName]) { + startEvents[`${ eventName }start`] = originalEvent; + } + this._eventsInProgress[eventName] = newEventsInProgress[eventName]; + } + if (!wasMoving && nowMoving) { + this._fireEvent('movestart', nowMoving.originalEvent); + } + for (const name in startEvents) { + this._fireEvent(name, startEvents[name]); + } + if (nowMoving) { + this._fireEvent('move', nowMoving.originalEvent); + } + for (const eventName in newEventsInProgress) { + const {originalEvent} = newEventsInProgress[eventName]; + this._fireEvent(eventName, originalEvent); + } + const endEvents = {}; + let originalEndEvent; + for (const eventName in this._eventsInProgress) { + const {handlerName, originalEvent} = this._eventsInProgress[eventName]; + if (!this._handlersById[handlerName].isActive()) { + delete this._eventsInProgress[eventName]; + originalEndEvent = deactivatedHandlers[handlerName] || originalEvent; + endEvents[`${ eventName }end`] = originalEndEvent; + } + } + for (const name in endEvents) { + this._fireEvent(name, endEvents[name]); + } + const stillMoving = isMoving(this._eventsInProgress); + if (allowEndAnimation && (wasMoving || nowMoving) && !stillMoving) { + this._updatingCamera = true; + const inertialEase = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions); + const shouldSnapToNorth = bearing => bearing !== 0 && -this._bearingSnap < bearing && bearing < this._bearingSnap; + if (inertialEase) { + if (shouldSnapToNorth(inertialEase.bearing || this._map.getBearing())) { + inertialEase.bearing = 0; + } + this._map.easeTo(inertialEase, { originalEvent: originalEndEvent }); + } else { + this._map.fire(new ref_properties.Event('moveend', { originalEvent: originalEndEvent })); + if (shouldSnapToNorth(this._map.getBearing())) { + this._map.resetNorth(); + } + } + this._updatingCamera = false; + } + } + _fireEvent(type, e) { + this._map.fire(new ref_properties.Event(type, e ? { originalEvent: e } : {})); + } + _requestFrame() { + this._map.triggerRepaint(); + return this._map._renderTaskQueue.add(timeStamp => { + delete this._frameId; + this.handleEvent(new RenderFrameEvent('renderFrame', { timeStamp })); + this._applyChanges(); + }); + } + _triggerRenderFrame() { + if (this._frameId === undefined) { + this._frameId = this._requestFrame(); + } + } +} + +class Camera extends ref_properties.Evented { + constructor(transform, options) { + super(); + this._moving = false; + this._zooming = false; + this.transform = transform; + this._bearingSnap = options.bearingSnap; + ref_properties.bindAll(['_renderFrameCallback'], this); + } + getCenter() { + return new ref_properties.LngLat(this.transform.center.lng, this.transform.center.lat); + } + setCenter(center, eventData) { + return this.jumpTo({ center }, eventData); + } + panBy(offset, options, eventData) { + offset = ref_properties.Point.convert(offset).mult(-1); + return this.panTo(this.transform.center, ref_properties.extend({ offset }, options), eventData); + } + panTo(lnglat, options, eventData) { + return this.easeTo(ref_properties.extend({ center: lnglat }, options), eventData); + } + getZoom() { + return this.transform.zoom; + } + setZoom(zoom, eventData) { + this.jumpTo({ zoom }, eventData); + return this; + } + zoomTo(zoom, options, eventData) { + return this.easeTo(ref_properties.extend({ zoom }, options), eventData); + } + zoomIn(options, eventData) { + this.zoomTo(this.getZoom() + 1, options, eventData); + return this; + } + zoomOut(options, eventData) { + this.zoomTo(this.getZoom() - 1, options, eventData); + return this; + } + getBearing() { + return this.transform.bearing; + } + setBearing(bearing, eventData) { + this.jumpTo({ bearing }, eventData); + return this; + } + getPadding() { + return this.transform.padding; + } + setPadding(padding, eventData) { + this.jumpTo({ padding }, eventData); + return this; + } + rotateTo(bearing, options, eventData) { + return this.easeTo(ref_properties.extend({ bearing }, options), eventData); + } + resetNorth(options, eventData) { + this.rotateTo(0, ref_properties.extend({ duration: 1000 }, options), eventData); + return this; + } + resetNorthPitch(options, eventData) { + this.easeTo(ref_properties.extend({ + bearing: 0, + pitch: 0, + duration: 1000 + }, options), eventData); + return this; + } + snapToNorth(options, eventData) { + if (Math.abs(this.getBearing()) < this._bearingSnap) { + return this.resetNorth(options, eventData); + } + return this; + } + getPitch() { + return this.transform.pitch; + } + setPitch(pitch, eventData) { + this.jumpTo({ pitch }, eventData); + return this; + } + cameraForBounds(bounds, options) { + bounds = ref_properties.LngLatBounds.convert(bounds); + const bearing = options && options.bearing || 0; + return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), bearing, options); + } + _extendCameraOptions(options) { + const defaultPadding = { + top: 0, + bottom: 0, + right: 0, + left: 0 + }; + options = ref_properties.extend({ + padding: defaultPadding, + offset: [ + 0, + 0 + ], + maxZoom: this.transform.maxZoom + }, options); + if (typeof options.padding === 'number') { + const p = options.padding; + options.padding = { + top: p, + bottom: p, + right: p, + left: p + }; + } + options.padding = ref_properties.extend(defaultPadding, options.padding); + return options; + } + _cameraForBoxAndBearing(p0, p1, bearing, options) { + const eOptions = this._extendCameraOptions(options); + const tr = this.transform; + const edgePadding = tr.padding; + const p0world = tr.project(ref_properties.LngLat.convert(p0)); + const p1world = tr.project(ref_properties.LngLat.convert(p1)); + const p0rotated = p0world.rotate(-ref_properties.degToRad(bearing)); + const p1rotated = p1world.rotate(-ref_properties.degToRad(bearing)); + const upperRight = new ref_properties.Point(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y)); + const lowerLeft = new ref_properties.Point(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y)); + const size = upperRight.sub(lowerLeft); + const scaleX = (tr.width - (edgePadding.left + edgePadding.right + eOptions.padding.left + eOptions.padding.right)) / size.x; + const scaleY = (tr.height - (edgePadding.top + edgePadding.bottom + eOptions.padding.top + eOptions.padding.bottom)) / size.y; + if (scaleY < 0 || scaleX < 0) { + ref_properties.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); + return; + } + const zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), eOptions.maxZoom); + const offset = typeof eOptions.offset.x === 'number' ? new ref_properties.Point(eOptions.offset.x, eOptions.offset.y) : ref_properties.Point.convert(eOptions.offset); + const paddingOffsetX = (eOptions.padding.left - eOptions.padding.right) / 2; + const paddingOffsetY = (eOptions.padding.top - eOptions.padding.bottom) / 2; + const paddingOffset = new ref_properties.Point(paddingOffsetX, paddingOffsetY); + const rotatedPaddingOffset = paddingOffset.rotate(bearing * Math.PI / 180); + const offsetAtInitialZoom = offset.add(rotatedPaddingOffset); + const offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom)); + const center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom)); + return { + center, + zoom, + bearing + }; + } + _cameraForBox(p0, p1, minAltitude, maxAltitude, options) { + const eOptions = this._extendCameraOptions(options); + minAltitude = minAltitude || 0; + maxAltitude = maxAltitude || 0; + p0 = ref_properties.LngLat.convert(p0); + p1 = ref_properties.LngLat.convert(p1); + const tr = this.transform.clone(); + tr.padding = eOptions.padding; + const camera = this.getFreeCameraOptions(); + const focus = new ref_properties.LngLat((p0.lng + p1.lng) * 0.5, (p0.lat + p1.lat) * 0.5); + const focusAltitude = (minAltitude + maxAltitude) * 0.5; + if (tr._camera.position[2] < ref_properties.mercatorZfromAltitude(focusAltitude, focus.lat)) { + ref_properties.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); + return; + } + camera.lookAtPoint(focus); + tr.setFreeCameraOptions(camera); + const coord0 = ref_properties.MercatorCoordinate.fromLngLat(p0); + const coord1 = ref_properties.MercatorCoordinate.fromLngLat(p1); + const toVec3 = p => [ + p.x, + p.y, + p.z + ]; + const centerIntersectionPoint = tr.pointRayIntersection(tr.centerPoint, focusAltitude); + const centerIntersectionCoord = toVec3(tr.rayIntersectionCoordinate(centerIntersectionPoint)); + const centerMercatorRay = tr.screenPointToMercatorRay(tr.centerPoint); + const maxMarchingSteps = 10; + let steps = 0; + let halfDistanceToGround; + do { + const z = Math.floor(tr.zoom); + const z2 = 1 << z; + const minX = Math.min(z2 * coord0.x, z2 * coord1.x); + const minY = Math.min(z2 * coord0.y, z2 * coord1.y); + const maxX = Math.max(z2 * coord0.x, z2 * coord1.x); + const maxY = Math.max(z2 * coord0.y, z2 * coord1.y); + const aabb = new ref_properties.Aabb([ + minX, + minY, + minAltitude + ], [ + maxX, + maxY, + maxAltitude + ]); + const frustum = ref_properties.Frustum.fromInvProjectionMatrix(tr.invProjMatrix, tr.worldSize, z); + if (aabb.intersects(frustum) !== 2) { + if (halfDistanceToGround) { + tr._camera.position = ref_properties.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, -halfDistanceToGround); + tr._updateStateFromCamera(); + } + break; + } + const cameraPositionToGround = ref_properties.sub([], tr._camera.position, centerIntersectionCoord); + halfDistanceToGround = 0.5 * ref_properties.length(cameraPositionToGround); + tr._camera.position = ref_properties.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, halfDistanceToGround); + try { + tr._updateStateFromCamera(); + } catch (e) { + ref_properties.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); + return; + } + } while (++steps < maxMarchingSteps); + return { + center: tr.center, + zoom: tr.zoom, + bearing: tr.bearing, + pitch: tr.pitch + }; + } + fitBounds(bounds, options, eventData) { + return this._fitInternal(this.cameraForBounds(bounds, options), options, eventData); + } + _raycastElevationBox(point0, point1) { + const elevation = this.transform.elevation; + if (!elevation) + return; + const point2 = new ref_properties.Point(point0.x, point1.y); + const point3 = new ref_properties.Point(point1.x, point0.y); + const r0 = elevation.pointCoordinate(point0); + if (!r0) + return; + const r1 = elevation.pointCoordinate(point1); + if (!r1) + return; + const r2 = elevation.pointCoordinate(point2); + if (!r2) + return; + const r3 = elevation.pointCoordinate(point3); + if (!r3) + return; + const m0 = new ref_properties.MercatorCoordinate(r0[0], r0[1]).toLngLat(); + const m1 = new ref_properties.MercatorCoordinate(r1[0], r1[1]).toLngLat(); + const m2 = new ref_properties.MercatorCoordinate(r2[0], r2[1]).toLngLat(); + const m3 = new ref_properties.MercatorCoordinate(r3[0], r3[1]).toLngLat(); + const minLng = Math.min(m0.lng, Math.min(m1.lng, Math.min(m2.lng, m3.lng))); + const minLat = Math.min(m0.lat, Math.min(m1.lat, Math.min(m2.lat, m3.lat))); + const maxLng = Math.max(m0.lng, Math.max(m1.lng, Math.max(m2.lng, m3.lng))); + const maxLat = Math.max(m0.lat, Math.max(m1.lat, Math.max(m2.lat, m3.lat))); + const minAltitude = Math.min(r0[3], Math.min(r1[3], Math.min(r2[3], r3[3]))); + const maxAltitude = Math.max(r0[3], Math.max(r1[3], Math.max(r2[3], r3[3]))); + const minLngLat = new ref_properties.LngLat(minLng, minLat); + const maxLngLat = new ref_properties.LngLat(maxLng, maxLat); + return { + minLngLat, + maxLngLat, + minAltitude, + maxAltitude + }; + } + fitScreenCoordinates(p0, p1, bearing, options, eventData) { + let lngLat0, lngLat1, minAltitude, maxAltitude; + const point0 = ref_properties.Point.convert(p0); + const point1 = ref_properties.Point.convert(p1); + const raycast = this._raycastElevationBox(point0, point1); + if (!raycast) { + if (this.transform.isHorizonVisibleForPoints(point0, point1)) { + return this; + } + lngLat0 = this.transform.pointLocation(point0); + lngLat1 = this.transform.pointLocation(point1); + } else { + lngLat0 = raycast.minLngLat; + lngLat1 = raycast.maxLngLat; + minAltitude = raycast.minAltitude; + maxAltitude = raycast.maxAltitude; + } + if (this.transform.pitch === 0) { + return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(ref_properties.Point.convert(p0)), this.transform.pointLocation(ref_properties.Point.convert(p1)), bearing, options), options, eventData); + } + return this._fitInternal(this._cameraForBox(lngLat0, lngLat1, minAltitude, maxAltitude, options), options, eventData); + } + _fitInternal(calculatedOptions, options, eventData) { + if (!calculatedOptions) + return this; + options = ref_properties.extend(calculatedOptions, options); + delete options.padding; + return options.linear ? this.easeTo(options, eventData) : this.flyTo(options, eventData); + } + jumpTo(options, eventData) { + this.stop(); + const tr = this.transform; + let zoomChanged = false, bearingChanged = false, pitchChanged = false; + if ('zoom' in options && tr.zoom !== +options.zoom) { + zoomChanged = true; + tr.zoom = +options.zoom; + } + if (options.center !== undefined) { + tr.center = ref_properties.LngLat.convert(options.center); + } + if ('bearing' in options && tr.bearing !== +options.bearing) { + bearingChanged = true; + tr.bearing = +options.bearing; + } + if ('pitch' in options && tr.pitch !== +options.pitch) { + pitchChanged = true; + tr.pitch = +options.pitch; + } + if (options.padding != null && !tr.isPaddingEqual(options.padding)) { + tr.padding = options.padding; + } + this.fire(new ref_properties.Event('movestart', eventData)).fire(new ref_properties.Event('move', eventData)); + if (zoomChanged) { + this.fire(new ref_properties.Event('zoomstart', eventData)).fire(new ref_properties.Event('zoom', eventData)).fire(new ref_properties.Event('zoomend', eventData)); + } + if (bearingChanged) { + this.fire(new ref_properties.Event('rotatestart', eventData)).fire(new ref_properties.Event('rotate', eventData)).fire(new ref_properties.Event('rotateend', eventData)); + } + if (pitchChanged) { + this.fire(new ref_properties.Event('pitchstart', eventData)).fire(new ref_properties.Event('pitch', eventData)).fire(new ref_properties.Event('pitchend', eventData)); + } + return this.fire(new ref_properties.Event('moveend', eventData)); + } + getFreeCameraOptions() { + return this.transform.getFreeCameraOptions(); + } + setFreeCameraOptions(options, eventData) { + this.stop(); + const tr = this.transform; + const prevZoom = tr.zoom; + const prevPitch = tr.pitch; + const prevBearing = tr.bearing; + tr.setFreeCameraOptions(options); + const zoomChanged = prevZoom !== tr.zoom; + const pitchChanged = prevPitch !== tr.pitch; + const bearingChanged = prevBearing !== tr.bearing; + this.fire(new ref_properties.Event('movestart', eventData)).fire(new ref_properties.Event('move', eventData)); + if (zoomChanged) { + this.fire(new ref_properties.Event('zoomstart', eventData)).fire(new ref_properties.Event('zoom', eventData)).fire(new ref_properties.Event('zoomend', eventData)); + } + if (bearingChanged) { + this.fire(new ref_properties.Event('rotatestart', eventData)).fire(new ref_properties.Event('rotate', eventData)).fire(new ref_properties.Event('rotateend', eventData)); + } + if (pitchChanged) { + this.fire(new ref_properties.Event('pitchstart', eventData)).fire(new ref_properties.Event('pitch', eventData)).fire(new ref_properties.Event('pitchend', eventData)); + } + this.fire(new ref_properties.Event('moveend', eventData)); + return this; + } + easeTo(options, eventData) { + this._stop(false, options.easeId); + options = ref_properties.extend({ + offset: [ + 0, + 0 + ], + duration: 500, + easing: ref_properties.ease + }, options); + if (options.animate === false || !options.essential && ref_properties.browser.prefersReducedMotion) + options.duration = 0; + const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch, padding = 'padding' in options ? options.padding : tr.padding; + const offsetAsPoint = ref_properties.Point.convert(options.offset); + let pointAtOffset = tr.centerPoint.add(offsetAsPoint); + const locationAtOffset = tr.pointLocation(pointAtOffset); + const center = ref_properties.LngLat.convert(options.center || locationAtOffset); + this._normalizeCenter(center); + const from = tr.project(locationAtOffset); + const delta = tr.project(center).sub(from); + const finalScale = tr.zoomScale(zoom - startZoom); + let around, aroundPoint; + if (options.around) { + around = ref_properties.LngLat.convert(options.around); + aroundPoint = tr.locationPoint(around); + } + const currently = { + moving: this._moving, + zooming: this._zooming, + rotating: this._rotating, + pitching: this._pitching + }; + this._zooming = this._zooming || zoom !== startZoom; + this._rotating = this._rotating || startBearing !== bearing; + this._pitching = this._pitching || pitch !== startPitch; + this._padding = !tr.isPaddingEqual(padding); + this._easeId = options.easeId; + this._prepareEase(eventData, options.noMoveStart, currently); + this._ease(k => { + if (this._zooming) { + tr.zoom = ref_properties.number(startZoom, zoom, k); + } + if (this._rotating) { + tr.bearing = ref_properties.number(startBearing, bearing, k); + } + if (this._pitching) { + tr.pitch = ref_properties.number(startPitch, pitch, k); + } + if (this._padding) { + tr.interpolatePadding(startPadding, padding, k); + pointAtOffset = tr.centerPoint.add(offsetAsPoint); + } + if (around) { + tr.setLocationAtPoint(around, aroundPoint); + } else { + const scale = tr.zoomScale(tr.zoom - startZoom); + const base = zoom > startZoom ? Math.min(2, finalScale) : Math.max(0.5, finalScale); + const speedup = Math.pow(base, 1 - k); + const newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale)); + tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); + } + this._fireMoveEvents(eventData); + }, interruptingEaseId => { + tr.recenterOnTerrain(); + this._afterEase(eventData, interruptingEaseId); + }, options); + return this; + } + _prepareEase(eventData, noMoveStart, currently = {}) { + this._moving = true; + this.transform.cameraElevationReference = 'sea'; + if (!noMoveStart && !currently.moving) { + this.fire(new ref_properties.Event('movestart', eventData)); + } + if (this._zooming && !currently.zooming) { + this.fire(new ref_properties.Event('zoomstart', eventData)); + } + if (this._rotating && !currently.rotating) { + this.fire(new ref_properties.Event('rotatestart', eventData)); + } + if (this._pitching && !currently.pitching) { + this.fire(new ref_properties.Event('pitchstart', eventData)); + } + } + _fireMoveEvents(eventData) { + this.fire(new ref_properties.Event('move', eventData)); + if (this._zooming) { + this.fire(new ref_properties.Event('zoom', eventData)); + } + if (this._rotating) { + this.fire(new ref_properties.Event('rotate', eventData)); + } + if (this._pitching) { + this.fire(new ref_properties.Event('pitch', eventData)); + } + } + _afterEase(eventData, easeId) { + if (this._easeId && easeId && this._easeId === easeId) { + return; + } + delete this._easeId; + this.transform.cameraElevationReference = 'ground'; + const wasZooming = this._zooming; + const wasRotating = this._rotating; + const wasPitching = this._pitching; + this._moving = false; + this._zooming = false; + this._rotating = false; + this._pitching = false; + this._padding = false; + if (wasZooming) { + this.fire(new ref_properties.Event('zoomend', eventData)); + } + if (wasRotating) { + this.fire(new ref_properties.Event('rotateend', eventData)); + } + if (wasPitching) { + this.fire(new ref_properties.Event('pitchend', eventData)); + } + this.fire(new ref_properties.Event('moveend', eventData)); + } + flyTo(options, eventData) { + if (!options.essential && ref_properties.browser.prefersReducedMotion) { + const coercedOptions = ref_properties.pick(options, [ + 'center', + 'zoom', + 'bearing', + 'pitch', + 'around' + ]); + return this.jumpTo(coercedOptions, eventData); + } + this.stop(); + options = ref_properties.extend({ + offset: [ + 0, + 0 + ], + speed: 1.2, + curve: 1.42, + easing: ref_properties.ease + }, options); + const tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(); + const zoom = 'zoom' in options ? ref_properties.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; + const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; + const pitch = 'pitch' in options ? +options.pitch : startPitch; + const padding = 'padding' in options ? options.padding : tr.padding; + const scale = tr.zoomScale(zoom - startZoom); + const offsetAsPoint = ref_properties.Point.convert(options.offset); + let pointAtOffset = tr.centerPoint.add(offsetAsPoint); + const locationAtOffset = tr.pointLocation(pointAtOffset); + const center = ref_properties.LngLat.convert(options.center || locationAtOffset); + this._normalizeCenter(center); + const from = tr.project(locationAtOffset); + const delta = tr.project(center).sub(from); + let rho = options.curve; + const w0 = Math.max(tr.width, tr.height), w1 = w0 / scale, u1 = delta.mag(); + if ('minZoom' in options) { + const minZoom = ref_properties.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); + const wMax = w0 / tr.zoomScale(minZoom - startZoom); + rho = Math.sqrt(wMax / u1 * 2); + } + const rho2 = rho * rho; + function r(i) { + const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); + return Math.log(Math.sqrt(b * b + 1) - b); + } + function sinh(n) { + return (Math.exp(n) - Math.exp(-n)) / 2; + } + function cosh(n) { + return (Math.exp(n) + Math.exp(-n)) / 2; + } + function tanh(n) { + return sinh(n) / cosh(n); + } + const r0 = r(0); + let w = function (s) { + return cosh(r0) / cosh(r0 + rho * s); + }; + let u = function (s) { + return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; + }; + let S = (r(1) - r0) / rho; + if (Math.abs(u1) < 0.000001 || !isFinite(S)) { + if (Math.abs(w0 - w1) < 0.000001) + return this.easeTo(options, eventData); + const k = w1 < w0 ? -1 : 1; + S = Math.abs(Math.log(w1 / w0)) / rho; + u = function () { + return 0; + }; + w = function (s) { + return Math.exp(k * rho * s); + }; + } + if ('duration' in options) { + options.duration = +options.duration; + } else { + const V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; + options.duration = 1000 * S / V; + } + if (options.maxDuration && options.duration > options.maxDuration) { + options.duration = 0; + } + this._zooming = true; + this._rotating = startBearing !== bearing; + this._pitching = pitch !== startPitch; + this._padding = !tr.isPaddingEqual(padding); + this._prepareEase(eventData, false); + this._ease(k => { + const s = k * S; + const scale = 1 / w(s); + tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale); + if (this._rotating) { + tr.bearing = ref_properties.number(startBearing, bearing, k); + } + if (this._pitching) { + tr.pitch = ref_properties.number(startPitch, pitch, k); + } + if (this._padding) { + tr.interpolatePadding(startPadding, padding, k); + pointAtOffset = tr.centerPoint.add(offsetAsPoint); + } + const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); + tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); + tr._updateCenterElevation(); + this._fireMoveEvents(eventData); + }, () => this._afterEase(eventData), options); + return this; + } + isEasing() { + return !!this._easeFrameId; + } + stop() { + return this._stop(); + } + _stop(allowGestures, easeId) { + if (this._easeFrameId) { + this._cancelRenderFrame(this._easeFrameId); + delete this._easeFrameId; + delete this._onEaseFrame; + } + if (this._onEaseEnd) { + const onEaseEnd = this._onEaseEnd; + delete this._onEaseEnd; + onEaseEnd.call(this, easeId); + } + if (!allowGestures) { + const handlers = this.handlers; + if (handlers) + handlers.stop(false); + } + return this; + } + _ease(frame, finish, options) { + if (options.animate === false || options.duration === 0) { + frame(1); + finish(); + } else { + this._easeStart = ref_properties.browser.now(); + this._easeOptions = options; + this._onEaseFrame = frame; + this._onEaseEnd = finish; + this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); + } + } + _renderFrameCallback() { + const t = Math.min((ref_properties.browser.now() - this._easeStart) / this._easeOptions.duration, 1); + this._onEaseFrame(this._easeOptions.easing(t)); + if (t < 1) { + this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); + } else { + this.stop(); + } + } + _normalizeBearing(bearing, currentBearing) { + bearing = ref_properties.wrap(bearing, -180, 180); + const diff = Math.abs(bearing - currentBearing); + if (Math.abs(bearing - 360 - currentBearing) < diff) + bearing -= 360; + if (Math.abs(bearing + 360 - currentBearing) < diff) + bearing += 360; + return bearing; + } + _normalizeCenter(center) { + const tr = this.transform; + if (!tr.renderWorldCopies || tr.lngRange) + return; + const delta = center.lng - tr.center.lng; + center.lng += delta > 180 ? -360 : delta < -180 ? 360 : 0; + } +} + +class AttributionControl { + constructor(options = {}) { + this.options = options; + ref_properties.bindAll([ + '_toggleAttribution', + '_updateEditLink', + '_updateData', + '_updateCompact' + ], this); + } + getDefaultPosition() { + return 'bottom-right'; + } + onAdd(map) { + const compact = this.options && this.options.compact; + this._map = map; + this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); + this._compactButton = DOM.create('button', 'mapboxgl-ctrl-attrib-button', this._container); + this._compactButton.addEventListener('click', this._toggleAttribution); + this._setElementTitle(this._compactButton, 'ToggleAttribution'); + this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container); + this._innerContainer.setAttribute('role', 'list'); + if (compact) { + this._container.classList.add('mapboxgl-compact'); + } + this._updateAttributions(); + this._updateEditLink(); + this._map.on('styledata', this._updateData); + this._map.on('sourcedata', this._updateData); + this._map.on('moveend', this._updateEditLink); + if (compact === undefined) { + this._map.on('resize', this._updateCompact); + this._updateCompact(); + } + return this._container; + } + onRemove() { + DOM.remove(this._container); + this._map.off('styledata', this._updateData); + this._map.off('sourcedata', this._updateData); + this._map.off('moveend', this._updateEditLink); + this._map.off('resize', this._updateCompact); + this._map = undefined; + this._attribHTML = undefined; + } + _setElementTitle(element, title) { + const str = this._map._getUIString(`AttributionControl.${ title }`); + element.title = str; + element.setAttribute('aria-label', str); + } + _toggleAttribution() { + if (this._container.classList.contains('mapboxgl-compact-show')) { + this._container.classList.remove('mapboxgl-compact-show'); + this._compactButton.setAttribute('aria-pressed', 'false'); + } else { + this._container.classList.add('mapboxgl-compact-show'); + this._compactButton.setAttribute('aria-pressed', 'true'); + } + } + _updateEditLink() { + let editLink = this._editLink; + if (!editLink) { + editLink = this._editLink = this._container.querySelector('.mapbox-improve-map'); + } + const params = [ + { + key: 'owner', + value: this.styleOwner + }, + { + key: 'id', + value: this.styleId + }, + { + key: 'access_token', + value: this._map._requestManager._customAccessToken || ref_properties.config.ACCESS_TOKEN + } + ]; + if (editLink) { + const paramString = params.reduce((acc, next, i) => { + if (next.value) { + acc += `${ next.key }=${ next.value }${ i < params.length - 1 ? '&' : '' }`; + } + return acc; + }, `?`); + editLink.href = `${ ref_properties.config.FEEDBACK_URL }/${ paramString }${ this._map._hash ? this._map._hash.getHashString(true) : '' }`; + editLink.rel = 'noopener nofollow'; + this._setElementTitle(editLink, 'MapFeedback'); + } + } + _updateData(e) { + if (e && (e.sourceDataType === 'metadata' || e.sourceDataType === 'visibility' || e.dataType === 'style')) { + this._updateAttributions(); + this._updateEditLink(); + } + } + _updateAttributions() { + if (!this._map.style) + return; + let attributions = []; + if (this.options.customAttribution) { + if (Array.isArray(this.options.customAttribution)) { + attributions = attributions.concat(this.options.customAttribution.map(attribution => { + if (typeof attribution !== 'string') + return ''; + return attribution; + })); + } else if (typeof this.options.customAttribution === 'string') { + attributions.push(this.options.customAttribution); + } + } + if (this._map.style.stylesheet) { + const stylesheet = this._map.style.stylesheet; + this.styleOwner = stylesheet.owner; + this.styleId = stylesheet.id; + } + const sourceCaches = this._map.style._sourceCaches; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + if (sourceCache.used) { + const source = sourceCache.getSource(); + if (source.attribution && attributions.indexOf(source.attribution) < 0) { + attributions.push(source.attribution); + } + } + } + attributions.sort((a, b) => a.length - b.length); + attributions = attributions.filter((attrib, i) => { + for (let j = i + 1; j < attributions.length; j++) { + if (attributions[j].indexOf(attrib) >= 0) { + return false; + } + } + return true; + }); + const attribHTML = attributions.join(' | '); + if (attribHTML === this._attribHTML) + return; + this._attribHTML = attribHTML; + if (attributions.length) { + this._innerContainer.innerHTML = attribHTML; + this._container.classList.remove('mapboxgl-attrib-empty'); + } else { + this._container.classList.add('mapboxgl-attrib-empty'); + } + this._editLink = null; + } + _updateCompact() { + if (this._map.getCanvasContainer().offsetWidth <= 640) { + this._container.classList.add('mapboxgl-compact'); + } else { + this._container.classList.remove('mapboxgl-compact', 'mapboxgl-compact-show'); + } + } +} + +class LogoControl { + constructor() { + ref_properties.bindAll(['_updateLogo'], this); + ref_properties.bindAll(['_updateCompact'], this); + } + onAdd(map) { + this._map = map; + this._container = DOM.create('div', 'mapboxgl-ctrl'); + const anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); + anchor.target = '_blank'; + anchor.rel = 'noopener nofollow'; + anchor.href = 'https://www.mapbox.com/'; + anchor.setAttribute('aria-label', this._map._getUIString('LogoControl.Title')); + anchor.setAttribute('rel', 'noopener nofollow'); + this._container.appendChild(anchor); + this._container.style.display = 'none'; + this._map.on('sourcedata', this._updateLogo); + this._updateLogo(); + this._map.on('resize', this._updateCompact); + this._updateCompact(); + return this._container; + } + onRemove() { + DOM.remove(this._container); + this._map.off('sourcedata', this._updateLogo); + this._map.off('resize', this._updateCompact); + } + getDefaultPosition() { + return 'bottom-left'; + } + _updateLogo(e) { + if (!e || e.sourceDataType === 'metadata') { + this._container.style.display = this._logoRequired() ? 'block' : 'none'; + } + } + _logoRequired() { + if (!this._map.style) + return; + const sourceCaches = this._map.style._sourceCaches; + if (Object.entries(sourceCaches).length === 0) + return true; + for (const id in sourceCaches) { + const source = sourceCaches[id].getSource(); + if (source.hasOwnProperty('mapbox_logo') && !source.mapbox_logo) { + return false; + } + } + return true; + } + _updateCompact() { + const containerChildren = this._container.children; + if (containerChildren.length) { + const anchor = containerChildren[0]; + if (this._map.getCanvasContainer().offsetWidth < 250) { + anchor.classList.add('mapboxgl-compact'); + } else { + anchor.classList.remove('mapboxgl-compact'); + } + } + } +} + +class TaskQueue { + constructor() { + this._queue = []; + this._id = 0; + this._cleared = false; + this._currentlyRunning = false; + } + add(callback) { + const id = ++this._id; + const queue = this._queue; + queue.push({ + callback, + id, + cancelled: false + }); + return id; + } + remove(id) { + const running = this._currentlyRunning; + const queue = running ? this._queue.concat(running) : this._queue; + for (const task of queue) { + if (task.id === id) { + task.cancelled = true; + return; + } + } + } + run(timeStamp = 0) { + const queue = this._currentlyRunning = this._queue; + this._queue = []; + for (const task of queue) { + if (task.cancelled) + continue; + task.callback(timeStamp); + if (this._cleared) + break; + } + this._cleared = false; + this._currentlyRunning = false; + } + clear() { + if (this._currentlyRunning) { + this._cleared = true; + } + this._queue = []; + } +} + +const defaultLocale = { + 'AttributionControl.ToggleAttribution': 'Toggle attribution', + 'AttributionControl.MapFeedback': 'Map feedback', + 'FullscreenControl.Enter': 'Enter fullscreen', + 'FullscreenControl.Exit': 'Exit fullscreen', + 'GeolocateControl.FindMyLocation': 'Find my location', + 'GeolocateControl.LocationNotAvailable': 'Location not available', + 'LogoControl.Title': 'Mapbox logo', + 'NavigationControl.ResetBearing': 'Reset bearing to north', + 'NavigationControl.ZoomIn': 'Zoom in', + 'NavigationControl.ZoomOut': 'Zoom out', + 'ScaleControl.Feet': 'ft', + 'ScaleControl.Meters': 'm', + 'ScaleControl.Kilometers': 'km', + 'ScaleControl.Miles': 'mi', + 'ScaleControl.NauticalMiles': 'nm' +}; + +const {HTMLImageElement, HTMLElement, ImageBitmap} = ref_properties.window; +const defaultMinZoom = -2; +const defaultMaxZoom = 22; +const defaultMinPitch = 0; +const defaultMaxPitch = 85; +const defaultOptions$1 = { + center: [ + 0, + 0 + ], + zoom: 0, + bearing: 0, + pitch: 0, + minZoom: defaultMinZoom, + maxZoom: defaultMaxZoom, + minPitch: defaultMinPitch, + maxPitch: defaultMaxPitch, + interactive: true, + scrollZoom: true, + boxZoom: true, + dragRotate: true, + dragPan: true, + keyboard: true, + doubleClickZoom: true, + touchZoomRotate: true, + touchPitch: true, + bearingSnap: 7, + clickTolerance: 3, + pitchWithRotate: true, + hash: false, + attributionControl: true, + failIfMajorPerformanceCaveat: false, + preserveDrawingBuffer: false, + trackResize: true, + optimizeForTerrain: true, + renderWorldCopies: true, + refreshExpiredTiles: true, + maxTileCacheSize: null, + localIdeographFontFamily: 'sans-serif', + localFontFamily: null, + transformRequest: null, + accessToken: null, + fadeDuration: 300, + crossSourceCollisions: true +}; +class Map extends Camera { + constructor(options) { + options = ref_properties.extend({}, defaultOptions$1, options); + if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) { + throw new Error(`maxZoom must be greater than or equal to minZoom`); + } + if (options.minPitch != null && options.maxPitch != null && options.minPitch > options.maxPitch) { + throw new Error(`maxPitch must be greater than or equal to minPitch`); + } + if (options.minPitch != null && options.minPitch < defaultMinPitch) { + throw new Error(`minPitch must be greater than or equal to ${ defaultMinPitch }`); + } + if (options.maxPitch != null && options.maxPitch > defaultMaxPitch) { + throw new Error(`maxPitch must be less than or equal to ${ defaultMaxPitch }`); + } + const transform = new Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies); + super(transform, options); + this._interactive = options.interactive; + this._maxTileCacheSize = options.maxTileCacheSize; + this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; + this._preserveDrawingBuffer = options.preserveDrawingBuffer; + this._antialias = options.antialias; + this._trackResize = options.trackResize; + this._bearingSnap = options.bearingSnap; + this._refreshExpiredTiles = options.refreshExpiredTiles; + this._fadeDuration = options.fadeDuration; + this._isInitialLoad = true; + this._crossSourceCollisions = options.crossSourceCollisions; + this._crossFadingFactor = 1; + this._collectResourceTiming = options.collectResourceTiming; + this._optimizeForTerrain = options.optimizeForTerrain; + this._renderTaskQueue = new TaskQueue(); + this._controls = []; + this._mapId = ref_properties.uniqueId(); + this._locale = ref_properties.extend({}, defaultLocale, options.locale); + this._clickTolerance = options.clickTolerance; + this._requestManager = new ref_properties.RequestManager(options.transformRequest, options.accessToken); + if (typeof options.container === 'string') { + this._container = ref_properties.window.document.getElementById(options.container); + if (!this._container) { + throw new Error(`Container '${ options.container }' not found.`); + } + } else if (options.container instanceof HTMLElement) { + this._container = options.container; + } else { + throw new Error(`Invalid type: 'container' must be a String or HTMLElement.`); + } + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + ref_properties.bindAll([ + '_onWindowOnline', + '_onWindowResize', + '_onMapScroll', + '_contextLost', + '_contextRestored' + ], this); + this._setupContainer(); + this._setupPainter(); + if (this.painter === undefined) { + throw new Error(`Failed to initialize WebGL.`); + } + this.on('move', () => this._update(false)); + this.on('moveend', () => this._update(false)); + this.on('zoom', () => this._update(true)); + if (typeof ref_properties.window !== 'undefined') { + ref_properties.window.addEventListener('online', this._onWindowOnline, false); + ref_properties.window.addEventListener('resize', this._onWindowResize, false); + ref_properties.window.addEventListener('orientationchange', this._onWindowResize, false); + } + this.handlers = new HandlerManager(this, options); + const hashName = typeof options.hash === 'string' && options.hash || undefined; + this._hash = options.hash && new Hash(hashName).addTo(this); + if (!this._hash || !this._hash._onHashChange()) { + this.jumpTo({ + center: options.center, + zoom: options.zoom, + bearing: options.bearing, + pitch: options.pitch + }); + if (options.bounds) { + this.resize(); + this.fitBounds(options.bounds, ref_properties.extend({}, options.fitBoundsOptions, { duration: 0 })); + } + } + this.resize(); + this._localFontFamily = options.localFontFamily; + this._localIdeographFontFamily = options.localIdeographFontFamily; + if (options.style) + this.setStyle(options.style, { + localFontFamily: this._localFontFamily, + localIdeographFontFamily: this._localIdeographFontFamily + }); + if (options.attributionControl) + this.addControl(new AttributionControl({ customAttribution: options.customAttribution })); + this._logoControl = new LogoControl(); + this.addControl(this._logoControl, options.logoPosition); + this.on('style.load', () => { + if (this.transform.unmodified) { + this.jumpTo(this.style.stylesheet); + } + }); + this.on('data', event => { + this._update(event.dataType === 'style'); + this.fire(new ref_properties.Event(`${ event.dataType }data`, event)); + }); + this.on('dataloading', event => { + this.fire(new ref_properties.Event(`${ event.dataType }dataloading`, event)); + }); + } + _getMapId() { + return this._mapId; + } + addControl(control, position) { + if (position === undefined) { + if (control.getDefaultPosition) { + position = control.getDefaultPosition(); + } else { + position = 'top-right'; + } + } + if (!control || !control.onAdd) { + return this.fire(new ref_properties.ErrorEvent(new Error('Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.'))); + } + const controlElement = control.onAdd(this); + this._controls.push(control); + const positionContainer = this._controlPositions[position]; + if (position.indexOf('bottom') !== -1) { + positionContainer.insertBefore(controlElement, positionContainer.firstChild); + } else { + positionContainer.appendChild(controlElement); + } + return this; + } + removeControl(control) { + if (!control || !control.onRemove) { + return this.fire(new ref_properties.ErrorEvent(new Error('Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.'))); + } + const ci = this._controls.indexOf(control); + if (ci > -1) + this._controls.splice(ci, 1); + control.onRemove(this); + return this; + } + hasControl(control) { + return this._controls.indexOf(control) > -1; + } + resize(eventData) { + const dimensions = this._containerDimensions(); + const width = dimensions[0]; + const height = dimensions[1]; + this._resizeCanvas(width, height); + this.transform.resize(width, height); + this.painter.resize(width, height); + const fireMoving = !this._moving; + if (fireMoving) { + this.stop(); + this.fire(new ref_properties.Event('movestart', eventData)).fire(new ref_properties.Event('move', eventData)); + } + this.fire(new ref_properties.Event('resize', eventData)); + if (fireMoving) + this.fire(new ref_properties.Event('moveend', eventData)); + return this; + } + getBounds() { + return this.transform.getBounds(); + } + getMaxBounds() { + return this.transform.getMaxBounds(); + } + setMaxBounds(bounds) { + this.transform.setMaxBounds(ref_properties.LngLatBounds.convert(bounds)); + return this._update(); + } + setMinZoom(minZoom) { + minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; + if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { + this.transform.minZoom = minZoom; + this._update(); + if (this.getZoom() < minZoom) + this.setZoom(minZoom); + return this; + } else + throw new Error(`minZoom must be between ${ defaultMinZoom } and the current maxZoom, inclusive`); + } + getMinZoom() { + return this.transform.minZoom; + } + setMaxZoom(maxZoom) { + maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; + if (maxZoom >= this.transform.minZoom) { + this.transform.maxZoom = maxZoom; + this._update(); + if (this.getZoom() > maxZoom) + this.setZoom(maxZoom); + return this; + } else + throw new Error(`maxZoom must be greater than the current minZoom`); + } + getMaxZoom() { + return this.transform.maxZoom; + } + setMinPitch(minPitch) { + minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch; + if (minPitch < defaultMinPitch) { + throw new Error(`minPitch must be greater than or equal to ${ defaultMinPitch }`); + } + if (minPitch >= defaultMinPitch && minPitch <= this.transform.maxPitch) { + this.transform.minPitch = minPitch; + this._update(); + if (this.getPitch() < minPitch) + this.setPitch(minPitch); + return this; + } else + throw new Error(`minPitch must be between ${ defaultMinPitch } and the current maxPitch, inclusive`); + } + getMinPitch() { + return this.transform.minPitch; + } + setMaxPitch(maxPitch) { + maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch; + if (maxPitch > defaultMaxPitch) { + throw new Error(`maxPitch must be less than or equal to ${ defaultMaxPitch }`); + } + if (maxPitch >= this.transform.minPitch) { + this.transform.maxPitch = maxPitch; + this._update(); + if (this.getPitch() > maxPitch) + this.setPitch(maxPitch); + return this; + } else + throw new Error(`maxPitch must be greater than the current minPitch`); + } + getMaxPitch() { + return this.transform.maxPitch; + } + getRenderWorldCopies() { + return this.transform.renderWorldCopies; + } + setRenderWorldCopies(renderWorldCopies) { + this.transform.renderWorldCopies = renderWorldCopies; + return this._update(); + } + project(lnglat) { + return this.transform.locationPoint3D(ref_properties.LngLat.convert(lnglat)); + } + unproject(point) { + return this.transform.pointLocation3D(ref_properties.Point.convert(point)); + } + isMoving() { + return this._moving || this.handlers && this.handlers.isMoving(); + } + isZooming() { + return this._zooming || this.handlers && this.handlers.isZooming(); + } + isRotating() { + return this._rotating || this.handlers && this.handlers.isRotating(); + } + _createDelegatedListener(type, layerId, listener) { + if (type === 'mouseenter' || type === 'mouseover') { + let mousein = false; + const mousemove = e => { + const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; + if (!features.length) { + mousein = false; + } else if (!mousein) { + mousein = true; + listener.call(this, new MapMouseEvent(type, this, e.originalEvent, { features })); + } + }; + const mouseout = () => { + mousein = false; + }; + return { + layer: layerId, + listener, + delegates: { + mousemove, + mouseout + } + }; + } else if (type === 'mouseleave' || type === 'mouseout') { + let mousein = false; + const mousemove = e => { + const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; + if (features.length) { + mousein = true; + } else if (mousein) { + mousein = false; + listener.call(this, new MapMouseEvent(type, this, e.originalEvent)); + } + }; + const mouseout = e => { + if (mousein) { + mousein = false; + listener.call(this, new MapMouseEvent(type, this, e.originalEvent)); + } + }; + return { + layer: layerId, + listener, + delegates: { + mousemove, + mouseout + } + }; + } else { + const delegate = e => { + const features = this.getLayer(layerId) ? this.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; + if (features.length) { + e.features = features; + listener.call(this, e); + delete e.features; + } + }; + return { + layer: layerId, + listener, + delegates: { [type]: delegate } + }; + } + } + on(type, layerId, listener) { + if (listener === undefined) { + return super.on(type, layerId); + } + const delegatedListener = this._createDelegatedListener(type, layerId, listener); + this._delegatedListeners = this._delegatedListeners || {}; + this._delegatedListeners[type] = this._delegatedListeners[type] || []; + this._delegatedListeners[type].push(delegatedListener); + for (const event in delegatedListener.delegates) { + this.on(event, delegatedListener.delegates[event]); + } + return this; + } + once(type, layerId, listener) { + if (listener === undefined) { + return super.once(type, layerId); + } + const delegatedListener = this._createDelegatedListener(type, layerId, listener); + for (const event in delegatedListener.delegates) { + this.once(event, delegatedListener.delegates[event]); + } + return this; + } + off(type, layerId, listener) { + if (listener === undefined) { + return super.off(type, layerId); + } + const removeDelegatedListener = delegatedListeners => { + const listeners = delegatedListeners[type]; + for (let i = 0; i < listeners.length; i++) { + const delegatedListener = listeners[i]; + if (delegatedListener.layer === layerId && delegatedListener.listener === listener) { + for (const event in delegatedListener.delegates) { + this.off(event, delegatedListener.delegates[event]); + } + listeners.splice(i, 1); + return this; + } + } + }; + if (this._delegatedListeners && this._delegatedListeners[type]) { + removeDelegatedListener(this._delegatedListeners); + } + return this; + } + queryRenderedFeatures(geometry, options) { + if (!this.style) { + return []; + } + if (options === undefined && geometry !== undefined && !(geometry instanceof ref_properties.Point) && !Array.isArray(geometry)) { + options = geometry; + geometry = undefined; + } + options = options || {}; + geometry = geometry || [ + [ + 0, + 0 + ], + [ + this.transform.width, + this.transform.height + ] + ]; + return this.style.queryRenderedFeatures(geometry, options, this.transform); + } + querySourceFeatures(sourceId, parameters) { + return this.style.querySourceFeatures(sourceId, parameters); + } + setStyle(style, options) { + options = ref_properties.extend({}, { + localIdeographFontFamily: this._localIdeographFontFamily, + localFontFamily: this._localFontFamily + }, options); + if (options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily && options.localFontFamily === this._localFontFamily && this.style && style) { + this._diffStyle(style, options); + return this; + } else { + this._localIdeographFontFamily = options.localIdeographFontFamily; + this._localFontFamily = options.localFontFamily; + return this._updateStyle(style, options); + } + } + _getUIString(key) { + const str = this._locale[key]; + if (str == null) { + throw new Error(`Missing UI string '${ key }'`); + } + return str; + } + _updateStyle(style, options) { + if (this.style) { + this.style.setEventedParent(null); + this.style._remove(); + delete this.style; + } + if (style) { + this.style = new Style(this, options || {}); + this.style.setEventedParent(this, { style: this.style }); + if (typeof style === 'string') { + this.style.loadURL(style); + } else { + this.style.loadJSON(style); + } + } + this._updateTerrain(); + return this; + } + _lazyInitEmptyStyle() { + if (!this.style) { + this.style = new Style(this, {}); + this.style.setEventedParent(this, { style: this.style }); + this.style.loadEmpty(); + } + } + _diffStyle(style, options) { + if (typeof style === 'string') { + const url = this._requestManager.normalizeStyleURL(style); + const request = this._requestManager.transformRequest(url, ref_properties.ResourceType.Style); + ref_properties.getJSON(request, (error, json) => { + if (error) { + this.fire(new ref_properties.ErrorEvent(error)); + } else if (json) { + this._updateDiff(json, options); + } + }); + } else if (typeof style === 'object') { + this._updateDiff(style, options); + } + } + _updateDiff(style, options) { + try { + if (this.style.setState(style)) { + this._update(true); + } + } catch (e) { + ref_properties.warnOnce(`Unable to perform style diff: ${ e.message || e.error || e }. Rebuilding the style from scratch.`); + this._updateStyle(style, options); + } + } + getStyle() { + if (this.style) { + return this.style.serialize(); + } + } + isStyleLoaded() { + if (!this.style) + return ref_properties.warnOnce('There is no style added to the map.'); + return this.style.loaded(); + } + addSource(id, source) { + this._lazyInitEmptyStyle(); + this.style.addSource(id, source); + return this._update(true); + } + isSourceLoaded(id) { + const sourceCaches = this.style && this.style._getSourceCaches(id); + if (sourceCaches.length === 0) { + this.fire(new ref_properties.ErrorEvent(new Error(`There is no source with ID '${ id }'`))); + return; + } + return sourceCaches.every(sc => sc.loaded()); + } + areTilesLoaded() { + const sources = this.style && this.style._sourceCaches; + for (const id in sources) { + const source = sources[id]; + const tiles = source._tiles; + for (const t in tiles) { + const tile = tiles[t]; + if (!(tile.state === 'loaded' || tile.state === 'errored')) + return false; + } + } + return true; + } + addSourceType(name, SourceType, callback) { + this._lazyInitEmptyStyle(); + return this.style.addSourceType(name, SourceType, callback); + } + removeSource(id) { + this.style.removeSource(id); + this._updateTerrain(); + return this._update(true); + } + getSource(id) { + return this.style.getSource(id); + } + addImage(id, image, {pixelRatio = 1, sdf = false, stretchX, stretchY, content} = {}) { + this._lazyInitEmptyStyle(); + const version = 0; + if (image instanceof HTMLImageElement || ImageBitmap && image instanceof ImageBitmap) { + const {width, height, data} = ref_properties.browser.getImageData(image); + this.style.addImage(id, { + data: new ref_properties.RGBAImage({ + width, + height + }, data), + pixelRatio, + stretchX, + stretchY, + content, + sdf, + version + }); + } else if (image.width === undefined || image.height === undefined) { + return this.fire(new ref_properties.ErrorEvent(new Error('Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); + } else { + const {width, height, data} = image; + const userImage = image; + this.style.addImage(id, { + data: new ref_properties.RGBAImage({ + width, + height + }, new Uint8Array(data)), + pixelRatio, + stretchX, + stretchY, + content, + sdf, + version, + userImage + }); + if (userImage.onAdd) { + userImage.onAdd(this, id); + } + } + } + updateImage(id, image) { + const existingImage = this.style.getImage(id); + if (!existingImage) { + return this.fire(new ref_properties.ErrorEvent(new Error('The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.'))); + } + const imageData = image instanceof HTMLImageElement || ImageBitmap && image instanceof ImageBitmap ? ref_properties.browser.getImageData(image) : image; + const {width, height, data} = imageData; + if (width === undefined || height === undefined) { + return this.fire(new ref_properties.ErrorEvent(new Error('Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); + } + if (width !== existingImage.data.width || height !== existingImage.data.height) { + return this.fire(new ref_properties.ErrorEvent(new Error('The width and height of the updated image must be that same as the previous version of the image'))); + } + const copy = !(image instanceof HTMLImageElement || ImageBitmap && image instanceof ImageBitmap); + existingImage.data.replace(data, copy); + this.style.updateImage(id, existingImage); + } + hasImage(id) { + if (!id) { + this.fire(new ref_properties.ErrorEvent(new Error('Missing required image id'))); + return false; + } + return !!this.style.getImage(id); + } + removeImage(id) { + this.style.removeImage(id); + } + loadImage(url, callback) { + ref_properties.getImage(this._requestManager.transformRequest(url, ref_properties.ResourceType.Image), callback); + } + listImages() { + return this.style.listImages(); + } + addLayer(layer, beforeId) { + this._lazyInitEmptyStyle(); + this.style.addLayer(layer, beforeId); + return this._update(true); + } + moveLayer(id, beforeId) { + this.style.moveLayer(id, beforeId); + return this._update(true); + } + removeLayer(id) { + this.style.removeLayer(id); + return this._update(true); + } + getLayer(id) { + return this.style.getLayer(id); + } + setLayerZoomRange(layerId, minzoom, maxzoom) { + this.style.setLayerZoomRange(layerId, minzoom, maxzoom); + return this._update(true); + } + setFilter(layerId, filter, options = {}) { + this.style.setFilter(layerId, filter, options); + return this._update(true); + } + getFilter(layerId) { + return this.style.getFilter(layerId); + } + setPaintProperty(layerId, name, value, options = {}) { + this.style.setPaintProperty(layerId, name, value, options); + return this._update(true); + } + getPaintProperty(layerId, name) { + return this.style.getPaintProperty(layerId, name); + } + setLayoutProperty(layerId, name, value, options = {}) { + this.style.setLayoutProperty(layerId, name, value, options); + return this._update(true); + } + getLayoutProperty(layerId, name) { + return this.style.getLayoutProperty(layerId, name); + } + setLight(light, options = {}) { + this._lazyInitEmptyStyle(); + this.style.setLight(light, options); + return this._update(true); + } + getLight() { + return this.style.getLight(); + } + setTerrain(terrain) { + this._lazyInitEmptyStyle(); + this.style.setTerrain(terrain); + return this._update(true); + } + setFeatureState(feature, state) { + this.style.setFeatureState(feature, state); + return this._update(); + } + removeFeatureState(target, key) { + this.style.removeFeatureState(target, key); + return this._update(); + } + getFeatureState(feature) { + return this.style.getFeatureState(feature); + } + getContainer() { + return this._container; + } + getCanvasContainer() { + return this._canvasContainer; + } + getCanvas() { + return this._canvas; + } + _containerDimensions() { + let width = 0; + let height = 0; + if (this._container) { + width = this._container.clientWidth || 400; + height = this._container.clientHeight || 300; + } + return [ + width, + height + ]; + } + _detectMissingCSS() { + const computedColor = ref_properties.window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color'); + if (computedColor !== 'rgb(250, 128, 114)') { + ref_properties.warnOnce('This page appears to be missing CSS declarations for ' + 'Mapbox GL JS, which may cause the map to display incorrectly. ' + 'Please ensure your page includes mapbox-gl.css, as described ' + 'in https://www.mapbox.com/mapbox-gl-js/api/.'); + } + } + _setupContainer() { + const container = this._container; + container.classList.add('mapboxgl-map'); + const missingCSSCanary = this._missingCSSCanary = DOM.create('div', 'mapboxgl-canary', container); + missingCSSCanary.style.visibility = 'hidden'; + this._detectMissingCSS(); + const canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); + if (this._interactive) { + canvasContainer.classList.add('mapboxgl-interactive'); + } + this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); + this._canvas.addEventListener('webglcontextlost', this._contextLost, false); + this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false); + this._canvas.setAttribute('tabindex', '0'); + this._canvas.setAttribute('aria-label', 'Map'); + this._canvas.setAttribute('role', 'region'); + const dimensions = this._containerDimensions(); + this._resizeCanvas(dimensions[0], dimensions[1]); + const controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); + const positions = this._controlPositions = {}; + [ + 'top-left', + 'top-right', + 'bottom-left', + 'bottom-right' + ].forEach(positionName => { + positions[positionName] = DOM.create('div', `mapboxgl-ctrl-${ positionName }`, controlContainer); + }); + this._container.addEventListener('scroll', this._onMapScroll, false); + } + _resizeCanvas(width, height) { + const pixelRatio = ref_properties.browser.devicePixelRatio || 1; + this._canvas.width = pixelRatio * width; + this._canvas.height = pixelRatio * height; + this._canvas.style.width = `${ width }px`; + this._canvas.style.height = `${ height }px`; + } + _setupPainter() { + const attributes = ref_properties.extend({}, supported.webGLContextAttributes, { + failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, + preserveDrawingBuffer: this._preserveDrawingBuffer, + antialias: this._antialias || false + }); + const gl = this._canvas.getContext('webgl', attributes) || this._canvas.getContext('experimental-webgl', attributes); + if (!gl) { + this.fire(new ref_properties.ErrorEvent(new Error('Failed to initialize WebGL'))); + return; + } + this.painter = new Painter(gl, this.transform); + this.on('data', event => { + if (event.dataType === 'source') { + this.painter.setTileLoadedFlag(true); + } + }); + ref_properties.webpSupported.testSupport(gl); + } + _contextLost(event) { + event.preventDefault(); + if (this._frame) { + this._frame.cancel(); + this._frame = null; + } + this.fire(new ref_properties.Event('webglcontextlost', { originalEvent: event })); + } + _contextRestored(event) { + this._setupPainter(); + this.resize(); + this._update(); + this.fire(new ref_properties.Event('webglcontextrestored', { originalEvent: event })); + } + _onMapScroll(event) { + if (event.target !== this._container) + return; + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + return false; + } + loaded() { + return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded(); + } + _update(updateStyle) { + if (!this.style) + return this; + this._styleDirty = this._styleDirty || updateStyle; + this._sourcesDirty = true; + this.triggerRepaint(); + return this; + } + _requestRenderFrame(callback) { + this._update(); + return this._renderTaskQueue.add(callback); + } + _cancelRenderFrame(id) { + this._renderTaskQueue.remove(id); + } + _render(paintStartTimeStamp) { + let gpuTimer, frameStartTime = 0; + const extTimerQuery = this.painter.context.extTimerQuery; + if (this.listens('gpu-timing-frame')) { + gpuTimer = extTimerQuery.createQueryEXT(); + extTimerQuery.beginQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer); + frameStartTime = ref_properties.browser.now(); + } + this.painter.context.setDirty(); + this.painter.setBaseState(); + this._renderTaskQueue.run(paintStartTimeStamp); + if (this._removed) + return; + let crossFading = false; + const fadeDuration = this._isInitialLoad ? 0 : this._fadeDuration; + if (this.style && this._styleDirty) { + this._styleDirty = false; + const zoom = this.transform.zoom; + const now = ref_properties.browser.now(); + this.style.zoomHistory.update(zoom, now); + const parameters = new ref_properties.EvaluationParameters(zoom, { + now, + fadeDuration, + zoomHistory: this.style.zoomHistory, + transition: this.style.getTransition() + }); + const factor = parameters.crossFadingFactor(); + if (factor !== 1 || factor !== this._crossFadingFactor) { + crossFading = true; + this._crossFadingFactor = factor; + } + this.style.update(parameters); + } + if (this.style && this._sourcesDirty) { + this._sourcesDirty = false; + this._updateTerrain(); + this.style._updateSources(this.transform); + } + this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, fadeDuration, this._crossSourceCollisions); + this.painter.render(this.style, { + showTileBoundaries: this.showTileBoundaries, + showOverdrawInspector: this._showOverdrawInspector, + showQueryGeometry: !!this._showQueryGeometry, + rotating: this.isRotating(), + zooming: this.isZooming(), + moving: this.isMoving(), + fadeDuration, + isInitialLoad: this._isInitialLoad, + showPadding: this.showPadding, + gpuTiming: !!this.listens('gpu-timing-layer'), + speedIndexTiming: this.speedIndexTiming + }); + this.fire(new ref_properties.Event('render')); + if (this.loaded() && !this._loaded) { + this._loaded = true; + this.fire(new ref_properties.Event('load')); + } + if (this.style && (this.style.hasTransitions() || crossFading)) { + this._styleDirty = true; + } + if (this.style && !this._placementDirty) { + this.style._releaseSymbolFadeTiles(); + } + if (this.listens('gpu-timing-frame')) { + const renderCPUTime = ref_properties.browser.now() - frameStartTime; + extTimerQuery.endQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer); + setTimeout(() => { + const renderGPUTime = extTimerQuery.getQueryObjectEXT(gpuTimer, extTimerQuery.QUERY_RESULT_EXT) / (1000 * 1000); + extTimerQuery.deleteQueryEXT(gpuTimer); + this.fire(new ref_properties.Event('gpu-timing-frame', { + cpuTime: renderCPUTime, + gpuTime: renderGPUTime + })); + }, 50); + } + if (this.listens('gpu-timing-layer')) { + const frameLayerQueries = this.painter.collectGpuTimers(); + setTimeout(() => { + const renderedLayerTimes = this.painter.queryGpuTimers(frameLayerQueries); + this.fire(new ref_properties.Event('gpu-timing-layer', { layerTimes: renderedLayerTimes })); + }, 50); + } + const somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty; + if (somethingDirty || this._repaint) { + this.triggerRepaint(); + } else { + this._triggerFrame(false); + if (!this.isMoving() && this.loaded()) { + this.fire(new ref_properties.Event('idle')); + if (this._isInitialLoad) { + this._authenticate(); + } + this._isInitialLoad = false; + if (this.speedIndexTiming) { + const speedIndexNumber = this._calculateSpeedIndex(); + this.fire(new ref_properties.Event('speedindexcompleted', { speedIndex: speedIndexNumber })); + this.speedIndexTiming = false; + } + } + } + if (this._loaded && !this._fullyLoaded && !somethingDirty) { + this._fullyLoaded = true; + } + return this; + } + _authenticate() { + ref_properties.getMapSessionAPI(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, err => { + if (err) { + if (err.message === ref_properties.AUTH_ERR_MSG || err.status === 401) { + console.error('Error: A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/'); + ref_properties.browser.setErrorState(); + const gl = this.painter.context.gl; + if (this._logoControl instanceof LogoControl) { + this._logoControl._updateLogo(); + } + if (gl) + gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + } + } + }); + ref_properties.postMapLoadEvent(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, () => { + }); + } + _updateTerrain() { + this.painter.updateTerrain(this.style, this.isMoving() || this.isRotating() || this.isZooming()); + } + _calculateSpeedIndex() { + const finalFrame = this.painter.canvasCopy(); + const canvasCopyInstances = this.painter.getCanvasCopiesAndTimestamps(); + canvasCopyInstances.timeStamps.push(performance.now()); + const gl = this.painter.context.gl; + const framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + function read(texture) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + const pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4); + gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + return pixels; + } + return this._canvasPixelComparison(read(finalFrame), canvasCopyInstances.canvasCopies.map(read), canvasCopyInstances.timeStamps); + } + _canvasPixelComparison(finalFrame, allFrames, timeStamps) { + let finalScore = timeStamps[1] - timeStamps[0]; + const numPixels = finalFrame.length / 4; + for (let i = 0; i < allFrames.length; i++) { + const frame = allFrames[i]; + let cnt = 0; + for (let j = 0; j < frame.length; j += 4) { + if (frame[j] === finalFrame[j] && frame[j + 1] === finalFrame[j + 1] && frame[j + 2] === finalFrame[j + 2] && frame[j + 3] === finalFrame[j + 3]) { + cnt = cnt + 1; + } + } + const interval = timeStamps[i + 2] - timeStamps[i + 1]; + const visualCompletness = cnt / numPixels; + finalScore += interval * (1 - visualCompletness); + } + return finalScore; + } + remove() { + if (this._hash) + this._hash.remove(); + for (const control of this._controls) + control.onRemove(this); + this._controls = []; + if (this._frame) { + this._frame.cancel(); + this._frame = null; + } + this._renderTaskQueue.clear(); + this.painter.destroy(); + this.handlers.destroy(); + delete this.handlers; + this.setStyle(null); + if (typeof ref_properties.window !== 'undefined') { + ref_properties.window.removeEventListener('resize', this._onWindowResize, false); + ref_properties.window.removeEventListener('orientationchange', this._onWindowResize, false); + ref_properties.window.removeEventListener('online', this._onWindowOnline, false); + } + const extension = this.painter.context.gl.getExtension('WEBGL_lose_context'); + if (extension) + extension.loseContext(); + removeNode(this._canvasContainer); + removeNode(this._controlContainer); + removeNode(this._missingCSSCanary); + this._container.classList.remove('mapboxgl-map'); + this._removed = true; + this.fire(new ref_properties.Event('remove')); + } + triggerRepaint() { + this._triggerFrame(true); + } + _triggerFrame(render) { + this._renderNextFrame = this._renderNextFrame || render; + if (this.style && !this._frame) { + this._frame = ref_properties.browser.frame(paintStartTimeStamp => { + const isRenderFrame = !!this._renderNextFrame; + this._frame = null; + this._renderNextFrame = null; + if (isRenderFrame) { + this._render(paintStartTimeStamp); + } + }); + } + } + _onWindowOnline() { + this._update(); + } + _onWindowResize(event) { + if (this._trackResize) { + this.resize({ originalEvent: event })._update(); + } + } + get showTileBoundaries() { + return !!this._showTileBoundaries; + } + set showTileBoundaries(value) { + if (this._showTileBoundaries === value) + return; + this._showTileBoundaries = value; + this._update(); + } + get speedIndexTiming() { + return !!this._speedIndexTiming; + } + set speedIndexTiming(value) { + if (this._speedIndexTiming === value) + return; + this._speedIndexTiming = value; + this._update(); + } + get showPadding() { + return !!this._showPadding; + } + set showPadding(value) { + if (this._showPadding === value) + return; + this._showPadding = value; + this._update(); + } + get showCollisionBoxes() { + return !!this._showCollisionBoxes; + } + set showCollisionBoxes(value) { + if (this._showCollisionBoxes === value) + return; + this._showCollisionBoxes = value; + if (value) { + this.style._generateCollisionBoxes(); + } else { + this._update(); + } + } + get showOverdrawInspector() { + return !!this._showOverdrawInspector; + } + set showOverdrawInspector(value) { + if (this._showOverdrawInspector === value) + return; + this._showOverdrawInspector = value; + this._update(); + } + get repaint() { + return !!this._repaint; + } + set repaint(value) { + if (this._repaint !== value) { + this._repaint = value; + this.triggerRepaint(); + } + } + get vertices() { + return !!this._vertices; + } + set vertices(value) { + this._vertices = value; + this._update(); + } + _setCacheLimits(limit, checkThreshold) { + ref_properties.setCacheLimits(limit, checkThreshold); + } + get version() { + return ref_properties.version; + } +} +function removeNode(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} + +const defaultOptions$2 = { + showCompass: true, + showZoom: true, + visualizePitch: false +}; +class NavigationControl { + constructor(options) { + this.options = ref_properties.extend({}, defaultOptions$2, options); + this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); + this._container.addEventListener('contextmenu', e => e.preventDefault()); + if (this.options.showZoom) { + ref_properties.bindAll([ + '_setButtonTitle', + '_updateZoomButtons' + ], this); + this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', e => this._map.zoomIn({}, { originalEvent: e })); + DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomInButton).setAttribute('aria-hidden', true); + this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', e => this._map.zoomOut({}, { originalEvent: e })); + DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomOutButton).setAttribute('aria-hidden', true); + } + if (this.options.showCompass) { + ref_properties.bindAll(['_rotateCompassArrow'], this); + this._compass = this._createButton('mapboxgl-ctrl-compass', e => { + if (this.options.visualizePitch) { + this._map.resetNorthPitch({}, { originalEvent: e }); + } else { + this._map.resetNorth({}, { originalEvent: e }); + } + }); + this._compassIcon = DOM.create('span', 'mapboxgl-ctrl-icon', this._compass); + this._compassIcon.setAttribute('aria-hidden', true); + } + } + _updateZoomButtons() { + const zoom = this._map.getZoom(); + const isMax = zoom === this._map.getMaxZoom(); + const isMin = zoom === this._map.getMinZoom(); + this._zoomInButton.disabled = isMax; + this._zoomOutButton.disabled = isMin; + this._zoomInButton.setAttribute('aria-disabled', isMax.toString()); + this._zoomOutButton.setAttribute('aria-disabled', isMin.toString()); + } + _rotateCompassArrow() { + const rotate = this.options.visualizePitch ? `scale(${ 1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5) }) rotateX(${ this._map.transform.pitch }deg) rotateZ(${ this._map.transform.angle * (180 / Math.PI) }deg)` : `rotate(${ this._map.transform.angle * (180 / Math.PI) }deg)`; + this._compassIcon.style.transform = rotate; + } + onAdd(map) { + this._map = map; + if (this.options.showZoom) { + this._setButtonTitle(this._zoomInButton, 'ZoomIn'); + this._setButtonTitle(this._zoomOutButton, 'ZoomOut'); + this._map.on('zoom', this._updateZoomButtons); + this._updateZoomButtons(); + } + if (this.options.showCompass) { + this._setButtonTitle(this._compass, 'ResetBearing'); + if (this.options.visualizePitch) { + this._map.on('pitch', this._rotateCompassArrow); + } + this._map.on('rotate', this._rotateCompassArrow); + this._rotateCompassArrow(); + this._handler = new MouseRotateWrapper(this._map, this._compass, this.options.visualizePitch); + } + return this._container; + } + onRemove() { + DOM.remove(this._container); + if (this.options.showZoom) { + this._map.off('zoom', this._updateZoomButtons); + } + if (this.options.showCompass) { + if (this.options.visualizePitch) { + this._map.off('pitch', this._rotateCompassArrow); + } + this._map.off('rotate', this._rotateCompassArrow); + this._handler.off(); + delete this._handler; + } + delete this._map; + } + _createButton(className, fn) { + const a = DOM.create('button', className, this._container); + a.type = 'button'; + a.addEventListener('click', fn); + return a; + } + _setButtonTitle(button, title) { + const str = this._map._getUIString(`NavigationControl.${ title }`); + button.title = str; + button.setAttribute('aria-label', str); + } +} +class MouseRotateWrapper { + constructor(map, element, pitch = false) { + this._clickTolerance = 10; + this.element = element; + this.mouseRotate = new MouseRotateHandler({ clickTolerance: map.dragRotate._mouseRotate._clickTolerance }); + this.map = map; + if (pitch) + this.mousePitch = new MousePitchHandler({ clickTolerance: map.dragRotate._mousePitch._clickTolerance }); + ref_properties.bindAll([ + 'mousedown', + 'mousemove', + 'mouseup', + 'touchstart', + 'touchmove', + 'touchend', + 'reset' + ], this); + DOM.addEventListener(element, 'mousedown', this.mousedown); + DOM.addEventListener(element, 'touchstart', this.touchstart, { passive: false }); + DOM.addEventListener(element, 'touchmove', this.touchmove); + DOM.addEventListener(element, 'touchend', this.touchend); + DOM.addEventListener(element, 'touchcancel', this.reset); + } + down(e, point) { + this.mouseRotate.mousedown(e, point); + if (this.mousePitch) + this.mousePitch.mousedown(e, point); + DOM.disableDrag(); + } + move(e, point) { + const map = this.map; + const r = this.mouseRotate.mousemoveWindow(e, point); + if (r && r.bearingDelta) + map.setBearing(map.getBearing() + r.bearingDelta); + if (this.mousePitch) { + const p = this.mousePitch.mousemoveWindow(e, point); + if (p && p.pitchDelta) + map.setPitch(map.getPitch() + p.pitchDelta); + } + } + off() { + const element = this.element; + DOM.removeEventListener(element, 'mousedown', this.mousedown); + DOM.removeEventListener(element, 'touchstart', this.touchstart, { passive: false }); + DOM.removeEventListener(element, 'touchmove', this.touchmove); + DOM.removeEventListener(element, 'touchend', this.touchend); + DOM.removeEventListener(element, 'touchcancel', this.reset); + this.offTemp(); + } + offTemp() { + DOM.enableDrag(); + DOM.removeEventListener(ref_properties.window, 'mousemove', this.mousemove); + DOM.removeEventListener(ref_properties.window, 'mouseup', this.mouseup); + } + mousedown(e) { + this.down(ref_properties.extend({}, e, { + ctrlKey: true, + preventDefault: () => e.preventDefault() + }), DOM.mousePos(this.element, e)); + DOM.addEventListener(ref_properties.window, 'mousemove', this.mousemove); + DOM.addEventListener(ref_properties.window, 'mouseup', this.mouseup); + } + mousemove(e) { + this.move(e, DOM.mousePos(this.element, e)); + } + mouseup(e) { + this.mouseRotate.mouseupWindow(e); + if (this.mousePitch) + this.mousePitch.mouseupWindow(e); + this.offTemp(); + } + touchstart(e) { + if (e.targetTouches.length !== 1) { + this.reset(); + } else { + this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; + this.down({ + type: 'mousedown', + button: 0, + ctrlKey: true, + preventDefault: () => e.preventDefault() + }, this._startPos); + } + } + touchmove(e) { + if (e.targetTouches.length !== 1) { + this.reset(); + } else { + this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; + this.move({ preventDefault: () => e.preventDefault() }, this._lastPos); + } + } + touchend(e) { + if (e.targetTouches.length === 0 && this._startPos && this._lastPos && this._startPos.dist(this._lastPos) < this._clickTolerance) { + this.element.click(); + } + this.reset(); + } + reset() { + this.mouseRotate.reset(); + if (this.mousePitch) + this.mousePitch.reset(); + delete this._startPos; + delete this._lastPos; + this.offTemp(); + } +} + +function smartWrap (lngLat, priorPos, transform) { + lngLat = new ref_properties.LngLat(lngLat.lng, lngLat.lat); + if (priorPos) { + const left = new ref_properties.LngLat(lngLat.lng - 360, lngLat.lat); + const right = new ref_properties.LngLat(lngLat.lng + 360, lngLat.lat); + const withinWrap = Math.ceil(Math.abs(lngLat.lng - transform.center.lng) / 360) * 360; + const delta = transform.locationPoint(lngLat).distSqr(priorPos); + const offscreen = priorPos.x < 0 || priorPos.y < 0 || priorPos.x > transform.width || priorPos.y > transform.height; + if (transform.locationPoint(left).distSqr(priorPos) < delta && (offscreen || Math.abs(left.lng - transform.center.lng) < withinWrap)) { + lngLat = left; + } else if (transform.locationPoint(right).distSqr(priorPos) < delta && (offscreen || Math.abs(right.lng - transform.center.lng) < withinWrap)) { + lngLat = right; + } + } + while (Math.abs(lngLat.lng - transform.center.lng) > 180) { + const pos = transform.locationPoint(lngLat); + if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { + break; + } + if (lngLat.lng > transform.center.lng) { + lngLat.lng -= 360; + } else { + lngLat.lng += 360; + } + } + return lngLat; +} + +const anchorTranslate = { + 'center': 'translate(-50%,-50%)', + 'top': 'translate(-50%,0)', + 'top-left': 'translate(0,0)', + 'top-right': 'translate(-100%,0)', + 'bottom': 'translate(-50%,-100%)', + 'bottom-left': 'translate(0,-100%)', + 'bottom-right': 'translate(-100%,-100%)', + 'left': 'translate(0,-50%)', + 'right': 'translate(-100%,-50%)' +}; +function applyAnchorClass(element, anchor, prefix) { + const classList = element.classList; + for (const key in anchorTranslate) { + classList.remove(`mapboxgl-${ prefix }-anchor-${ key }`); + } + classList.add(`mapboxgl-${ prefix }-anchor-${ anchor }`); +} + +class Marker extends ref_properties.Evented { + constructor(options, legacyOptions) { + super(); + if (options instanceof ref_properties.window.HTMLElement || legacyOptions) { + options = ref_properties.extend({ element: options }, legacyOptions); + } + ref_properties.bindAll([ + '_update', + '_onMove', + '_onUp', + '_addDragHandler', + '_onMapClick', + '_onKeyPress' + ], this); + this._anchor = options && options.anchor || 'center'; + this._color = options && options.color || '#3FB1CE'; + this._scale = options && options.scale || 1; + this._draggable = options && options.draggable || false; + this._clickTolerance = options && options.clickTolerance || 0; + this._isDragging = false; + this._state = 'inactive'; + this._rotation = options && options.rotation || 0; + this._rotationAlignment = options && options.rotationAlignment || 'auto'; + this._pitchAlignment = options && options.pitchAlignment && options.pitchAlignment !== 'auto' ? options.pitchAlignment : this._rotationAlignment; + if (!options || !options.element) { + this._defaultMarker = true; + this._element = DOM.create('div'); + this._element.setAttribute('aria-label', 'Map marker'); + const svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg'); + const defaultHeight = 41; + const defaultWidth = 27; + svg.setAttributeNS(null, 'display', 'block'); + svg.setAttributeNS(null, 'height', `${ defaultHeight }px`); + svg.setAttributeNS(null, 'width', `${ defaultWidth }px`); + svg.setAttributeNS(null, 'viewBox', `0 0 ${ defaultWidth } ${ defaultHeight }`); + const markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + markerLarge.setAttributeNS(null, 'stroke', 'none'); + markerLarge.setAttributeNS(null, 'stroke-width', '1'); + markerLarge.setAttributeNS(null, 'fill', 'none'); + markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd'); + const page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + page1.setAttributeNS(null, 'fill-rule', 'nonzero'); + const shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)'); + shadow.setAttributeNS(null, 'fill', '#000000'); + const ellipses = [ + { + 'rx': '10.5', + 'ry': '5.25002273' + }, + { + 'rx': '10.5', + 'ry': '5.25002273' + }, + { + 'rx': '9.5', + 'ry': '4.77275007' + }, + { + 'rx': '8.5', + 'ry': '4.29549936' + }, + { + 'rx': '7.5', + 'ry': '3.81822308' + }, + { + 'rx': '6.5', + 'ry': '3.34094679' + }, + { + 'rx': '5.5', + 'ry': '2.86367051' + }, + { + 'rx': '4.5', + 'ry': '2.38636864' + } + ]; + for (const data of ellipses) { + const ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse'); + ellipse.setAttributeNS(null, 'opacity', '0.04'); + ellipse.setAttributeNS(null, 'cx', '10.5'); + ellipse.setAttributeNS(null, 'cy', '5.80029008'); + ellipse.setAttributeNS(null, 'rx', data['rx']); + ellipse.setAttributeNS(null, 'ry', data['ry']); + shadow.appendChild(ellipse); + } + const background = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + background.setAttributeNS(null, 'fill', this._color); + const bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); + bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z'); + background.appendChild(bgPath); + const border = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + border.setAttributeNS(null, 'opacity', '0.25'); + border.setAttributeNS(null, 'fill', '#000000'); + const borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); + borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z'); + border.appendChild(borderPath); + const maki = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)'); + maki.setAttributeNS(null, 'fill', '#FFFFFF'); + const circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g'); + circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)'); + const circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); + circle1.setAttributeNS(null, 'fill', '#000000'); + circle1.setAttributeNS(null, 'opacity', '0.25'); + circle1.setAttributeNS(null, 'cx', '5.5'); + circle1.setAttributeNS(null, 'cy', '5.5'); + circle1.setAttributeNS(null, 'r', '5.4999962'); + const circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); + circle2.setAttributeNS(null, 'fill', '#FFFFFF'); + circle2.setAttributeNS(null, 'cx', '5.5'); + circle2.setAttributeNS(null, 'cy', '5.5'); + circle2.setAttributeNS(null, 'r', '5.4999962'); + circleContainer.appendChild(circle1); + circleContainer.appendChild(circle2); + page1.appendChild(shadow); + page1.appendChild(background); + page1.appendChild(border); + page1.appendChild(maki); + page1.appendChild(circleContainer); + svg.appendChild(page1); + svg.setAttributeNS(null, 'height', `${ defaultHeight * this._scale }px`); + svg.setAttributeNS(null, 'width', `${ defaultWidth * this._scale }px`); + this._element.appendChild(svg); + this._offset = ref_properties.Point.convert(options && options.offset || [ + 0, + -14 + ]); + } else { + this._element = options.element; + this._offset = ref_properties.Point.convert(options && options.offset || [ + 0, + 0 + ]); + } + this._element.classList.add('mapboxgl-marker'); + this._element.addEventListener('dragstart', e => { + e.preventDefault(); + }); + this._element.addEventListener('mousedown', e => { + e.preventDefault(); + }); + applyAnchorClass(this._element, this._anchor, 'marker'); + this._popup = null; + } + addTo(map) { + this.remove(); + this._map = map; + map.getCanvasContainer().appendChild(this._element); + map.on('move', this._update); + map.on('moveend', this._update); + this.setDraggable(this._draggable); + this._update(); + this._map.on('click', this._onMapClick); + return this; + } + remove() { + if (this._map) { + this._map.off('click', this._onMapClick); + this._map.off('move', this._update); + this._map.off('moveend', this._update); + this._map.off('mousedown', this._addDragHandler); + this._map.off('touchstart', this._addDragHandler); + this._map.off('mouseup', this._onUp); + this._map.off('touchend', this._onUp); + this._map.off('mousemove', this._onMove); + this._map.off('touchmove', this._onMove); + delete this._map; + } + DOM.remove(this._element); + if (this._popup) + this._popup.remove(); + return this; + } + getLngLat() { + return this._lngLat; + } + setLngLat(lnglat) { + this._lngLat = ref_properties.LngLat.convert(lnglat); + this._pos = null; + if (this._popup) + this._popup.setLngLat(this._lngLat); + this._update(); + return this; + } + getElement() { + return this._element; + } + setPopup(popup) { + if (this._popup) { + this._popup.remove(); + this._popup = null; + this._element.removeEventListener('keypress', this._onKeyPress); + if (!this._originalTabIndex) { + this._element.removeAttribute('tabindex'); + } + } + if (popup) { + if (!('offset' in popup.options)) { + const markerHeight = 41 - 5.8 / 2; + const markerRadius = 13.5; + const linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2); + popup.options.offset = this._defaultMarker ? { + 'top': [ + 0, + 0 + ], + 'top-left': [ + 0, + 0 + ], + 'top-right': [ + 0, + 0 + ], + 'bottom': [ + 0, + -markerHeight + ], + 'bottom-left': [ + linearOffset, + (markerHeight - markerRadius + linearOffset) * -1 + ], + 'bottom-right': [ + -linearOffset, + (markerHeight - markerRadius + linearOffset) * -1 + ], + 'left': [ + markerRadius, + (markerHeight - markerRadius) * -1 + ], + 'right': [ + -markerRadius, + (markerHeight - markerRadius) * -1 + ] + } : this._offset; + } + this._popup = popup; + if (this._lngLat) + this._popup.setLngLat(this._lngLat); + this._originalTabIndex = this._element.getAttribute('tabindex'); + if (!this._originalTabIndex) { + this._element.setAttribute('tabindex', '0'); + } + this._element.addEventListener('keypress', this._onKeyPress); + } + return this; + } + _onKeyPress(e) { + const code = e.code; + const legacyCode = e.charCode || e.keyCode; + if (code === 'Space' || code === 'Enter' || legacyCode === 32 || legacyCode === 13) { + this.togglePopup(); + } + } + _onMapClick(e) { + const targetElement = e.originalEvent.target; + const element = this._element; + if (this._popup && (targetElement === element || element.contains(targetElement))) { + this.togglePopup(); + } + } + getPopup() { + return this._popup; + } + togglePopup() { + const popup = this._popup; + if (!popup) + return this; + else if (popup.isOpen()) + popup.remove(); + else + popup.addTo(this._map); + return this; + } + _updateOcclusion() { + if (!this._occlusionTimer) { + this._occlusionTimer = setTimeout(this._onOcclusionTimer.bind(this), 60); + } + } + _onOcclusionTimer() { + const tr = this._map.transform; + const pos = this._pos ? this._pos.sub(this._transformedOffset()) : null; + if (pos && pos.x >= 0 && pos.x < tr.width && pos.y >= 0 && pos.y < tr.height) { + const raycastLoc = this._map.unproject(pos); + const camera = this._map.getFreeCameraOptions(); + if (camera.position) { + const cameraPos = camera.position.toLngLat(); + const raycastDistance = cameraPos.distanceTo(raycastLoc); + const posDistance = cameraPos.distanceTo(this._lngLat); + const occluded = raycastDistance < posDistance * 0.9; + this._element.classList.toggle('mapboxgl-marker-occluded', occluded); + } + } + this._occlusionTimer = null; + } + _update(e) { + if (!this._map) + return; + if (this._map.transform.renderWorldCopies) { + this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); + } + this._pos = this._map.project(this._lngLat)._add(this._transformedOffset()); + if (this._map.transform.elevation) + this._updateOcclusion(); + let rotation = ''; + if (this._rotationAlignment === 'viewport' || this._rotationAlignment === 'auto') { + rotation = `rotateZ(${ this._rotation }deg)`; + } else if (this._rotationAlignment === 'map') { + rotation = `rotateZ(${ this._rotation - this._map.getBearing() }deg)`; + } + let pitch = ''; + if (this._pitchAlignment === 'viewport' || this._pitchAlignment === 'auto') { + pitch = 'rotateX(0deg)'; + } else if (this._pitchAlignment === 'map') { + pitch = `rotateX(${ this._map.getPitch() }deg)`; + } + if (!e || e.type === 'moveend') { + this._pos = this._pos.round(); + } + DOM.setTransform(this._element, `${ anchorTranslate[this._anchor] } translate(${ this._pos.x }px, ${ this._pos.y }px) ${ pitch } ${ rotation }`); + } + _transformedOffset() { + if (!this._defaultMarker) + return this._offset; + const tr = this._map.transform; + const offset = this._offset.mult(this._scale); + if (this._rotationAlignment === 'map') + offset._rotate(tr.angle); + if (this._pitchAlignment === 'map') + offset.y *= Math.cos(tr._pitch); + return offset; + } + getOffset() { + return this._offset; + } + setOffset(offset) { + this._offset = ref_properties.Point.convert(offset); + this._update(); + return this; + } + _onMove(e) { + if (!this._isDragging) { + const clickTolerance = this._clickTolerance || this._map._clickTolerance; + this._isDragging = e.point.dist(this._pointerdownPos) >= clickTolerance; + } + if (!this._isDragging) + return; + this._pos = e.point.sub(this._positionDelta); + this._lngLat = this._map.unproject(this._pos); + this.setLngLat(this._lngLat); + this._element.style.pointerEvents = 'none'; + if (this._state === 'pending') { + this._state = 'active'; + this.fire(new ref_properties.Event('dragstart')); + } + this.fire(new ref_properties.Event('drag')); + } + _onUp() { + this._element.style.pointerEvents = 'auto'; + this._positionDelta = null; + this._pointerdownPos = null; + this._isDragging = false; + this._map.off('mousemove', this._onMove); + this._map.off('touchmove', this._onMove); + if (this._state === 'active') { + this.fire(new ref_properties.Event('dragend')); + } + this._state = 'inactive'; + } + _addDragHandler(e) { + if (this._element.contains(e.originalEvent.target)) { + e.preventDefault(); + this._positionDelta = e.point.sub(this._pos).add(this._transformedOffset()); + this._pointerdownPos = e.point; + this._state = 'pending'; + this._map.on('mousemove', this._onMove); + this._map.on('touchmove', this._onMove); + this._map.once('mouseup', this._onUp); + this._map.once('touchend', this._onUp); + } + } + setDraggable(shouldBeDraggable) { + this._draggable = !!shouldBeDraggable; + if (this._map) { + if (shouldBeDraggable) { + this._map.on('mousedown', this._addDragHandler); + this._map.on('touchstart', this._addDragHandler); + } else { + this._map.off('mousedown', this._addDragHandler); + this._map.off('touchstart', this._addDragHandler); + } + } + return this; + } + isDraggable() { + return this._draggable; + } + setRotation(rotation) { + this._rotation = rotation || 0; + this._update(); + return this; + } + getRotation() { + return this._rotation; + } + setRotationAlignment(alignment) { + this._rotationAlignment = alignment || 'auto'; + this._update(); + return this; + } + getRotationAlignment() { + return this._rotationAlignment; + } + setPitchAlignment(alignment) { + this._pitchAlignment = alignment && alignment !== 'auto' ? alignment : this._rotationAlignment; + this._update(); + return this; + } + getPitchAlignment() { + return this._pitchAlignment; + } +} + +const defaultOptions$3 = { + positionOptions: { + enableHighAccuracy: false, + maximumAge: 0, + timeout: 6000 + }, + fitBoundsOptions: { maxZoom: 15 }, + trackUserLocation: false, + showAccuracyCircle: true, + showUserLocation: true +}; +let supportsGeolocation; +function checkGeolocationSupport(callback) { + if (supportsGeolocation !== undefined) { + callback(supportsGeolocation); + } else if (ref_properties.window.navigator.permissions !== undefined) { + ref_properties.window.navigator.permissions.query({ name: 'geolocation' }).then(p => { + supportsGeolocation = p.state !== 'denied'; + callback(supportsGeolocation); + }); + } else { + supportsGeolocation = !!ref_properties.window.navigator.geolocation; + callback(supportsGeolocation); + } +} +let numberOfWatches = 0; +let noTimeout = false; +class GeolocateControl extends ref_properties.Evented { + constructor(options) { + super(); + this.options = ref_properties.extend({}, defaultOptions$3, options); + ref_properties.bindAll([ + '_onSuccess', + '_onError', + '_onZoom', + '_finish', + '_setupUI', + '_updateCamera', + '_updateMarker' + ], this); + } + onAdd(map) { + this._map = map; + this._container = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); + checkGeolocationSupport(this._setupUI); + return this._container; + } + onRemove() { + if (this._geolocationWatchID !== undefined) { + ref_properties.window.navigator.geolocation.clearWatch(this._geolocationWatchID); + this._geolocationWatchID = undefined; + } + if (this.options.showUserLocation && this._userLocationDotMarker) { + this._userLocationDotMarker.remove(); + } + if (this.options.showAccuracyCircle && this._accuracyCircleMarker) { + this._accuracyCircleMarker.remove(); + } + DOM.remove(this._container); + this._map.off('zoom', this._onZoom); + this._map = undefined; + numberOfWatches = 0; + noTimeout = false; + } + _isOutOfMapMaxBounds(position) { + const bounds = this._map.getMaxBounds(); + const coordinates = position.coords; + return bounds && (coordinates.longitude < bounds.getWest() || coordinates.longitude > bounds.getEast() || coordinates.latitude < bounds.getSouth() || coordinates.latitude > bounds.getNorth()); + } + _setErrorState() { + switch (this._watchState) { + case 'WAITING_ACTIVE': + this._watchState = 'ACTIVE_ERROR'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); + break; + case 'ACTIVE_LOCK': + this._watchState = 'ACTIVE_ERROR'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + break; + case 'BACKGROUND': + this._watchState = 'BACKGROUND_ERROR'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + break; + } + } + _onSuccess(position) { + if (!this._map) { + return; + } + if (this._isOutOfMapMaxBounds(position)) { + this._setErrorState(); + this.fire(new ref_properties.Event('outofmaxbounds', position)); + this._updateMarker(); + this._finish(); + return; + } + if (this.options.trackUserLocation) { + this._lastKnownPosition = position; + switch (this._watchState) { + case 'WAITING_ACTIVE': + case 'ACTIVE_LOCK': + case 'ACTIVE_ERROR': + this._watchState = 'ACTIVE_LOCK'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); + break; + case 'BACKGROUND': + case 'BACKGROUND_ERROR': + this._watchState = 'BACKGROUND'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); + break; + } + } + if (this.options.showUserLocation && this._watchState !== 'OFF') { + this._updateMarker(position); + } + if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') { + this._updateCamera(position); + } + if (this.options.showUserLocation) { + this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); + } + this.fire(new ref_properties.Event('geolocate', position)); + this._finish(); + } + _updateCamera(position) { + const center = new ref_properties.LngLat(position.coords.longitude, position.coords.latitude); + const radius = position.coords.accuracy; + const bearing = this._map.getBearing(); + const options = ref_properties.extend({ bearing }, this.options.fitBoundsOptions); + this._map.fitBounds(center.toBounds(radius), options, { geolocateSource: true }); + } + _updateMarker(position) { + if (position) { + const center = new ref_properties.LngLat(position.coords.longitude, position.coords.latitude); + this._accuracyCircleMarker.setLngLat(center).addTo(this._map); + this._userLocationDotMarker.setLngLat(center).addTo(this._map); + this._accuracy = position.coords.accuracy; + if (this.options.showUserLocation && this.options.showAccuracyCircle) { + this._updateCircleRadius(); + } + } else { + this._userLocationDotMarker.remove(); + this._accuracyCircleMarker.remove(); + } + } + _updateCircleRadius() { + const y = this._map._container.clientHeight / 2; + const a = this._map.unproject([ + 0, + y + ]); + const b = this._map.unproject([ + 1, + y + ]); + const metersPerPixel = a.distanceTo(b); + const circleDiameter = Math.ceil(2 * this._accuracy / metersPerPixel); + this._circleElement.style.width = `${ circleDiameter }px`; + this._circleElement.style.height = `${ circleDiameter }px`; + } + _onZoom() { + if (this.options.showUserLocation && this.options.showAccuracyCircle) { + this._updateCircleRadius(); + } + } + _onError(error) { + if (!this._map) { + return; + } + if (this.options.trackUserLocation) { + if (error.code === 1) { + this._watchState = 'OFF'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); + this._geolocateButton.disabled = true; + const title = this._map._getUIString('GeolocateControl.LocationNotAvailable'); + this._geolocateButton.title = title; + this._geolocateButton.setAttribute('aria-label', title); + if (this._geolocationWatchID !== undefined) { + this._clearWatch(); + } + } else if (error.code === 3 && noTimeout) { + return; + } else { + this._setErrorState(); + } + } + if (this._watchState !== 'OFF' && this.options.showUserLocation) { + this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); + } + this.fire(new ref_properties.Event('error', error)); + this._finish(); + } + _finish() { + if (this._timeoutId) { + clearTimeout(this._timeoutId); + } + this._timeoutId = undefined; + } + _setupUI(supported) { + this._container.addEventListener('contextmenu', e => e.preventDefault()); + this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container); + DOM.create('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', true); + this._geolocateButton.type = 'button'; + if (supported === false) { + ref_properties.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.'); + const title = this._map._getUIString('GeolocateControl.LocationNotAvailable'); + this._geolocateButton.disabled = true; + this._geolocateButton.title = title; + this._geolocateButton.setAttribute('aria-label', title); + } else { + const title = this._map._getUIString('GeolocateControl.FindMyLocation'); + this._geolocateButton.title = title; + this._geolocateButton.setAttribute('aria-label', title); + } + if (this.options.trackUserLocation) { + this._geolocateButton.setAttribute('aria-pressed', 'false'); + this._watchState = 'OFF'; + } + if (this.options.showUserLocation) { + this._dotElement = DOM.create('div', 'mapboxgl-user-location-dot'); + this._userLocationDotMarker = new Marker(this._dotElement); + this._circleElement = DOM.create('div', 'mapboxgl-user-location-accuracy-circle'); + this._accuracyCircleMarker = new Marker({ + element: this._circleElement, + pitchAlignment: 'map' + }); + if (this.options.trackUserLocation) + this._watchState = 'OFF'; + this._map.on('zoom', this._onZoom); + } + this._geolocateButton.addEventListener('click', this.trigger.bind(this)); + this._setup = true; + if (this.options.trackUserLocation) { + this._map.on('movestart', event => { + const fromResize = event.originalEvent && event.originalEvent.type === 'resize'; + if (!event.geolocateSource && this._watchState === 'ACTIVE_LOCK' && !fromResize) { + this._watchState = 'BACKGROUND'; + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); + this.fire(new ref_properties.Event('trackuserlocationend')); + } + }); + } + } + trigger() { + if (!this._setup) { + ref_properties.warnOnce('Geolocate control triggered before added to a map'); + return false; + } + if (this.options.trackUserLocation) { + switch (this._watchState) { + case 'OFF': + this._watchState = 'WAITING_ACTIVE'; + this.fire(new ref_properties.Event('trackuserlocationstart')); + break; + case 'WAITING_ACTIVE': + case 'ACTIVE_LOCK': + case 'ACTIVE_ERROR': + case 'BACKGROUND_ERROR': + numberOfWatches--; + noTimeout = false; + this._watchState = 'OFF'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); + this.fire(new ref_properties.Event('trackuserlocationend')); + break; + case 'BACKGROUND': + this._watchState = 'ACTIVE_LOCK'; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); + if (this._lastKnownPosition) + this._updateCamera(this._lastKnownPosition); + this.fire(new ref_properties.Event('trackuserlocationstart')); + break; + } + switch (this._watchState) { + case 'WAITING_ACTIVE': + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); + break; + case 'ACTIVE_LOCK': + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); + break; + case 'ACTIVE_ERROR': + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); + break; + case 'BACKGROUND': + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); + break; + case 'BACKGROUND_ERROR': + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); + break; + } + if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) { + this._clearWatch(); + } else if (this._geolocationWatchID === undefined) { + this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.setAttribute('aria-pressed', 'true'); + numberOfWatches++; + let positionOptions; + if (numberOfWatches > 1) { + positionOptions = { + maximumAge: 600000, + timeout: 0 + }; + noTimeout = true; + } else { + positionOptions = this.options.positionOptions; + noTimeout = false; + } + this._geolocationWatchID = ref_properties.window.navigator.geolocation.watchPosition(this._onSuccess, this._onError, positionOptions); + } + } else { + ref_properties.window.navigator.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions); + this._timeoutId = setTimeout(this._finish, 10000); + } + return true; + } + _clearWatch() { + ref_properties.window.navigator.geolocation.clearWatch(this._geolocationWatchID); + this._geolocationWatchID = undefined; + this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); + this._geolocateButton.setAttribute('aria-pressed', 'false'); + if (this.options.showUserLocation) { + this._updateMarker(null); + } + } +} + +const defaultOptions$4 = { + maxWidth: 100, + unit: 'metric' +}; +class ScaleControl { + constructor(options) { + this.options = ref_properties.extend({}, defaultOptions$4, options); + ref_properties.bindAll([ + '_onMove', + 'setUnit' + ], this); + } + getDefaultPosition() { + return 'bottom-left'; + } + _onMove() { + updateScale(this._map, this._container, this.options); + } + onAdd(map) { + this._map = map; + this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); + this._map.on('move', this._onMove); + this._onMove(); + return this._container; + } + onRemove() { + DOM.remove(this._container); + this._map.off('move', this._onMove); + this._map = undefined; + } + setUnit(unit) { + this.options.unit = unit; + updateScale(this._map, this._container, this.options); + } +} +function updateScale(map, container, options) { + const maxWidth = options && options.maxWidth || 100; + const y = map._container.clientHeight / 2; + const left = map.unproject([ + 0, + y + ]); + const right = map.unproject([ + maxWidth, + y + ]); + const maxMeters = left.distanceTo(right); + if (options && options.unit === 'imperial') { + const maxFeet = 3.2808 * maxMeters; + if (maxFeet > 5280) { + const maxMiles = maxFeet / 5280; + setScale(container, maxWidth, maxMiles, map._getUIString('ScaleControl.Miles')); + } else { + setScale(container, maxWidth, maxFeet, map._getUIString('ScaleControl.Feet')); + } + } else if (options && options.unit === 'nautical') { + const maxNauticals = maxMeters / 1852; + setScale(container, maxWidth, maxNauticals, map._getUIString('ScaleControl.NauticalMiles')); + } else if (maxMeters >= 1000) { + setScale(container, maxWidth, maxMeters / 1000, map._getUIString('ScaleControl.Kilometers')); + } else { + setScale(container, maxWidth, maxMeters, map._getUIString('ScaleControl.Meters')); + } +} +function setScale(container, maxWidth, maxDistance, unit) { + const distance = getRoundNum(maxDistance); + const ratio = distance / maxDistance; + container.style.width = `${ maxWidth * ratio }px`; + container.innerHTML = `${ distance } ${ unit }`; +} +function getDecimalRoundNum(d) { + const multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10)); + return Math.round(d * multiplier) / multiplier; +} +function getRoundNum(num) { + const pow10 = Math.pow(10, `${ Math.floor(num) }`.length - 1); + let d = num / pow10; + d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : d >= 1 ? 1 : getDecimalRoundNum(d); + return pow10 * d; +} + +class FullscreenControl { + constructor(options) { + this._fullscreen = false; + if (options && options.container) { + if (options.container instanceof ref_properties.window.HTMLElement) { + this._container = options.container; + } else { + ref_properties.warnOnce('Full screen control \'container\' must be a DOM element.'); + } + } + ref_properties.bindAll([ + '_onClickFullscreen', + '_changeIcon' + ], this); + if ('onfullscreenchange' in ref_properties.window.document) { + this._fullscreenchange = 'fullscreenchange'; + } else if ('onwebkitfullscreenchange' in ref_properties.window.document) { + this._fullscreenchange = 'webkitfullscreenchange'; + } + } + onAdd(map) { + this._map = map; + if (!this._container) + this._container = this._map.getContainer(); + this._controlContainer = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); + if (this._checkFullscreenSupport()) { + this._setupUI(); + } else { + this._controlContainer.style.display = 'none'; + ref_properties.warnOnce('This device does not support fullscreen mode.'); + } + return this._controlContainer; + } + onRemove() { + DOM.remove(this._controlContainer); + this._map = null; + ref_properties.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); + } + _checkFullscreenSupport() { + return !!(ref_properties.window.document.fullscreenEnabled || ref_properties.window.document.webkitFullscreenEnabled); + } + _setupUI() { + const button = this._fullscreenButton = DOM.create('button', `mapboxgl-ctrl-fullscreen`, this._controlContainer); + DOM.create('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', true); + button.type = 'button'; + this._updateTitle(); + this._fullscreenButton.addEventListener('click', this._onClickFullscreen); + ref_properties.window.document.addEventListener(this._fullscreenchange, this._changeIcon); + } + _updateTitle() { + const title = this._getTitle(); + this._fullscreenButton.setAttribute('aria-label', title); + this._fullscreenButton.title = title; + } + _getTitle() { + return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter'); + } + _isFullscreen() { + return this._fullscreen; + } + _changeIcon() { + const fullscreenElement = ref_properties.window.document.fullscreenElement || ref_properties.window.document.webkitFullscreenElement; + if (fullscreenElement === this._container !== this._fullscreen) { + this._fullscreen = !this._fullscreen; + this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-shrink`); + this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-fullscreen`); + this._updateTitle(); + } + } + _onClickFullscreen() { + if (this._isFullscreen()) { + if (ref_properties.window.document.exitFullscreen) { + ref_properties.window.document.exitFullscreen(); + } else if (ref_properties.window.document.webkitCancelFullScreen) { + ref_properties.window.document.webkitCancelFullScreen(); + } + } else if (this._container.requestFullscreen) { + this._container.requestFullscreen(); + } else if (this._container.webkitRequestFullscreen) { + this._container.webkitRequestFullscreen(); + } + } +} + +const defaultOptions$5 = { + closeButton: true, + closeOnClick: true, + focusAfterOpen: true, + className: '', + maxWidth: '240px' +}; +const focusQuerySelector = [ + 'a[href]', + '[tabindex]:not([tabindex=\'-1\'])', + '[contenteditable]:not([contenteditable=\'false\'])', + 'button:not([disabled])', + 'input:not([disabled])', + 'select:not([disabled])', + 'textarea:not([disabled])' +].join(', '); +class Popup extends ref_properties.Evented { + constructor(options) { + super(); + this.options = ref_properties.extend(Object.create(defaultOptions$5), options); + ref_properties.bindAll([ + '_update', + '_onClose', + 'remove', + '_onMouseMove', + '_onMouseUp', + '_onDrag' + ], this); + } + addTo(map) { + if (this._map) + this.remove(); + this._map = map; + if (this.options.closeOnClick) { + this._map.on('click', this._onClose); + } + if (this.options.closeOnMove) { + this._map.on('move', this._onClose); + } + this._map.on('remove', this.remove); + this._update(); + this._focusFirstElement(); + if (this._trackPointer) { + this._map.on('mousemove', this._onMouseMove); + this._map.on('mouseup', this._onMouseUp); + if (this._container) { + this._container.classList.add('mapboxgl-popup-track-pointer'); + } + this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); + } else { + this._map.on('move', this._update); + } + this.fire(new ref_properties.Event('open')); + return this; + } + isOpen() { + return !!this._map; + } + remove() { + if (this._content) { + DOM.remove(this._content); + } + if (this._container) { + DOM.remove(this._container); + delete this._container; + } + if (this._map) { + this._map.off('move', this._update); + this._map.off('move', this._onClose); + this._map.off('click', this._onClose); + this._map.off('remove', this.remove); + this._map.off('mousemove', this._onMouseMove); + this._map.off('mouseup', this._onMouseUp); + this._map.off('drag', this._onDrag); + delete this._map; + } + this.fire(new ref_properties.Event('close')); + return this; + } + getLngLat() { + return this._lngLat; + } + setLngLat(lnglat) { + this._lngLat = ref_properties.LngLat.convert(lnglat); + this._pos = null; + this._trackPointer = false; + this._update(); + if (this._map) { + this._map.on('move', this._update); + this._map.off('mousemove', this._onMouseMove); + if (this._container) { + this._container.classList.remove('mapboxgl-popup-track-pointer'); + } + this._map._canvasContainer.classList.remove('mapboxgl-track-pointer'); + } + return this; + } + trackPointer() { + this._trackPointer = true; + this._pos = null; + this._update(); + if (this._map) { + this._map.off('move', this._update); + this._map.on('mousemove', this._onMouseMove); + this._map.on('drag', this._onDrag); + if (this._container) { + this._container.classList.add('mapboxgl-popup-track-pointer'); + } + this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); + } + return this; + } + getElement() { + return this._container; + } + setText(text) { + return this.setDOMContent(ref_properties.window.document.createTextNode(text)); + } + setHTML(html) { + const frag = ref_properties.window.document.createDocumentFragment(); + const temp = ref_properties.window.document.createElement('body'); + let child; + temp.innerHTML = html; + while (true) { + child = temp.firstChild; + if (!child) + break; + frag.appendChild(child); + } + return this.setDOMContent(frag); + } + getMaxWidth() { + return this._container && this._container.style.maxWidth; + } + setMaxWidth(maxWidth) { + this.options.maxWidth = maxWidth; + this._update(); + return this; + } + setDOMContent(htmlNode) { + if (this._content) { + while (this._content.hasChildNodes()) { + if (this._content.firstChild) { + this._content.removeChild(this._content.firstChild); + } + } + } else { + this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); + } + this._content.appendChild(htmlNode); + this._createCloseButton(); + this._update(); + this._focusFirstElement(); + return this; + } + addClassName(className) { + if (this._container) { + this._container.classList.add(className); + } + } + removeClassName(className) { + if (this._container) { + this._container.classList.remove(className); + } + } + setOffset(offset) { + this.options.offset = offset; + this._update(); + return this; + } + toggleClassName(className) { + if (this._container) { + return this._container.classList.toggle(className); + } + } + _createCloseButton() { + if (this.options.closeButton) { + this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); + this._closeButton.type = 'button'; + this._closeButton.setAttribute('aria-label', 'Close popup'); + this._closeButton.innerHTML = '×'; + this._closeButton.addEventListener('click', this._onClose); + } + } + _onMouseUp(event) { + this._update(event.point); + } + _onMouseMove(event) { + this._update(event.point); + } + _onDrag(event) { + this._update(event.point); + } + _update(cursor) { + const hasPosition = this._lngLat || this._trackPointer; + if (!this._map || !hasPosition || !this._content) { + return; + } + if (!this._container) { + this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); + this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); + this._container.appendChild(this._content); + if (this.options.className) { + this.options.className.split(' ').forEach(name => this._container.classList.add(name)); + } + if (this._trackPointer) { + this._container.classList.add('mapboxgl-popup-track-pointer'); + } + } + if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) { + this._container.style.maxWidth = this.options.maxWidth; + } + if (this._map.transform.renderWorldCopies && !this._trackPointer) { + this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); + } + if (this._trackPointer && !cursor) + return; + const pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat); + let anchor = this.options.anchor; + const offset = normalizeOffset(this.options.offset); + if (!anchor) { + const width = this._container.offsetWidth; + const height = this._container.offsetHeight; + let anchorComponents; + if (pos.y + offset.bottom.y < height) { + anchorComponents = ['top']; + } else if (pos.y > this._map.transform.height - height) { + anchorComponents = ['bottom']; + } else { + anchorComponents = []; + } + if (pos.x < width / 2) { + anchorComponents.push('left'); + } else if (pos.x > this._map.transform.width - width / 2) { + anchorComponents.push('right'); + } + if (anchorComponents.length === 0) { + anchor = 'bottom'; + } else { + anchor = anchorComponents.join('-'); + } + } + const offsetedPos = pos.add(offset[anchor]).round(); + DOM.setTransform(this._container, `${ anchorTranslate[anchor] } translate(${ offsetedPos.x }px,${ offsetedPos.y }px)`); + applyAnchorClass(this._container, anchor, 'popup'); + } + _focusFirstElement() { + if (!this.options.focusAfterOpen || !this._container) + return; + const firstFocusable = this._container.querySelector(focusQuerySelector); + if (firstFocusable) + firstFocusable.focus(); + } + _onClose() { + this.remove(); + } +} +function normalizeOffset(offset) { + if (!offset) { + return normalizeOffset(new ref_properties.Point(0, 0)); + } else if (typeof offset === 'number') { + const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); + return { + 'center': new ref_properties.Point(0, 0), + 'top': new ref_properties.Point(0, offset), + 'top-left': new ref_properties.Point(cornerOffset, cornerOffset), + 'top-right': new ref_properties.Point(-cornerOffset, cornerOffset), + 'bottom': new ref_properties.Point(0, -offset), + 'bottom-left': new ref_properties.Point(cornerOffset, -cornerOffset), + 'bottom-right': new ref_properties.Point(-cornerOffset, -cornerOffset), + 'left': new ref_properties.Point(offset, 0), + 'right': new ref_properties.Point(-offset, 0) + }; + } else if (offset instanceof ref_properties.Point || Array.isArray(offset)) { + const convertedOffset = ref_properties.Point.convert(offset); + return { + 'center': convertedOffset, + 'top': convertedOffset, + 'top-left': convertedOffset, + 'top-right': convertedOffset, + 'bottom': convertedOffset, + 'bottom-left': convertedOffset, + 'bottom-right': convertedOffset, + 'left': convertedOffset, + 'right': convertedOffset + }; + } else { + return { + 'center': ref_properties.Point.convert(offset['center'] || [ + 0, + 0 + ]), + 'top': ref_properties.Point.convert(offset['top'] || [ + 0, + 0 + ]), + 'top-left': ref_properties.Point.convert(offset['top-left'] || [ + 0, + 0 + ]), + 'top-right': ref_properties.Point.convert(offset['top-right'] || [ + 0, + 0 + ]), + 'bottom': ref_properties.Point.convert(offset['bottom'] || [ + 0, + 0 + ]), + 'bottom-left': ref_properties.Point.convert(offset['bottom-left'] || [ + 0, + 0 + ]), + 'bottom-right': ref_properties.Point.convert(offset['bottom-right'] || [ + 0, + 0 + ]), + 'left': ref_properties.Point.convert(offset['left'] || [ + 0, + 0 + ]), + 'right': ref_properties.Point.convert(offset['right'] || [ + 0, + 0 + ]) + }; + } +} + +const exported = { + version: ref_properties.version, + supported, + setRTLTextPlugin: ref_properties.setRTLTextPlugin, + getRTLTextPluginStatus: ref_properties.getRTLTextPluginStatus, + Map, + NavigationControl, + GeolocateControl, + AttributionControl, + ScaleControl, + FullscreenControl, + Popup, + Marker, + Style, + LngLat: ref_properties.LngLat, + LngLatBounds: ref_properties.LngLatBounds, + Point: ref_properties.Point, + MercatorCoordinate: ref_properties.MercatorCoordinate, + FreeCameraOptions, + Evented: ref_properties.Evented, + config: ref_properties.config, + prewarm, + clearPrewarmedResources, + get accessToken() { + return ref_properties.config.ACCESS_TOKEN; + }, + set accessToken(token) { + ref_properties.config.ACCESS_TOKEN = token; + }, + get baseApiUrl() { + return ref_properties.config.API_URL; + }, + set baseApiUrl(url) { + ref_properties.config.API_URL = url; + }, + get workerCount() { + return WorkerPool.workerCount; + }, + set workerCount(count) { + WorkerPool.workerCount = count; + }, + get maxParallelImageRequests() { + return ref_properties.config.MAX_PARALLEL_IMAGE_REQUESTS; + }, + set maxParallelImageRequests(numRequests) { + ref_properties.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; + }, + clearStorage(callback) { + ref_properties.clearTileCache(callback); + }, + workerUrl: '', + workerClass: null, + setNow: ref_properties.browser.setNow, + restoreNow: ref_properties.browser.restoreNow +}; + +return exported; + +}); + +// + +return mapboxgl; + +}))); +//# sourceMappingURL=mapbox-gl-unminified.js.map diff --git a/public/mapbox/mapbox-gl.css b/public/mapbox/mapbox-gl.css new file mode 100644 index 0000000..0221a0d --- /dev/null +++ b/public/mapbox/mapbox-gl.css @@ -0,0 +1 @@ +.mapboxgl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mapboxgl-canvas{position:absolute;left:0;top:0}.mapboxgl-map:-webkit-full-screen{width:100%;height:100%}.mapboxgl-canary{background-color:salmon}.mapboxgl-canvas-container.mapboxgl-interactive,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer{cursor:pointer}.mapboxgl-canvas-container.mapboxgl-interactive:active,.mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas{touch-action:pan-x pan-y}.mapboxgl-canvas-container.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:pinch-zoom}.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas{touch-action:none}.mapboxgl-ctrl-bottom-left,.mapboxgl-ctrl-bottom-right,.mapboxgl-ctrl-top-left,.mapboxgl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.mapboxgl-ctrl-top-left{top:0;left:0}.mapboxgl-ctrl-top-right{top:0;right:0}.mapboxgl-ctrl-bottom-left{bottom:0;left:0}.mapboxgl-ctrl-bottom-right{right:0;bottom:0}.mapboxgl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.mapboxgl-ctrl-top-left .mapboxgl-ctrl{margin:10px 0 0 10px;float:left}.mapboxgl-ctrl-top-right .mapboxgl-ctrl{margin:10px 10px 0 0;float:right}.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl{margin:0 0 10px 10px;float:left}.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl{margin:0 10px 10px 0;float:right}.mapboxgl-ctrl-group{border-radius:4px;background:#fff}.mapboxgl-ctrl-group:not(:empty){-moz-box-shadow:0 0 2px rgba(0,0,0,.1);-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.mapboxgl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.mapboxgl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.mapboxgl-ctrl-group button+button{border-top:1px solid #ddd}.mapboxgl-ctrl button .mapboxgl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media (-ms-high-contrast:active){.mapboxgl-ctrl-icon{background-color:transparent}.mapboxgl-ctrl-group button+button{border-top:1px solid ButtonText}}.mapboxgl-ctrl button::-moz-focus-inner{border:0;padding:0}.mapboxgl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl button:disabled{cursor:not-allowed}.mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon{opacity:.25}.mapboxgl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.mapboxgl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.mapboxgl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.mapboxgl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.mapboxgl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.mapboxgl-ctrl-group button:focus:only-child{border-radius:inherit}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E")}}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting .mapboxgl-ctrl-icon{-webkit-animation:mapboxgl-spin 2s linear infinite;-moz-animation:mapboxgl-spin 2s infinite linear;-o-animation:mapboxgl-spin 2s infinite linear;-ms-animation:mapboxgl-spin 2s infinite linear;animation:mapboxgl-spin 2s linear infinite}@media (-ms-high-contrast:active){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 005.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 009 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 003.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0011 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 110 7 3.5 3.5 0 110-7z'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath d='M14 5l1 1-9 9-1-1 9-9z' fill='red'/%3E%3C/svg%3E")}}@-webkit-keyframes mapboxgl-spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@-moz-keyframes mapboxgl-spin{0%{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(1turn)}}@-o-keyframes mapboxgl-spin{0%{-o-transform:rotate(0deg)}to{-o-transform:rotate(1turn)}}@-ms-keyframes mapboxgl-spin{0%{-ms-transform:rotate(0deg)}to{-ms-transform:rotate(1turn)}}@keyframes mapboxgl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.mapboxgl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg opacity='.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg opacity='.9' fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}a.mapboxgl-ctrl-logo.mapboxgl-compact{width:23px}@media (-ms-high-contrast:active){a.mapboxgl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cg fill='%23fff'%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.mapboxgl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='88' height='23' viewBox='0 0 88 23' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd'%3E%3Cdefs%3E%3Cpath id='a' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='b' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='c'%3E%3Crect width='100%25' height='100%25' fill='%23fff'/%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/mask%3E%3Cg stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23c)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23b' mask='url(%23c)'/%3E%3C/g%3E%3Cuse xlink:href='%23a'/%3E%3Cuse xlink:href='%23b'/%3E%3C/svg%3E")}}.mapboxgl-ctrl.mapboxgl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.mapboxgl-ctrl-attrib.mapboxgl-compact{min-height:20px;padding:0;margin:10px;position:relative;background-color:#fff;border-radius:3px 12px 12px 3px}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 24px 2px 4px;visibility:visible;margin-top:6px}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover,.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:hover{padding:2px 4px 2px 24px;border-radius:12px 3px 3px 12px}.mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner{display:none}.mapboxgl-ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner{display:block}.mapboxgl-ctrl-attrib.mapboxgl-compact:after{content:"";cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px}.mapboxgl-ctrl-bottom-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;right:0}.mapboxgl-ctrl-top-right>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;right:0}.mapboxgl-ctrl-top-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{top:0;left:0}.mapboxgl-ctrl-bottom-left>.mapboxgl-ctrl-attrib.mapboxgl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.mapboxgl-ctrl-attrib.mapboxgl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1012 0 6 6 0 10-12 0m5-3a1 1 0 102 0 1 1 0 10-2 0m0 3a1 1 0 112 0v3a1 1 0 11-2 0'/%3E%3C/svg%3E")}}.mapboxgl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.mapboxgl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.mapboxgl-ctrl-attrib .mapbox-improve-map{font-weight:700;margin-left:2px}.mapboxgl-attrib-empty{display:none}.mapboxgl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;border:2px solid #333;border-top:#333;padding:0 5px;color:#333;box-sizing:border-box}.mapboxgl-popup{position:absolute;top:0;left:0;display:-webkit-flex;display:flex;will-change:transform;pointer-events:none}.mapboxgl-popup-anchor-top,.mapboxgl-popup-anchor-top-left,.mapboxgl-popup-anchor-top-right{-webkit-flex-direction:column;flex-direction:column}.mapboxgl-popup-anchor-bottom,.mapboxgl-popup-anchor-bottom-left,.mapboxgl-popup-anchor-bottom-right{-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.mapboxgl-popup-anchor-left{-webkit-flex-direction:row;flex-direction:row}.mapboxgl-popup-anchor-right{-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.mapboxgl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.mapboxgl-popup-anchor-top .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-top:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-bottom:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip{-webkit-align-self:flex-start;align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip{-webkit-align-self:flex-end;align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.mapboxgl-popup-anchor-left .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-left:none;border-right-color:#fff}.mapboxgl-popup-anchor-right .mapboxgl-popup-tip{-webkit-align-self:center;align-self:center;border-right:none;border-left-color:#fff}.mapboxgl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.mapboxgl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.mapboxgl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:10px 10px 15px;pointer-events:auto}.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content{border-top-left-radius:0}.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content{border-top-right-radius:0}.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content{border-bottom-left-radius:0}.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content{border-bottom-right-radius:0}.mapboxgl-popup-track-pointer{display:none}.mapboxgl-popup-track-pointer *{pointer-events:none;user-select:none}.mapboxgl-map:hover .mapboxgl-popup-track-pointer{display:flex}.mapboxgl-map:active .mapboxgl-popup-track-pointer{display:none}.mapboxgl-marker{position:absolute;top:0;left:0;will-change:transform}.mapboxgl-user-location-dot,.mapboxgl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.mapboxgl-user-location-dot:before{content:"";position:absolute;-webkit-animation:mapboxgl-user-location-dot-pulse 2s infinite;-moz-animation:mapboxgl-user-location-dot-pulse 2s infinite;-ms-animation:mapboxgl-user-location-dot-pulse 2s infinite;animation:mapboxgl-user-location-dot-pulse 2s infinite}.mapboxgl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@-webkit-keyframes mapboxgl-user-location-dot-pulse{0%{-webkit-transform:scale(1);opacity:1}70%{-webkit-transform:scale(3);opacity:0}to{-webkit-transform:scale(1);opacity:0}}@-ms-keyframes mapboxgl-user-location-dot-pulse{0%{-ms-transform:scale(1);opacity:1}70%{-ms-transform:scale(3);opacity:0}to{-ms-transform:scale(1);opacity:0}}@keyframes mapboxgl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.mapboxgl-user-location-dot-stale{background-color:#aaa}.mapboxgl-user-location-dot-stale:after{display:none}.mapboxgl-user-location-accuracy-circle{background-color:rgba(29,161,242,.2);width:1px;height:1px;border-radius:100%}.mapboxgl-crosshair,.mapboxgl-crosshair .mapboxgl-interactive,.mapboxgl-crosshair .mapboxgl-interactive:active{cursor:crosshair}.mapboxgl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}@media print{.mapbox-improve-map{display:none}} \ No newline at end of file diff --git a/public/mapbox/mapbox-gl.js b/public/mapbox/mapbox-gl.js new file mode 100644 index 0000000..447e513 --- /dev/null +++ b/public/mapbox/mapbox-gl.js @@ -0,0 +1,40 @@ +/* Mapbox GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/mapbox/mapbox-gl-js/blob/v1.3.1/LICENSE.txt */ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : +typeof define === 'function' && define.amd ? define(factory) : +(global = global || self, global.mapboxgl = factory()); +}(this, function () { 'use strict'; + +/* eslint-disable */ + +var shared, worker, mapboxgl; +// define gets called three times: one for each chunk. we rely on the order +// they're imported to know which is which +function define(_, chunk) { +if (!shared) { + shared = chunk; +} else if (!worker) { + worker = chunk; +} else { + var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' + + var sharedChunk = {}; + shared(sharedChunk); + mapboxgl = chunk(sharedChunk); + mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); +} +} + + +define(["exports"],(function(t){"use strict";function e(t,e){return t(e={exports:{}},e.exports),e.exports}var r=n;function n(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=r,this.p2y=n;}n.prototype.sampleCurveX=function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return ((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){var r,n,i,a,o;for(void 0===e&&(e=1e-6),i=t,o=0;o<8;o++){if(a=this.sampleCurveX(i)-t,Math.abs(a)(n=1))return n;for(;ra?r=i:n=i,i=.5*(n-r)+r;}return i},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var i=a;function a(t,e){this.x=t,this.y=e;}function o(t,e){if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return !1;for(var r=0;r0;)e[r]=arguments[r+1];for(var n=0,i=e;n>e/4).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function d(t){return !!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function m(t,e){t.forEach((function(t){e[t]&&(e[t]=e[t].bind(e));}));}function v(t,e){return -1!==t.indexOf(e,t.length-e.length)}function g(t,e,r){var n={};for(var i in t)n[i]=e.call(r||this,t[i],i,t);return n}function x(t,e,r){var n={};for(var i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function b(t){return Array.isArray(t)?t.map(b):"object"==typeof t&&t?g(t,b):t}var _={};function w(t){_[t]||("undefined"!=typeof console&&console.warn(t),_[t]=!0);}function A(t,e,r){return (r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function k(t){for(var e=0,r=0,n=t.length,i=n-1,a=void 0,o=void 0;r@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,(function(t,r,n,i){var a=n||i;return e[r]=!a||a.toLowerCase(),""})),e["max-age"]){var r=parseInt(e["max-age"],10);isNaN(r)?delete e["max-age"]:e["max-age"]=r;}return e}function z(t){try{var e=self[t];return e.setItem("_mapbox_test_",1),e.removeItem("_mapbox_test_"),!0}catch(t){return !1}}var I,C,B,M,E=self.performance&&self.performance.now?self.performance.now.bind(self.performance):Date.now.bind(Date),P=self.requestAnimationFrame||self.mozRequestAnimationFrame||self.webkitRequestAnimationFrame||self.msRequestAnimationFrame,T=self.cancelAnimationFrame||self.mozCancelAnimationFrame||self.webkitCancelAnimationFrame||self.msCancelAnimationFrame,V={now:E,frame:function(t){var e=P(t);return {cancel:function(){return T(e)}}},getImageData:function(t,e){void 0===e&&(e=0);var r=self.document.createElement("canvas"),n=r.getContext("2d");if(!n)throw new Error("failed to create canvas 2d context");return r.width=t.width,r.height=t.height,n.drawImage(t,0,0,t.width,t.height),n.getImageData(-e,-e,t.width+2*e,t.height+2*e)},resolveURL:function(t){return I||(I=self.document.createElement("a")),I.href=t,I.href},hardwareConcurrency:self.navigator.hardwareConcurrency||4,get devicePixelRatio(){return self.devicePixelRatio},get prefersReducedMotion(){return !!self.matchMedia&&(null==C&&(C=self.matchMedia("(prefers-reduced-motion: reduce)")),C.matches)}},F={API_URL:"https://api.mapbox.com",get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf("https://api.mapbox.cn")?"https://events.mapbox.cn/events/v2":0===this.API_URL.indexOf("https://api.mapbox.com")?"https://events.mapbox.com/events/v2":null:null},FEEDBACK_URL:"https://apps.mapbox.com/feedback",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},O={supported:!1,testSupport:function(t){if(L||!M)return;D?U(t):B=t;}},L=!1,D=!1;function U(t){var e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,M),t.isContextLost())return;O.supported=!0;}catch(t){}t.deleteTexture(e),L=!0;}self.document&&((M=self.document.createElement("img")).onload=function(){B&&U(B),B=null,D=!0;},M.onerror=function(){L=!0,B=null;},M.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=");var R="01";var j=function(t,e){this._transformRequestFn=t,this._customAccessToken=e,this._createSkuToken();};function q(t){return 0===t.indexOf("mapbox:")}j.prototype._createSkuToken=function(){var t=function(){for(var t="",e=0;e<10;e++)t+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[Math.floor(62*Math.random())];return {token:["1",R,t].join(""),tokenExpiresAt:Date.now()+432e5}}();this._skuToken=t.token,this._skuTokenExpiresAt=t.tokenExpiresAt;},j.prototype._isSkuTokenExpired=function(){return Date.now()>this._skuTokenExpiresAt},j.prototype.transformRequest=function(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}},j.prototype.normalizeStyleURL=function(t,e){if(!q(t))return t;var r=Z(t);return r.path="/styles/v1"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},j.prototype.normalizeGlyphsURL=function(t,e){if(!q(t))return t;var r=Z(t);return r.path="/fonts/v1"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},j.prototype.normalizeSourceURL=function(t,e){if(!q(t))return t;var r=Z(t);return r.path="/v4/"+r.authority+".json",r.params.push("secure"),this._makeAPIURL(r,this._customAccessToken||e)},j.prototype.normalizeSpriteURL=function(t,e,r,n){var i=Z(t);return q(t)?(i.path="/styles/v1"+i.path+"/sprite"+e+r,this._makeAPIURL(i,this._customAccessToken||n)):(i.path+=""+e+r,G(i))},j.prototype.normalizeTileURL=function(t,e,r){if(this._isSkuTokenExpired()&&this._createSkuToken(),!e||!q(e))return t;var n=Z(t),i=V.devicePixelRatio>=2||512===r?"@2x":"",a=O.supported?".webp":"$1";return n.path=n.path.replace(/(\.(png|jpg)\d*)(?=$)/,""+i+a),n.path=n.path.replace(/^.+\/v4\//,"/"),n.path="/v4"+n.path,F.REQUIRE_ACCESS_TOKEN&&(F.ACCESS_TOKEN||this._customAccessToken)&&this._skuToken&&n.params.push("sku="+this._skuToken),this._makeAPIURL(n,this._customAccessToken)},j.prototype.canonicalizeTileURL=function(t){var e=Z(t);if(!e.path.match(/(^\/v4\/)/)||!e.path.match(/\.[\w]+$/))return t;var r="mapbox://tiles/";r+=e.path.replace("/v4/","");var n=e.params.filter((function(t){return !t.match(/^access_token=/)}));return n.length&&(r+="?"+n.join("&")),r},j.prototype.canonicalizeTileset=function(t,e){if(!q(e))return t.tiles||[];for(var r=[],n=0,i=t.tiles;n=1&&self.localStorage.setItem(e,JSON.stringify(this.eventData));}catch(t){w("Unable to write to LocalStorage");}},H.prototype.processRequests=function(t){},H.prototype.postEvent=function(t,e,r,n){var i=this;if(F.EVENTS_URL){var a=Z(F.EVENTS_URL);a.params.push("access_token="+(n||F.ACCESS_TOKEN||""));var o={event:this.type,created:new Date(t).toISOString(),sdkIdentifier:"mapbox-gl-js",sdkVersion:"1.3.1",skuId:R,userId:this.anonId},s=e?c(o,e):o,u={url:G(a),headers:{"Content-Type":"text/plain"},body:JSON.stringify([s])};this.pendingRequest=vt(u,(function(t){i.pendingRequest=null,r(t),i.saveEventData(),i.processRequests(n);}));}},H.prototype.queueRequest=function(t,e){this.queue.push(t),this.processRequests(e);};var Y,$=function(t){function e(){t.call(this,"map.load"),this.success={},this.skuToken="";}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postMapLoadEvent=function(t,e,r,n){this.skuToken=r,(F.EVENTS_URL&&n||F.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return q(t)||K(t)})))&&this.queueRequest({id:e,timestamp:Date.now()},n);},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){var r=this.queue.shift(),n=r.id,i=r.timestamp;n&&this.success[n]||(this.anonId||this.fetchEventData(),d(this.anonId)||(this.anonId=y()),this.postEvent(i,{skuToken:this.skuToken},(function(t){t||n&&(e.success[n]=!0);}),t));}},e}(H),W=new(function(t){function e(e){t.call(this,"appUserTurnstile"),this._customAccessToken=e;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postTurnstileEvent=function(t,e){F.EVENTS_URL&&F.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return q(t)||K(t)}))&&this.queueRequest(Date.now(),e);},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();var r=J(F.ACCESS_TOKEN),n=r?r.u:F.ACCESS_TOKEN,i=n!==this.eventData.tokenU;d(this.anonId)||(this.anonId=y(),i=!0);var a=this.queue.shift();if(this.eventData.lastSuccess){var o=new Date(this.eventData.lastSuccess),s=new Date(a),u=(a-this.eventData.lastSuccess)/864e5;i=i||u>=1||u<-1||o.getDate()!==s.getDate();}else i=!0;if(!i)return this.processRequests();this.postEvent(a,{"enabled.telemetry":!1},(function(t){t||(e.eventData.lastSuccess=a,e.eventData.tokenU=n);}),t);}},e}(H)),Q=W.postTurnstileEvent.bind(W),tt=new $,et=tt.postMapLoadEvent.bind(tt),rt="mapbox-tiles",nt=500,it=50,at=42e4;function ot(t,e,r){if(self.caches){var n={status:e.status,statusText:e.statusText,headers:new self.Headers};e.headers.forEach((function(t,e){return n.headers.set(e,t)}));var i=S(e.headers.get("Cache-Control")||"");if(!i["no-store"])i["max-age"]&&n.headers.set("Expires",new Date(r+1e3*i["max-age"]).toUTCString()),new Date(n.headers.get("Expires")).getTime()-rDate.now()&&!r["no-cache"]}(n);t.delete(r),i&&t.put(r,n.clone()),e(null,n,i);})).catch(e);})).catch(e);}var lt=1/0;var pt={Unknown:"Unknown",Style:"Style",Source:"Source",Tile:"Tile",Glyphs:"Glyphs",SpriteImage:"SpriteImage",SpriteJSON:"SpriteJSON",Image:"Image"};"function"==typeof Object.freeze&&Object.freeze(pt);var ct=function(t){function e(e,r,n){401===r&&K(n)&&(e+=": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes"),t.call(this,e),this.status=r,this.url=n,this.name=this.constructor.name,this.message=e;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.name+": "+this.message+" ("+this.status+"): "+this.url},e}(Error);function ht(){return "undefined"!=typeof WorkerGlobalScope&&"undefined"!=typeof self&&self instanceof WorkerGlobalScope}var ft=ht()?function(){return self.worker&&self.worker.referrer}:function(){return ("blob:"===self.location.protocol?self.parent:self).location.href};function yt(t,e){var r,n=new self.AbortController,i=new self.Request(t.url,{method:t.method||"GET",body:t.body,credentials:t.credentials,headers:t.headers,referrer:ft(),signal:n.signal}),a=!1,o=!1,s=(r=i.url).indexOf("sku=")>0&&K(r);"json"===t.type&&i.headers.set("Accept","application/json");var u=function(r,n,a){if(!o){if(r&&"SecurityError"!==r.message&&w(r),n&&a)return l(n);var u=Date.now();self.fetch(i).then((function(r){if(r.ok){var n=s?r.clone():null;return l(r,n,u)}return e(new ct(r.statusText,r.status,t.url))})).catch((function(t){20!==t.code&&e(new Error(t.message));}));}},l=function(r,n,s){("arrayBuffer"===t.type?r.arrayBuffer():"json"===t.type?r.json():r.text()).then((function(t){o||(n&&s&&ot(i,n,s),a=!0,e(null,t,r.headers.get("Cache-Control"),r.headers.get("Expires")));})).catch((function(t){return e(new Error(t.message))}));};return s?ut(i,u):u(null,null),{cancel:function(){o=!0,a||n.abort();}}}var dt=function(t,e){if(r=t.url,!(/^file:/.test(r)||/^file:/.test(ft())&&!/^\w+:/.test(r))){if(self.fetch&&self.Request&&self.AbortController&&self.Request.prototype.hasOwnProperty("signal"))return yt(t,e);if(ht()&&self.worker&&self.worker.actor)return self.worker.actor.send("getResource",t,e)}var r;return function(t,e){var r=new self.XMLHttpRequest;for(var n in r.open(t.method||"GET",t.url,!0),"arrayBuffer"===t.type&&(r.responseType="arraybuffer"),t.headers)r.setRequestHeader(n,t.headers[n]);return "json"===t.type&&(r.responseType="text",r.setRequestHeader("Accept","application/json")),r.withCredentials="include"===t.credentials,r.onerror=function(){e(new Error(r.statusText));},r.onload=function(){if((r.status>=200&&r.status<300||0===r.status)&&null!==r.response){var n=r.response;if("json"===t.type)try{n=JSON.parse(r.response);}catch(t){return e(t)}e(null,n,r.getResponseHeader("Cache-Control"),r.getResponseHeader("Expires"));}else e(new ct(r.statusText,r.status,t.url));},r.send(t.body),{cancel:function(){return r.abort()}}}(t,e)},mt=function(t,e){return dt(c(t,{type:"arrayBuffer"}),e)},vt=function(t,e){return dt(c(t,{method:"POST"}),e)};var gt,xt;gt=[],xt=0;var bt=function(t,e){if(xt>=F.MAX_PARALLEL_IMAGE_REQUESTS){var r={requestParameters:t,callback:e,cancelled:!1,cancel:function(){this.cancelled=!0;}};return gt.push(r),r}xt++;var n=!1,i=function(){if(!n)for(n=!0,xt--;gt.length&&xt0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)},St.prototype.setEventedParent=function(t,e){return this._eventedParent=t,this._eventedParentData=e,this};var zt={$version:8,$root:{version:{required:!0,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number",default:0,period:360,units:"degrees"},pitch:{type:"number",default:0,units:"degrees"},light:{type:"light"},sources:{required:!0,type:"sources"},sprite:{type:"string"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:!0,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image"],source_vector:{type:{required:!0,type:"enum",values:{vector:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},attribution:{type:"string"},"*":{type:"*"}},source_raster:{type:{required:!0,type:"enum",values:{raster:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},attribution:{type:"string"},"*":{type:"*"}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},attribution:{type:"string"},encoding:{type:"enum",values:{terrarium:{},mapbox:{}},default:"mapbox"},"*":{type:"*"}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{}}},data:{type:"*"},maxzoom:{type:"number",default:18},attribution:{type:"string"},buffer:{type:"number",default:128,maximum:512,minimum:0},tolerance:{type:"number",default:.375},cluster:{type:"boolean",default:!1},clusterRadius:{type:"number",default:50,minimum:0},clusterMaxZoom:{type:"number"},clusterProperties:{type:"*"},lineMetrics:{type:"boolean",default:!1},generateId:{type:"boolean",default:!1}},source_video:{type:{required:!0,type:"enum",values:{video:{}}},urls:{required:!0,type:"array",value:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:!0,type:"enum",values:{image:{}}},url:{required:!0,type:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:!0},type:{type:"enum",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},"fill-extrusion":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:"*"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:24},maxzoom:{type:"number",minimum:0,maximum:24},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background"],layout_background:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{},round:{},square:{}},default:"butt",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-join":{type:"enum",values:{bevel:{},round:{},miter:{}},default:"miter",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,requires:[{"line-join":"miter"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,requires:[{"line-join":"round"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{},line:{},"line-center":{}},default:"point",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",requires:[{"symbol-placement":"line"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{},"viewport-y":{},source:{}},default:"auto",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{},width:{},height:{},both:{}},default:"none",requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"image",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{type:"boolean",default:!1,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-letter-spacing":{type:"number",default:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{},left:{},center:{},right:{}},default:"center",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["text-field",{"!":"text-variable-anchor"}],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",requires:["text-field",{"symbol-placement":["line","line-center"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{},vertical:{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{},uppercase:{},lowercase:{}},default:"none",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,requires:["text-field","icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},in:{},"!in":{},all:{},any:{},none:{},has:{},"!has":{}}},geometry_type:{type:"enum",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:"expression"},stops:{type:"array",value:"function_stop"},base:{type:"number",default:1,minimum:0},property:{type:"string",default:"$zoom"},type:{type:"enum",values:{identity:{},exponential:{},interval:{},categorical:{}},default:"exponential"},colorSpace:{type:"enum",values:{rgb:{},lab:{},hcl:{}},default:"rgb"},default:{type:"*",required:!1}},function_stop:{type:"array",minimum:0,maximum:22,value:["number","color"],length:2},expression:{type:"array",value:"*",minimum:1},expression_name:{type:"enum",values:{let:{group:"Variable binding"},var:{group:"Variable binding"},literal:{group:"Types"},array:{group:"Types"},at:{group:"Lookup"},case:{group:"Decision"},match:{group:"Decision"},coalesce:{group:"Decision"},step:{group:"Ramps, scales, curves"},interpolate:{group:"Ramps, scales, curves"},"interpolate-hcl":{group:"Ramps, scales, curves"},"interpolate-lab":{group:"Ramps, scales, curves"},ln2:{group:"Math"},pi:{group:"Math"},e:{group:"Math"},typeof:{group:"Types"},string:{group:"Types"},number:{group:"Types"},boolean:{group:"Types"},object:{group:"Types"},collator:{group:"Types"},format:{group:"Types"},image:{group:"Types"},"number-format":{group:"Types"},"to-string":{group:"Types"},"to-number":{group:"Types"},"to-boolean":{group:"Types"},"to-rgba":{group:"Color"},"to-color":{group:"Types"},rgb:{group:"Color"},rgba:{group:"Color"},get:{group:"Lookup"},has:{group:"Lookup"},length:{group:"Lookup"},properties:{group:"Feature data"},"feature-state":{group:"Feature data"},"geometry-type":{group:"Feature data"},id:{group:"Feature data"},zoom:{group:"Zoom"},"heatmap-density":{group:"Heatmap"},"line-progress":{group:"Feature data"},accumulated:{group:"Feature data"},"+":{group:"Math"},"*":{group:"Math"},"-":{group:"Math"},"/":{group:"Math"},"%":{group:"Math"},"^":{group:"Math"},sqrt:{group:"Math"},log10:{group:"Math"},ln:{group:"Math"},log2:{group:"Math"},sin:{group:"Math"},cos:{group:"Math"},tan:{group:"Math"},asin:{group:"Math"},acos:{group:"Math"},atan:{group:"Math"},min:{group:"Math"},max:{group:"Math"},round:{group:"Math"},abs:{group:"Math"},ceil:{group:"Math"},floor:{group:"Math"},"==":{group:"Decision"},"!=":{group:"Decision"},">":{group:"Decision"},"<":{group:"Decision"},">=":{group:"Decision"},"<=":{group:"Decision"},all:{group:"Decision"},any:{group:"Decision"},"!":{group:"Decision"},"is-supported-script":{group:"String"},upcase:{group:"String"},downcase:{group:"String"},concat:{group:"String"},"resolved-locale":{group:"String"}}},light:{anchor:{type:"enum",default:"viewport",values:{map:{},viewport:{}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"image",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-extrusion-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"image",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",transition:!0,requires:["fill-extrusion-height"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["line-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"line-pattern":{type:"image",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["circle-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{},viewport:{}},default:"map",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],transition:!1,expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["icon-image","icon-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["text-field","text-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",values:{linear:{},nearest:{}},default:"linear",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"background-pattern"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"image",transition:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds"},delay:{type:"number",default:0,minimum:0,units:"milliseconds"}},"property-type":{"data-driven":{type:"property-type"},"cross-faded":{type:"property-type"},"cross-faded-data-driven":{type:"property-type"},"color-ramp":{type:"property-type"},"data-constant":{type:"property-type"},constant:{type:"property-type"}}},It=function(t,e,r,n){this.message=(t?t+": ":"")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__);};function Ct(t){var e=t.key,r=t.value;return r?[new It(e,r,"constants have been deprecated as of v8")]:[]}function Bt(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n":"value"===t.itemType.kind?"array":"array<"+e+">"}return t.kind}var Gt=[Ft,Ot,Lt,Dt,Ut,Nt,Rt,Xt(jt),Kt];function Jt(t,e){if("error"===e.kind)return null;if("array"===t.kind){if("array"===e.kind&&(0===e.N&&"value"===e.itemType.kind||!Jt(t.itemType,e.itemType))&&("number"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if("value"===t.kind)for(var r=0,n=Gt;r255?255:t}function i(t){return t<0?0:t>1?1:t}function a(t){return "%"===t[t.length-1]?n(parseFloat(t)/100*255):n(parseInt(t))}function o(t){return "%"===t[t.length-1]?i(parseFloat(t)/100):i(parseFloat(t))}function s(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,i=t.replace(/ /g,"").toLowerCase();if(i in r)return r[i].slice();if("#"===i[0])return 4===i.length?(e=parseInt(i.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===i.length&&(e=parseInt(i.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var u=i.indexOf("("),l=i.indexOf(")");if(-1!==u&&l+1===i.length){var p=i.substr(0,u),c=i.substr(u+1,l-(u+1)).split(","),h=1;switch(p){case"rgba":if(4!==c.length)return null;h=o(c.pop());case"rgb":return 3!==c.length?null:[a(c[0]),a(c[1]),a(c[2]),h];case"hsla":if(4!==c.length)return null;h=o(c.pop());case"hsl":if(3!==c.length)return null;var f=(parseFloat(c[0])%360+360)%360/360,y=o(c[1]),d=o(c[2]),m=d<=.5?d*(y+1):d+y-d*y,v=2*d-m;return [n(255*s(v,m,f+1/3)),n(255*s(v,m,f)),n(255*s(v,m,f-1/3)),h];default:return null}}return null};}catch(t){}})).parseCSSColor,Yt=function(t,e,r,n){void 0===n&&(n=1),this.r=t,this.g=e,this.b=r,this.a=n;};Yt.parse=function(t){if(t){if(t instanceof Yt)return t;if("string"==typeof t){var e=Ht(t);if(e)return new Yt(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3])}}},Yt.prototype.toString=function(){var t=this.toArray(),e=t[0],r=t[1],n=t[2],i=t[3];return "rgba("+Math.round(e)+","+Math.round(r)+","+Math.round(n)+","+i+")"},Yt.prototype.toArray=function(){var t=this.r,e=this.g,r=this.b,n=this.a;return 0===n?[0,0,0,0]:[255*t/n,255*e/n,255*r/n,n]},Yt.black=new Yt(0,0,0,1),Yt.white=new Yt(1,1,1,1),Yt.transparent=new Yt(0,0,0,0),Yt.red=new Yt(1,0,0,1);var $t=function(t,e,r){this.sensitivity=t?e?"variant":"case":e?"accent":"base",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"});};$t.prototype.compare=function(t,e){return this.collator.compare(t,e)},$t.prototype.resolvedLocale=function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale};var Wt=function(t,e,r,n){this.text=t,this.scale=e,this.fontStack=r,this.textColor=n;},Qt=function(t){this.sections=t;};Qt.fromString=function(t){return new Qt([new Wt(t,null,null,null)])},Qt.prototype.toString=function(){return this.sections.map((function(t){return t.text})).join("")},Qt.prototype.serialize=function(){for(var t=["format"],e=0,r=this.sections;e=0&&t<=255&&"number"==typeof e&&e>=0&&e<=255&&"number"==typeof r&&r>=0&&r<=255?void 0===n||"number"==typeof n&&n>=0&&n<=1?null:"Invalid rgba value ["+[t,e,r,n].join(", ")+"]: 'a' must be between 0 and 1.":"Invalid rgba value ["+("number"==typeof n?[t,e,r,n]:[t,e,r]).join(", ")+"]: 'r', 'g', and 'b' must be between 0 and 255."}function re(t){if(null===t)return Ft;if("string"==typeof t)return Lt;if("boolean"==typeof t)return Dt;if("number"==typeof t)return Ot;if(t instanceof Yt)return Ut;if(t instanceof $t)return qt;if(t instanceof Qt)return Nt;if(t instanceof te)return Kt;if(Array.isArray(t)){for(var e,r=t.length,n=0,i=t;n2){var s=t[1];if("string"!=typeof s||!(s in oe)||"object"===s)return e.error('The item type argument of "array" must be one of string, number, boolean',1);a=oe[s],n++;}else a=jt;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to "array" must be a positive integer literal',2);o=t[2],n++;}r=Xt(a,o);}else r=oe[i];for(var u=[];n1)&&e.push(n);}}return e.concat(this.args.map((function(t){return t.serialize()})))};var ue=function(t){this.type=Nt,this.sections=t;};ue.parse=function(t,e){if(t.length<3)return e.error("Expected at least two arguments.");if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");for(var r=[],n=1;n-1&&(r=!0),{name:e,available:r}},le.prototype.eachChild=function(t){t(this.input);},le.prototype.possibleOutputs=function(){return [void 0]},le.prototype.serialize=function(){return ["image",this.input.serialize()]};var pe={"to-boolean":Dt,"to-color":Ut,"to-number":Ot,"to-string":Lt},ce=function(t,e){this.type=t,this.args=e;};ce.parse=function(t,e){if(t.length<2)return e.error("Expected at least one argument.");var r=t[0];if(("to-boolean"===r||"to-string"===r)&&2!==t.length)return e.error("Expected one argument.");for(var n=pe[r],i=[],a=1;a4?"Invalid rbga value "+JSON.stringify(e)+": expected an array containing either three or four numeric values.":ee(e[0],e[1],e[2],e[3])))return new Yt(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new ae(r||"Could not parse color from value '"+("string"==typeof e?e:String(JSON.stringify(e)))+"'")}if("number"===this.type.kind){for(var o=null,s=0,u=this.args;s=0)return !1;var r=!0;return t.eachChild((function(t){r&&!ge(t,e)&&(r=!1);})),r}de.parse=function(t,e){if(2!==t.length)return e.error("Expected one argument.");var r=t[1];if("object"!=typeof r||Array.isArray(r))return e.error("Collator options argument must be an object.");var n=e.parse(void 0!==r["case-sensitive"]&&r["case-sensitive"],1,Dt);if(!n)return null;var i=e.parse(void 0!==r["diacritic-sensitive"]&&r["diacritic-sensitive"],1,Dt);if(!i)return null;var a=null;return r.locale&&!(a=e.parse(r.locale,1,Lt))?null:new de(n,i,a)},de.prototype.evaluate=function(t){return new $t(this.caseSensitive.evaluate(t),this.diacriticSensitive.evaluate(t),this.locale?this.locale.evaluate(t):null)},de.prototype.eachChild=function(t){t(this.caseSensitive),t(this.diacriticSensitive),this.locale&&t(this.locale);},de.prototype.possibleOutputs=function(){return [void 0]},de.prototype.serialize=function(){var t={};return t["case-sensitive"]=this.caseSensitive.serialize(),t["diacritic-sensitive"]=this.diacriticSensitive.serialize(),this.locale&&(t.locale=this.locale.serialize()),["collator",t]};var xe=function(t,e){this.type=e.type,this.name=t,this.boundExpression=e;};xe.parse=function(t,e){if(2!==t.length||"string"!=typeof t[1])return e.error("'var' expression requires exactly one string literal argument.");var r=t[1];return e.scope.has(r)?new xe(r,e.scope.get(r)):e.error('Unknown variable "'+r+'". Make sure "'+r+'" has been bound in an enclosing "let" expression before using it.',1)},xe.prototype.evaluate=function(t){return this.boundExpression.evaluate(t)},xe.prototype.eachChild=function(){},xe.prototype.possibleOutputs=function(){return [void 0]},xe.prototype.serialize=function(){return ["var",this.name]};var be=function(t,e,r,n,i){void 0===e&&(e=[]),void 0===n&&(n=new Vt),void 0===i&&(i=[]),this.registry=t,this.path=e,this.key=e.map((function(t){return "["+t+"]"})).join(""),this.scope=n,this.errors=i,this.expectedType=r;};function _e(t,e){for(var r,n,i=t.length-1,a=0,o=i,s=0;a<=o;)if(r=t[s=Math.floor((a+o)/2)],n=t[s+1],r<=e){if(s===i||ee))throw new ae("Input is not a number.");o=s-1;}return 0}be.prototype.parse=function(t,e,r,n,i){return void 0===i&&(i={}),e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)},be.prototype._parse=function(t,e){function r(t,e,r){return "assert"===r?new se(e,[t]):"coerce"===r?new ce(e,[t]):t}if(null!==t&&"string"!=typeof t&&"boolean"!=typeof t&&"number"!=typeof t||(t=["literal",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');var n=t[0];if("string"!=typeof n)return this.error("Expression name must be a string, but found "+typeof n+' instead. If you wanted a literal array, use ["literal", [...]].',0),null;var i=this.registry[n];if(i){var a=i.parse(t,this);if(!a)return null;if(this.expectedType){var o=this.expectedType,s=a.type;if("string"!==o.kind&&"number"!==o.kind&&"boolean"!==o.kind&&"object"!==o.kind&&"array"!==o.kind||"value"!==s.kind)if("color"!==o.kind&&"formatted"!==o.kind&&"image"!==o.kind||"value"!==s.kind&&"string"!==s.kind){if(this.checkSubtype(o,s))return null}else a=r(a,o,e.typeAnnotation||"coerce");else a=r(a,o,e.typeAnnotation||"assert");}if(!(a instanceof ie)&&"image"!==a.type.kind&&function t(e){if(e instanceof xe)return t(e.boundExpression);if(e instanceof ye&&"error"===e.name)return !1;if(e instanceof de)return !1;var r=e instanceof ce||e instanceof se;var n=!0;e.eachChild((function(e){n=r?n&&t(e):n&&e instanceof ie;}));if(!n)return !1;return me(e)&&ge(e,["zoom","heatmap-density","line-progress","accumulated","is-supported-script"])}(a)){var u=new fe;try{a=new ie(a.type,a.evaluate(u));}catch(t){return this.error(t.message),null}}return a}return this.error('Unknown expression "'+n+'". If you wanted a literal array, use ["literal", [...]].',0)}return void 0===t?this.error("'undefined' value invalid. Use null instead."):"object"==typeof t?this.error('Bare objects invalid. Use ["literal", {...}] instead.'):this.error("Expected an array, but found "+typeof t+" instead.")},be.prototype.concat=function(t,e,r){var n="number"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new be(this.registry,n,e||null,i,this.errors)},be.prototype.error=function(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];var n=""+this.key+e.map((function(t){return "["+t+"]"})).join("");this.errors.push(new Tt(n,t));},be.prototype.checkSubtype=function(t,e){var r=Jt(t,e);return r&&this.error(r),r};var we=function(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(var n=0,i=r;n=o)return e.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',u);var p=e.parse(s,l,i);if(!p)return null;i=i||p.type,n.push([o,p]);}return new we(i,r,n)},we.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[_e(e,n)].evaluate(t)},we.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t};var Ae=ke;function ke(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=r,this.p2y=n;}function Se(t,e,r){return t*(1-r)+e*r}ke.prototype.sampleCurveX=function(t){return ((this.ax*t+this.bx)*t+this.cx)*t},ke.prototype.sampleCurveY=function(t){return ((this.ay*t+this.by)*t+this.cy)*t},ke.prototype.sampleCurveDerivativeX=function(t){return (3*this.ax*t+2*this.bx)*t+this.cx},ke.prototype.solveCurveX=function(t,e){var r,n,i,a,o;for(void 0===e&&(e=1e-6),i=t,o=0;o<8;o++){if(a=this.sampleCurveX(i)-t,Math.abs(a)(n=1))return n;for(;ra?r=i:n=i,i=.5*(n-r)+r;}return i},ke.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var ze=Object.freeze({number:Se,color:function(t,e,r){return new Yt(Se(t.r,e.r,r),Se(t.g,e.g,r),Se(t.b,e.b,r),Se(t.a,e.a,r))},array:function(t,e,r){return t.map((function(t,n){return Se(t,e[n],r)}))}}),Ie=.95047,Ce=1,Be=1.08883,Me=4/29,Ee=6/29,Pe=3*Ee*Ee,Te=Ee*Ee*Ee,Ve=Math.PI/180,Fe=180/Math.PI;function Oe(t){return t>Te?Math.pow(t,1/3):t/Pe+Me}function Le(t){return t>Ee?t*t*t:Pe*(t-Me)}function De(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Ue(t){return (t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Re(t){var e=Ue(t.r),r=Ue(t.g),n=Ue(t.b),i=Oe((.4124564*e+.3575761*r+.1804375*n)/Ie),a=Oe((.2126729*e+.7151522*r+.072175*n)/Ce);return {l:116*a-16,a:500*(i-a),b:200*(a-Oe((.0193339*e+.119192*r+.9503041*n)/Be)),alpha:t.a}}function je(t){var e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=Ce*Le(e),r=Ie*Le(r),n=Be*Le(n),new Yt(De(3.2404542*r-1.5371385*e-.4985314*n),De(-.969266*r+1.8760108*e+.041556*n),De(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}function qe(t,e,r){var n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}var Ne={forward:Re,reverse:je,interpolate:function(t,e,r){return {l:Se(t.l,e.l,r),a:Se(t.a,e.a,r),b:Se(t.b,e.b,r),alpha:Se(t.alpha,e.alpha,r)}}},Ke={forward:function(t){var e=Re(t),r=e.l,n=e.a,i=e.b,a=Math.atan2(i,n)*Fe;return {h:a<0?a+360:a,c:Math.sqrt(n*n+i*i),l:r,alpha:t.a}},reverse:function(t){var e=t.h*Ve,r=t.c;return je({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return {h:qe(t.h,e.h,r),c:Se(t.c,e.c,r),l:Se(t.l,e.l,r),alpha:Se(t.alpha,e.alpha,r)}}},Xe=Object.freeze({lab:Ne,hcl:Ke}),Ze=function(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(var a=0,o=i;a1})))return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);n={name:"cubic-bezier",controlPoints:s};}if(t.length-1<4)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(!(i=e.parse(i,2,Ot)))return null;var u=[],l=null;"interpolate-hcl"===r||"interpolate-lab"===r?l=Ut:e.expectedType&&"value"!==e.expectedType.kind&&(l=e.expectedType);for(var p=0;p=c)return e.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',f);var d=e.parse(h,y,l);if(!d)return null;l=l||d.type,u.push([c,d]);}return "number"===l.kind||"color"===l.kind||"array"===l.kind&&"number"===l.itemType.kind&&"number"==typeof l.N?new Ze(l,r,n,i,u):e.error("Type "+Zt(l)+" is not interpolatable.")},Ze.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);var a=_e(e,n),o=e[a],s=e[a+1],u=Ze.interpolationFactor(this.interpolation,n,o,s),l=r[a].evaluate(t),p=r[a+1].evaluate(t);return "interpolate"===this.operator?ze[this.type.kind.toLowerCase()](l,p,u):"interpolate-hcl"===this.operator?Ke.reverse(Ke.interpolate(Ke.forward(l),Ke.forward(p),u)):Ne.reverse(Ne.interpolate(Ne.forward(l),Ne.forward(p),u))},Ze.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e=r.length)throw new ae("Array index out of bounds: "+e+" > "+(r.length-1)+".");if(e!==Math.floor(e))throw new ae("Array index must be an integer, but found "+e+" instead.");return r[e]},Ye.prototype.eachChild=function(t){t(this.index),t(this.input);},Ye.prototype.possibleOutputs=function(){return [void 0]},Ye.prototype.serialize=function(){return ["at",this.index.serialize(),this.input.serialize()]};var $e=function(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a;};$e.parse=function(t,e){if(t.length<5)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if(t.length%2!=1)return e.error("Expected an even number of arguments.");var r,n;e.expectedType&&"value"!==e.expectedType.kind&&(n=e.expectedType);for(var i={},a=[],o=2;oNumber.MAX_SAFE_INTEGER)return l.error("Branch labels must be integers no larger than "+Number.MAX_SAFE_INTEGER+".");if("number"==typeof h&&Math.floor(h)!==h)return l.error("Numeric branch labels must be integer values.");if(r){if(l.checkSubtype(r,re(h)))return null}else r=re(h);if(void 0!==i[String(h)])return l.error("Branch labels must be unique.");i[String(h)]=a.length;}var f=e.parse(u,o,n);if(!f)return null;n=n||f.type,a.push(f);}var y=e.parse(t[1],1,jt);if(!y)return null;var d=e.parse(t[t.length-1],t.length-1,n);return d?"value"!==y.type.kind&&e.concat(1).checkSubtype(r,y.type)?null:new $e(r,n,y,i,a,d):null},$e.prototype.evaluate=function(t){var e=this.input.evaluate(t);return (re(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)},$e.prototype.eachChild=function(t){t(this.input),this.outputs.forEach(t),t(this.otherwise);},$e.prototype.possibleOutputs=function(){var t;return (t=[]).concat.apply(t,this.outputs.map((function(t){return t.possibleOutputs()}))).concat(this.otherwise.possibleOutputs())},$e.prototype.serialize=function(){for(var t=this,e=["match",this.input.serialize()],r=[],n={},i=0,a=Object.keys(this.cases).sort();i",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),or=er("<=",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),sr=er(">=",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0})),ur=function(t,e,r,n,i){this.type=Lt,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i;};ur.parse=function(t,e){if(3!==t.length)return e.error("Expected two arguments.");var r=e.parse(t[1],1,Ot);if(!r)return null;var n=t[2];if("object"!=typeof n||Array.isArray(n))return e.error("NumberFormat options argument must be an object.");var i=null;if(n.locale&&!(i=e.parse(n.locale,1,Lt)))return null;var a=null;if(n.currency&&!(a=e.parse(n.currency,1,Lt)))return null;var o=null;if(n["min-fraction-digits"]&&!(o=e.parse(n["min-fraction-digits"],1,Ot)))return null;var s=null;return n["max-fraction-digits"]&&!(s=e.parse(n["max-fraction-digits"],1,Ot))?null:new ur(r,i,a,o,s)},ur.prototype.evaluate=function(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))},ur.prototype.eachChild=function(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits);},ur.prototype.possibleOutputs=function(){return [void 0]},ur.prototype.serialize=function(){var t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.minFractionDigits&&(t["min-fraction-digits"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t["max-fraction-digits"]=this.maxFractionDigits.serialize()),["number-format",this.number.serialize(),t]};var lr=function(t){this.type=Ot,this.input=t;};lr.parse=function(t,e){if(2!==t.length)return e.error("Expected 1 argument, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1);return r?"array"!==r.type.kind&&"string"!==r.type.kind&&"value"!==r.type.kind?e.error("Expected argument of type string or array, but found "+Zt(r.type)+" instead."):new lr(r):null},lr.prototype.evaluate=function(t){var e=this.input.evaluate(t);if("string"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new ae("Expected value to be of type string or array, but found "+Zt(re(e))+" instead.")},lr.prototype.eachChild=function(t){t(this.input);},lr.prototype.possibleOutputs=function(){return [void 0]},lr.prototype.serialize=function(){var t=["length"];return this.eachChild((function(e){t.push(e.serialize());})),t};var pr={"==":rr,"!=":nr,">":ar,"<":ir,">=":sr,"<=":or,array:se,at:Ye,boolean:se,case:We,coalesce:Je,collator:de,format:ue,image:le,interpolate:Ze,"interpolate-hcl":Ze,"interpolate-lab":Ze,length:lr,let:He,literal:ie,match:$e,number:se,"number-format":ur,object:se,step:we,string:se,"to-boolean":ce,"to-color":ce,"to-number":ce,"to-string":ce,var:xe};function cr(t,e){var r=e[0],n=e[1],i=e[2],a=e[3];r=r.evaluate(t),n=n.evaluate(t),i=i.evaluate(t);var o=a?a.evaluate(t):1,s=ee(r,n,i,o);if(s)throw new ae(s);return new Yt(r/255*o,n/255*o,i/255*o,o)}function hr(t,e){return t in e}function fr(t,e){var r=e[t];return void 0===r?null:r}function yr(t){return {type:t}}function dr(t){return {result:"success",value:t}}function mr(t){return {result:"error",value:t}}function vr(t){return "data-driven"===t["property-type"]||"cross-faded-data-driven"===t["property-type"]}function gr(t){return !!t.expression&&t.expression.parameters.indexOf("zoom")>-1}function xr(t){return !!t.expression&&t.expression.interpolated}function br(t){return t instanceof Number?"number":t instanceof String?"string":t instanceof Boolean?"boolean":Array.isArray(t)?"array":null===t?"null":typeof t}function _r(t){return "object"==typeof t&&null!==t&&!Array.isArray(t)}function wr(t){return t}function Ar(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function kr(t,e,r,n,i){return Ar(typeof r===i?n[r]:void 0,t.default,e.default)}function Sr(t,e,r){if("number"!==br(r))return Ar(t.default,e.default);var n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];var i=_e(t.stops.map((function(t){return t[0]})),r);return t.stops[i][1]}function zr(t,e,r){var n=void 0!==t.base?t.base:1;if("number"!==br(r))return Ar(t.default,e.default);var i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];var a=_e(t.stops.map((function(t){return t[0]})),r),o=function(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],u=t.stops[a+1][1],l=ze[e.type]||wr;if(t.colorSpace&&"rgb"!==t.colorSpace){var p=Xe[t.colorSpace];l=function(t,e){return p.reverse(p.interpolate(p.forward(t),p.forward(e),o))};}return "function"==typeof s.evaluate?{evaluate:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var r=s.evaluate.apply(void 0,t),n=u.evaluate.apply(void 0,t);if(void 0!==r&&void 0!==n)return l(r,n,o)}}:l(s,u,o)}function Ir(t,e,r){return "color"===e.type?r=Yt.parse(r):"formatted"===e.type?r=Qt.fromString(r.toString()):"image"===e.type?r=te.fromString({name:r.toString(),available:!1}):br(r)===e.type||"enum"===e.type&&e.values[r]||(r=void 0),Ar(r,t.default,e.default)}ye.register(pr,{error:[{kind:"error"},[Lt],function(t,e){var r=e[0];throw new ae(r.evaluate(t))}],typeof:[Lt,[jt],function(t,e){return Zt(re(e[0].evaluate(t)))}],"to-rgba":[Xt(Ot,4),[Ut],function(t,e){return e[0].evaluate(t).toArray()}],rgb:[Ut,[Ot,Ot,Ot],cr],rgba:[Ut,[Ot,Ot,Ot,Ot],cr],has:{type:Dt,overloads:[[[Lt],function(t,e){return hr(e[0].evaluate(t),t.properties())}],[[Lt,Rt],function(t,e){var r=e[0],n=e[1];return hr(r.evaluate(t),n.evaluate(t))}]]},get:{type:jt,overloads:[[[Lt],function(t,e){return fr(e[0].evaluate(t),t.properties())}],[[Lt,Rt],function(t,e){var r=e[0],n=e[1];return fr(r.evaluate(t),n.evaluate(t))}]]},"feature-state":[jt,[Lt],function(t,e){return fr(e[0].evaluate(t),t.featureState||{})}],properties:[Rt,[],function(t){return t.properties()}],"geometry-type":[Lt,[],function(t){return t.geometryType()}],id:[jt,[],function(t){return t.id()}],zoom:[Ot,[],function(t){return t.globals.zoom}],"heatmap-density":[Ot,[],function(t){return t.globals.heatmapDensity||0}],"line-progress":[Ot,[],function(t){return t.globals.lineProgress||0}],accumulated:[jt,[],function(t){return void 0===t.globals.accumulated?null:t.globals.accumulated}],"+":[Ot,yr(Ot),function(t,e){for(var r=0,n=0,i=e;n":[Dt,[Lt,jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>a}],"filter-id->":[Dt,[jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>i}],"filter-<=":[Dt,[Lt,jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<=a}],"filter-id-<=":[Dt,[jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<=i}],"filter->=":[Dt,[Lt,jt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>=a}],"filter-id->=":[Dt,[jt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>=i}],"filter-has":[Dt,[jt],function(t,e){return e[0].value in t.properties()}],"filter-has-id":[Dt,[],function(t){return null!==t.id()}],"filter-type-in":[Dt,[Xt(Lt)],function(t,e){return e[0].value.indexOf(t.geometryType())>=0}],"filter-id-in":[Dt,[Xt(jt)],function(t,e){return e[0].value.indexOf(t.id())>=0}],"filter-in-small":[Dt,[Lt,Xt(jt)],function(t,e){var r=e[0];return e[1].value.indexOf(t.properties()[r.value])>=0}],"filter-in-large":[Dt,[Lt,Xt(jt)],function(t,e){var r=e[0],n=e[1];return function(t,e,r,n){for(;r<=n;){var i=r+n>>1;if(e[i]===t)return !0;e[i]>t?n=i-1:r=i+1;}return !1}(t.properties()[r.value],n.value,0,n.value.length-1)}],all:{type:Dt,overloads:[[[Dt,Dt],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)&&n.evaluate(t)}],[yr(Dt),function(t,e){for(var r=0,n=e;r0&&"string"==typeof t[0]&&t[0]in pr}function Mr(t,e){var r=new be(pr,[],e?function(t){var e={color:Ut,string:Lt,number:Ot,enum:Lt,boolean:Dt,formatted:Nt,image:Kt};if("array"===t.type)return Xt(e[t.value]||jt,t.length);return e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&"string"===e.type?{typeAnnotation:"coerce"}:void 0);return n?dr(new Cr(n,e)):mr(r.errors)}Cr.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.availableImages=n||null,this._evaluator.formattedSection=i,this.expression.evaluate(this._evaluator)},Cr.prototype.evaluate=function(t,e,r,n,i){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.availableImages=n||null,this._evaluator.formattedSection=i||null;try{var a=this.expression.evaluate(this._evaluator);if(null==a)return this._defaultValue;if(this._enumValues&&!(a in this._enumValues))throw new ae("Expected value to be one of "+Object.keys(this._enumValues).map((function(t){return JSON.stringify(t)})).join(", ")+", but found "+JSON.stringify(a)+" instead.");return a}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,"undefined"!=typeof console&&console.warn(t.message)),this._defaultValue}};var Er=function(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent="constant"!==t&&!ve(e.expression);};Er.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i)},Er.prototype.evaluate=function(t,e,r,n,i){return this._styleExpression.evaluate(t,e,r,n,i)};var Pr=function(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent="camera"!==t&&!ve(e.expression),this.interpolationType=n;};function Tr(t,e){if("error"===(t=Mr(t,e)).result)return t;var r=t.value.expression,n=me(r);if(!n&&!vr(e))return mr([new Tt("","data expressions not supported")]);var i=ge(r,["zoom"]);if(!i&&!gr(e))return mr([new Tt("","zoom expressions not supported")]);var a=function t(e){var r=null;if(e instanceof He)r=t(e.result);else if(e instanceof Je)for(var n=0,i=e.args;nn.maximum?[new It(e,r,r+" is greater than the maximum value "+n.maximum)]:[]}function Dr(t){var e,r,n,i=t.valueSpec,a=Et(t.value.type),o={},s="categorical"!==a&&void 0===t.value.property,u=!s,l="array"===br(t.value.stops)&&"array"===br(t.value.stops[0])&&"object"===br(t.value.stops[0][0]),p=Fr({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if("identity"===a)return [new It(t.key,t.value,'identity function may not have a "stops" property')];var e=[],r=t.value;e=e.concat(Or({key:t.key,value:r,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:c})),"array"===br(r)&&0===r.length&&e.push(new It(t.key,r,"array must have at least one stop"));return e},default:function(t){return on({key:t.key,value:t.value,valueSpec:i,style:t.style,styleSpec:t.styleSpec})}}});return "identity"===a&&s&&p.push(new It(t.key,t.value,'missing required property "property"')),"identity"===a||t.value.stops||p.push(new It(t.key,t.value,'missing required property "stops"')),"exponential"===a&&t.valueSpec.expression&&!xr(t.valueSpec)&&p.push(new It(t.key,t.value,"exponential functions not supported")),t.styleSpec.$version>=8&&(u&&!vr(t.valueSpec)?p.push(new It(t.key,t.value,"property functions not supported")):s&&!gr(t.valueSpec)&&p.push(new It(t.key,t.value,"zoom functions not supported"))),"categorical"!==a&&!l||void 0!==t.value.property||p.push(new It(t.key,t.value,'"property" property is required')),p;function c(t){var e=[],a=t.value,s=t.key;if("array"!==br(a))return [new It(s,a,"array expected, "+br(a)+" found")];if(2!==a.length)return [new It(s,a,"array length 2 expected, length "+a.length+" found")];if(l){if("object"!==br(a[0]))return [new It(s,a,"object expected, "+br(a[0])+" found")];if(void 0===a[0].zoom)return [new It(s,a,"object stop key must have zoom")];if(void 0===a[0].value)return [new It(s,a,"object stop key must have value")];if(n&&n>Et(a[0].zoom))return [new It(s,a[0].zoom,"stop zoom values must appear in ascending order")];Et(a[0].zoom)!==n&&(n=Et(a[0].zoom),r=void 0,o={}),e=e.concat(Fr({key:s+"[0]",value:a[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:Lr,value:h}}));}else e=e.concat(h({key:s+"[0]",value:a[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},a));return Br(Pt(a[1]))?e.concat([new It(s+"[1]",a[1],"expressions are not allowed in function stops.")]):e.concat(on({key:s+"[1]",value:a[1],valueSpec:i,style:t.style,styleSpec:t.styleSpec}))}function h(t,n){var s=br(t.value),u=Et(t.value),l=null!==t.value?t.value:n;if(e){if(s!==e)return [new It(t.key,l,s+" stop domain type must match previous stop domain type "+e)]}else e=s;if("number"!==s&&"string"!==s&&"boolean"!==s)return [new It(t.key,l,"stop domain value must be a number, string, or boolean")];if("number"!==s&&"categorical"!==a){var p="number expected, "+s+" found";return vr(i)&&void 0===a&&(p+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new It(t.key,l,p)]}return "categorical"!==a||"number"!==s||isFinite(u)&&Math.floor(u)===u?"categorical"!==a&&"number"===s&&void 0!==r&&u=2&&"$id"!==t[1]&&"$type"!==t[1];case"in":case"!in":case"!has":case"none":return !1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case"any":case"all":for(var e=0,r=t.slice(1);ee?1:0}function Xr(t){if(!t)return !0;var e,r=t[0];return t.length<=1?"any"!==r:"=="===r?Zr(t[1],t[2],"=="):"!="===r?Hr(Zr(t[1],t[2],"==")):"<"===r||">"===r||"<="===r||">="===r?Zr(t[1],t[2],r):"any"===r?(e=t.slice(1),["any"].concat(e.map(Xr))):"all"===r?["all"].concat(t.slice(1).map(Xr)):"none"===r?["all"].concat(t.slice(1).map(Xr).map(Hr)):"in"===r?Gr(t[1],t.slice(2)):"!in"===r?Hr(Gr(t[1],t.slice(2))):"has"===r?Jr(t[1]):"!has"!==r||Hr(Jr(t[1]))}function Zr(t,e,r){switch(t){case"$type":return ["filter-type-"+r,e];case"$id":return ["filter-id-"+r,e];default:return ["filter-"+r,t,e]}}function Gr(t,e){if(0===e.length)return !1;switch(t){case"$type":return ["filter-type-in",["literal",e]];case"$id":return ["filter-id-in",["literal",e]];default:return e.length>200&&!e.some((function(t){return typeof t!=typeof e[0]}))?["filter-in-large",t,["literal",e.sort(Kr)]]:["filter-in-small",t,["literal",e]]}}function Jr(t){switch(t){case"$type":return !0;case"$id":return ["filter-has-id"];default:return ["filter-has",t]}}function Hr(t){return ["!",t]}function Yr(t){return jr(Pt(t.value))?Ur(Bt({},t,{expressionContext:"filter",valueSpec:{value:"boolean"}})):function t(e){var r=e.value;var n=e.key;if("array"!==br(r))return [new It(n,r,"array expected, "+br(r)+" found")];var i=e.styleSpec;var a;var o=[];if(r.length<1)return [new It(n,r,"filter array must have at least 1 element")];o=o.concat(Rr({key:n+"[0]",value:r[0],valueSpec:i.filter_operator,style:e.style,styleSpec:e.styleSpec}));switch(Et(r[0])){case"<":case"<=":case">":case">=":r.length>=2&&"$type"===Et(r[1])&&o.push(new It(n,r,'"$type" cannot be use with operator "'+r[0]+'"'));case"==":case"!=":3!==r.length&&o.push(new It(n,r,'filter array for operator "'+r[0]+'" must have 3 elements'));case"in":case"!in":r.length>=2&&"string"!==(a=br(r[1]))&&o.push(new It(n+"[1]",r[1],"string expected, "+a+" found"));for(var s=2;s=p[f+0]&&n>=p[f+1])?(o[h]=!0,a.push(l[h])):o[h]=!1;}}},gn.prototype._forEachCell=function(t,e,r,n,i,a,o,s){for(var u=this._convertToCellCoord(t),l=this._convertToCellCoord(e),p=this._convertToCellCoord(r),c=this._convertToCellCoord(n),h=u;h<=p;h++)for(var f=l;f<=c;f++){var y=this.d*f+h;if((!s||s(this._convertFromCellCoord(h),this._convertFromCellCoord(f),this._convertFromCellCoord(h+1),this._convertFromCellCoord(f+1)))&&i.call(this,t,e,r,n,y,a,o,s))return}},gn.prototype._convertFromCellCoord=function(t){return (t-this.padding)/this.scale},gn.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},gn.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=vn+this.cells.length+1+1,r=0,n=0;n=0)){var c=t[p];l[p]=bn[u].shallow.indexOf(p)>=0?c:An(c,e);}t instanceof Error&&(l.message=t.message);}if(l.$name)throw new Error("$name property is reserved for worker serialization logic.");return "Object"!==u&&(l.$name=u),l}throw new Error("can't serialize object of type "+typeof t)}function kn(t){if(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||t instanceof ArrayBuffer||ArrayBuffer.isView(t)||t instanceof xn)return t;if(Array.isArray(t))return t.map(kn);if("object"==typeof t){var e=t.$name||"Object",r=bn[e].klass;if(!r)throw new Error("can't deserialize unregistered class "+e);if(r.deserialize)return r.deserialize(t);for(var n=Object.create(r.prototype),i=0,a=Object.keys(t);i=0?s:kn(s);}}return n}throw new Error("can't deserialize object of type "+typeof t)}var Sn=function(){this.first=!0;};Sn.prototype.update=function(t,e){var r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom=128&&t<=255},Arabic:function(t){return t>=1536&&t<=1791},"Arabic Supplement":function(t){return t>=1872&&t<=1919},"Arabic Extended-A":function(t){return t>=2208&&t<=2303},"Hangul Jamo":function(t){return t>=4352&&t<=4607},"Unified Canadian Aboriginal Syllabics":function(t){return t>=5120&&t<=5759},Khmer:function(t){return t>=6016&&t<=6143},"Unified Canadian Aboriginal Syllabics Extended":function(t){return t>=6320&&t<=6399},"General Punctuation":function(t){return t>=8192&&t<=8303},"Letterlike Symbols":function(t){return t>=8448&&t<=8527},"Number Forms":function(t){return t>=8528&&t<=8591},"Miscellaneous Technical":function(t){return t>=8960&&t<=9215},"Control Pictures":function(t){return t>=9216&&t<=9279},"Optical Character Recognition":function(t){return t>=9280&&t<=9311},"Enclosed Alphanumerics":function(t){return t>=9312&&t<=9471},"Geometric Shapes":function(t){return t>=9632&&t<=9727},"Miscellaneous Symbols":function(t){return t>=9728&&t<=9983},"Miscellaneous Symbols and Arrows":function(t){return t>=11008&&t<=11263},"CJK Radicals Supplement":function(t){return t>=11904&&t<=12031},"Kangxi Radicals":function(t){return t>=12032&&t<=12255},"Ideographic Description Characters":function(t){return t>=12272&&t<=12287},"CJK Symbols and Punctuation":function(t){return t>=12288&&t<=12351},Hiragana:function(t){return t>=12352&&t<=12447},Katakana:function(t){return t>=12448&&t<=12543},Bopomofo:function(t){return t>=12544&&t<=12591},"Hangul Compatibility Jamo":function(t){return t>=12592&&t<=12687},Kanbun:function(t){return t>=12688&&t<=12703},"Bopomofo Extended":function(t){return t>=12704&&t<=12735},"CJK Strokes":function(t){return t>=12736&&t<=12783},"Katakana Phonetic Extensions":function(t){return t>=12784&&t<=12799},"Enclosed CJK Letters and Months":function(t){return t>=12800&&t<=13055},"CJK Compatibility":function(t){return t>=13056&&t<=13311},"CJK Unified Ideographs Extension A":function(t){return t>=13312&&t<=19903},"Yijing Hexagram Symbols":function(t){return t>=19904&&t<=19967},"CJK Unified Ideographs":function(t){return t>=19968&&t<=40959},"Yi Syllables":function(t){return t>=40960&&t<=42127},"Yi Radicals":function(t){return t>=42128&&t<=42191},"Hangul Jamo Extended-A":function(t){return t>=43360&&t<=43391},"Hangul Syllables":function(t){return t>=44032&&t<=55215},"Hangul Jamo Extended-B":function(t){return t>=55216&&t<=55295},"Private Use Area":function(t){return t>=57344&&t<=63743},"CJK Compatibility Ideographs":function(t){return t>=63744&&t<=64255},"Arabic Presentation Forms-A":function(t){return t>=64336&&t<=65023},"Vertical Forms":function(t){return t>=65040&&t<=65055},"CJK Compatibility Forms":function(t){return t>=65072&&t<=65103},"Small Form Variants":function(t){return t>=65104&&t<=65135},"Arabic Presentation Forms-B":function(t){return t>=65136&&t<=65279},"Halfwidth and Fullwidth Forms":function(t){return t>=65280&&t<=65519}};function In(t){for(var e=0,r=t;e=65097&&t<=65103)||(!!zn["CJK Compatibility Ideographs"](t)||(!!zn["CJK Compatibility"](t)||(!!zn["CJK Radicals Supplement"](t)||(!!zn["CJK Strokes"](t)||(!(!zn["CJK Symbols and Punctuation"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||(!!zn["CJK Unified Ideographs Extension A"](t)||(!!zn["CJK Unified Ideographs"](t)||(!!zn["Enclosed CJK Letters and Months"](t)||(!!zn["Hangul Compatibility Jamo"](t)||(!!zn["Hangul Jamo Extended-A"](t)||(!!zn["Hangul Jamo Extended-B"](t)||(!!zn["Hangul Jamo"](t)||(!!zn["Hangul Syllables"](t)||(!!zn.Hiragana(t)||(!!zn["Ideographic Description Characters"](t)||(!!zn.Kanbun(t)||(!!zn["Kangxi Radicals"](t)||(!!zn["Katakana Phonetic Extensions"](t)||(!(!zn.Katakana(t)||12540===t)||(!(!zn["Halfwidth and Fullwidth Forms"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||(!(!zn["Small Form Variants"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||(!!zn["Unified Canadian Aboriginal Syllabics"](t)||(!!zn["Unified Canadian Aboriginal Syllabics Extended"](t)||(!!zn["Vertical Forms"](t)||(!!zn["Yijing Hexagram Symbols"](t)||(!!zn["Yi Syllables"](t)||!!zn["Yi Radicals"](t))))))))))))))))))))))))))))))}function Mn(t){return !(Bn(t)||function(t){return !(!zn["Latin-1 Supplement"](t)||167!==t&&169!==t&&174!==t&&177!==t&&188!==t&&189!==t&&190!==t&&215!==t&&247!==t)||(!(!zn["General Punctuation"](t)||8214!==t&&8224!==t&&8225!==t&&8240!==t&&8241!==t&&8251!==t&&8252!==t&&8258!==t&&8263!==t&&8264!==t&&8265!==t&&8273!==t)||(!!zn["Letterlike Symbols"](t)||(!!zn["Number Forms"](t)||(!(!zn["Miscellaneous Technical"](t)||!(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215))||(!(!zn["Control Pictures"](t)||9251===t)||(!!zn["Optical Character Recognition"](t)||(!!zn["Enclosed Alphanumerics"](t)||(!!zn["Geometric Shapes"](t)||(!(!zn["Miscellaneous Symbols"](t)||t>=9754&&t<=9759)||(!(!zn["Miscellaneous Symbols and Arrows"](t)||!(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243))||(!!zn["CJK Symbols and Punctuation"](t)||(!!zn.Katakana(t)||(!!zn["Private Use Area"](t)||(!!zn["CJK Compatibility Forms"](t)||(!!zn["Small Form Variants"](t)||(!!zn["Halfwidth and Fullwidth Forms"](t)||(8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)))))))))))))))))}(t))}function En(t,e){return !(!e&&(t>=1424&&t<=2303||zn["Arabic Presentation Forms-A"](t)||zn["Arabic Presentation Forms-B"](t)))&&!(t>=2304&&t<=3583||t>=3840&&t<=4255||zn.Khmer(t))}var Pn,Tn=!1,Vn=null,Fn=!1,On=new St,Ln={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:function(){return Fn||null!=Ln.applyArabicShaping}},Dn=function(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new Sn,this.transition={});};Dn.prototype.isSupportedScript=function(t){return function(t,e){for(var r=0,n=t;rthis.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}};var Un=function(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(_r(t))return new Vr(t,e);if(Br(t)){var r=Tr(t,e);if("error"===r.result)throw new Error(r.value.map((function(t){return t.key+": "+t.message})).join(", "));return r.value}var n=t;return "string"==typeof t&&"color"===e.type&&(n=Yt.parse(t)),{kind:"constant",evaluate:function(){return n}}}(void 0===e?t.specification.default:e,t.specification);};Un.prototype.isDataDriven=function(){return "source"===this.expression.kind||"composite"===this.expression.kind},Un.prototype.possiblyEvaluate=function(t,e){return this.property.possiblyEvaluate(this,t,e)};var Rn=function(t){this.property=t,this.value=new Un(t,void 0);};Rn.prototype.transitioned=function(t,e){return new qn(this.property,this.value,e,c({},t.transition,this.transition),t.now)},Rn.prototype.untransitioned=function(){return new qn(this.property,this.value,null,{},0)};var jn=function(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues);};jn.prototype.getValue=function(t){return b(this._values[t].value.value)},jn.prototype.setValue=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Rn(this._values[t].property)),this._values[t].value=new Un(this._values[t].property,null===e?void 0:b(e));},jn.prototype.getTransition=function(t){return b(this._values[t].transition)},jn.prototype.setTransition=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Rn(this._values[t].property)),this._values[t].transition=b(e)||void 0;},jn.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);ethis.end)return this.prior=null,n;if(this.value.isDataDriven())return this.prior=null,n;if(r=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(a))}return n};var Nn=function(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues);};Nn.prototype.possiblyEvaluate=function(t,e){for(var r=new Zn(this._properties),n=0,i=Object.keys(this._values);nn.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},e.prototype.interpolate=function(t){return t},e}(Jn),Yn=function(t){this.specification=t;};Yn.prototype.possiblyEvaluate=function(t,e,r){if(void 0!==t.value){if("constant"===t.expression.kind){var n=t.expression.evaluate(e,null,{},r);return this._calculate(n,n,n,e)}return this._calculate(t.expression.evaluate(new Dn(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Dn(Math.floor(e.zoom),e)),t.expression.evaluate(new Dn(Math.floor(e.zoom+1),e)),e)}},Yn.prototype._calculate=function(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},Yn.prototype.interpolate=function(t){return t};var $n=function(t){this.specification=t;};$n.prototype.possiblyEvaluate=function(t,e,r){return !!t.expression.evaluate(e,null,{},r)},$n.prototype.interpolate=function(){return !1};var Wn=function(t){for(var e in this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[],t){var r=t[e];r.specification.overridable&&this.overridableProperties.push(e);var n=this.defaultPropertyValues[e]=new Un(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Rn(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({});}};_n("DataDrivenProperty",Jn),_n("DataConstantProperty",Gn),_n("CrossFadedDataDrivenProperty",Hn),_n("CrossFadedProperty",Yn),_n("ColorRampProperty",$n);var Qn=function(t){function e(e,r){if(t.call(this),this.id=e.id,this.type=e.type,this._featureFilter=function(){return !0},"custom"!==e.type&&(e=e,this.metadata=e.metadata,this.minzoom=e.minzoom,this.maxzoom=e.maxzoom,"background"!==e.type&&(this.source=e.source,this.sourceLayer=e["source-layer"],this.filter=e.filter),r.layout&&(this._unevaluatedLayout=new Kn(r.layout)),r.paint)){for(var n in this._transitionablePaint=new jn(r.paint),e.paint)this.setPaintProperty(n,e.paint[n],{validate:!1});for(var i in e.layout)this.setLayoutProperty(i,e.layout[i],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned();}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCrossfadeParameters=function(){return this._crossfadeParameters},e.prototype.getLayoutProperty=function(t){return "visibility"===t?this.visibility:this._unevaluatedLayout.getValue(t)},e.prototype.setLayoutProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n="layers."+this.id+".layout."+t;if(this._validate(yn,n,t,e,r))return}"visibility"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e;},e.prototype.getPaintProperty=function(t){return v(t,"-transition")?this._transitionablePaint.getTransition(t.slice(0,-"-transition".length)):this._transitionablePaint.getValue(t)},e.prototype.setPaintProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n="layers."+this.id+".paint."+t;if(this._validate(fn,n,t,e,r))return !1}if(v(t,"-transition"))return this._transitionablePaint.setTransition(t.slice(0,-"-transition".length),e||void 0),!1;var i=this._transitionablePaint._values[t],a="cross-faded-data-driven"===i.property.specification["property-type"],o=i.value.isDataDriven(),s=i.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);var u=this._transitionablePaint._values[t].value;return u.isDataDriven()||o||a||this._handleOverridablePaintPropertyUpdate(t,s,u)},e.prototype._handleSpecialPaintPropertyUpdate=function(t){},e.prototype._handleOverridablePaintPropertyUpdate=function(t,e,r){return !1},e.prototype.isHidden=function(t){return !!(this.minzoom&&t=this.maxzoom)||"none"===this.visibility)},e.prototype.updateTransitions=function(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint);},e.prototype.hasTransition=function(){return this._transitioningPaint.hasTransition()},e.prototype.recalculate=function(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,e);},e.prototype.serialize=function(){var t={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),x(t,(function(t,e){return !(void 0===t||"layout"===e&&!Object.keys(t).length||"paint"===e&&!Object.keys(t).length)}))},e.prototype._validate=function(t,e,r,n,i){return void 0===i&&(i={}),(!i||!1!==i.validate)&&dn(this,t.call(cn,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:zt,style:{glyphs:!0,sprite:!0}}))},e.prototype.is3D=function(){return !1},e.prototype.isTileClipped=function(){return !1},e.prototype.hasOffscreenPass=function(){return !1},e.prototype.resize=function(){},e.prototype.isStateDependent=function(){for(var t in this.paint._values){var e=this.paint.get(t);if(e instanceof Xn&&vr(e.property.specification)&&(("source"===e.value.kind||"composite"===e.value.kind)&&e.value.isStateDependent))return !0}return !1},e}(St),ti={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array},ei=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8;},ri=function(){this.isTransferred=!1,this.capacity=-1,this.resize(0);};function ni(t,e){void 0===e&&(e=1);var r=0,n=0;return {members:t.map((function(t){var i,a=(i=t.type,ti[i].BYTES_PER_ELEMENT),o=r=ii(r,Math.max(e,a)),s=t.components||1;return n=Math.max(n,a),r+=a*s,{name:t.name,type:t.type,components:s,offset:o}})),size:ii(r,Math.max(n,e)),alignment:e}}function ii(t,e){return Math.ceil(t/e)*e}ri.serialize=function(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}},ri.deserialize=function(t){var e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e},ri.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews());},ri.prototype.clear=function(){this.length=0;},ri.prototype.resize=function(t){this.reserve(t),this.length=t;},ri.prototype.reserve=function(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e);}},ri.prototype._refreshViews=function(){throw new Error("_refreshViews() must be implemented by each concrete StructArray layout")};var ai=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t},e}(ri);ai.prototype.bytesPerElement=4,_n("StructArrayLayout2i4",ai);var oi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.int16[a+0]=e,this.int16[a+1]=r,this.int16[a+2]=n,this.int16[a+3]=i,t},e}(ri);oi.prototype.bytesPerElement=8,_n("StructArrayLayout4i8",oi);var si=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(ri);si.prototype.bytesPerElement=12,_n("StructArrayLayout2i4i12",si);var ui=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=4*t,u=8*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.uint8[u+4]=n,this.uint8[u+5]=i,this.uint8[u+6]=a,this.uint8[u+7]=o,t},e}(ri);ui.prototype.bytesPerElement=8,_n("StructArrayLayout2i4ub8",ui);var li=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s){var u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,u){var l=8*t;return this.uint16[l+0]=e,this.uint16[l+1]=r,this.uint16[l+2]=n,this.uint16[l+3]=i,this.uint16[l+4]=a,this.uint16[l+5]=o,this.uint16[l+6]=s,this.uint16[l+7]=u,t},e}(ri);li.prototype.bytesPerElement=16,_n("StructArrayLayout8ui16",li);var pi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s){var u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,u){var l=8*t;return this.int16[l+0]=e,this.int16[l+1]=r,this.int16[l+2]=n,this.int16[l+3]=i,this.uint16[l+4]=a,this.uint16[l+5]=o,this.uint16[l+6]=s,this.uint16[l+7]=u,t},e}(ri);pi.prototype.bytesPerElement=16,_n("StructArrayLayout4i4ui16",pi);var ci=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t},e}(ri);ci.prototype.bytesPerElement=12,_n("StructArrayLayout3f12",ci);var hi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint32[r+0]=e,t},e}(ri);hi.prototype.bytesPerElement=4,_n("StructArrayLayout1ul4",hi);var fi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,u,l,p){var c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,a,o,s,u,l,p)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,u,l,p,c){var h=12*t,f=6*t;return this.int16[h+0]=e,this.int16[h+1]=r,this.int16[h+2]=n,this.int16[h+3]=i,this.int16[h+4]=a,this.int16[h+5]=o,this.uint32[f+3]=s,this.uint16[h+8]=u,this.uint16[h+9]=l,this.int16[h+10]=p,this.int16[h+11]=c,t},e}(ri);fi.prototype.bytesPerElement=24,_n("StructArrayLayout6i1ul2ui2i24",fi);var yi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(ri);yi.prototype.bytesPerElement=12,_n("StructArrayLayout2i2i2i12",yi);var di=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=12*t,o=3*t;return this.uint8[a+0]=e,this.uint8[a+1]=r,this.float32[o+1]=n,this.float32[o+2]=i,t},e}(ri);di.prototype.bytesPerElement=12,_n("StructArrayLayout2ub2f12",di);var mi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m){var v=this.length;return this.resize(v+1),this.emplace(v,t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m,v){var g=24*t,x=12*t,b=48*t;return this.int16[g+0]=e,this.int16[g+1]=r,this.uint16[g+2]=n,this.uint16[g+3]=i,this.uint32[x+2]=a,this.uint32[x+3]=o,this.uint32[x+4]=s,this.uint16[g+10]=u,this.uint16[g+11]=l,this.uint16[g+12]=p,this.float32[x+7]=c,this.float32[x+8]=h,this.uint8[b+36]=f,this.uint8[b+37]=y,this.uint8[b+38]=d,this.uint32[x+10]=m,this.int16[g+22]=v,t},e}(ri);mi.prototype.bytesPerElement=48,_n("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48",mi);var vi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m,v,g,x,b,_){var w=this.length;return this.resize(w+1),this.emplace(w,t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m,v,g,x,b,_)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,u,l,p,c,h,f,y,d,m,v,g,x,b,_,w){var A=26*t,k=13*t;return this.int16[A+0]=e,this.int16[A+1]=r,this.int16[A+2]=n,this.int16[A+3]=i,this.int16[A+4]=a,this.int16[A+5]=o,this.int16[A+6]=s,this.uint16[A+7]=u,this.uint16[A+8]=l,this.uint16[A+9]=p,this.uint16[A+10]=c,this.uint16[A+11]=h,this.uint16[A+12]=f,this.uint16[A+13]=y,this.uint16[A+14]=d,this.uint16[A+15]=m,this.uint16[A+16]=v,this.uint16[A+17]=g,this.uint32[k+9]=x,this.float32[k+10]=b,this.float32[k+11]=_,this.float32[k+12]=w,t},e}(ri);vi.prototype.bytesPerElement=52,_n("StructArrayLayout7i11ui1ul3f52",vi);var gi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.float32[r+0]=e,t},e}(ri);gi.prototype.bytesPerElement=4,_n("StructArrayLayout1f4",gi);var xi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t},e}(ri);xi.prototype.bytesPerElement=6,_n("StructArrayLayout3i6",xi);var bi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=2*t,a=4*t;return this.uint32[i+0]=e,this.uint16[a+2]=r,this.uint16[a+3]=n,t},e}(ri);bi.prototype.bytesPerElement=8,_n("StructArrayLayout1ul2ui8",bi);var _i=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t},e}(ri);_i.prototype.bytesPerElement=6,_n("StructArrayLayout3ui6",_i);var wi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t},e}(ri);wi.prototype.bytesPerElement=4,_n("StructArrayLayout2ui4",wi);var Ai=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint16[r+0]=e,t},e}(ri);Ai.prototype.bytesPerElement=2,_n("StructArrayLayout1ui2",Ai);var ki=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t},e}(ri);ki.prototype.bytesPerElement=8,_n("StructArrayLayout2f8",ki);var Si=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer);},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,t},e}(ri);Si.prototype.bytesPerElement=16,_n("StructArrayLayout4f16",Si);var zi=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorPointX:{configurable:!0},anchorPointY:{configurable:!0},x1:{configurable:!0},y1:{configurable:!0},x2:{configurable:!0},y2:{configurable:!0},featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0},radius:{configurable:!0},signedDistanceFromAnchor:{configurable:!0},anchorPoint:{configurable:!0}};return r.anchorPointX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorPointX.set=function(t){this._structArray.int16[this._pos2+0]=t;},r.anchorPointY.get=function(){return this._structArray.int16[this._pos2+1]},r.anchorPointY.set=function(t){this._structArray.int16[this._pos2+1]=t;},r.x1.get=function(){return this._structArray.int16[this._pos2+2]},r.x1.set=function(t){this._structArray.int16[this._pos2+2]=t;},r.y1.get=function(){return this._structArray.int16[this._pos2+3]},r.y1.set=function(t){this._structArray.int16[this._pos2+3]=t;},r.x2.get=function(){return this._structArray.int16[this._pos2+4]},r.x2.set=function(t){this._structArray.int16[this._pos2+4]=t;},r.y2.get=function(){return this._structArray.int16[this._pos2+5]},r.y2.set=function(t){this._structArray.int16[this._pos2+5]=t;},r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.featureIndex.set=function(t){this._structArray.uint32[this._pos4+3]=t;},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.sourceLayerIndex.set=function(t){this._structArray.uint16[this._pos2+8]=t;},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.bucketIndex.set=function(t){this._structArray.uint16[this._pos2+9]=t;},r.radius.get=function(){return this._structArray.int16[this._pos2+10]},r.radius.set=function(t){this._structArray.int16[this._pos2+10]=t;},r.signedDistanceFromAnchor.get=function(){return this._structArray.int16[this._pos2+11]},r.signedDistanceFromAnchor.set=function(t){this._structArray.int16[this._pos2+11]=t;},r.anchorPoint.get=function(){return new i(this.anchorPointX,this.anchorPointY)},Object.defineProperties(e.prototype,r),e}(ei);zi.prototype.size=24;var Ii=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new zi(this,t)},e}(fi);_n("CollisionBoxArray",Ii);var Ci=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},glyphStartIndex:{configurable:!0},numGlyphs:{configurable:!0},vertexStartIndex:{configurable:!0},lineStartIndex:{configurable:!0},lineLength:{configurable:!0},segment:{configurable:!0},lowerSize:{configurable:!0},upperSize:{configurable:!0},lineOffsetX:{configurable:!0},lineOffsetY:{configurable:!0},writingMode:{configurable:!0},placedOrientation:{configurable:!0},hidden:{configurable:!0},crossTileID:{configurable:!0},associatedIconIndex:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorX.set=function(t){this._structArray.int16[this._pos2+0]=t;},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.anchorY.set=function(t){this._structArray.int16[this._pos2+1]=t;},r.glyphStartIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.glyphStartIndex.set=function(t){this._structArray.uint16[this._pos2+2]=t;},r.numGlyphs.get=function(){return this._structArray.uint16[this._pos2+3]},r.numGlyphs.set=function(t){this._structArray.uint16[this._pos2+3]=t;},r.vertexStartIndex.get=function(){return this._structArray.uint32[this._pos4+2]},r.vertexStartIndex.set=function(t){this._structArray.uint32[this._pos4+2]=t;},r.lineStartIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.lineStartIndex.set=function(t){this._structArray.uint32[this._pos4+3]=t;},r.lineLength.get=function(){return this._structArray.uint32[this._pos4+4]},r.lineLength.set=function(t){this._structArray.uint32[this._pos4+4]=t;},r.segment.get=function(){return this._structArray.uint16[this._pos2+10]},r.segment.set=function(t){this._structArray.uint16[this._pos2+10]=t;},r.lowerSize.get=function(){return this._structArray.uint16[this._pos2+11]},r.lowerSize.set=function(t){this._structArray.uint16[this._pos2+11]=t;},r.upperSize.get=function(){return this._structArray.uint16[this._pos2+12]},r.upperSize.set=function(t){this._structArray.uint16[this._pos2+12]=t;},r.lineOffsetX.get=function(){return this._structArray.float32[this._pos4+7]},r.lineOffsetX.set=function(t){this._structArray.float32[this._pos4+7]=t;},r.lineOffsetY.get=function(){return this._structArray.float32[this._pos4+8]},r.lineOffsetY.set=function(t){this._structArray.float32[this._pos4+8]=t;},r.writingMode.get=function(){return this._structArray.uint8[this._pos1+36]},r.writingMode.set=function(t){this._structArray.uint8[this._pos1+36]=t;},r.placedOrientation.get=function(){return this._structArray.uint8[this._pos1+37]},r.placedOrientation.set=function(t){this._structArray.uint8[this._pos1+37]=t;},r.hidden.get=function(){return this._structArray.uint8[this._pos1+38]},r.hidden.set=function(t){this._structArray.uint8[this._pos1+38]=t;},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+10]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+10]=t;},r.associatedIconIndex.get=function(){return this._structArray.int16[this._pos2+22]},r.associatedIconIndex.set=function(t){this._structArray.int16[this._pos2+22]=t;},Object.defineProperties(e.prototype,r),e}(ei);Ci.prototype.size=48;var Bi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ci(this,t)},e}(mi);_n("PlacedSymbolArray",Bi);var Mi=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},rightJustifiedTextSymbolIndex:{configurable:!0},centerJustifiedTextSymbolIndex:{configurable:!0},leftJustifiedTextSymbolIndex:{configurable:!0},verticalPlacedTextSymbolIndex:{configurable:!0},placedIconSymbolIndex:{configurable:!0},key:{configurable:!0},textBoxStartIndex:{configurable:!0},textBoxEndIndex:{configurable:!0},verticalTextBoxStartIndex:{configurable:!0},verticalTextBoxEndIndex:{configurable:!0},iconBoxStartIndex:{configurable:!0},iconBoxEndIndex:{configurable:!0},featureIndex:{configurable:!0},numHorizontalGlyphVertices:{configurable:!0},numVerticalGlyphVertices:{configurable:!0},numIconVertices:{configurable:!0},crossTileID:{configurable:!0},textBoxScale:{configurable:!0},textOffset0:{configurable:!0},textOffset1:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorX.set=function(t){this._structArray.int16[this._pos2+0]=t;},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.anchorY.set=function(t){this._structArray.int16[this._pos2+1]=t;},r.rightJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+2]},r.rightJustifiedTextSymbolIndex.set=function(t){this._structArray.int16[this._pos2+2]=t;},r.centerJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+3]},r.centerJustifiedTextSymbolIndex.set=function(t){this._structArray.int16[this._pos2+3]=t;},r.leftJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+4]},r.leftJustifiedTextSymbolIndex.set=function(t){this._structArray.int16[this._pos2+4]=t;},r.verticalPlacedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+5]},r.verticalPlacedTextSymbolIndex.set=function(t){this._structArray.int16[this._pos2+5]=t;},r.placedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+6]},r.placedIconSymbolIndex.set=function(t){this._structArray.int16[this._pos2+6]=t;},r.key.get=function(){return this._structArray.uint16[this._pos2+7]},r.key.set=function(t){this._structArray.uint16[this._pos2+7]=t;},r.textBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.textBoxStartIndex.set=function(t){this._structArray.uint16[this._pos2+8]=t;},r.textBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.textBoxEndIndex.set=function(t){this._structArray.uint16[this._pos2+9]=t;},r.verticalTextBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+10]},r.verticalTextBoxStartIndex.set=function(t){this._structArray.uint16[this._pos2+10]=t;},r.verticalTextBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+11]},r.verticalTextBoxEndIndex.set=function(t){this._structArray.uint16[this._pos2+11]=t;},r.iconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+12]},r.iconBoxStartIndex.set=function(t){this._structArray.uint16[this._pos2+12]=t;},r.iconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+13]},r.iconBoxEndIndex.set=function(t){this._structArray.uint16[this._pos2+13]=t;},r.featureIndex.get=function(){return this._structArray.uint16[this._pos2+14]},r.featureIndex.set=function(t){this._structArray.uint16[this._pos2+14]=t;},r.numHorizontalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+15]},r.numHorizontalGlyphVertices.set=function(t){this._structArray.uint16[this._pos2+15]=t;},r.numVerticalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+16]},r.numVerticalGlyphVertices.set=function(t){this._structArray.uint16[this._pos2+16]=t;},r.numIconVertices.get=function(){return this._structArray.uint16[this._pos2+17]},r.numIconVertices.set=function(t){this._structArray.uint16[this._pos2+17]=t;},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+9]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+9]=t;},r.textBoxScale.get=function(){return this._structArray.float32[this._pos4+10]},r.textBoxScale.set=function(t){this._structArray.float32[this._pos4+10]=t;},r.textOffset0.get=function(){return this._structArray.float32[this._pos4+11]},r.textOffset0.set=function(t){this._structArray.float32[this._pos4+11]=t;},r.textOffset1.get=function(){return this._structArray.float32[this._pos4+12]},r.textOffset1.set=function(t){this._structArray.float32[this._pos4+12]=t;},Object.defineProperties(e.prototype,r),e}(ei);Mi.prototype.size=52;var Ei=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Mi(this,t)},e}(vi);_n("SymbolInstanceArray",Ei);var Pi=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={offsetX:{configurable:!0}};return r.offsetX.get=function(){return this._structArray.float32[this._pos4+0]},r.offsetX.set=function(t){this._structArray.float32[this._pos4+0]=t;},Object.defineProperties(e.prototype,r),e}(ei);Pi.prototype.size=4;var Ti=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getoffsetX=function(t){return this.float32[1*t+0]},e.prototype.get=function(t){return new Pi(this,t)},e}(gi);_n("GlyphOffsetArray",Ti);var Vi=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={x:{configurable:!0},y:{configurable:!0},tileUnitDistanceFromAnchor:{configurable:!0}};return r.x.get=function(){return this._structArray.int16[this._pos2+0]},r.x.set=function(t){this._structArray.int16[this._pos2+0]=t;},r.y.get=function(){return this._structArray.int16[this._pos2+1]},r.y.set=function(t){this._structArray.int16[this._pos2+1]=t;},r.tileUnitDistanceFromAnchor.get=function(){return this._structArray.int16[this._pos2+2]},r.tileUnitDistanceFromAnchor.set=function(t){this._structArray.int16[this._pos2+2]=t;},Object.defineProperties(e.prototype,r),e}(ei);Vi.prototype.size=6;var Fi=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getx=function(t){return this.int16[3*t+0]},e.prototype.gety=function(t){return this.int16[3*t+1]},e.prototype.gettileUnitDistanceFromAnchor=function(t){return this.int16[3*t+2]},e.prototype.get=function(t){return new Vi(this,t)},e}(xi);_n("SymbolLineVertexArray",Fi);var Oi=function(t){function e(){t.apply(this,arguments);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0}};return r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+0]},r.featureIndex.set=function(t){this._structArray.uint32[this._pos4+0]=t;},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.sourceLayerIndex.set=function(t){this._structArray.uint16[this._pos2+2]=t;},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+3]},r.bucketIndex.set=function(t){this._structArray.uint16[this._pos2+3]=t;},Object.defineProperties(e.prototype,r),e}(ei);Oi.prototype.size=8;var Li=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Oi(this,t)},e}(bi);_n("FeatureIndexArray",Li);var Di=ni([{name:"a_pos",components:2,type:"Int16"}],4).members,Ui=function(t){void 0===t&&(t=[]),this.segments=t;};function Ri(t,e){return 256*(t=l(Math.floor(t),0,255))+(e=l(Math.floor(e),0,255))}Ui.prototype.prepareSegment=function(t,e,r,n){var i=this.segments[this.segments.length-1];return t>Ui.MAX_VERTEX_ARRAY_LENGTH&&w("Max vertices per segment is "+Ui.MAX_VERTEX_ARRAY_LENGTH+": bucket requested "+t),(!i||i.vertexLength+t>Ui.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i},Ui.prototype.get=function(){return this.segments},Ui.prototype.destroy=function(){for(var t=0,e=this.segments;t>1;this.ids[n]>=t?r=n:e=n+1;}for(var i=[];this.ids[e]===t;){var a=this.positions[3*e],o=this.positions[3*e+1],s=this.positions[3*e+2];i.push({index:a,start:o,end:s}),e++;}return i},ji.serialize=function(t,e){var r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return function t(e,r,n,i){if(n>=i)return;var a=e[n+i>>1];var o=n-1;var s=i+1;for(;;){do{o++;}while(e[o]a);if(o>=s)break;qi(e,o,s),qi(r,3*o,3*s),qi(r,3*o+1,3*s+1),qi(r,3*o+2,3*s+2);}t(e,r,n,s);t(e,r,s+1,i);}(r,n,0,r.length-1),e.push(r.buffer,n.buffer),{ids:r,positions:n}},ji.deserialize=function(t){var e=new ji;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e},_n("FeaturePositionMap",ji);var Ni=function(t,e){this.gl=t.gl,this.location=e;},Ki=function(t){function e(e,r){t.call(this,e,r),this.current=0;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){this.current!==t&&(this.current=t,this.gl.uniform1i(this.location,t));},e}(Ni),Xi=function(t){function e(e,r){t.call(this,e,r),this.current=0;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){this.current!==t&&(this.current=t,this.gl.uniform1f(this.location,t));},e}(Ni),Zi=function(t){function e(e,r){t.call(this,e,r),this.current=[0,0];}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){t[0]===this.current[0]&&t[1]===this.current[1]||(this.current=t,this.gl.uniform2f(this.location,t[0],t[1]));},e}(Ni),Gi=function(t){function e(e,r){t.call(this,e,r),this.current=[0,0,0];}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){t[0]===this.current[0]&&t[1]===this.current[1]&&t[2]===this.current[2]||(this.current=t,this.gl.uniform3f(this.location,t[0],t[1],t[2]));},e}(Ni),Ji=function(t){function e(e,r){t.call(this,e,r),this.current=[0,0,0,0];}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){t[0]===this.current[0]&&t[1]===this.current[1]&&t[2]===this.current[2]&&t[3]===this.current[3]||(this.current=t,this.gl.uniform4f(this.location,t[0],t[1],t[2],t[3]));},e}(Ni),Hi=function(t){function e(e,r){t.call(this,e,r),this.current=Yt.transparent;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){t.r===this.current.r&&t.g===this.current.g&&t.b===this.current.b&&t.a===this.current.a||(this.current=t,this.gl.uniform4f(this.location,t.r,t.g,t.b,t.a));},e}(Ni),Yi=new Float32Array(16),$i=function(t){function e(e,r){t.call(this,e,r),this.current=Yi;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){if(t[12]!==this.current[12]||t[0]!==this.current[0])return this.current=t,void this.gl.uniformMatrix4fv(this.location,!1,t);for(var e=1;e<16;e++)if(t[e]!==this.current[e]){this.current=t,this.gl.uniformMatrix4fv(this.location,!1,t);break}},e}(Ni);function Wi(t){return [Ri(255*t.r,255*t.g),Ri(255*t.b,255*t.a)]}var Qi=function(t,e,r){this.value=t,this.names=e,this.uniformNames=this.names.map((function(t){return "u_"+t})),this.type=r,this.maxValue=-1/0;};Qi.prototype.defines=function(){return this.names.map((function(t){return "#define HAS_UNIFORM_u_"+t}))},Qi.prototype.setConstantPatternPositions=function(){},Qi.prototype.populatePaintArray=function(){},Qi.prototype.updatePaintArray=function(){},Qi.prototype.upload=function(){},Qi.prototype.destroy=function(){},Qi.prototype.setUniforms=function(t,e,r,n){e.set(n.constantOr(this.value));},Qi.prototype.getBinding=function(t,e){return "color"===this.type?new Hi(t,e):new Xi(t,e)},Qi.serialize=function(t){var e=t.value,r=t.names,n=t.type;return {value:An(e),names:r,type:n}},Qi.deserialize=function(t){var e=t.value,r=t.names,n=t.type;return new Qi(kn(e),r,n)};var ta=function(t,e,r){this.value=t,this.names=e,this.uniformNames=this.names.map((function(t){return "u_"+t})),this.type=r,this.maxValue=-1/0,this.patternPositions={patternTo:null,patternFrom:null};};ta.prototype.defines=function(){return this.names.map((function(t){return "#define HAS_UNIFORM_u_"+t}))},ta.prototype.populatePaintArray=function(){},ta.prototype.updatePaintArray=function(){},ta.prototype.upload=function(){},ta.prototype.destroy=function(){},ta.prototype.setConstantPatternPositions=function(t,e){this.patternPositions.patternTo=t.tlbr,this.patternPositions.patternFrom=e.tlbr;},ta.prototype.setUniforms=function(t,e,r,n,i){var a=this.patternPositions;"u_pattern_to"===i&&a.patternTo&&e.set(a.patternTo),"u_pattern_from"===i&&a.patternFrom&&e.set(a.patternFrom);},ta.prototype.getBinding=function(t,e){return new Ji(t,e)};var ea=function(t,e,r,n){this.expression=t,this.names=e,this.type=r,this.uniformNames=this.names.map((function(t){return "a_"+t})),this.maxValue=-1/0,this.paintVertexAttributes=e.map((function(t){return {name:"a_"+t,type:"Float32",components:"color"===r?2:1,offset:0}})),this.paintVertexArray=new n;};ea.prototype.defines=function(){return []},ea.prototype.setConstantPatternPositions=function(){},ea.prototype.populatePaintArray=function(t,e,r,n){var i=this.paintVertexArray,a=i.length;i.reserve(t);var o=this.expression.evaluate(new Dn(0),e,{},[],n);if("color"===this.type)for(var s=Wi(o),u=a;upa.max||o.ypa.max)&&(w("Geometry exceeds allowed extent, reduce your vector tile buffer size"),o.x=l(o.x,pa.min,pa.max),o.y=l(o.y,pa.min,pa.max));}return r}function ha(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2);}var fa=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ai,this.indexArray=new _i,this.segments=new Ui,this.programConfigurations=new aa(Di,t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}));};function ya(t,e){for(var r=0;r1){if(ga(t,e))return !0;for(var n=0;n1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function wa(t,e){for(var r,n,i,a=!1,o=0;oe.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a);return a}function Aa(t,e){for(var r=!1,n=0,i=t.length-1;ne.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r);}return r}function ka(t,e,r){var n=r[0],i=r[2];if(t.xi.x&&e.x>i.x||t.yi.y&&e.y>i.y)return !1;var a=A(t,e,r[0]);return a!==A(t,e,r[1])||a!==A(t,e,r[2])||a!==A(t,e,r[3])}function Sa(t,e,r){var n=e.paint.get(t).value;return "constant"===n.kind?n.value:r.programConfigurations.get(e.id).binders[t].maxValue}function za(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Ia(t,e,r,n,a){if(!e[0]&&!e[1])return t;var o=i.convert(e)._mult(a);"viewport"===r&&o._rotate(-n);for(var s=[],u=0;u=ua||l<0||l>=ua)){var p=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),c=p.vertexLength;ha(this.layoutVertexArray,u,l,-1,-1),ha(this.layoutVertexArray,u,l,1,-1),ha(this.layoutVertexArray,u,l,1,1),ha(this.layoutVertexArray,u,l,-1,1),this.indexArray.emplaceBack(c,c+1,c+2),this.indexArray.emplaceBack(c,c+3,c+2),p.vertexLength+=4,p.primitiveLength+=2;}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{});},_n("CircleBucket",fa,{omit:["layers"]});var Ca=new Wn({"circle-sort-key":new Jn(zt.layout_circle["circle-sort-key"])}),Ba={paint:new Wn({"circle-radius":new Jn(zt.paint_circle["circle-radius"]),"circle-color":new Jn(zt.paint_circle["circle-color"]),"circle-blur":new Jn(zt.paint_circle["circle-blur"]),"circle-opacity":new Jn(zt.paint_circle["circle-opacity"]),"circle-translate":new Gn(zt.paint_circle["circle-translate"]),"circle-translate-anchor":new Gn(zt.paint_circle["circle-translate-anchor"]),"circle-pitch-scale":new Gn(zt.paint_circle["circle-pitch-scale"]),"circle-pitch-alignment":new Gn(zt.paint_circle["circle-pitch-alignment"]),"circle-stroke-width":new Jn(zt.paint_circle["circle-stroke-width"]),"circle-stroke-color":new Jn(zt.paint_circle["circle-stroke-color"]),"circle-stroke-opacity":new Jn(zt.paint_circle["circle-stroke-opacity"])}),layout:Ca},Ma="undefined"!=typeof Float32Array?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=arguments,e=0,r=arguments.length;r--;)e+=t[r]*t[r];return Math.sqrt(e)});var Ea,Pa;Ea=new Ma(3),Ma!=Float32Array&&(Ea[0]=0,Ea[1]=0,Ea[2]=0),Pa=Ea;function Ta(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}!function(){var t=function(){var t=new Ma(4);return Ma!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}();}();var Va=function(t){function e(e){t.call(this,e,Ba);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new fa(t)},e.prototype.queryRadius=function(t){var e=t;return Sa("circle-radius",this,e)+Sa("circle-stroke-width",this,e)+za(this.paint.get("circle-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a,o,s){for(var u=Ia(t,this.paint.get("circle-translate"),this.paint.get("circle-translate-anchor"),a.angle,o),l=this.paint.get("circle-radius").evaluate(e,r)+this.paint.get("circle-stroke-width").evaluate(e,r),p="map"===this.paint.get("circle-pitch-alignment"),c=p?u:function(t,e){return t.map((function(t){return Fa(t,e)}))}(u,s),h=p?l*o:l,f=0,y=n;ft.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError("out of range source coordinates for image copy");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError("out of range destination coordinates for image copy");for(var o=t.data,s=e.data,u=0;u80*r){n=a=t[0],i=o=t[1];for(var y=r;ya&&(a=s),u>o&&(o=u);l=0!==(l=Math.max(a-n,o-i))?1/l:0;}return Qa(h,f,r,n,i,l),f}function $a(t,e,r,n,i){var a,o;if(i===wo(t,e,r,n)>0)for(a=e;a=e;a-=n)o=xo(a,t[a],t[a+1],o);return o&&ho(o,o.next)&&(bo(o),o=o.next),o}function Wa(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!ho(n,n.next)&&0!==co(n.prev,n,n.next))n=n.next;else{if(bo(n),(n=e=n.prev)===n.next)break;r=!0;}}while(r||n!==e);return e}function Qa(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=so(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,u,l=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||u>0&&n;)0!==s&&(0===u||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,u--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n;}a.nextZ=null,l*=2;}while(o>1)}(i);}(t,n,i,a);for(var s,u,l=t;t.prev!==t.next;)if(s=t.prev,u=t.next,a?eo(t,n,i,a):to(t))e.push(s.i/r),e.push(t.i/r),e.push(u.i/r),bo(t),t=u.next,l=u.next;else if((t=u)===l){o?1===o?Qa(t=ro(Wa(t),e,r),e,r,n,i,a,2):2===o&&no(t,e,r,n,i,a):Qa(Wa(t),e,r,n,i,a,1);break}}}function to(t){var e=t.prev,r=t,n=t.next;if(co(e,r,n)>=0)return !1;for(var i=t.next.next;i!==t.prev;){if(lo(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&co(i.prev,i,i.next)>=0)return !1;i=i.next;}return !0}function eo(t,e,r,n){var i=t.prev,a=t,o=t.next;if(co(i,a,o)>=0)return !1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,p=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,c=so(s,u,e,r,n),h=so(l,p,e,r,n),f=t.prevZ,y=t.nextZ;f&&f.z>=c&&y&&y.z<=h;){if(f!==t.prev&&f!==t.next&&lo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&co(f.prev,f,f.next)>=0)return !1;if(f=f.prevZ,y!==t.prev&&y!==t.next&&lo(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&co(y.prev,y,y.next)>=0)return !1;y=y.nextZ;}for(;f&&f.z>=c;){if(f!==t.prev&&f!==t.next&&lo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&co(f.prev,f,f.next)>=0)return !1;f=f.prevZ;}for(;y&&y.z<=h;){if(y!==t.prev&&y!==t.next&&lo(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&co(y.prev,y,y.next)>=0)return !1;y=y.nextZ;}return !0}function ro(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!ho(i,a)&&fo(i,n,n.next,a)&&vo(i,a)&&vo(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),bo(n),bo(n.next),n=t=a),n=n.next;}while(n!==t);return Wa(n)}function no(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&po(o,s)){var u=go(o,s);return o=Wa(o,o.next),u=Wa(u,u.next),Qa(o,e,r,n,i,a),void Qa(u,e,r,n,i,a)}s=s.next;}o=o.next;}while(o!==t)}function io(t,e){return t.x-e.x}function ao(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=p&&i!==n.x&&lo(ar.x||n.x===r.x&&oo(r,n)))&&(r=n,h=u)),n=n.next;}while(n!==l);return r}(t,e)){var r=go(e,t);Wa(r,r.next);}}function oo(t,e){return co(t.prev,t,e.prev)<0&&co(e.next,t,t.next)<0}function so(t,e,r,n,i){return (t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function uo(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function po(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&fo(r,r.next,t,e))return !0;r=r.next;}while(r!==t);return !1}(t,e)&&(vo(t,e)&&vo(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;}while(r!==t);return n}(t,e)&&(co(t.prev,t,e.prev)||co(t,e.prev,e))||ho(t,e)&&co(t.prev,t,t.next)>0&&co(e.prev,e,e.next)>0)}function co(t,e,r){return (e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function ho(t,e){return t.x===e.x&&t.y===e.y}function fo(t,e,r,n){var i=mo(co(t,e,r)),a=mo(co(t,e,n)),o=mo(co(r,n,t)),s=mo(co(r,n,e));return i!==a&&o!==s||(!(0!==i||!yo(t,r,e))||(!(0!==a||!yo(t,n,e))||(!(0!==o||!yo(r,t,n))||!(0!==s||!yo(r,e,n)))))}function yo(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function mo(t){return t>0?1:t<0?-1:0}function vo(t,e){return co(t.prev,t,t.next)<0?co(t,e,t.next)>=0&&co(t,t.prev,e)>=0:co(t,e,t.prev)<0||co(t,t.next,e)<0}function go(t,e){var r=new _o(t.i,t.x,t.y),n=new _o(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function xo(t,e,r,n){var i=new _o(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function bo(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ);}function _o(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1;}function wo(t,e,r,n){for(var i=0,a=e,o=r-n;an;){if(i-n>600){var o=i-n+1,s=r-n+1,u=Math.log(o),l=.5*Math.exp(2*u/3),p=.5*Math.sqrt(u*l*(o-l)/o)*(s-o/2<0?-1:1),c=Math.max(n,Math.floor(r-s*l/o+p)),h=Math.min(i,Math.floor(r+(o-s)*l/o+p));t(e,r,c,h,a);}var f=e[r],y=n,d=i;for(ko(e,n,r),a(e[i],f)>0&&ko(e,n,i);y0;)d--;}0===a(e[n],f)?ko(e,n,d):ko(e,++d,i),d<=r&&(n=d+1),r<=d&&(i=d-1);}}(t,e,r||0,n||t.length-1,i||So);}function ko(t,e,r){var n=t[e];t[e]=t[r],t[r]=n;}function So(t,e){return te?1:0}function zo(t,e){var r=t.length;if(r<=1)return [t];for(var n,i,a=[],o=0;o1)for(var u=0;u0&&(n+=t[i-1].length,r.holes.push(n));}return r},Ja.default=Ha;var Mo=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new ai,this.indexArray=new _i,this.indexArray2=new wi,this.programConfigurations=new aa(Ga,t.layers,t.zoom),this.segments=new Ui,this.segments2=new Ui,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}));};Mo.prototype.populate=function(t,e){this.hasPattern=Co("fill",this.layers,e);for(var r=this.layers[0].layout.get("fill-sort-key"),n=[],i=0,a=t;i>3;}if(a--,1===n||2===n)o+=t.readSVarint(),s+=t.readSVarint(),1===n&&(e&&u.push(e),e=[]),e.push(new i(o,s));else{if(7!==n)throw new Error("unknown command "+n);e&&e.push(e[0].clone());}}return e&&u.push(e),u},Oo.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,u=1/0,l=-1/0;t.pos>3;}if(n--,1===r||2===r)(i+=t.readSVarint())s&&(s=i),(a+=t.readSVarint())l&&(l=a);else if(7!==r)throw new Error("unknown command "+r)}return [o,u,s,l]},Oo.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,u=this.loadGeometry(),l=Oo.types[this.type];function p(t){for(var e=0;e>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null;}return e}(r));}function qo(t,e,r){if(3===t){var n=new Uo(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n);}}Ro.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Fo(this._pbf,e,this.extent,this._keys,this._values)};var No={VectorTile:function(t,e){this.layers=t.readFields(qo,{},e);},VectorTileFeature:Fo,VectorTileLayer:Uo},Ko=No.VectorTileFeature.types,Xo=Math.pow(2,13);function Zo(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*Xo)+o,i*Xo*2,a*Xo*2,Math.round(s));}var Go=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new si,this.indexArray=new _i,this.programConfigurations=new aa(Vo,t.layers,t.zoom),this.segments=new Ui,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}));};function Jo(t,e){return t.x===e.x&&(t.x<0||t.x>ua)||t.y===e.y&&(t.y<0||t.y>ua)}function Ho(t){return t.every((function(t){return t.x<0}))||t.every((function(t){return t.x>ua}))||t.every((function(t){return t.y<0}))||t.every((function(t){return t.y>ua}))}Go.prototype.populate=function(t,e){this.features=[],this.hasPattern=Co("fill-extrusion",this.layers,e);for(var r=0,n=t;r=1){var v=f[d-1];if(!Jo(m,v)){p.vertexLength+4>Ui.MAX_VERTEX_ARRAY_LENGTH&&(p=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));var g=m.sub(v)._perp()._unit(),x=v.dist(m);y+x>32768&&(y=0),Zo(this.layoutVertexArray,m.x,m.y,g.x,g.y,0,0,y),Zo(this.layoutVertexArray,m.x,m.y,g.x,g.y,0,1,y),y+=x,Zo(this.layoutVertexArray,v.x,v.y,g.x,g.y,0,0,y),Zo(this.layoutVertexArray,v.x,v.y,g.x,g.y,0,1,y);var b=p.vertexLength;this.indexArray.emplaceBack(b,b+2,b+1),this.indexArray.emplaceBack(b+1,b+2,b+3),p.vertexLength+=4,p.primitiveLength+=2;}}}}if(p.vertexLength+s>Ui.MAX_VERTEX_ARRAY_LENGTH&&(p=this.segments.prepareSegment(s,this.layoutVertexArray,this.indexArray)),"Polygon"===Ko[t.type]){for(var _=[],w=[],A=p.vertexLength,k=0,S=o;k=2&&t[p-1].equals(t[p-2]);)p--;for(var c=0;c0;if(S&&x>c){var I=h.dist(d);if(I>2*f){var C=h.sub(h.sub(d)._mult(f/I)._round());this.updateDistance(d,C),this.addCurrentVertex(C,v,0,0,y),d=C;}}var B=d&&m,M=B?r:l?"butt":n;if(B&&"round"===M&&(Ai&&(M="bevel"),"bevel"===M&&(A>2&&(M="flipbevel"),A100)b=g.mult(-1);else{var E=A*v.add(g).mag()/v.sub(g).mag();b._perp()._mult(E*(z?-1:1));}this.addCurrentVertex(h,b,0,0,y),this.addCurrentVertex(h,b.mult(-1),0,0,y);}else if("bevel"===M||"fakeround"===M){var P=-Math.sqrt(A*A-1),T=z?P:0,V=z?0:P;if(d&&this.addCurrentVertex(h,v,T,V,y),"fakeround"===M)for(var F=Math.round(180*k/Math.PI/20),O=1;O2*f){var q=h.add(m.sub(h)._mult(f/j)._round());this.updateDistance(h,q),this.addCurrentVertex(q,g,0,0,y),h=q;}}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,e,o,s);}},is.prototype.addCurrentVertex=function(t,e,r,n,i,a){void 0===a&&(a=!1);var o=e.x+e.y*r,s=e.y-e.x*r,u=-e.x+e.y*n,l=-e.y-e.x*n;this.addHalfVertex(t,o,s,a,!1,r,i),this.addHalfVertex(t,u,l,a,!0,-n,i),this.distance>ns/2&&0===this.totalDistance&&(this.distance=0,this.addCurrentVertex(t,e,r,n,i,a));},is.prototype.addHalfVertex=function(t,e,r,n,i,a,o){var s=t.x,u=t.y,l=.5*this.scaledDistance;this.layoutVertexArray.emplaceBack((s<<1)+(n?1:0),(u<<1)+(i?1:0),Math.round(63*e)+128,Math.round(63*r)+128,1+(0===a?0:a<0?-1:1)|(63&l)<<2,l>>6);var p=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,p),o.primitiveLength++),i?this.e2=p:this.e1=p;},is.prototype.updateDistance=function(t,e){this.distance+=t.dist(e),this.scaledDistance=this.totalDistance>0?(this.clipStart+(this.clipEnd-this.clipStart)*this.distance/this.totalDistance)*(ns-1):this.distance;},_n("LineBucket",is,{omit:["layers","patternFeatures"]});var as=new Wn({"line-cap":new Gn(zt.layout_line["line-cap"]),"line-join":new Jn(zt.layout_line["line-join"]),"line-miter-limit":new Gn(zt.layout_line["line-miter-limit"]),"line-round-limit":new Gn(zt.layout_line["line-round-limit"]),"line-sort-key":new Jn(zt.layout_line["line-sort-key"])}),os={paint:new Wn({"line-opacity":new Jn(zt.paint_line["line-opacity"]),"line-color":new Jn(zt.paint_line["line-color"]),"line-translate":new Gn(zt.paint_line["line-translate"]),"line-translate-anchor":new Gn(zt.paint_line["line-translate-anchor"]),"line-width":new Jn(zt.paint_line["line-width"]),"line-gap-width":new Jn(zt.paint_line["line-gap-width"]),"line-offset":new Jn(zt.paint_line["line-offset"]),"line-blur":new Jn(zt.paint_line["line-blur"]),"line-dasharray":new Yn(zt.paint_line["line-dasharray"]),"line-pattern":new Hn(zt.paint_line["line-pattern"]),"line-gradient":new $n(zt.paint_line["line-gradient"])}),layout:as},ss=new(function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.possiblyEvaluate=function(e,r){return r=new Dn(Math.floor(r.zoom),{now:r.now,fadeDuration:r.fadeDuration,zoomHistory:r.zoomHistory,transition:r.transition}),t.prototype.possiblyEvaluate.call(this,e,r)},e.prototype.evaluate=function(e,r,n,i){return r=c({},r,{zoom:Math.floor(r.zoom)}),t.prototype.evaluate.call(this,e,r,n,i)},e}(Jn))(os.paint.properties["line-width"].specification);ss.useIntegerZoom=!0;var us=function(t){function e(e){t.call(this,e,os);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._handleSpecialPaintPropertyUpdate=function(t){"line-gradient"===t&&this._updateGradient();},e.prototype._updateGradient=function(){var t=this._transitionablePaint._values["line-gradient"].value.expression;this.gradient=Na(t,"lineProgress"),this.gradientTexture=null;},e.prototype.recalculate=function(e,r){t.prototype.recalculate.call(this,e,r),this.paint._values["line-floorwidth"]=ss.possiblyEvaluate(this._transitioningPaint._values["line-width"].value,e);},e.prototype.createBucket=function(t){return new is(t)},e.prototype.queryRadius=function(t){var e=t,r=ls(Sa("line-width",this,e),Sa("line-gap-width",this,e)),n=Sa("line-offset",this,e);return r/2+Math.abs(n)+za(this.paint.get("line-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,a,o,s){var u=Ia(t,this.paint.get("line-translate"),this.paint.get("line-translate-anchor"),o.angle,s),l=s/2*ls(this.paint.get("line-width").evaluate(e,r),this.paint.get("line-gap-width").evaluate(e,r)),p=this.paint.get("line-offset").evaluate(e,r);return p&&(n=function(t,e){for(var r=[],n=new i(0,0),a=0;a=3)for(var a=0;a0?e+2*t:t}var ps=ni([{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"}]),cs=ni([{name:"a_projected_pos",components:3,type:"Float32"}],4),hs=(ni([{name:"a_fade_opacity",components:1,type:"Uint32"}],4),ni([{name:"a_placed",components:2,type:"Uint8"},{name:"a_shift",components:2,type:"Float32"}])),fs=(ni([{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"radius"},{type:"Int16",name:"signedDistanceFromAnchor"}]),ni([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4)),ys=ni([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4);ni([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Uint16",name:"glyphStartIndex"},{type:"Uint16",name:"numGlyphs"},{type:"Uint32",name:"vertexStartIndex"},{type:"Uint32",name:"lineStartIndex"},{type:"Uint32",name:"lineLength"},{type:"Uint16",name:"segment"},{type:"Uint16",name:"lowerSize"},{type:"Uint16",name:"upperSize"},{type:"Float32",name:"lineOffsetX"},{type:"Float32",name:"lineOffsetY"},{type:"Uint8",name:"writingMode"},{type:"Uint8",name:"placedOrientation"},{type:"Uint8",name:"hidden"},{type:"Uint32",name:"crossTileID"},{type:"Int16",name:"associatedIconIndex"}]),ni([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Int16",name:"rightJustifiedTextSymbolIndex"},{type:"Int16",name:"centerJustifiedTextSymbolIndex"},{type:"Int16",name:"leftJustifiedTextSymbolIndex"},{type:"Int16",name:"verticalPlacedTextSymbolIndex"},{type:"Int16",name:"placedIconSymbolIndex"},{type:"Uint16",name:"key"},{type:"Uint16",name:"textBoxStartIndex"},{type:"Uint16",name:"textBoxEndIndex"},{type:"Uint16",name:"verticalTextBoxStartIndex"},{type:"Uint16",name:"verticalTextBoxEndIndex"},{type:"Uint16",name:"iconBoxStartIndex"},{type:"Uint16",name:"iconBoxEndIndex"},{type:"Uint16",name:"featureIndex"},{type:"Uint16",name:"numHorizontalGlyphVertices"},{type:"Uint16",name:"numVerticalGlyphVertices"},{type:"Uint16",name:"numIconVertices"},{type:"Uint32",name:"crossTileID"},{type:"Float32",name:"textBoxScale"},{type:"Float32",components:2,name:"textOffset"}]),ni([{type:"Float32",name:"offsetX"}]),ni([{type:"Int16",name:"x"},{type:"Int16",name:"y"},{type:"Int16",name:"tileUnitDistanceFromAnchor"}]);function ds(t,e,r){return t.sections.forEach((function(t){t.text=function(t,e,r){var n=e.layout.get("text-transform").evaluate(r,{});return "uppercase"===n?t=t.toLocaleUpperCase():"lowercase"===n&&(t=t.toLocaleLowerCase()),Ln.applyArabicShaping&&(t=Ln.applyArabicShaping(t)),t}(t.text,e,r);})),t}var ms={"!":"︕","#":"#",$:"$","%":"%","&":"&","(":"︵",")":"︶","*":"*","+":"+",",":"︐","-":"︲",".":"・","/":"/",":":"︓",";":"︔","<":"︿","=":"=",">":"﹀","?":"︖","@":"@","[":"﹇","\\":"\","]":"﹈","^":"^",_:"︳","`":"`","{":"︷","|":"―","}":"︸","~":"~","¢":"¢","£":"£","¥":"¥","¦":"¦","¬":"¬","¯":" ̄","–":"︲","—":"︱","‘":"﹃","’":"﹄","“":"﹁","”":"﹂","…":"︙","‧":"・","₩":"₩","、":"︑","。":"︒","〈":"︿","〉":"﹀","《":"︽","》":"︾","「":"﹁","」":"﹂","『":"﹃","』":"﹄","【":"︻","】":"︼","〔":"︹","〕":"︺","〖":"︗","〗":"︘","!":"︕","(":"︵",")":"︶",",":"︐","-":"︲",".":"・",":":"︓",";":"︔","<":"︿",">":"﹀","?":"︖","[":"﹇","]":"﹈","_":"︳","{":"︷","|":"―","}":"︸","⦅":"︵","⦆":"︶","。":"︒","「":"﹁","」":"﹂"};var vs=24,gs={horizontal:1,vertical:2,horizontalOnly:3},xs=function(){this.text="",this.sectionIndex=[],this.sections=[];};function bs(t,e,r,n,i,a,o,s,u,l,p,c){var h,f=xs.fromFeature(t,r);l===gs.vertical&&f.verticalizePunctuation();var y=Ln.processBidirectionalText,d=Ln.processStyledBidirectionalText;if(y&&1===f.sections.length){h=[];for(var m=0,v=y(f.toString(),zs(f,s,n,e,c));m=0&&n>=t&&_s[this.text.charCodeAt(n)];n--)r--;this.text=this.text.substring(t,r),this.sectionIndex=this.sectionIndex.slice(t,r);},xs.prototype.substring=function(t,e){var r=new xs;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r},xs.prototype.toString=function(){return this.text},xs.prototype.getMaxScale=function(){var t=this;return this.sectionIndex.reduce((function(e,r){return Math.max(e,t.sections[r].scale)}),0)};var _s={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},ws={};function As(t,e,r,n){var i=Math.pow(t-e,2);return n?t=0,l=0,p=0;p0)&&("constant"!==i.value.kind||i.value.value.length>0),u="constant"!==o.value.kind||!!o.value.value||Object.keys(o.parameters).length>0,l=n.get("symbol-sort-key");if(this.features=[],s||u){for(var p=e.iconDependencies,c=e.glyphDependencies,h=e.availableImages,f=new Dn(this.zoom),y=0,d=t;y=0;for(var C=0,B=b.sections;C=0;s--)a[s]={x:e[s].x,y:e[s].y,tileUnitDistanceFromAnchor:i},s>0&&(i+=e[s-1].dist(e[s]));for(var u=0;u0;this.addCollisionDebugVertices(o,s,u,l,p?n?this.textCollisionCircle:this.iconCollisionCircle:n?this.textCollisionBox:this.iconCollisionBox,a.anchorPoint,r,p);}},js.prototype.generateCollisionDebugBuffers=function(){for(var t=0;t0},js.prototype.hasIconData=function(){return this.icon.segments.get().length>0},js.prototype.hasTextCollisionBoxData=function(){return this.textCollisionBox.segments.get().length>0},js.prototype.hasIconCollisionBoxData=function(){return this.iconCollisionBox.segments.get().length>0},js.prototype.hasTextCollisionCircleData=function(){return this.textCollisionCircle.segments.get().length>0},js.prototype.hasIconCollisionCircleData=function(){return this.iconCollisionCircle.segments.get().length>0},js.prototype.addIndicesForPlacedTextSymbol=function(t){for(var e=this.text.placedSymbolArray.get(t),r=e.vertexStartIndex+4*e.numGlyphs,n=e.vertexStartIndex;n1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(var r=0,n=this.symbolInstanceIndexes;r=0&&n.indexOf(t)===r&&e.addIndicesForPlacedTextSymbol(t);})),a.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedTextSymbol(a.verticalPlacedTextSymbolIndex);var o=this.icon.placedSymbolArray.get(i);if(o.numGlyphs){var s=o.vertexStartIndex;this.icon.indexArray.emplaceBack(s,s+1,s+2),this.icon.indexArray.emplaceBack(s+1,s+2,s+3);}}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray);}},_n("SymbolBucket",js,{omit:["layers","collisionBoxArray","features","compareText"]}),js.MAX_GLYPHS=65535,js.addDynamicAttributes=Ds;var qs=new Wn({"symbol-placement":new Gn(zt.layout_symbol["symbol-placement"]),"symbol-spacing":new Gn(zt.layout_symbol["symbol-spacing"]),"symbol-avoid-edges":new Gn(zt.layout_symbol["symbol-avoid-edges"]),"symbol-sort-key":new Jn(zt.layout_symbol["symbol-sort-key"]),"symbol-z-order":new Gn(zt.layout_symbol["symbol-z-order"]),"icon-allow-overlap":new Gn(zt.layout_symbol["icon-allow-overlap"]),"icon-ignore-placement":new Gn(zt.layout_symbol["icon-ignore-placement"]),"icon-optional":new Gn(zt.layout_symbol["icon-optional"]),"icon-rotation-alignment":new Gn(zt.layout_symbol["icon-rotation-alignment"]),"icon-size":new Jn(zt.layout_symbol["icon-size"]),"icon-text-fit":new Gn(zt.layout_symbol["icon-text-fit"]),"icon-text-fit-padding":new Gn(zt.layout_symbol["icon-text-fit-padding"]),"icon-image":new Jn(zt.layout_symbol["icon-image"]),"icon-rotate":new Jn(zt.layout_symbol["icon-rotate"]),"icon-padding":new Gn(zt.layout_symbol["icon-padding"]),"icon-keep-upright":new Gn(zt.layout_symbol["icon-keep-upright"]),"icon-offset":new Jn(zt.layout_symbol["icon-offset"]),"icon-anchor":new Jn(zt.layout_symbol["icon-anchor"]),"icon-pitch-alignment":new Gn(zt.layout_symbol["icon-pitch-alignment"]),"text-pitch-alignment":new Gn(zt.layout_symbol["text-pitch-alignment"]),"text-rotation-alignment":new Gn(zt.layout_symbol["text-rotation-alignment"]),"text-field":new Jn(zt.layout_symbol["text-field"]),"text-font":new Jn(zt.layout_symbol["text-font"]),"text-size":new Jn(zt.layout_symbol["text-size"]),"text-max-width":new Jn(zt.layout_symbol["text-max-width"]),"text-line-height":new Gn(zt.layout_symbol["text-line-height"]),"text-letter-spacing":new Jn(zt.layout_symbol["text-letter-spacing"]),"text-justify":new Jn(zt.layout_symbol["text-justify"]),"text-radial-offset":new Jn(zt.layout_symbol["text-radial-offset"]),"text-variable-anchor":new Gn(zt.layout_symbol["text-variable-anchor"]),"text-anchor":new Jn(zt.layout_symbol["text-anchor"]),"text-max-angle":new Gn(zt.layout_symbol["text-max-angle"]),"text-writing-mode":new Gn(zt.layout_symbol["text-writing-mode"]),"text-rotate":new Jn(zt.layout_symbol["text-rotate"]),"text-padding":new Gn(zt.layout_symbol["text-padding"]),"text-keep-upright":new Gn(zt.layout_symbol["text-keep-upright"]),"text-transform":new Jn(zt.layout_symbol["text-transform"]),"text-offset":new Jn(zt.layout_symbol["text-offset"]),"text-allow-overlap":new Gn(zt.layout_symbol["text-allow-overlap"]),"text-ignore-placement":new Gn(zt.layout_symbol["text-ignore-placement"]),"text-optional":new Gn(zt.layout_symbol["text-optional"])}),Ns={paint:new Wn({"icon-opacity":new Jn(zt.paint_symbol["icon-opacity"]),"icon-color":new Jn(zt.paint_symbol["icon-color"]),"icon-halo-color":new Jn(zt.paint_symbol["icon-halo-color"]),"icon-halo-width":new Jn(zt.paint_symbol["icon-halo-width"]),"icon-halo-blur":new Jn(zt.paint_symbol["icon-halo-blur"]),"icon-translate":new Gn(zt.paint_symbol["icon-translate"]),"icon-translate-anchor":new Gn(zt.paint_symbol["icon-translate-anchor"]),"text-opacity":new Jn(zt.paint_symbol["text-opacity"]),"text-color":new Jn(zt.paint_symbol["text-color"],{runtimeType:Ut,getOverride:function(t){return t.textColor},hasOverride:function(t){return !!t.textColor}}),"text-halo-color":new Jn(zt.paint_symbol["text-halo-color"]),"text-halo-width":new Jn(zt.paint_symbol["text-halo-width"]),"text-halo-blur":new Jn(zt.paint_symbol["text-halo-blur"]),"text-translate":new Gn(zt.paint_symbol["text-translate"]),"text-translate-anchor":new Gn(zt.paint_symbol["text-translate-anchor"])}),layout:qs},Ks=function(t){this.type=t.property.overrides?t.property.overrides.runtimeType:Ft,this.defaultValue=t;};Ks.prototype.evaluate=function(t){if(t.formattedSection){var e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default},Ks.prototype.eachChild=function(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression);},Ks.prototype.possibleOutputs=function(){return [void 0]},Ks.prototype.serialize=function(){return null},_n("FormatSectionOverride",Ks,{omit:["defaultValue"]});var Xs=function(t){function e(e){t.call(this,e,Ns);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(e,r){if(t.prototype.recalculate.call(this,e,r),"auto"===this.layout.get("icon-rotation-alignment")&&("point"!==this.layout.get("symbol-placement")?this.layout._values["icon-rotation-alignment"]="map":this.layout._values["icon-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-rotation-alignment")&&("point"!==this.layout.get("symbol-placement")?this.layout._values["text-rotation-alignment"]="map":this.layout._values["text-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-pitch-alignment")&&(this.layout._values["text-pitch-alignment"]=this.layout.get("text-rotation-alignment")),"auto"===this.layout.get("icon-pitch-alignment")&&(this.layout._values["icon-pitch-alignment"]=this.layout.get("icon-rotation-alignment")),"point"===this.layout.get("symbol-placement")){var n=this.layout.get("text-writing-mode");if(n){for(var i=[],a=0,o=n;a=0;h--){var f=o[h];if(!(c.w>f.w||c.h>f.h)){if(c.x=f.x,c.y=f.y,u=Math.max(u,c.y+c.h),s=Math.max(s,c.x+c.w),c.w===f.w&&c.h===f.h){var y=o.pop();h>1,p=-7,c=r?i-1:0,h=r?-1:1,f=t[e+c];for(c+=h,a=f&(1<<-p)-1,f>>=-p,p+=s;p>0;a=256*a+t[e+c],c+=h,p-=8);for(o=a&(1<<-p)-1,a>>=-p,p+=n;p>0;o=256*o+t[e+c],c+=h,p-=8);if(0===a)a=1-l;else{if(a===u)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,n),a-=l;}return (f?-1:1)*o*Math.pow(2,a-n)},uu=function(t,e,r,n,i,a){var o,s,u,l=8*a-i-1,p=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:a-1,y=n?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=p):(o=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-o))<1&&(o--,u*=2),(e+=o+c>=1?h/u:h*Math.pow(2,1-c))*u>=2&&(o++,u/=2),o+c>=p?(s=0,o=p):o+c>=1?(s=(e*u-1)*Math.pow(2,i),o+=c):(s=e*Math.pow(2,c-1)*Math.pow(2,i),o=0));i>=8;t[r+f]=255&s,f+=y,s/=256,i-=8);for(o=o<0;t[r+f]=255&o,f+=y,o/=256,l-=8);t[r+f-y]|=128*d;},lu=pu;function pu(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length;}pu.Varint=0,pu.Fixed64=1,pu.Bytes=2,pu.Fixed32=5;function cu(t){return t.type===pu.Bytes?t.readVarint()+t.pos:t.pos+1}function hu(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function fu(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i];}function yu(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24;}function Su(t,e){return (t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}pu.prototype={destroy:function(){this.buf=null;},readFields:function(t,e,r){for(r=r||this.length;this.pos>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n);}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=Au(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Su(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=Au(this.buf,this.pos)+4294967296*Au(this.buf,this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=Au(this.buf,this.pos)+4294967296*Su(this.buf,this.pos+4);return this.pos+=8,t},readFloat:function(){var t=su(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=su(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(i=a[r.pos++],n=(112&i)>>4,i<128)return hu(t,n,e);if(i=a[r.pos++],n|=(127&i)<<3,i<128)return hu(t,n,e);if(i=a[r.pos++],n|=(127&i)<<10,i<128)return hu(t,n,e);if(i=a[r.pos++],n|=(127&i)<<17,i<128)return hu(t,n,e);if(i=a[r.pos++],n|=(127&i)<<24,i<128)return hu(t,n,e);if(i=a[r.pos++],n|=(1&i)<<31,i<128)return hu(t,n,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=function(t,e,r){var n="",i=e;for(;i239?4:u>223?3:u>191?2:1;if(i+p>r)break;1===p?u<128&&(l=u):2===p?128==(192&(a=t[i+1]))&&(l=(31&u)<<6|63&a)<=127&&(l=null):3===p?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((l=(15&u)<<12|(63&a)<<6|63&o)<=2047||l>=55296&&l<=57343)&&(l=null)):4===p&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((l=(15&u)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||l>=1114112)&&(l=null)),null===l?(l=65533,p=1):l>65535&&(l-=65536,n+=String.fromCharCode(l>>>10&1023|55296),l=56320|1023&l),n+=String.fromCharCode(l),i+=p;}return n}(this.buf,this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==pu.Bytes)return t.push(this.readVarint(e));var r=cu(this);for(t=t||[];this.pos127;);else if(e===pu.Bytes)this.pos=this.readVarint()+this.pos;else if(e===pu.Fixed32)this.pos+=4;else{if(e!==pu.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8;}},writeTag:function(t,e){this.writeVarint(t<<3|e);},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,n;t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0));if(t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t;}(r,0,e),function(t,e){var r=(7&t)<<4;if(e.buf[e.pos++]|=r|((t>>>=3)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;if(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),!t)return;e.buf[e.pos++]=127&t;}(n,e);}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))));},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t);},writeBoolean:function(t){this.writeVarint(Boolean(t));},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null;}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128);}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&fu(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r;},writeFloat:function(t){this.realloc(4),uu(this.buf,t,this.pos,!0,23,4),this.pos+=4;},writeDouble:function(t){this.realloc(8),uu(this.buf,t,this.pos,!0,52,8),this.pos+=8;},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&fu(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n;},writeMessage:function(t,e,r){this.writeTag(t,pu.Bytes),this.writeRawMessage(e,r);},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,yu,e);},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,du,e);},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,gu,e);},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,mu,e);},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,vu,e);},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,xu,e);},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,bu,e);},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,_u,e);},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,wu,e);},writeBytesField:function(t,e){this.writeTag(t,pu.Bytes),this.writeBytes(e);},writeFixed32Field:function(t,e){this.writeTag(t,pu.Fixed32),this.writeFixed32(e);},writeSFixed32Field:function(t,e){this.writeTag(t,pu.Fixed32),this.writeSFixed32(e);},writeFixed64Field:function(t,e){this.writeTag(t,pu.Fixed64),this.writeFixed64(e);},writeSFixed64Field:function(t,e){this.writeTag(t,pu.Fixed64),this.writeSFixed64(e);},writeVarintField:function(t,e){this.writeTag(t,pu.Varint),this.writeVarint(e);},writeSVarintField:function(t,e){this.writeTag(t,pu.Varint),this.writeSVarint(e);},writeStringField:function(t,e){this.writeTag(t,pu.Bytes),this.writeString(e);},writeFloatField:function(t,e){this.writeTag(t,pu.Fixed32),this.writeFloat(e);},writeDoubleField:function(t,e){this.writeTag(t,pu.Fixed64),this.writeDouble(e);},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e));}};var zu=3;function Iu(t,e,r){1===t&&r.readMessage(Cu,e);}function Cu(t,e,r){if(3===t){var n=r.readMessage(Bu,{}),i=n.id,a=n.bitmap,o=n.width,s=n.height,u=n.left,l=n.top,p=n.advance;e.push({id:i,bitmap:new Ra({width:o+2*zu,height:s+2*zu},a),metrics:{width:o,height:s,left:u,top:l,advance:p}});}}function Bu(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint());}var Mu=zu,Eu=function(t){var e=this;this._callback=t,this._triggered=!1,"undefined"!=typeof MessageChannel&&(this._channel=new MessageChannel,this._channel.port2.onmessage=function(){e._triggered=!1,e._callback();});};Eu.prototype.trigger=function(){var t=this;this._triggered||(this._triggered=!0,this._channel?this._channel.port1.postMessage(!0):setTimeout((function(){t._triggered=!1,t._callback();}),0));};var Pu=function(t,e,r){this.target=t,this.parent=e,this.mapId=r,this.callbacks={},this.tasks={},this.taskQueue=[],this.cancelCallbacks={},m(["receive","process"],this),this.invoker=new Eu(this.process),this.target.addEventListener("message",this.receive,!1);};function Tu(t,e,r){var n=2*Math.PI*6378137/256/Math.pow(2,r);return [t*n-2*Math.PI*6378137/2,e*n-2*Math.PI*6378137/2]}Pu.prototype.send=function(t,e,r,n){var i=this,a=Math.round(1e18*Math.random()).toString(36).substring(0,10);r&&(this.callbacks[a]=r);var o=[];return this.target.postMessage({id:a,type:t,hasCallback:!!r,targetMapId:n,sourceMapId:this.mapId,data:An(e,o)},o),{cancel:function(){r&&delete i.callbacks[a],i.target.postMessage({id:a,type:"",targetMapId:n,sourceMapId:i.mapId});}}},Pu.prototype.receive=function(t){var e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(""===e.type){delete this.tasks[r];var n=this.cancelCallbacks[r];delete this.cancelCallbacks[r],n&&n();}else this.tasks[r]=e,this.taskQueue.push(r),this.invoker.trigger();},Pu.prototype.process=function(){var t=this;if(this.taskQueue.length){var e=this.taskQueue.shift(),r=this.tasks[e];if(delete this.tasks[e],this.taskQueue.length&&this.invoker.trigger(),r)if(""===r.type){var n=this.callbacks[e];delete this.callbacks[e],n&&(r.error?n(kn(r.error)):n(null,kn(r.data)));}else{var i=!1,a=r.hasCallback?function(r,n){i=!0,delete t.cancelCallbacks[e];var a=[];t.target.postMessage({id:e,type:"",sourceMapId:t.mapId,error:r?An(r):null,data:An(n,a)},a);}:function(t){i=!0;},o=null,s=kn(r.data);if(this.parent[r.type])o=this.parent[r.type](r.sourceMapId,s,a);else if(this.parent.getWorkerSource){var u=r.type.split(".");o=this.parent.getWorkerSource(r.sourceMapId,u[0],s.source)[u[1]](s,a);}else a(new Error("Could not find function "+r.type));!i&&o&&o.cancel&&(this.cancelCallbacks[e]=o.cancel);}}},Pu.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1);};var Vu=function(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]));};Vu.prototype.setNorthEast=function(t){return this._ne=t instanceof Fu?new Fu(t.lng,t.lat):Fu.convert(t),this},Vu.prototype.setSouthWest=function(t){return this._sw=t instanceof Fu?new Fu(t.lng,t.lat):Fu.convert(t),this},Vu.prototype.extend=function(t){var e,r,n=this._sw,i=this._ne;if(t instanceof Fu)e=t,r=t;else{if(!(t instanceof Vu))return Array.isArray(t)?t.every(Array.isArray)?this.extend(Vu.convert(t)):this.extend(Fu.convert(t)):this;if(e=t._sw,r=t._ne,!e||!r)return this}return n||i?(n.lng=Math.min(e.lng,n.lng),n.lat=Math.min(e.lat,n.lat),i.lng=Math.max(r.lng,i.lng),i.lat=Math.max(r.lat,i.lat)):(this._sw=new Fu(e.lng,e.lat),this._ne=new Fu(r.lng,r.lat)),this},Vu.prototype.getCenter=function(){return new Fu((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},Vu.prototype.getSouthWest=function(){return this._sw},Vu.prototype.getNorthEast=function(){return this._ne},Vu.prototype.getNorthWest=function(){return new Fu(this.getWest(),this.getNorth())},Vu.prototype.getSouthEast=function(){return new Fu(this.getEast(),this.getSouth())},Vu.prototype.getWest=function(){return this._sw.lng},Vu.prototype.getSouth=function(){return this._sw.lat},Vu.prototype.getEast=function(){return this._ne.lng},Vu.prototype.getNorth=function(){return this._ne.lat},Vu.prototype.toArray=function(){return [this._sw.toArray(),this._ne.toArray()]},Vu.prototype.toString=function(){return "LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},Vu.prototype.isEmpty=function(){return !(this._sw&&this._ne)},Vu.convert=function(t){return !t||t instanceof Vu?t:new Vu(t)};var Fu=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid LngLat object: ("+t+", "+e+")");if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};Fu.prototype.wrap=function(){return new Fu(p(this.lng,-180,180),this.lat)},Fu.prototype.toArray=function(){return [this.lng,this.lat]},Fu.prototype.toString=function(){return "LngLat("+this.lng+", "+this.lat+")"},Fu.prototype.toBounds=function(t){void 0===t&&(t=0);var e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new Vu(new Fu(this.lng-r,this.lat-e),new Fu(this.lng+r,this.lat+e))},Fu.convert=function(t){if(t instanceof Fu)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new Fu(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new Fu(Number("lng"in t?t.lng:t.lon),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]")};var Ou=2*Math.PI*6378137;function Lu(t){return Ou*Math.cos(t*Math.PI/180)}function Du(t){return (180+t)/360}function Uu(t){return (180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Ru(t,e){return t/Lu(e)}function ju(t){var e=180-360*t;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90}var qu=function(t,e,r){void 0===r&&(r=0),this.x=+t,this.y=+e,this.z=+r;};qu.fromLngLat=function(t,e){void 0===e&&(e=0);var r=Fu.convert(t);return new qu(Du(r.lng),Uu(r.lat),Ru(e,r.lat))},qu.prototype.toLngLat=function(){return new Fu(360*this.x-180,ju(this.y))},qu.prototype.toAltitude=function(){return t=this.z,e=this.y,t*Lu(ju(e));var t,e;},qu.prototype.meterInMercatorCoordinateUnits=function(){return 1/Ou*(t=ju(this.y),1/Math.cos(t*Math.PI/180));var t;};var Nu=function(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Zu(0,t,e,r);};Nu.prototype.equals=function(t){return this.z===t.z&&this.x===t.x&&this.y===t.y},Nu.prototype.url=function(t,e){var r,n,i,a,o,s=(r=this.x,n=this.y,i=this.z,a=Tu(256*r,256*(n=Math.pow(2,i)-n-1),i),o=Tu(256*(r+1),256*(n+1),i),a[0]+","+a[1]+","+o[0]+","+o[1]),u=function(t,e,r){for(var n,i="",a=t;a>0;a--)i+=(e&(n=1<this.canonical.z?new Xu(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Xu(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)},Xu.prototype.isChildOf=function(t){if(t.wrap!==this.wrap)return !1;var e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e},Xu.prototype.children=function(t){if(this.overscaledZ>=t)return [new Xu(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];var e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return [new Xu(e,this.wrap,e,r,n),new Xu(e,this.wrap,e,r+1,n),new Xu(e,this.wrap,e,r,n+1),new Xu(e,this.wrap,e,r+1,n+1)]},Xu.prototype.isLessThan=function(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.y=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError("out of range source coordinates for DEM data");return (e+1)*this.stride+(t+1)},Gu.prototype._unpackMapbox=function(t,e,r){return (256*t*256+256*e+r)/10-1e4},Gu.prototype._unpackTerrarium=function(t,e,r){return 256*t+e+r/256-32768},Gu.prototype.getPixels=function(){return new ja({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))},Gu.prototype.backfillBorder=function(t,e,r){if(this.dim!==t.dim)throw new Error("dem dimension mismatch");var n=e*this.dim,i=e*this.dim+this.dim,a=r*this.dim,o=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1;}switch(r){case-1:a=o-1;break;case 1:o=a+1;}for(var s=-e*this.dim,u=-r*this.dim,l=a;l=0)null!==this.deletedStates[t][n]&&(this.deletedStates[t][n]=this.deletedStates[t][n]||{},this.deletedStates[t][n][r]=null);else if(void 0!==e&&e>=0){if(this.stateChanges[t]&&this.stateChanges[t][n])for(r in this.deletedStates[t][n]={},this.stateChanges[t][n])this.deletedStates[t][n][r]=null;else this.deletedStates[t][n]=null;}else this.deletedStates[t]=null;}},Wu.prototype.getState=function(t,e){var r=String(e),n=this.state[t]||{},i=this.stateChanges[t]||{},a=c({},n[r],i[r]);if(null===this.deletedStates[t])return {};if(this.deletedStates[t]){var o=this.deletedStates[t][e];if(null===o)return {};for(var s in o)delete a[s];}return a},Wu.prototype.initializeTileState=function(t,e){t.setFeatureState(this.state,e);},Wu.prototype.coalesceChanges=function(t,e){var r={};for(var n in this.stateChanges){this.state[n]=this.state[n]||{};var i={};for(var a in this.stateChanges[n])this.state[n][a]||(this.state[n][a]={}),c(this.state[n][a],this.stateChanges[n][a]),i[a]=this.state[n][a];r[n]=i;}for(var o in this.deletedStates){this.state[o]=this.state[o]||{};var s={};if(null===this.deletedStates[o])for(var u in this.state[o])s[u]={},this.state[o][u]={};else for(var l in this.deletedStates[o]){if(null===this.deletedStates[o][l])this.state[o][l]={};else for(var p=0,h=Object.keys(this.deletedStates[o][l]);p=0&&p[3]>=0&&s.insert(o,p[0],p[1],p[2],p[3]);}},Qu.prototype.loadVTLayers=function(){return this.vtLayers||(this.vtLayers=new No.VectorTile(new lu(this.rawTileData)).layers,this.sourceLayerCoder=new Hu(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"])),this.vtLayers},Qu.prototype.query=function(t,e,r){var n=this;this.loadVTLayers();for(var a=t.params||{},o=ua/t.tileSize/t.scale,s=Nr(a.filter),u=t.queryGeometry,l=t.queryPadding*o,p=tl(u),c=this.grid.query(p.minX-l,p.minY-l,p.maxX+l,p.maxY+l),h=tl(t.cameraQueryGeometry),f=this.grid3D.query(h.minX-l,h.minY-l,h.maxX+l,h.maxY+l,(function(e,r,n,a){return function(t,e,r,n,a){for(var o=0,s=t;o=u.x&&a>=u.y)return !0}var l=[new i(e,r),new i(e,a),new i(n,a),new i(n,r)];if(t.length>2)for(var p=0,c=l;p=0)return !0;return !1}(a,u)){var l=this.sourceLayerCoder.decode(r),p=this.vtLayers[l].feature(n);if(i(new Dn(this.tileID.overscaledZ),p))for(var c=0;c>u.z,p=new i(u.x*l,u.y*l),c=new i(p.x+l,p.y+l),h=this.segments.prepareSegment(4,r,n);r.emplaceBack(p.x,p.y,p.x,p.y),r.emplaceBack(c.x,p.y,c.x,p.y),r.emplaceBack(p.x,c.y,p.x,c.y),r.emplaceBack(c.x,c.y,c.x,c.y);var f=h.vertexLength;n.emplaceBack(f,f+1,f+2),n.emplaceBack(f+1,f+2,f+3),h.vertexLength+=4,h.primitiveLength+=2;}this.maskedBoundsBuffer=e.createVertexBuffer(r,Ju.members),this.maskedIndexBuffer=e.createIndexBuffer(n);}},rl.prototype.hasData=function(){return "loaded"===this.state||"reloading"===this.state||"expired"===this.state},rl.prototype.patternsLoaded=function(){return this.imageAtlas&&!!Object.keys(this.imageAtlas.patternPositions).length},rl.prototype.setExpiryData=function(t){var e=this.expirationTime;if(t.cacheControl){var r=S(t.cacheControl);r["max-age"]&&(this.expirationTime=Date.now()+1e3*r["max-age"]);}else t.expires&&(this.expirationTime=new Date(t.expires).getTime());if(this.expirationTime){var n=Date.now(),i=!1;if(this.expirationTime>n)i=!1;else if(e)if(this.expirationTime-r/2;){if(--o<0)return !1;s-=t[o].dist(a),a=t[o];}s+=t[o].dist(t[o+1]),o++;for(var u=[],l=0;sn;)l-=u.shift().angleDelta;if(l>i)return !1;o++,s+=c.dist(h);}return !0}function il(t){for(var e=0,r=0;rl){var y=(l-u)/f,d=Se(c.x,h.x,y),m=Se(c.y,h.y,y),v=new Bs(d,m,h.angleTo(c),p);return v._round(),!o||nl(t,v,s,o,e)?v:void 0}u+=f;}}function ul(t,e,r,n,i,a,o,s,u){var l=al(n,a,o),p=ol(n,i),c=p*o,h=0===t[0].x||t[0].x===u||0===t[0].y||t[0].y===u;return e-c=0&&_=0&&w=0&&f+p<=c){var A=new Bs(_,w,x,d);A._round(),i&&!nl(e,A,o,i,a)||y.push(A);}}h+=g;}u||y.length||s||(y=t(e,h/2,n,i,a,o,s,!0,l));return y}(t,h?e/2*s%e:(p/2+2*a)*o*s%e,e,l,r,c,h,!1,u)}var ll=function(t,e,r,n,a,o,s,u,l,p,c,h){var f=s.top*u-l,y=s.bottom*u+l,d=s.left*u-l,m=s.right*u+l;if(this.boxStartIndex=t.length,p){var v=y-f,g=m-d;v>0&&(v=Math.max(10*u,v),this._addLineCollisionCircles(t,e,r,r.segment,g,v,n,a,o,c));}else{if(h){var x=new i(d,f),b=new i(m,f),_=new i(d,y),w=new i(m,y),A=h*Math.PI/180;x._rotate(A),b._rotate(A),_._rotate(A),w._rotate(A),d=Math.min(x.x,b.x,_.x,w.x),m=Math.max(x.x,b.x,_.x,w.x),f=Math.min(x.y,b.y,_.y,w.y),y=Math.max(x.y,b.y,_.y,w.y);}t.emplaceBack(r.x,r.y,d,f,m,y,n,a,o,0,0);}this.boxEndIndex=t.length;};ll.prototype._addLineCollisionCircles=function(t,e,r,n,i,a,o,s,u,l){var p=a/2,c=Math.floor(i/p)||1,h=1+.4*Math.log(l)/Math.LN2,f=Math.floor(c*h/2),y=-a/2,d=r,m=n+1,v=y,g=-i/2,x=g-i/4;do{if(--m<0){if(v>g)return;m=0;break}v-=e[m].dist(d),d=e[m];}while(v>x);for(var b=e[m].dist(e[m+1]),_=-f;_i&&(A+=w-i),!(A=e.length)return;b=e[m].dist(e[m+1]);}var k=A-v,S=e[m],z=e[m+1].sub(S)._unit()._mult(k)._add(S)._round(),I=Math.abs(A-y)0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r);};function cl(t,e){return te?1:0}function hl(t,e,r){void 0===e&&(e=1),void 0===r&&(r=!1);for(var n=1/0,a=1/0,o=-1/0,s=-1/0,u=t[0],l=0;lo)&&(o=p.x),(!l||p.y>s)&&(s=p.y);}var c=o-n,h=s-a,f=Math.min(c,h),y=f/2,d=new pl([],fl);if(0===f)return new i(n,a);for(var m=n;mg.d||!g.d)&&(g=b,r&&console.log("found best %d after %d probes",Math.round(1e4*b.d)/1e4,x)),b.max-g.d<=e||(y=b.h/2,d.push(new yl(b.p.x-y,b.p.y-y,y,t)),d.push(new yl(b.p.x+y,b.p.y-y,y,t)),d.push(new yl(b.p.x-y,b.p.y+y,y,t)),d.push(new yl(b.p.x+y,b.p.y+y,y,t)),x+=4);}return r&&(console.log("num probes: "+x),console.log("best distance: "+g.d)),g.p}function fl(t,e){return e.max-t.max}function yl(t,e,r,n){this.p=new i(t,e),this.h=r,this.d=function(t,e){for(var r=!1,n=1/0,i=0;it.y!=p.y>t.y&&t.x<(p.x-l.x)*(t.y-l.y)/(p.y-l.y)+l.x&&(r=!r),n=Math.min(n,_a(t,l,p));}return (r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2;}pl.prototype.push=function(t){this.data.push(t),this.length++,this._up(this.length-1);},pl.prototype.pop=function(){if(0!==this.length){var t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}},pl.prototype.peek=function(){return this.data[0]},pl.prototype._up=function(t){for(var e=this.data,r=this.compare,n=e[t];t>0;){var i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i;}e[t]=n;},pl.prototype._down=function(t){for(var e=this.data,r=this.compare,n=this.length>>1,i=e[t];t=0)break;e[t]=o,t=a;}e[t]=i;};var dl=e((function(t){t.exports=function(t,e){var r,n,i,a,o,s,u,l;for(r=3&t.length,n=t.length-r,i=e,o=3432918353,s=461845907,l=0;l>>16)*o&65535)<<16)&4294967295)<<15|u>>>17))*s+(((u>>>16)*s&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(a>>>16)&65535)<<16);switch(u=0,r){case 3:u^=(255&t.charCodeAt(l+2))<<16;case 2:u^=(255&t.charCodeAt(l+1))<<8;case 1:i^=u=(65535&(u=(u=(65535&(u^=255&t.charCodeAt(l)))*o+(((u>>>16)*o&65535)<<16)&4294967295)<<15|u>>>17))*s+(((u>>>16)*s&65535)<<16)&4294967295;}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0};})),ml=e((function(t){t.exports=function(t,e){for(var r,n=t.length,i=e^n,a=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++a;switch(n){case 3:i^=(255&t.charCodeAt(a+2))<<16;case 2:i^=(255&t.charCodeAt(a+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(a)))+((1540483477*(i>>>16)&65535)<<16);}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0};})),vl=dl,gl=dl,xl=ml;vl.murmur3=gl,vl.murmur2=xl;var bl=7,_l=Number.POSITIVE_INFINITY;function wl(t,e){return e[1]!==_l?function(t,e,r){var n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case"top-right":case"top-left":case"top":i=r-bl;break;case"bottom-right":case"bottom-left":case"bottom":i=-r+bl;}switch(t){case"top-right":case"bottom-right":case"right":n=-e;break;case"top-left":case"bottom-left":case"left":n=e;}return [n,i]}(t,e[0],e[1]):function(t,e){var r=0,n=0;e<0&&(e=0);var i=e/Math.sqrt(2);switch(t){case"top-right":case"top-left":n=i-bl;break;case"bottom-right":case"bottom-left":n=-i+bl;break;case"bottom":n=-e+bl;break;case"top":n=e-bl;}switch(t){case"top-right":case"bottom-right":r=-i;break;case"top-left":case"bottom-left":r=i;break;case"left":r=e;break;case"right":r=-e;}return [r,n]}(t,e[0])}function Al(t){switch(t){case"right":case"top-right":case"bottom-right":return "right";case"left":case"top-left":case"bottom-left":return "left"}return "center"}var kl=65535;function Sl(t,e,r,n,a,o,s,u,l,p,c,h,f,y){var d=function(t,e,r,n,a,o,s,u){for(var l=n.layout.get("text-rotate").evaluate(o,{})*Math.PI/180,p=e.positionedGlyphs,c=[],h=0;hkl&&w(t.layerIds[0]+': Value for "text-size" is >= 256. Reduce your "text-size".'):"composite"===m.kind&&((v=[Ms*y.compositeTextSizes[0].evaluate(o,{}),Ms*y.compositeTextSizes[1].evaluate(o,{})])[0]>kl||v[1]>kl)&&w(t.layerIds[0]+': Value for "text-size" is >= 256. Reduce your "text-size".'),t.addSymbols(t.text,d,v,s,a,o,l,e,u.lineStartIndex,u.lineLength,f);for(var g=0,x=p;g=0;o--)if(n.dist(a[o])it&&(t.getActor().send("enforceCacheSizeLimit",nt),lt=0);},t.clamp=l,t.clearTileCache=function(t){var e=self.caches.delete(rt);t&&e.catch(t).then((function(){return t()}));},t.clone=function(t){var e=new Ma(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=b,t.config=F,t.create=function(){var t=new Ma(16);return Ma!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=function(){var t=new Ma(9);return Ma!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},t.create$2=function(){var t=new Ma(4);return Ma!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},t.createCommonjsModule=e,t.createExpression=Mr,t.createLayout=ni,t.createStyleLayer=function(t){return "custom"===t.type?new Ys(t):new $s[t.type](t)},t.deepEqual=o,t.ease=u,t.emitValidationErrors=dn,t.endsWith=v,t.enforceCacheSizeLimit=function(t){self.caches&&self.caches.open(rt).then((function(e){e.keys().then((function(r){for(var n=0;n=ua||l.y<0||l.y>=ua||function(t,e,r,n,a,o,s,u,l,p,c,h,f,y,d,m,v,g,x,b,_){var A,k,S,z,I=t.addToLineVertexArray(e,r),C=0,B=0,M=0,E=-1,P={},T=vl(""),V=0,F=0;void 0===o._unevaluatedLayout.getValue("text-radial-offset")?(A=o.layout.get("text-offset").evaluate(x,{}).map((function(t){return t*vs})),V=A[0],F=A[1]):(V=o.layout.get("text-radial-offset").evaluate(x,{})*vs,F=_l);if(t.allowVerticalPlacement&&n.vertical){var O=o.layout.get("text-rotate").evaluate(x,{})+90,L=n.vertical;z=new ll(s,r,e,u,l,p,L,c,h,f,t.overscaling,O);}if(a){var D=o.layout.get("icon-rotate").evaluate(x,{}),U=function(t,e){var r=t.image,n=t.right-t.left,a=(n*r.paddedRect.w/(r.paddedRect.w-2)-n)/2,o=t.left-a,s=t.right+a,u=t.bottom-t.top,l=(u*r.paddedRect.h/(r.paddedRect.h-2)-u)/2,p=t.top-l,c=t.bottom+l,h=new i(o,p),f=new i(s,p),y=new i(s,c),d=new i(o,c),m=e*Math.PI/180;if(m){var v=Math.sin(m),g=Math.cos(m),x=[g,-v,v,g];h._matMult(x),f._matMult(x),d._matMult(x),y._matMult(x);}return [{tl:h,tr:f,bl:d,br:y,tex:r.paddedRect,writingMode:void 0,glyphOffset:[0,0],sectionIndex:0}]}(a,D);S=new ll(s,r,e,u,l,p,a,d,m,!1,t.overscaling,D),C=4*U.length;var R=t.iconSizeData,j=null;"source"===R.kind?(j=[Ms*o.layout.get("icon-size").evaluate(x,{})])[0]>kl&&w(t.layerIds[0]+': Value for "icon-size" is >= 256. Reduce your "icon-size".'):"composite"===R.kind&&((j=[Ms*_.compositeIconSizes[0].evaluate(x,{}),Ms*_.compositeIconSizes[1].evaluate(x,{})])[0]>kl||j[1]>kl)&&w(t.layerIds[0]+': Value for "icon-size" is >= 256. Reduce your "icon-size".'),t.addSymbols(t.icon,U,j,g,v,x,!1,e,I.lineStartIndex,I.lineLength,-1),E=t.icon.placedSymbolArray.length-1;}for(var q in n.horizontal){var N=n.horizontal[q];if(!k){T=vl(N.text);var K=o.layout.get("text-rotate").evaluate(x,{});k=new ll(s,r,e,u,l,p,N,c,h,f,t.overscaling,K);}var X=1===N.lineCount;if(B+=Sl(t,e,N,o,f,x,y,I,n.vertical?gs.horizontal:gs.horizontalOnly,X?Object.keys(n.horizontal):[q],P,b,E,_),X)break}n.vertical&&(M+=Sl(t,e,n.vertical,o,f,x,y,I,gs.vertical,["vertical"],P,b,E,_));var Z=k?k.boxStartIndex:t.collisionBoxArray.length,G=k?k.boxEndIndex:t.collisionBoxArray.length,J=z?z.boxStartIndex:t.collisionBoxArray.length,H=z?z.boxEndIndex:t.collisionBoxArray.length,Y=S?S.boxStartIndex:t.collisionBoxArray.length,$=S?S.boxEndIndex:t.collisionBoxArray.length;t.glyphOffsetArray.length>=js.MAX_GLYPHS&&w("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907");t.symbolInstances.emplaceBack(e.x,e.y,P.right>=0?P.right:-1,P.center>=0?P.center:-1,P.left>=0?P.left:-1,P.vertical||-1,E,T,Z,G,J,H,Y,$,u,B,M,C,0,c,V,F);}(t,l,u,r,n,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,d,x,A,s,v,b,k,h,e,a,o);};if("line"===S)for(var B=0,M=function(t,e,r,n,a){for(var o=[],s=0;s=n&&h.x>=n||(c.x>=n?c=new i(n,c.y+(h.y-c.y)*((n-c.x)/(h.x-c.x)))._round():h.x>=n&&(h=new i(n,c.y+(h.y-c.y)*((n-c.x)/(h.x-c.x)))._round()),c.y>=a&&h.y>=a||(c.y>=a?c=new i(c.x+(h.x-c.x)*((a-c.y)/(h.y-c.y)),a)._round():h.y>=a&&(h=new i(c.x+(h.x-c.x)*((a-c.y)/(h.y-c.y)),a)._round()),l&&c.equals(l[l.length-1])||(l=[c],o.push(l)),l.push(h)))));}return o}(e.geometry,0,0,ua,ua);B1){var R=sl(U,_,r.vertical||f,n,24,m);R&&C(U,R);}}else if("Polygon"===e.type)for(var j=0,q=zo(e.geometry,0);j=P.maxzoom))if("none"!==P.visibility)a(_,this.zoom,i),(g[P.id]=P.createBucket({index:h.bucketLayerIDs.length,layers:_,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:w,sourceID:this.source})).populate(S,m),h.bucketLayerIDs.push(_.map((function(e){return e.id})));}}}var T=e.mapObject(m.glyphDependencies,(function(e){return Object.keys(e).map(Number)}));Object.keys(T).length?n.send("getGlyphs",{uid:this.uid,stacks:T},(function(e,t){c||(c=e,p=t,C.call(l));})):p={};var L=Object.keys(m.iconDependencies);L.length?n.send("getImages",{icons:L},(function(e,t){c||(c=e,f=t,C.call(l));})):f={};var D=Object.keys(m.patternDependencies);function C(){if(c)return s(c);if(p&&f&&d){var t=new o(p),r=new e.ImageAtlas(f,d);for(var n in g){var l=g[n];l instanceof e.SymbolBucket?(a(l.layers,this.zoom,i),e.performSymbolLayout(l,p,t.positions,f,r.iconPositions,this.showCollisionBoxes)):l.hasPattern&&(l instanceof e.LineBucket||l instanceof e.FillBucket||l instanceof e.FillExtrusionBucket)&&(a(l.layers,this.zoom,i),l.addFeatures(m,r.patternPositions));}this.status="done",s(null,{buckets:e.values(g).filter((function(e){return !e.isEmpty()})),featureIndex:h,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:t.image,imageAtlas:r,glyphMap:this.returnDependencies?p:null,iconMap:this.returnDependencies?f:null,glyphPositions:this.returnDependencies?t.positions:null});}}D.length?n.send("getImages",{icons:D},(function(e,t){c||(c=e,d=t,C.call(l));})):d={},C.call(this);};var s="undefined"!=typeof performance,l={getEntriesByName:function(e){return !!(s&&performance&&performance.getEntriesByName)&&performance.getEntriesByName(e)},mark:function(e){return !!(s&&performance&&performance.mark)&&performance.mark(e)},measure:function(e,t,r){return !!(s&&performance&&performance.measure)&&performance.measure(e,t,r)},clearMarks:function(e){return !!(s&&performance&&performance.clearMarks)&&performance.clearMarks(e)},clearMeasures:function(e){return !!(s&&performance&&performance.clearMeasures)&&performance.clearMeasures(e)}},u=function(e){this._marks={start:[e.url,"start"].join("#"),end:[e.url,"end"].join("#"),measure:e.url.toString()},l.mark(this._marks.start);};function h(t,r){var i=e.getArrayBuffer(t.request,(function(t,i,o,n){t?r(t):i&&r(null,{vectorTile:new e.vectorTile.VectorTile(new e.pbf(i)),rawData:i,cacheControl:o,expires:n});}));return function(){i.cancel(),r();}}u.prototype.finish=function(){l.mark(this._marks.end);var e=l.getEntriesByName(this._marks.measure);return 0===e.length&&(l.measure(this._marks.measure,this._marks.start,this._marks.end),e=l.getEntriesByName(this._marks.measure),l.clearMarks(this._marks.start),l.clearMarks(this._marks.end),l.clearMeasures(this._marks.measure)),e},l.Performance=u;var c=function(e,t,r,i){this.actor=e,this.layerIndex=t,this.availableImages=r,this.loadVectorData=i||h,this.loading={},this.loaded={};};c.prototype.loadTile=function(t,r){var i=this,o=t.uid;this.loading||(this.loading={});var a=!!(t&&t.request&&t.request.collectResourceTiming)&&new l.Performance(t.request),s=this.loading[o]=new n(t);s.abort=this.loadVectorData(t,(function(t,n){if(delete i.loading[o],t||!n)return s.status="done",i.loaded[o]=s,r(t);var l=n.rawData,u={};n.expires&&(u.expires=n.expires),n.cacheControl&&(u.cacheControl=n.cacheControl);var h={};if(a){var c=a.finish();c&&(h.resourceTiming=JSON.parse(JSON.stringify(c)));}s.vectorTile=n.vectorTile,s.parse(n.vectorTile,i.layerIndex,i.availableImages,i.actor,(function(t,i){if(t||!i)return r(t);r(null,e.extend({rawTileData:l.slice(0)},i,u,h));})),i.loaded=i.loaded||{},i.loaded[o]=s;}));},c.prototype.reloadTile=function(e,t){var r=this,i=this.loaded,o=e.uid,n=this;if(i&&i[o]){var a=i[o];a.showCollisionBoxes=e.showCollisionBoxes;var s=function(e,i){var o=a.reloadCallback;o&&(delete a.reloadCallback,a.parse(a.vectorTile,n.layerIndex,r.availableImages,n.actor,o)),t(e,i);};"parsing"===a.status?a.reloadCallback=s:"done"===a.status&&(a.vectorTile?a.parse(a.vectorTile,this.layerIndex,this.availableImages,this.actor,s):s());}},c.prototype.abortTile=function(e,t){var r=this.loading,i=e.uid;r&&r[i]&&r[i].abort&&(r[i].abort(),delete r[i]),t();},c.prototype.removeTile=function(e,t){var r=this.loaded,i=e.uid;r&&r[i]&&delete r[i],t();};var p=function(){this.loaded={};};p.prototype.loadTile=function(t,r){var i=t.uid,o=t.encoding,n=t.rawImageData,a=new e.DEMData(i,n,o);this.loaded=this.loaded||{},this.loaded[i]=a,r(null,a);},p.prototype.removeTile=function(e){var t=this.loaded,r=e.uid;t&&t[r]&&delete t[r];};var f={RADIUS:6378137,FLATTENING:1/298.257223563,POLAR_RADIUS:6356752.3142};function d(e){var t=0;if(e&&e.length>0){t+=Math.abs(g(e[0]));for(var r=1;r2){for(a=0;a=0}(e)===t?e:e.reverse()}var M=e.vectorTile.VectorTileFeature.prototype.toGeoJSON,b=function(t){this._feature=t,this.extent=e.EXTENT,this.type=t.type,this.properties=t.tags,"id"in t&&!isNaN(t.id)&&(this.id=parseInt(t.id,10));};b.prototype.loadGeometry=function(){if(1===this._feature.type){for(var t=[],r=0,i=this._feature.geometry;r>31}function J(e,t){for(var r=e.loadGeometry(),i=e.type,o=0,n=0,a=r.length,s=0;s>1;!function e(t,r,i,o,n,a){for(;n>o;){if(n-o>600){var s=n-o+1,l=i-o+1,u=Math.log(s),h=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*h*(s-h)/s)*(l-s/2<0?-1:1),p=Math.max(o,Math.floor(i-l*h/s+c)),f=Math.min(n,Math.floor(i+(s-l)*h/s+c));e(t,r,i,p,f,a);}var d=r[2*i+a],g=o,m=n;for(j(t,r,o,i),r[2*n+a]>d&&j(t,r,o,n);gd;)m--;}r[2*o+a]===d?j(t,r,o,m):j(t,r,++m,n),m<=i&&(o=m+1),i<=m&&(n=m-1);}}(e,t,a,i,o,n%2),Z(e,t,r,i,a-1,n+1),Z(e,t,r,a+1,o,n+1);}}function j(e,t,r,i){Y(e,r,i),Y(t,2*r,2*i),Y(t,2*r+1,2*i+1);}function Y(e,t,r){var i=e[t];e[t]=e[r],e[r]=i;}function V(e,t,r,i){var o=e-r,n=t-i;return o*o+n*n}L.fromVectorTileJs=D,L.fromGeojsonVt=C,L.GeoJSONWrapper=z;var X=function(e){return e[0]},W=function(e){return e[1]},R=function(e,t,r,i,o){void 0===t&&(t=X),void 0===r&&(r=W),void 0===i&&(i=64),void 0===o&&(o=Float64Array),this.nodeSize=i,this.points=e;for(var n=e.length<65536?Uint16Array:Uint32Array,a=this.ids=new n(e.length),s=this.coords=new o(2*e.length),l=0;l=r&&s<=o&&l>=i&&l<=n&&h.push(e[d]);else{var g=Math.floor((f+p)/2);s=t[2*g],l=t[2*g+1],s>=r&&s<=o&&l>=i&&l<=n&&h.push(e[g]);var m=(c+1)%2;(0===c?r<=s:i<=l)&&(u.push(f),u.push(g-1),u.push(m)),(0===c?o>=s:n>=l)&&(u.push(g+1),u.push(p),u.push(m));}}return h}(this.ids,this.coords,e,t,r,i,this.nodeSize)},R.prototype.within=function(e,t,r){return function(e,t,r,i,o,n){for(var a=[0,e.length-1,0],s=[],l=o*o;a.length;){var u=a.pop(),h=a.pop(),c=a.pop();if(h-c<=n)for(var p=c;p<=h;p++)V(t[2*p],t[2*p+1],r,i)<=l&&s.push(e[p]);else{var f=Math.floor((c+h)/2),d=t[2*f],g=t[2*f+1];V(d,g,r,i)<=l&&s.push(e[f]);var m=(u+1)%2;(0===u?r-o<=d:i-o<=g)&&(a.push(c),a.push(f-1),a.push(m)),(0===u?r+o>=d:i+o>=g)&&(a.push(f+1),a.push(h),a.push(m));}}return s}(this.ids,this.coords,e,t,r,this.nodeSize)};var q={minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,map:function(e){return e}},U=function(e){this.options=re(Object.create(q),e),this.trees=new Array(this.options.maxZoom+1);};function $(e,t,r,i,o){return {x:e,y:t,zoom:1/0,id:r,parentId:-1,numPoints:i,properties:o}}function H(e,t){var r=e.geometry.coordinates,i=r[0],o=r[1];return {x:ee(i),y:te(o),zoom:1/0,index:t,parentId:-1}}function K(e){return {type:"Feature",id:e.id,properties:Q(e),geometry:{type:"Point",coordinates:[(i=e.x,360*(i-.5)),(t=e.y,r=(180-360*t)*Math.PI/180,360*Math.atan(Math.exp(r))/Math.PI-90)]}};var t,r,i;}function Q(e){var t=e.numPoints,r=t>=1e4?Math.round(t/1e3)+"k":t>=1e3?Math.round(t/100)/10+"k":t;return re(re({},e.properties),{cluster:!0,cluster_id:e.id,point_count:t,point_count_abbreviated:r})}function ee(e){return e/360+.5}function te(e){var t=Math.sin(e*Math.PI/180),r=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return r<0?0:r>1?1:r}function re(e,t){for(var r in t)e[r]=t[r];return e}function ie(e){return e.x}function oe(e){return e.y}function ne(e,t,r,i,o,n){var a=o-r,s=n-i;if(0!==a||0!==s){var l=((e-r)*a+(t-i)*s)/(a*a+s*s);l>1?(r=o,i=n):l>0&&(r+=a*l,i+=s*l);}return (a=e-r)*a+(s=t-i)*s}function ae(e,t,r,i){var o={id:void 0===e?null:e,type:t,geometry:r,tags:i,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(e){var t=e.geometry,r=e.type;if("Point"===r||"MultiPoint"===r||"LineString"===r)se(e,t);else if("Polygon"===r||"MultiLineString"===r)for(var i=0;i0&&(a+=i?(o*u-l*n)/2:Math.sqrt(Math.pow(l-o,2)+Math.pow(u-n,2))),o=l,n=u;}var h=t.length-3;t[2]=1,function e(t,r,i,o){for(var n,a=o,s=i-r>>1,l=i-r,u=t[r],h=t[r+1],c=t[i],p=t[i+1],f=r+3;fa)n=f,a=d;else if(d===a){var g=Math.abs(f-s);go&&(n-r>3&&e(t,r,n,o),t[n+2]=a,i-n>3&&e(t,n,i,o));}(t,0,h,r),t[h+2]=1,t.size=Math.abs(a),t.start=0,t.end=t.size;}function ce(e,t,r,i){for(var o=0;o1?1:r}function de(e,t,r,i,o,n,a,s){if(i/=t,n>=(r/=t)&&a=i)return null;for(var l=[],u=0;u=r&&d=i)){var g=[];if("Point"===p||"MultiPoint"===p)ge(c,g,r,i,o);else if("LineString"===p)me(c,g,r,i,o,!1,s.lineMetrics);else if("MultiLineString"===p)ye(c,g,r,i,o,!1);else if("Polygon"===p)ye(c,g,r,i,o,!0);else if("MultiPolygon"===p)for(var m=0;m=r&&a<=i&&(t.push(e[n]),t.push(e[n+1]),t.push(e[n+2]));}}function me(e,t,r,i,o,n,a){for(var s,l,u=ve(e),h=0===o?we:Se,c=e.start,p=0;pr&&(l=h(u,f,d,m,v,r),a&&(u.start=c+s*l)):y>i?x=r&&(l=h(u,f,d,m,v,r),w=!0),x>i&&y<=i&&(l=h(u,f,d,m,v,i),w=!0),!n&&w&&(a&&(u.end=c+s*l),t.push(u),u=ve(e)),a&&(c+=s);}var S=e.length-3;f=e[S],d=e[S+1],g=e[S+2],(y=0===o?f:d)>=r&&y<=i&&xe(u,f,d,g),S=u.length-3,n&&S>=3&&(u[S]!==u[0]||u[S+1]!==u[1])&&xe(u,u[0],u[1],u[2]),u.length&&t.push(u);}function ve(e){var t=[];return t.size=e.size,t.start=e.start,t.end=e.end,t}function ye(e,t,r,i,o,n){for(var a=0;aa.maxX&&(a.maxX=h),c>a.maxY&&(a.maxY=c);}return a}function Pe(e,t,r,i){var o=t.geometry,n=t.type,a=[];if("Point"===n||"MultiPoint"===n)for(var s=0;s0&&t.size<(o?a:i))r.numPoints+=t.length/3;else{for(var s=[],l=0;la)&&(r.numSimplified++,s.push(t[l]),s.push(t[l+1])),r.numPoints++;o&&function(e,t){for(var r=0,i=0,o=e.length,n=o-2;i0===t)for(i=0,o=e.length;i24)throw new Error("maxZoom should be in the 0-24 range");if(t.promoteId&&t.generateId)throw new Error("promoteId and generateId cannot be used together.");var i=function(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;i=i;u--){var h=+Date.now();s=this._cluster(s,u),this.trees[u]=new R(s,ie,oe,n,Float32Array),r&&console.log("z%d: %d clusters in %dms",u,s.length,+Date.now()-h);}return r&&console.timeEnd("total time"),this},U.prototype.getClusters=function(e,t){var r=((e[0]+180)%360+360)%360-180,i=Math.max(-90,Math.min(90,e[1])),o=180===e[2]?180:((e[2]+180)%360+360)%360-180,n=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)r=-180,o=180;else if(r>o){var a=this.getClusters([r,i,180,n],t),s=this.getClusters([-180,i,o,n],t);return a.concat(s)}for(var l=this.trees[this._limitZoom(t)],u=[],h=0,c=l.range(ee(r),te(n),ee(o),te(i));h>5,r=e%32,i="No cluster with the specified id.",o=this.trees[r];if(!o)throw new Error(i);var n=o.points[t];if(!n)throw new Error(i);for(var a=this.options.radius/(this.options.extent*Math.pow(2,r-1)),s=[],l=0,u=o.within(n.x,n.y,a);l1?this._map(u,!0):null,m=(l<<5)+(t+1),v=0,y=c;v1&&console.time("creation"),p=this.tiles[c]=_e(e,t,r,i,l),this.tileCoords.push({z:t,x:r,y:i}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,i,p.numFeatures,p.numPoints,p.numSimplified),console.timeEnd("creation"));var f="z"+t;this.stats[f]=(this.stats[f]||0)+1,this.total++;}if(p.source=e,o){if(t===l.maxZoom||t===o)continue;var d=1<1&&console.time("clipping");var g,m,v,y,x,w,S=.5*l.buffer/l.extent,M=.5-S,b=.5+S,k=1+S;g=m=v=y=null,x=de(e,h,r-S,r+b,0,p.minX,p.maxX,l),w=de(e,h,r+M,r+k,0,p.minX,p.maxX,l),e=null,x&&(g=de(x,h,i-S,i+b,1,p.minY,p.maxY,l),m=de(x,h,i+M,i+k,1,p.minY,p.maxY,l),x=null),w&&(v=de(w,h,i-S,i+b,1,p.minY,p.maxY,l),y=de(w,h,i+M,i+k,1,p.minY,p.maxY,l),w=null),u>1&&console.timeEnd("clipping"),s.push(g||[],t+1,2*r,2*i),s.push(m||[],t+1,2*r,2*i+1),s.push(v||[],t+1,2*r+1,2*i),s.push(y||[],t+1,2*r+1,2*i+1);}}},Le.prototype.getTile=function(e,t,r){var i=this.options,o=i.extent,n=i.debug;if(e<0||e>24)return null;var a=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var l,u=e,h=t,c=r;!l&&u>0;)u--,h=Math.floor(h/2),c=Math.floor(c/2),l=this.tiles[De(u,h,c)];return l&&l.source?(n>1&&console.log("found parent tile z%d-%d-%d",u,h,c),n>1&&console.time("drilling down"),this.splitTile(l.source,u,h,c,e,t,r),n>1&&console.timeEnd("drilling down"),this.tiles[s]?ke(this.tiles[s],o):null):null};var ze=function(t){function r(e,r,i,o){t.call(this,e,r,i,Ce),o&&(this.loadGeoJSON=o);}return t&&(r.__proto__=t),r.prototype=Object.create(t&&t.prototype),r.prototype.constructor=r,r.prototype.loadData=function(e,t){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=t,this._pendingLoadDataParams=e,this._state&&"Idle"!==this._state?this._state="NeedsLoadData":(this._state="Coalescing",this._loadData());},r.prototype._loadData=function(){var t=this;if(this._pendingCallback&&this._pendingLoadDataParams){var r=this._pendingCallback,i=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams;var o=!!(i&&i.request&&i.request.collectResourceTiming)&&new l.Performance(i.request);this.loadGeoJSON(i,(function(n,a){if(n||!a)return r(n);if("object"!=typeof a)return r(new Error("Input data given to '"+i.source+"' is not a valid GeoJSON object."));y(a,!0);try{t._geoJSONIndex=i.cluster?new U(function(t){var r=t.superclusterOptions,i=t.clusterProperties;if(!i||!r)return r;for(var o={},n={},a={accumulated:null,zoom:0},s={properties:null},l=Object.keys(i),u=0,h=l;u=0?0:e.button},i.remove=function(t){t.parentNode&&t.parentNode.removeChild(t);};var p=function(e){function i(){e.call(this),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new t.RGBAImage({width:1,height:1}),this.dirty=!0;}return e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i,i.prototype.isLoaded=function(){return this.loaded},i.prototype.setLoaded=function(t){if(this.loaded!==t&&(this.loaded=t,t)){for(var e=0,i=this.requestors;e=0?1.2:1));}function g(t,e,i,o,r,a,n){for(var s=0;s65535)e(new Error("glyphs > 65535 not supported"));else{var l=a.requests[s];l||(l=a.requests[s]=[],y.loadGlyphRange(i,s,o.url,o.requestManager,(function(t,e){if(e)for(var i in e)o._doesCharSupportLocalGlyph(+i)||(a.glyphs[+i]=e[+i]);for(var r=0,n=l;rthis.height)return t.warnOnce("LineAtlas out of space"),null;for(var a=0,n=0;n=o&&e.x=r&&e.y0&&(l[new t.OverscaledTileID(e.overscaledZ,a,i.z,r,i.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,i.z,i.x,i.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,i.z,n,i.y-1).key]={backfilled:!1}),i.y+10&&(o.resourceTiming=e._resourceTiming,e._resourceTiming=[]),e.fire(new t.Event("data",o));}}));},i.prototype.onAdd=function(t){this.map=t,this.load();},i.prototype.setData=function(e){var i=this;return this._data=e,this.fire(new t.Event("dataloading",{dataType:"source"})),this._updateWorkerData((function(e){if(e)i.fire(new t.ErrorEvent(e));else{var o={dataType:"source",sourceDataType:"content"};i._collectResourceTiming&&i._resourceTiming&&i._resourceTiming.length>0&&(o.resourceTiming=i._resourceTiming,i._resourceTiming=[]),i.fire(new t.Event("data",o));}})),this},i.prototype.getClusterExpansionZoom=function(t,e){return this.actor.send("geojson.getClusterExpansionZoom",{clusterId:t,source:this.id},e),this},i.prototype.getClusterChildren=function(t,e){return this.actor.send("geojson.getClusterChildren",{clusterId:t,source:this.id},e),this},i.prototype.getClusterLeaves=function(t,e,i,o){return this.actor.send("geojson.getClusterLeaves",{source:this.id,clusterId:t,limit:e,offset:i},o),this},i.prototype._updateWorkerData=function(e){var i=this;this._loaded=!1;var o=t.extend({},this.workerOptions),r=this._data;"string"==typeof r?(o.request=this.map._requestManager.transformRequest(t.browser.resolveURL(r),t.ResourceType.Source),o.request.collectResourceTiming=this._collectResourceTiming):o.data=JSON.stringify(r),this.actor.send(this.type+".loadData",o,(function(t,r){i._removed||r&&r.abandoned||(i._loaded=!0,r&&r.resourceTiming&&r.resourceTiming[i.id]&&(i._resourceTiming=r.resourceTiming[i.id].slice(0)),i.actor.send(i.type+".coalesce",{source:o.source},null),e(t));}));},i.prototype.loaded=function(){return this._loaded},i.prototype.loadTile=function(e,i){var o=this,r=e.actor?"reloadTile":"loadTile";e.actor=this.actor;var a={type:this.type,uid:e.uid,tileID:e.tileID,zoom:e.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:t.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes};e.request=this.actor.send(r,a,(function(t,a){return delete e.request,e.unloadVectorData(),e.aborted?i(null):t?i(t):(e.loadVectorData(a,o.map.painter,"reloadTile"===r),i(null))}));},i.prototype.abortTile=function(t){t.request&&(t.request.cancel(),delete t.request),t.aborted=!0;},i.prototype.unloadTile=function(t){t.unloadVectorData(),this.actor.send("removeTile",{uid:t.uid,type:this.type,source:this.id});},i.prototype.onRemove=function(){this._removed=!0,this.actor.send("removeSource",{type:this.type,source:this.id});},i.prototype.serialize=function(){return t.extend({},this._options,{type:this.type,data:this._data})},i.prototype.hasTransition=function(){return !1},i}(t.Evented),D=function(e){function i(t,i,o,r){e.call(this),this.id=t,this.dispatcher=o,this.coordinates=i.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(r),this.options=i;}return e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i,i.prototype.load=function(e,i){var o=this;this._loaded=!1,this.fire(new t.Event("dataloading",{dataType:"source"})),this.url=this.options.url,t.getImage(this.map._requestManager.transformRequest(this.url,t.ResourceType.Image),(function(r,a){o._loaded=!0,r?o.fire(new t.ErrorEvent(r)):a&&(o.image=a,e&&(o.coordinates=e),i&&i(),o._finishLoading());}));},i.prototype.loaded=function(){return this._loaded},i.prototype.updateImage=function(t){var e=this;return this.image&&t.url?(this.options.url=t.url,this.load(t.coordinates,(function(){e.texture=null;})),this):this},i.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new t.Event("data",{dataType:"source",sourceDataType:"metadata"})));},i.prototype.onAdd=function(t){this.map=t,this.load();},i.prototype.setCoordinates=function(e){var i=this;this.coordinates=e;var o=e.map(t.MercatorCoordinate.fromLngLat);this.tileID=function(e){for(var i=1/0,o=1/0,r=-1/0,a=-1/0,n=0,s=e;ni.end(0)?this.fire(new t.ErrorEvent(new t.ValidationError("Playback for this video can be set only between the "+i.start(0)+" and "+i.end(0)+"-second mark."))):this.video.currentTime=e;}},i.prototype.getVideo=function(){return this.video},i.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)));},i.prototype.prepare=function(){if(!(0===Object.keys(this.tiles).length||this.video.readyState<2)){var e=this.map.painter.context,i=e.gl;for(var o in this.boundsBuffer||(this.boundsBuffer=e.createVertexBuffer(this._boundsArray,t.rasterBoundsAttributes.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE),i.texSubImage2D(i.TEXTURE_2D,0,0,0,i.RGBA,i.UNSIGNED_BYTE,this.video)):(this.texture=new t.Texture(e,this.video,i.RGBA),this.texture.bind(i.LINEAR,i.CLAMP_TO_EDGE)),this.tiles){var r=this.tiles[o];"loaded"!==r.state&&(r.state="loaded",r.texture=this.texture);}}},i.prototype.serialize=function(){return {type:"video",urls:this.urls,coordinates:this.coordinates}},i.prototype.hasTransition=function(){return this.video&&!this.video.paused},i}(D),R=function(e){function i(i,o,r,a){e.call(this,i,o,r,a),o.coordinates?Array.isArray(o.coordinates)&&4===o.coordinates.length&&!o.coordinates.some((function(t){return !Array.isArray(t)||2!==t.length||t.some((function(t){return "number"!=typeof t}))}))||this.fire(new t.ErrorEvent(new t.ValidationError("sources."+i,null,'"coordinates" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new t.ErrorEvent(new t.ValidationError("sources."+i,null,'missing required property "coordinates"'))),o.animate&&"boolean"!=typeof o.animate&&this.fire(new t.ErrorEvent(new t.ValidationError("sources."+i,null,'optional "animate" property must be a boolean value'))),o.canvas?"string"==typeof o.canvas||o.canvas instanceof t.window.HTMLCanvasElement||this.fire(new t.ErrorEvent(new t.ValidationError("sources."+i,null,'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new t.ErrorEvent(new t.ValidationError("sources."+i,null,'missing required property "canvas"'))),this.options=o,this.animate=void 0===o.animate||o.animate;}return e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i,i.prototype.load=function(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof t.window.HTMLCanvasElement?this.options.canvas:t.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new t.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))):(this.play=function(){this._playing=!0,this.map.triggerRepaint();},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1);},this._finishLoading());},i.prototype.getCanvas=function(){return this.canvas},i.prototype.onAdd=function(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play();},i.prototype.onRemove=function(){this.pause();},i.prototype.prepare=function(){var e=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,e=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,e=!0),!this._hasInvalidDimensions()&&0!==Object.keys(this.tiles).length){var i=this.map.painter.context,o=i.gl;for(var r in this.boundsBuffer||(this.boundsBuffer=i.createVertexBuffer(this._boundsArray,t.rasterBoundsAttributes.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?(e||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new t.Texture(i,this.canvas,o.RGBA,{premultiply:!0}),this.tiles){var a=this.tiles[r];"loaded"!==a.state&&(a.state="loaded",a.texture=this.texture);}}},i.prototype.serialize=function(){return {type:"canvas",coordinates:this.coordinates}},i.prototype.hasTransition=function(){return this._playing},i.prototype._hasInvalidDimensions=function(){for(var t=0,e=[this.canvas.width,this.canvas.height];tthis.max){var n=this._getAndRemoveByKey(this.order[0]);n&&this.onRemove(n);}return this},U.prototype.has=function(t){return t.wrapped().key in this.data},U.prototype.getAndRemove=function(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null},U.prototype._getAndRemoveByKey=function(t){var e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value},U.prototype.get=function(t){return this.has(t)?this.data[t.wrapped().key][0].value:null},U.prototype.remove=function(t,e){if(!this.has(t))return this;var i=t.wrapped().key,o=void 0===e?0:this.data[i].indexOf(e),r=this.data[i][o];return this.data[i].splice(o,1),r.timeout&&clearTimeout(r.timeout),0===this.data[i].length&&delete this.data[i],this.onRemove(r.value),this.order.splice(this.order.indexOf(i),1),this},U.prototype.setMaxSize=function(t){for(this.max=t;this.order.length>this.max;){var e=this._getAndRemoveByKey(this.order[0]);e&&this.onRemove(e);}return this};var N=function(t,e,i){this.context=t;var o=t.gl;this.buffer=o.createBuffer(),this.dynamicDraw=Boolean(i),this.context.unbindVAO(),t.bindElementBuffer.set(this.buffer),o.bufferData(o.ELEMENT_ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?o.DYNAMIC_DRAW:o.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;};N.prototype.bind=function(){this.context.bindElementBuffer.set(this.buffer);},N.prototype.updateData=function(t){var e=this.context.gl;this.context.unbindVAO(),this.bind(),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,t.arrayBuffer);},N.prototype.destroy=function(){var t=this.context.gl;this.buffer&&(t.deleteBuffer(this.buffer),delete this.buffer);};var Z={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT",Int32:"INT",Uint32:"UNSIGNED_INT",Float32:"FLOAT"},V=function(t,e,i,o){this.length=e.length,this.attributes=i,this.itemSize=e.bytesPerElement,this.dynamicDraw=o,this.context=t;var r=t.gl;this.buffer=r.createBuffer(),t.bindVertexBuffer.set(this.buffer),r.bufferData(r.ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?r.DYNAMIC_DRAW:r.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer;};V.prototype.bind=function(){this.context.bindVertexBuffer.set(this.buffer);},V.prototype.updateData=function(t){var e=this.context.gl;this.bind(),e.bufferSubData(e.ARRAY_BUFFER,0,t.arrayBuffer);},V.prototype.enableAttributes=function(t,e){for(var i=0;i1||(Math.abs(i)>1&&(1===Math.abs(i+r)?i+=r:1===Math.abs(i-r)&&(i-=r)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,i,o),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)));}},i.prototype.getTile=function(t){return this.getTileByID(t.key)},i.prototype.getTileByID=function(t){return this._tiles[t]},i.prototype.getZoom=function(t){return t.zoom+t.scaleZoom(t.tileSize/this._source.tileSize)},i.prototype._retainLoadedChildren=function(t,e,i,o){for(var r in this._tiles){var a=this._tiles[r];if(!(o[r]||!a.hasData()||a.tileID.overscaledZ<=e||a.tileID.overscaledZ>i)){for(var n=a.tileID;a&&a.tileID.overscaledZ>e+1;){var s=a.tileID.scaledTo(a.tileID.overscaledZ-1);(a=this._tiles[s.key])&&a.hasData()&&(n=s);}for(var l=n;l.overscaledZ>e;)if(t[(l=l.scaledTo(l.overscaledZ-1)).key]){o[n.key]=n;break}}}},i.prototype.findLoadedParent=function(t,e){for(var i=t.overscaledZ-1;i>=e;i--){var o=t.scaledTo(i);if(!o)return;var r=String(o.key),a=this._tiles[r];if(a&&a.hasData())return a;if(this._cache.has(o))return this._cache.get(o)}},i.prototype.updateCacheSize=function(t){var e=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),i=Math.floor(5*e),o="number"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,i):i;this._cache.setMaxSize(o);},i.prototype.handleWrapJump=function(t){var e=(t-(void 0===this._prevLng?t:this._prevLng))/360,i=Math.round(e);if(this._prevLng=t,i){var o={};for(var r in this._tiles){var a=this._tiles[r];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+i),o[a.tileID.key]=a;}for(var n in this._tiles=o,this._timers)clearTimeout(this._timers[n]),delete this._timers[n];for(var s in this._tiles){var l=this._tiles[s];this._setTileReloadTimer(s,l);}}},i.prototype.update=function(e){var o=this;if(this.transform=e,this._sourceLoaded&&!this._paused){var r;this.updateCacheSize(e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used?this._source.tileID?r=e.getVisibleUnwrappedCoordinates(this._source.tileID).map((function(e){return new t.OverscaledTileID(e.canonical.z,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y)})):(r=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(r=r.filter((function(t){return o._source.hasTile(t)})))):r=[];var a=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),n=Math.max(a-i.maxOverzooming,this._source.minzoom),s=Math.max(a+i.maxUnderzooming,this._source.minzoom),l=this._updateRetainedTiles(r,a);if(Mt(this._source.type)){for(var c={},u={},h=0,p=Object.keys(l);hthis._source.maxzoom){var m=_.children(this._source.maxzoom)[0],g=this.getTile(m);if(g&&g.hasData()){o[m.key]=m;continue}}else{var v=_.children(this._source.maxzoom);if(o[v[0].key]&&o[v[1].key]&&o[v[2].key]&&o[v[3].key])continue}for(var y=f.wasRequested(),x=_.overscaledZ-1;x>=a;--x){var b=_.scaledTo(x);if(r[b.key])break;if(r[b.key]=!0,!(f=this.getTile(b))&&y&&(f=this._addTile(b)),f&&(o[b.key]=b,y=f.wasRequested(),f.hasData()))break}}}return o},i.prototype._addTile=function(e){var i=this._tiles[e.key];if(i)return i;(i=this._cache.getAndRemove(e))&&(this._setTileReloadTimer(e.key,i),i.tileID=e,this._state.initializeTileState(i,this.map?this.map.painter:null),this._cacheTimers[e.key]&&(clearTimeout(this._cacheTimers[e.key]),delete this._cacheTimers[e.key],this._setTileReloadTimer(e.key,i)));var o=Boolean(i);return o||(i=new t.Tile(e,this._source.tileSize*e.overscaleFactor()),this._loadTile(i,this._tileLoaded.bind(this,i,e.key,i.state))),i?(i.uses++,this._tiles[e.key]=i,o||this._source.fire(new t.Event("dataloading",{tile:i,coord:i.tileID,dataType:"source"})),i):null},i.prototype._setTileReloadTimer=function(t,e){var i=this;t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);var o=e.getExpiryTimeout();o&&(this._timers[t]=setTimeout((function(){i._reloadTile(t,"expired"),delete i._timers[t];}),o));},i.prototype._removeTile=function(t){var e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()&&"reloading"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))));},i.prototype.clearTiles=function(){for(var t in this._shouldReloadOnResume=!1,this._paused=!1,this._tiles)this._removeTile(t);this._cache.reset();},i.prototype.tilesIn=function(e,i,o){var r=this,a=[],n=this.transform;if(!n)return a;for(var s=o?n.getCameraQueryGeometry(e):e,l=e.map((function(t){return n.pointCoordinate(t)})),c=s.map((function(t){return n.pointCoordinate(t)})),u=this.getIds(),h=1/0,p=1/0,d=-1/0,_=-1/0,f=0,m=c;f=0&&g[1].y+m>=0){var v=l.map((function(t){return s.getTilePoint(t)})),y=c.map((function(t){return s.getTilePoint(t)}));a.push({tile:o,tileID:s,queryGeometry:v,cameraQueryGeometry:y,scale:f});}}},y=0;y=t.browser.now())return !0}return !1},i.prototype.setFeatureState=function(t,e,i){t=t||"_geojsonTileLayer",this._state.updateState(t,e,i);},i.prototype.removeFeatureState=function(t,e,i){t=t||"_geojsonTileLayer",this._state.removeFeatureState(t,e,i);},i.prototype.getFeatureState=function(t,e){return t=t||"_geojsonTileLayer",this._state.getState(t,e)},i}(t.Evented);function Dt(t,e){return t%32-e%32||e-t}function Mt(t){return "raster"===t||"image"===t||"video"===t}function Rt(){return new t.window.Worker(or.workerUrl)}Lt.maxOverzooming=10,Lt.maxUnderzooming=3;var At=function(){this.active={};};At.prototype.acquire=function(t){if(!this.workers)for(this.workers=[];this.workers.length=-e[0]&&i<=e[0]&&o>=-e[1]&&o<=e[1]}function $t(e,i,o,r,a,n,s,l){var c=r?e.textSizeData:e.iconSizeData,u=t.evaluateSizeForZoom(c,o.transform.zoom),h=[256/o.width*2+1,256/o.height*2+1],p=r?e.text.dynamicLayoutVertexArray:e.icon.dynamicLayoutVertexArray;p.clear();for(var d=e.lineVertexArray,_=r?e.text.placedSymbolArray:e.icon.placedSymbolArray,f=o.transform.width/o.transform.height,m=!1,g=0;g<_.length;g++){var v=_.get(g);if(v.hidden||v.writingMode===t.WritingMode.vertical&&!m)ne(v.numGlyphs,p);else{m=!1;var y=[v.anchorX,v.anchorY,0,1];if(t.transformMat4(y,y,i),Qt(y,h)){var x=.5+y[3]/o.transform.cameraToCenterDistance*.5,b=t.evaluateSizeForFeature(c,u,v),w=s?b*x:b/x,E=new t.Point(v.anchorX,v.anchorY),T=Yt(E,a).point,I={},C=ie(v,w,!1,l,i,a,n,e.glyphOffsetArray,d,p,T,E,I,f);m=C.useVertical,(C.notEnoughRoom||m||C.needsFlipping&&ie(v,w,!0,l,i,a,n,e.glyphOffsetArray,d,p,T,E,I,f).notEnoughRoom)&&ne(v.numGlyphs,p);}else ne(v.numGlyphs,p);}}r?e.text.dynamicLayoutVertexBuffer.updateData(p):e.icon.dynamicLayoutVertexBuffer.updateData(p);}function te(t,e,i,o,r,a,n,s,l,c,u,h){var p=s.glyphStartIndex+s.numGlyphs,d=s.lineStartIndex,_=s.lineStartIndex+s.lineLength,f=e.getoffsetX(s.glyphStartIndex),m=e.getoffsetX(p-1),g=re(t*f,i,o,r,a,n,s.segment,d,_,l,c,u,h);if(!g)return null;var v=re(t*m,i,o,r,a,n,s.segment,d,_,l,c,u,h);return v?{first:g,last:v}:null}function ee(e,i,o,r){if(e===t.WritingMode.horizontal&&Math.abs(o.y-i.y)>Math.abs(o.x-i.x)*r)return {useVertical:!0};return (e===t.WritingMode.vertical?i.yo.x)?{needsFlipping:!0}:null}function ie(e,i,o,r,a,n,s,l,c,u,h,p,d,_){var f,m=i/24,g=e.lineOffsetX*m,v=e.lineOffsetY*m;if(e.numGlyphs>1){var y=e.glyphStartIndex+e.numGlyphs,x=e.lineStartIndex,b=e.lineStartIndex+e.lineLength,w=te(m,l,g,v,o,h,p,e,c,n,d,!1);if(!w)return {notEnoughRoom:!0};var E=Yt(w.first.point,s).point,T=Yt(w.last.point,s).point;if(r&&!o){var I=ee(e.writingMode,E,T,_);if(I)return I}f=[w.first];for(var C=e.glyphStartIndex+1;C0?L.point:oe(p,z,S,1,a),M=ee(e.writingMode,S,D,_);if(M)return M}var R=re(m*l.getoffsetX(e.glyphStartIndex),g,v,o,h,p,e.segment,e.lineStartIndex,e.lineStartIndex+e.lineLength,c,n,d,!1);if(!R)return {notEnoughRoom:!0};f=[R];}for(var A=0,k=f;A0?1:-1,m=0;r&&(f*=-1,m=Math.PI),f<0&&(m+=Math.PI);for(var g=f>0?l+s:l+s+1,v=g,y=a,x=a,b=0,w=0,E=Math.abs(_);b+w<=E;){if((g+=f)=c)return null;if(x=y,void 0===(y=p[g])){var T=new t.Point(u.getx(g),u.gety(g)),I=Yt(T,h);if(I.signedDistanceFromCamera>0)y=p[g]=I.point;else{var C=g-f;y=oe(0===b?n:new t.Point(u.getx(C),u.gety(C)),T,x,E-b+1,h);}}b+=w,w=x.dist(y);}var S=(E-b)/w,P=y.sub(x),z=P.mult(S)._add(x);return z._add(P._unit()._perp()._mult(o*f)),{point:z,angle:m+Math.atan2(y.y-x.y,y.x-x.x),tileDistance:d?{prevTileDistance:g-f===v?0:u.gettileUnitDistanceFromAnchor(g-f),lastSegmentViewportDistance:E-b}:null}}Ht.prototype.keysLength=function(){return this.boxKeys.length+this.circleKeys.length},Ht.prototype.insert=function(t,e,i,o,r){this._forEachCell(e,i,o,r,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(i),this.bboxes.push(o),this.bboxes.push(r);},Ht.prototype.insertCircle=function(t,e,i,o){this._forEachCell(e-o,i-o,e+o,i+o,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(i),this.circles.push(o);},Ht.prototype._insertBoxCell=function(t,e,i,o,r,a){this.boxCells[r].push(a);},Ht.prototype._insertCircleCell=function(t,e,i,o,r,a){this.circleCells[r].push(a);},Ht.prototype._query=function(t,e,i,o,r,a){if(i<0||t>this.width||o<0||e>this.height)return !r&&[];var n=[];if(t<=0&&e<=0&&this.width<=i&&this.height<=o){if(r)return !0;for(var s=0;s0:n},Ht.prototype._queryCircle=function(t,e,i,o,r){var a=t-i,n=t+i,s=e-i,l=e+i;if(n<0||a>this.width||l<0||s>this.height)return !o&&[];var c=[],u={hitTest:o,circle:{x:t,y:e,radius:i},seenUids:{box:{},circle:{}}};return this._forEachCell(a,s,n,l,this._queryCellCircle,c,u,r),o?c.length>0:c},Ht.prototype.query=function(t,e,i,o,r){return this._query(t,e,i,o,!1,r)},Ht.prototype.hitTest=function(t,e,i,o,r){return this._query(t,e,i,o,!0,r)},Ht.prototype.hitTestCircle=function(t,e,i,o){return this._queryCircle(t,e,i,!0,o)},Ht.prototype._queryCell=function(t,e,i,o,r,a,n,s){var l=n.seenUids,c=this.boxCells[r];if(null!==c)for(var u=this.bboxes,h=0,p=c;h=u[_+0]&&o>=u[_+1]&&(!s||s(this.boxKeys[d]))){if(n.hitTest)return a.push(!0),!0;a.push({key:this.boxKeys[d],x1:u[_],y1:u[_+1],x2:u[_+2],y2:u[_+3]});}}}var f=this.circleCells[r];if(null!==f)for(var m=this.circles,g=0,v=f;gn*n+s*s},Ht.prototype._circleAndRectCollide=function(t,e,i,o,r,a,n){var s=(a-o)/2,l=Math.abs(t-(o+s));if(l>s+i)return !1;var c=(n-r)/2,u=Math.abs(e-(r+c));if(u>c+i)return !1;if(l<=s||u<=c)return !0;var h=l-s,p=u-c;return h*h+p*p<=i*i};var ae=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function ne(t,e){for(var i=0;iS)ce(e,P,!1);else{var R=this.projectPoint(c,z,L),A=D*T;if(_.length>0){var k=R.x-_[_.length-4],B=R.y-_[_.length-3];if(A*A*2>k*k+B*B)if(P+8-C&&O=this.screenRightBoundary||o<100||e>this.screenBottomBoundary},le.prototype.isInsideGrid=function(t,e,i,o){return i>=0&&t=0&&e0)return this.prevPlacement&&this.prevPlacement.variableOffsets[h.crossTileID]&&this.prevPlacement.placements[h.crossTileID]&&this.prevPlacement.placements[h.crossTileID].text&&(_=this.prevPlacement.variableOffsets[h.crossTileID].anchor),this.variableOffsets[h.crossTileID]={textOffset:f,width:i,height:o,anchor:t,textBoxScale:r,prevAnchor:_},this.markUsedJustification(p,t,h,d),p.allowVerticalPlacement&&(this.markUsedOrientation(p,d,h),this.placedOrientations[h.crossTileID]=d),{shift:m,placedGlyphBoxes:g}},ve.prototype.placeLayerBucket=function(e,i,o,r,a,n,s,l,c,u){var h=this,p=e.layers[0].layout,d=t.evaluateSizeForZoom(e.textSizeData,this.transform.zoom),_=p.get("text-optional"),f=p.get("icon-optional"),m=p.get("text-allow-overlap"),g=p.get("icon-allow-overlap"),v=m&&(g||!e.hasIconData()||f),y=g&&(m||!e.hasTextData()||_),x=this.collisionGroups.get(e.sourceID),b="map"===p.get("text-rotation-alignment"),w="map"===p.get("text-pitch-alignment"),E="none"!==p.get("icon-text-fit"),T="viewport-y"===p.get("symbol-z-order");!e.collisionArrays&&u&&e.deserializeCollisionBoxes(u);var I=function(r,u){if(!c[r.crossTileID])if(l)h.placements[r.crossTileID]=new de(!1,!1,!1);else{var g,T=!1,I=!1,C=!0,S=null,P={box:null,offscreen:null},z={box:null,offscreen:null},L=null,D=null,M=0,R=0,A=0;u.textFeatureIndex&&(M=u.textFeatureIndex),u.verticalTextFeatureIndex&&(R=u.verticalTextFeatureIndex);var k=u.textBox;if(k){var B=function(i){var o=t.WritingMode.horizontal;if(e.allowVerticalPlacement&&!i&&h.prevPlacement){var a=h.prevPlacement.placedOrientations[r.crossTileID];a&&(h.placedOrientations[r.crossTileID]=a,o=a,h.markUsedOrientation(e,o,r));}return o},O=function(i,o){if(e.allowVerticalPlacement&&r.numVerticalGlyphVertices>0&&u.verticalTextBox)for(var a=0,n=e.writingModes;a0&&(F=F.filter((function(t){return t!==U.anchor}))).unshift(U.anchor);}var N=function(t,o){for(var a=t.x2-t.x1,s=t.y2-t.y1,l=r.textBoxScale,c={box:[],offscreen:!1},u=m?2*F.length:F.length,p=0;p=F.length,f=h.attemptAnchorPlacement(d,t,a,s,l,b,w,n,i,x,_,r,e,o);if(f&&(c=f.placedGlyphBoxes)&&c.box&&c.box.length){T=!0,S=f.shift;break}}return c};O((function(){return N(k,t.WritingMode.horizontal)}),(function(){var i=u.verticalTextBox,o=P&&P.box&&P.box.length;return e.allowVerticalPlacement&&!o&&r.numVerticalGlyphVertices>0&&i?N(i,t.WritingMode.vertical):{box:null,offscreen:null}})),P&&(T=P.box,C=P.offscreen);var Z=B(P&&P.box);if(!T&&h.prevPlacement){var V=h.prevPlacement.variableOffsets[r.crossTileID];V&&(h.variableOffsets[r.crossTileID]=V,h.markUsedJustification(e,V.anchor,r,Z));}}else{var q=function(t,o){var a=h.collisionIndex.placeCollisionBox(t,p.get("text-allow-overlap"),n,i,x.predicate);return a&&a.box&&a.box.length&&(h.markUsedOrientation(e,o,r),h.placedOrientations[r.crossTileID]=o),a};O((function(){return q(k,t.WritingMode.horizontal)}),(function(){var i=u.verticalTextBox;return e.allowVerticalPlacement&&r.numVerticalGlyphVertices>0&&i?q(i,t.WritingMode.vertical):{box:null,offscreen:null}})),B(P&&P.box&&P.box.length);}}T=(g=P)&&g.box&&g.box.length>0,C=g&&g.offscreen;var j=u.textCircles;if(j){var G=e.text.placedSymbolArray.get(r.centerJustifiedTextSymbolIndex),W=t.evaluateSizeForFeature(e.textSizeData,d,G);L=h.collisionIndex.placeCollisionCircles(j,p.get("text-allow-overlap"),a,n,G,e.lineVertexArray,e.glyphOffsetArray,W,i,o,s,w,x.predicate),T=p.get("text-allow-overlap")||L.circles.length>0,C=C&&L.offscreen;}if(u.iconFeatureIndex&&(A=u.iconFeatureIndex),u.iconBox){var X=E&&S?ge(u.iconBox,S.x,S.y,b,w,h.transform.angle):u.iconBox;I=(D=h.collisionIndex.placeCollisionBox(X,p.get("icon-allow-overlap"),n,i,x.predicate)).box.length>0,C=C&&D.offscreen;}var H=_||0===r.numHorizontalGlyphVertices&&0===r.numVerticalGlyphVertices,K=f||0===r.numIconVertices;H||K?K?H||(I=I&&T):T=I&&T:I=T=I&&T,T&&g&&g.box&&(z&&z.box&&R?h.collisionIndex.insertCollisionBox(g.box,p.get("text-ignore-placement"),e.bucketInstanceId,R,x.ID):h.collisionIndex.insertCollisionBox(g.box,p.get("text-ignore-placement"),e.bucketInstanceId,M,x.ID)),I&&D&&h.collisionIndex.insertCollisionBox(D.box,p.get("icon-ignore-placement"),e.bucketInstanceId,A,x.ID),T&&L&&h.collisionIndex.insertCollisionCircles(L.circles,p.get("text-ignore-placement"),e.bucketInstanceId,M,x.ID),h.placements[r.crossTileID]=new de(T||v,I||y,C||e.justReloaded),c[r.crossTileID]=!0;}};if(T)for(var C=e.getSortedSymbolIndexes(this.transform.angle),S=C.length-1;S>=0;--S){var P=C[S];I(e.symbolInstances.get(P),e.collisionArrays[P]);}else for(var z=0;z=0&&(e.text.placedSymbolArray.get(c).crossTileID=a>=0&&c!==a?0:o.crossTileID);}},ve.prototype.markUsedOrientation=function(e,i,o){for(var r=i===t.WritingMode.horizontal||i===t.WritingMode.horizontalOnly?i:0,a=i===t.WritingMode.vertical?i:0,n=0,s=[o.leftJustifiedTextSymbolIndex,o.centerJustifiedTextSymbolIndex,o.rightJustifiedTextSymbolIndex];n0||m>0,b=_.numIconVertices>0;if(x){for(var w=Se(y.text),E=(f+m)/4,T=0;T=0&&(e.text.placedSymbolArray.get(t).hidden=I||P);})),_.verticalPlacedTextSymbolIndex>=0&&(e.text.placedSymbolArray.get(_.verticalPlacedTextSymbolIndex).hidden=I||S);var z=this.variableOffsets[_.crossTileID];z&&this.markUsedJustification(e,z.anchor,_,C);var L=this.placedOrientations[_.crossTileID];L&&(this.markUsedJustification(e,"left",_,L),this.markUsedOrientation(e,L,_));}if(b){for(var D=Se(y.icon),M=0;M<_.numIconVertices/4;M++)e.icon.opacityVertexArray.emplaceBack(D);e.icon.placedSymbolArray.get(d).hidden=y.icon.isHidden();}if(e.hasIconCollisionBoxData()||e.hasIconCollisionCircleData()||e.hasTextCollisionBoxData()||e.hasTextCollisionCircleData()){var R=e.collisionArrays[d];if(R){var A=new t.Point(0,0);if(R.textBox){var k=!0;if(l){var B=this.variableOffsets[g];B?(A=me(B.anchor,B.width,B.height,B.textOffset,B.textBoxScale),c&&A._rotate(u?this.transform.angle:-this.transform.angle)):k=!1;}ye(e.textCollisionBox.collisionVertexArray,y.text.placed,!k,A.x,A.y);}R.iconBox&&ye(e.iconCollisionBox.collisionVertexArray,y.icon.placed,!1,h?A.x:0,h?A.y:0);var O=R.textCircles;if(O&&e.hasTextCollisionCircleData())for(var F=0;Ft},ve.prototype.setStale=function(){this.stale=!0;};var xe=Math.pow(2,25),be=Math.pow(2,24),we=Math.pow(2,17),Ee=Math.pow(2,16),Te=Math.pow(2,9),Ie=Math.pow(2,8),Ce=Math.pow(2,1);function Se(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;var e=t.placed?1:0,i=Math.floor(127*t.opacity);return i*xe+e*be+i*we+e*Ee+i*Te+e*Ie+i*Ce+e}var Pe=function(){this._currentTileIndex=0,this._seenCrossTileIDs={};};Pe.prototype.continuePlacement=function(t,e,i,o,r){for(;this._currentTileIndex2};this._currentPlacementIndex>=0;){var s=i[e[this._currentPlacementIndex]],l=this.placement.collisionIndex.transform.zoom;if("symbol"===s.type&&(!s.minzoom||s.minzoom<=l)&&(!s.maxzoom||s.maxzoom>l)){if(this._inProgressLayer||(this._inProgressLayer=new Pe),this._inProgressLayer.continuePlacement(o[s.source],this.placement,this._showCollisionBoxes,s,n))return;delete this._inProgressLayer;}this._currentPlacementIndex--;}this._done=!0;},ze.prototype.commit=function(t){return this.placement.commit(t),this.placement};var Le=512/t.EXTENT/2,De=function(t,e,i){this.tileID=t,this.indexedSymbolInstances={},this.bucketInstanceId=i;for(var o=0;ot.overscaledZ)for(var s in n){var l=n[s];l.tileID.isChildOf(t)&&l.findMatches(e.symbolInstances,t,r);}else{var c=n[t.scaledTo(Number(a)).key];c&&c.findMatches(e.symbolInstances,t,r);}}for(var u=0;u1?"@2x":"",l=t.getJSON(i.transformRequest(i.normalizeSpriteURL(e,s,".json"),t.ResourceType.SpriteJSON),(function(t,e){l=null,n||(n=t,r=e,u());})),c=t.getImage(i.transformRequest(i.normalizeSpriteURL(e,s,".png"),t.ResourceType.SpriteImage),(function(t,e){c=null,n||(n=t,a=e,u());}));function u(){if(n)o(n);else if(r&&a){var e=t.browser.getImageData(a),i={};for(var s in r){var l=r[s],c=l.width,u=l.height,h=l.x,p=l.y,d=l.sdf,_=l.pixelRatio,f=new t.RGBAImage({width:c,height:u});t.RGBAImage.copy(e,f,{x:h,y:p},{x:0,y:0},{width:c,height:u}),i[s]={data:f,pixelRatio:_,sdf:d};}o(null,i);}}return {cancel:function(){l&&(l.cancel(),l=null),c&&(c.cancel(),c=null);}}}(e.sprite,this.map._requestManager,(function(e,i){if(o._spriteRequest=null,e)o.fire(new t.ErrorEvent(e));else if(i)for(var r in i)o.imageManager.addImage(r,i[r]);o.imageManager.setLoaded(!0),o.dispatcher.broadcast("setImages",o.imageManager.listImages()),o.fire(new t.Event("data",{dataType:"style"}));})):this.imageManager.setLoaded(!0),this.glyphManager.setURL(e.glyphs);var a=Ft(this.stylesheet.layers);this._order=a.map((function(t){return t.id})),this._layers={};for(var n=0,s=a;n0)throw new Error("Unimplemented: "+r.map((function(t){return t.command})).join(", ")+".");return o.forEach((function(t){"setTransition"!==t.command&&i[t.command].apply(i,t.args);})),this.stylesheet=e,!0},i.prototype.addImage=function(e,i){if(this.getImage(e))return this.fire(new t.ErrorEvent(new Error("An image with this name already exists.")));this.imageManager.addImage(e,i),this.fire(new t.Event("data",{dataType:"style"}));},i.prototype.updateImage=function(t,e){this.imageManager.updateImage(t,e);},i.prototype.getImage=function(t){return this.imageManager.getImage(t)},i.prototype.removeImage=function(e){if(!this.getImage(e))return this.fire(new t.ErrorEvent(new Error("No image with this name exists.")));this.imageManager.removeImage(e),this.fire(new t.Event("data",{dataType:"style"}));},i.prototype.listImages=function(){return this._checkLoaded(),this.imageManager.listImages()},i.prototype.addSource=function(e,i,o){var r=this;if(void 0===o&&(o={}),this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!i.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(i).join(", ")+".");if(!(["vector","raster","geojson","video","image"].indexOf(i.type)>=0)||!this._validate(t.validateStyle.source,"sources."+e,i,null,o)){this.map&&this.map._collectResourceTiming&&(i.collectResourceTiming=!0);var a=this.sourceCaches[e]=new Lt(e,i,this.dispatcher);a.style=this,a.setEventedParent(this,(function(){return {isSourceLoaded:r.loaded(),source:a.serialize(),sourceId:e}})),a.onAdd(this.map),this._changed=!0;}},i.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");for(var i in this._layers)if(this._layers[i].source===e)return this.fire(new t.ErrorEvent(new Error('Source "'+e+'" cannot be removed while layer "'+i+'" is using it.')));var o=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],o.fire(new t.Event("data",{sourceDataType:"metadata",dataType:"source",sourceId:e})),o.setEventedParent(null),o.clearTiles(),o.onRemove&&o.onRemove(this.map),this._changed=!0;},i.prototype.setGeoJSONSourceData=function(t,e){this._checkLoaded(),this.sourceCaches[t].getSource().setData(e),this._changed=!0;},i.prototype.getSource=function(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()},i.prototype.addLayer=function(e,i,o){void 0===o&&(o={}),this._checkLoaded();var r=e.id;if(this.getLayer(r))this.fire(new t.ErrorEvent(new Error('Layer with id "'+r+'" already exists on this map')));else{var a;if("custom"===e.type){if(ke(this,t.validateCustomStyleLayer(e)))return;a=t.createStyleLayer(e);}else{if("object"==typeof e.source&&(this.addSource(r,e.source),e=t.clone$1(e),e=t.extend(e,{source:r})),this._validate(t.validateStyle.layer,"layers."+r,e,{arrayIndex:-1},o))return;a=t.createStyleLayer(e),this._validateLayer(a),a.setEventedParent(this,{layer:{id:r}});}var n=i?this._order.indexOf(i):this._order.length;if(i&&-1===n)this.fire(new t.ErrorEvent(new Error('Layer with id "'+i+'" does not exist on this map.')));else{if(this._order.splice(n,0,r),this._layerOrderChanged=!0,this._layers[r]=a,this._removedLayers[r]&&a.source&&"custom"!==a.type){var s=this._removedLayers[r];delete this._removedLayers[r],s.type!==a.type?this._updatedSources[a.source]="clear":(this._updatedSources[a.source]="reload",this.sourceCaches[a.source].pause());}this._updateLayer(a),a.onAdd&&a.onAdd(this.map);}}},i.prototype.moveLayer=function(e,i){if(this._checkLoaded(),this._changed=!0,this._layers[e]){if(e!==i){var o=this._order.indexOf(e);this._order.splice(o,1);var r=i?this._order.indexOf(i):this._order.length;i&&-1===r?this.fire(new t.ErrorEvent(new Error('Layer with id "'+i+'" does not exist on this map.'))):(this._order.splice(r,0,e),this._layerOrderChanged=!0);}}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be moved.")));},i.prototype.removeLayer=function(e){this._checkLoaded();var i=this._layers[e];if(i){i.setEventedParent(null);var o=this._order.indexOf(e);this._order.splice(o,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[e]=i,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e],i.onRemove&&i.onRemove(this.map);}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be removed.")));},i.prototype.getLayer=function(t){return this._layers[t]},i.prototype.setLayerZoomRange=function(e,i,o){this._checkLoaded();var r=this.getLayer(e);r?r.minzoom===i&&r.maxzoom===o||(null!=i&&(r.minzoom=i),null!=o&&(r.maxzoom=o),this._updateLayer(r)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot have zoom extent.")));},i.prototype.setFilter=function(e,i,o){void 0===o&&(o={}),this._checkLoaded();var r=this.getLayer(e);if(r){if(!t.deepEqual(r.filter,i))return null==i?(r.filter=void 0,void this._updateLayer(r)):void(this._validate(t.validateStyle.filter,"layers."+r.id+".filter",i,null,o)||(r.filter=t.clone$1(i),this._updateLayer(r)))}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be filtered.")));},i.prototype.getFilter=function(e){return t.clone$1(this.getLayer(e).filter)},i.prototype.setLayoutProperty=function(e,i,o,r){void 0===r&&(r={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getLayoutProperty(i),o)||(a.setLayoutProperty(i,o,r),this._updateLayer(a)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")));},i.prototype.getLayoutProperty=function(e,i){var o=this.getLayer(e);if(o)return o.getLayoutProperty(i);this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style.")));},i.prototype.setPaintProperty=function(e,i,o,r){void 0===r&&(r={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getPaintProperty(i),o)||(a.setPaintProperty(i,o,r)&&this._updateLayer(a),this._changed=!0,this._updatedPaintProps[e]=!0):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")));},i.prototype.getPaintProperty=function(t,e){return this.getLayer(t).getPaintProperty(e)},i.prototype.setFeatureState=function(e,i){this._checkLoaded();var o=e.source,r=e.sourceLayer,a=this.sourceCaches[o],n=parseInt(e.id,10);if(void 0!==a){var s=a.getSource().type;"geojson"===s&&r?this.fire(new t.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))):"vector"!==s||r?isNaN(n)||n<0?this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided and non-negative."))):a.setFeatureState(r,n,i):this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));}else this.fire(new t.ErrorEvent(new Error("The source '"+o+"' does not exist in the map's style.")));},i.prototype.removeFeatureState=function(e,i){this._checkLoaded();var o=e.source,r=this.sourceCaches[o];if(void 0!==r){var a=r.getSource().type,n="vector"===a?e.sourceLayer:void 0,s=parseInt(e.id,10);"vector"!==a||n?void 0!==e.id&&isNaN(s)||s<0?this.fire(new t.ErrorEvent(new Error("The feature id parameter must be non-negative."))):i&&"string"!=typeof e.id&&"number"!=typeof e.id?this.fire(new t.ErrorEvent(new Error("A feature id is requred to remove its specific state property."))):r.removeFeatureState(n,s,i):this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));}else this.fire(new t.ErrorEvent(new Error("The source '"+o+"' does not exist in the map's style.")));},i.prototype.getFeatureState=function(e){this._checkLoaded();var i=e.source,o=e.sourceLayer,r=this.sourceCaches[i],a=parseInt(e.id,10);if(void 0!==r)if("vector"!==r.getSource().type||o){if(!(isNaN(a)||a<0))return r.getFeatureState(o,a);this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided and non-negative.")));}else this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));else this.fire(new t.ErrorEvent(new Error("The source '"+i+"' does not exist in the map's style.")));},i.prototype.getTransition=function(){return t.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},i.prototype.serialize=function(){return t.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t.mapObject(this.sourceCaches,(function(t){return t.serialize()})),layers:this._serializeLayers(this._order)},(function(t){return void 0!==t}))},i.prototype._updateLayer=function(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&(this._updatedSources[t.source]="reload",this.sourceCaches[t.source].pause()),this._changed=!0;},i.prototype._flattenAndSortRenderedFeatures=function(t){for(var e=this,i=function(t){return "fill-extrusion"===e._layers[t].type},o={},r=[],a=this._order.length-1;a>=0;a--){var n=this._order[a];if(i(n)){o[n]=a;for(var s=0,l=t;s=0;_--){var f=this._order[_];if(i(f))for(var m=r.length-1;m>=0;m--){var g=r[m].feature;if(o[g.layer.id]<_)break;d.push(g),r.pop();}else for(var v=0,y=t;v 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}","attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"),He=hi("uniform float u_overscale_factor;varying float v_placed;varying float v_notUsed;varying float v_radius;varying vec2 v_extrude;varying vec2 v_extrude_scale;void main() {float alpha=0.5;vec4 color=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {color=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {color*=.2;}float extrude_scale_length=length(v_extrude_scale);float extrude_length=length(v_extrude)*extrude_scale_length;float stroke_width=15.0*extrude_scale_length/u_overscale_factor;float radius=v_radius*extrude_scale_length;float distance_to_edge=abs(extrude_length-radius);float opacity_t=smoothstep(-stroke_width,0.0,-distance_to_edge);gl_FragColor=opacity_t*color;}","attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;varying float v_radius;varying vec2 v_extrude;varying vec2 v_extrude_scale;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);highp float padding_factor=1.2;gl_Position.xy+=a_extrude*u_extrude_scale*padding_factor*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;v_radius=abs(a_extrude.y);v_extrude=a_extrude*padding_factor;v_extrude_scale=u_extrude_scale*u_camera_to_center_distance*collision_perspective_ratio;}"),Ke=hi("uniform highp vec4 u_color;void main() {gl_FragColor=u_color;}","attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),Je=hi("#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),Ye=hi("varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),Qe=hi("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec4 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float pixelRatio=u_scale.x;float tileRatio=u_scale.y;float fromScale=u_scale.z;float toScale=u_scale.w;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=vec2((pattern_br_a.x-pattern_tl_a.x)/pixelRatio,(pattern_br_a.y-pattern_tl_a.y)/pixelRatio);vec2 display_size_b=vec2((pattern_br_b.x-pattern_tl_b.x)/pixelRatio,(pattern_br_b.y-pattern_tl_b.y)/pixelRatio);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),$e=hi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec4 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float pixelRatio=u_scale.x;float tileZoomRatio=u_scale.y;float fromScale=u_scale.z;float toScale=u_scale.w;vec2 display_size_a=vec2((pattern_br_a.x-pattern_tl_a.x)/pixelRatio,(pattern_br_a.y-pattern_tl_a.y)/pixelRatio);vec2 display_size_b=vec2((pattern_br_b.x-pattern_tl_b.x)/pixelRatio,(pattern_br_b.y-pattern_tl_b.y)/pixelRatio);gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),ti=hi("varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),ei=hi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec4 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float pixelRatio=u_scale.x;float tileRatio=u_scale.y;float fromScale=u_scale.z;float toScale=u_scale.w;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=vec2((pattern_br_a.x-pattern_tl_a.x)/pixelRatio,(pattern_br_a.y-pattern_tl_a.y)/pixelRatio);vec2 display_size_b=vec2((pattern_br_b.x-pattern_tl_b.x)/pixelRatio,(pattern_br_b.y-pattern_tl_b.y)/pixelRatio);base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\n? a_pos\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),ii=hi("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform float u_maxzoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggeration=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/ pow(2.0,(u_zoom-u_maxzoom)*exaggeration+19.2562-u_zoom);gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),oi=hi("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\n#define PI 3.141592653589793\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),ri=hi("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),ai=hi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp float v_lineprogress;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,vec2(v_lineprogress,0.5));gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define MAX_LINE_DISTANCE 32767.0\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_lineprogress;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_lineprogress=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0/MAX_LINE_DISTANCE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),ni=hi("uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec4 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float pixelRatio=u_scale.x;float tileZoomRatio=u_scale.y;float fromScale=u_scale.z;float toScale=u_scale.w;vec2 display_size_a=vec2((pattern_br_a.x-pattern_tl_a.x)/pixelRatio,(pattern_br_a.y-pattern_tl_a.y)/pixelRatio);vec2 display_size_b=vec2((pattern_br_b.x-pattern_tl_b.x)/pixelRatio,(pattern_br_b.y-pattern_tl_b.y)/pixelRatio);vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x,1.0);float x_b=mod(v_linesofar/pattern_size_b.x,1.0);float y_a=0.5+(v_normal.y*clamp(v_width2.s,0.0,(pattern_size_a.y+2.0)/2.0)/pattern_size_a.y);float y_b=0.5+(v_normal.y*clamp(v_width2.s,0.0,(pattern_size_b.y+2.0)/2.0)/pattern_size_b.y);vec2 pos_a=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,vec2(x_a,y_a));vec2 pos_b=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,vec2(x_b,y_b));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);}"),si=hi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),li=hi("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),ci=hi("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size[0],a_size[1],u_size_t)/256.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size[0]/256.0;} else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {size=u_size;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}"),ui=hi("#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size[0],a_size[1],u_size_t)/256.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size[0]/256.0;} else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {size=u_size;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=vec2(tex.x,tex.y);v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}");function hi(t,e){var i=/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,o={};return {fragmentSource:t=t.replace(i,(function(t,e,i,r,a){return o[a]=!0,"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nvarying "+i+" "+r+" "+a+";\n#else\nuniform "+i+" "+r+" u_"+a+";\n#endif\n":"\n#ifdef HAS_UNIFORM_u_"+a+"\n "+i+" "+r+" "+a+" = u_"+a+";\n#endif\n"})),vertexSource:e=e.replace(i,(function(t,e,i,r,a){var n="float"===r?"vec2":"vec4",s=a.match(/color/)?"color":n;return o[a]?"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float u_"+a+"_t;\nattribute "+i+" "+n+" a_"+a+";\nvarying "+i+" "+r+" "+a+";\n#else\nuniform "+i+" "+r+" u_"+a+";\n#endif\n":"vec4"===s?"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+a+" = a_"+a+";\n#else\n "+i+" "+r+" "+a+" = u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+a+" = unpack_mix_"+s+"(a_"+a+", u_"+a+"_t);\n#else\n "+i+" "+r+" "+a+" = u_"+a+";\n#endif\n":"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float u_"+a+"_t;\nattribute "+i+" "+n+" a_"+a+";\n#else\nuniform "+i+" "+r+" u_"+a+";\n#endif\n":"vec4"===s?"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+i+" "+r+" "+a+" = a_"+a+";\n#else\n "+i+" "+r+" "+a+" = u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+i+" "+r+" "+a+" = unpack_mix_"+s+"(a_"+a+", u_"+a+"_t);\n#else\n "+i+" "+r+" "+a+" = u_"+a+";\n#endif\n"}))}}var pi=Object.freeze({prelude:Ne,background:Ze,backgroundPattern:Ve,circle:qe,clippingMask:je,heatmap:Ge,heatmapTexture:We,collisionBox:Xe,collisionCircle:He,debug:Ke,fill:Je,fillOutline:Ye,fillOutlinePattern:Qe,fillPattern:$e,fillExtrusion:ti,fillExtrusionPattern:ei,hillshadePrepare:ii,hillshade:oi,line:ri,lineGradient:ai,linePattern:ni,lineSDF:si,raster:li,symbolIcon:ci,symbolSDF:ui}),di=function(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null;};di.prototype.bind=function(t,e,i,o,r,a,n,s){this.context=t;for(var l=this.boundPaintVertexBuffers.length!==o.length,c=0;!l&&c>16,l>>16],u_pixel_coord_lower:[65535&s,65535&l]}}_i.prototype.draw=function(t,e,i,o,r,a,n,s,l,c,u,h,p,d,_,f){var m,g=t.gl;for(var v in t.program.set(this.program),t.setDepthMode(i),t.setStencilMode(o),t.setColorMode(r),t.setCullFace(a),this.fixedUniforms)this.fixedUniforms[v].set(n[v]);d&&d.setUniforms(t,this.binderUniforms,h,{zoom:p});for(var y=(m={},m[g.LINES]=2,m[g.TRIANGLES]=3,m[g.LINE_STRIP]=1,m)[e],x=0,b=u.get();x0?1-1/(1.001-n):-n),u_contrast_factor:(a=r.paint.get("raster-contrast"),a>0?1/(1-a):1+a),u_spin_weights:Ui(r.paint.get("raster-hue-rotate"))};var a,n;};function Ui(t){t*=Math.PI/180;var e=Math.sin(t),i=Math.cos(t);return [(2*i+1)/3,(-Math.sqrt(3)*e-i+1)/3,(Math.sqrt(3)*e-i+1)/3]}var Ni=function(t,e,i,o,r,a,n,s,l,c){var u=r.transform;return {u_is_size_zoom_constant:+("constant"===t||"source"===t),u_is_size_feature_constant:+("constant"===t||"camera"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:u.cameraToCenterDistance,u_pitch:u.pitch/360*2*Math.PI,u_rotate_symbol:+i,u_aspect_ratio:u.width/u.height,u_fade_change:r.options.fadeDuration?r.symbolFadeChange:1,u_matrix:a,u_label_plane_matrix:n,u_coord_matrix:s,u_is_text:+l,u_pitch_with_map:+o,u_texsize:c,u_texture:0}},Zi=function(e,i,o,r,a,n,s,l,c,u,h){var p=a.transform;return t.extend(Ni(e,i,o,r,a,n,s,l,c,u),{u_gamma_scale:r?Math.cos(p._pitch)*p.cameraToCenterDistance:1,u_device_pixel_ratio:t.browser.devicePixelRatio,u_is_halo:+h})},Vi=function(t,e,i){return {u_matrix:t,u_opacity:e,u_color:i}},qi=function(e,i,o,r,a,n){return t.extend(function(t,e,i,o){var r=i.imageManager.getPattern(t.from.toString()),a=i.imageManager.getPattern(t.to.toString()),n=i.imageManager.getPixelSize(),s=n.width,l=n.height,c=Math.pow(2,o.tileID.overscaledZ),u=o.tileSize*Math.pow(2,i.transform.tileZoom)/c,h=u*(o.tileID.canonical.x+o.tileID.wrap*c),p=u*o.tileID.canonical.y;return {u_image:0,u_pattern_tl_a:r.tl,u_pattern_br_a:r.br,u_pattern_tl_b:a.tl,u_pattern_br_b:a.br,u_texsize:[s,l],u_mix:e.t,u_pattern_size_a:r.displaySize,u_pattern_size_b:a.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/ue(o,1,i.transform.tileZoom),u_pixel_coord_upper:[h>>16,p>>16],u_pixel_coord_lower:[65535&h,65535&p]}}(r,n,o,a),{u_matrix:e,u_opacity:i})},ji={fillExtrusion:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_lightpos:new t.Uniform3f(e,i.u_lightpos),u_lightintensity:new t.Uniform1f(e,i.u_lightintensity),u_lightcolor:new t.Uniform3f(e,i.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,i.u_vertical_gradient),u_opacity:new t.Uniform1f(e,i.u_opacity)}},fillExtrusionPattern:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_lightpos:new t.Uniform3f(e,i.u_lightpos),u_lightintensity:new t.Uniform1f(e,i.u_lightintensity),u_lightcolor:new t.Uniform3f(e,i.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,i.u_vertical_gradient),u_height_factor:new t.Uniform1f(e,i.u_height_factor),u_image:new t.Uniform1i(e,i.u_image),u_texsize:new t.Uniform2f(e,i.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,i.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,i.u_pixel_coord_lower),u_scale:new t.Uniform4f(e,i.u_scale),u_fade:new t.Uniform1f(e,i.u_fade),u_opacity:new t.Uniform1f(e,i.u_opacity)}},fill:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix)}},fillPattern:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_image:new t.Uniform1i(e,i.u_image),u_texsize:new t.Uniform2f(e,i.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,i.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,i.u_pixel_coord_lower),u_scale:new t.Uniform4f(e,i.u_scale),u_fade:new t.Uniform1f(e,i.u_fade)}},fillOutline:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_world:new t.Uniform2f(e,i.u_world)}},fillOutlinePattern:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_world:new t.Uniform2f(e,i.u_world),u_image:new t.Uniform1i(e,i.u_image),u_texsize:new t.Uniform2f(e,i.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,i.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,i.u_pixel_coord_lower),u_scale:new t.Uniform4f(e,i.u_scale),u_fade:new t.Uniform1f(e,i.u_fade)}},circle:function(e,i){return {u_camera_to_center_distance:new t.Uniform1f(e,i.u_camera_to_center_distance),u_scale_with_map:new t.Uniform1i(e,i.u_scale_with_map),u_pitch_with_map:new t.Uniform1i(e,i.u_pitch_with_map),u_extrude_scale:new t.Uniform2f(e,i.u_extrude_scale),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_matrix:new t.UniformMatrix4f(e,i.u_matrix)}},collisionBox:Ei,collisionCircle:Ei,debug:function(e,i){return {u_color:new t.UniformColor(e,i.u_color),u_matrix:new t.UniformMatrix4f(e,i.u_matrix)}},clippingMask:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix)}},heatmap:function(e,i){return {u_extrude_scale:new t.Uniform1f(e,i.u_extrude_scale),u_intensity:new t.Uniform1f(e,i.u_intensity),u_matrix:new t.UniformMatrix4f(e,i.u_matrix)}},heatmapTexture:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_world:new t.Uniform2f(e,i.u_world),u_image:new t.Uniform1i(e,i.u_image),u_color_ramp:new t.Uniform1i(e,i.u_color_ramp),u_opacity:new t.Uniform1f(e,i.u_opacity)}},hillshade:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_image:new t.Uniform1i(e,i.u_image),u_latrange:new t.Uniform2f(e,i.u_latrange),u_light:new t.Uniform2f(e,i.u_light),u_shadow:new t.UniformColor(e,i.u_shadow),u_highlight:new t.UniformColor(e,i.u_highlight),u_accent:new t.UniformColor(e,i.u_accent)}},hillshadePrepare:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_image:new t.Uniform1i(e,i.u_image),u_dimension:new t.Uniform2f(e,i.u_dimension),u_zoom:new t.Uniform1f(e,i.u_zoom),u_maxzoom:new t.Uniform1f(e,i.u_maxzoom),u_unpack:new t.Uniform4f(e,i.u_unpack)}},line:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_ratio:new t.Uniform1f(e,i.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,i.u_units_to_pixels)}},lineGradient:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_ratio:new t.Uniform1f(e,i.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,i.u_units_to_pixels),u_image:new t.Uniform1i(e,i.u_image)}},linePattern:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_texsize:new t.Uniform2f(e,i.u_texsize),u_ratio:new t.Uniform1f(e,i.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_image:new t.Uniform1i(e,i.u_image),u_units_to_pixels:new t.Uniform2f(e,i.u_units_to_pixels),u_scale:new t.Uniform4f(e,i.u_scale),u_fade:new t.Uniform1f(e,i.u_fade)}},lineSDF:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_ratio:new t.Uniform1f(e,i.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,i.u_units_to_pixels),u_patternscale_a:new t.Uniform2f(e,i.u_patternscale_a),u_patternscale_b:new t.Uniform2f(e,i.u_patternscale_b),u_sdfgamma:new t.Uniform1f(e,i.u_sdfgamma),u_image:new t.Uniform1i(e,i.u_image),u_tex_y_a:new t.Uniform1f(e,i.u_tex_y_a),u_tex_y_b:new t.Uniform1f(e,i.u_tex_y_b),u_mix:new t.Uniform1f(e,i.u_mix)}},raster:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_tl_parent:new t.Uniform2f(e,i.u_tl_parent),u_scale_parent:new t.Uniform1f(e,i.u_scale_parent),u_buffer_scale:new t.Uniform1f(e,i.u_buffer_scale),u_fade_t:new t.Uniform1f(e,i.u_fade_t),u_opacity:new t.Uniform1f(e,i.u_opacity),u_image0:new t.Uniform1i(e,i.u_image0),u_image1:new t.Uniform1i(e,i.u_image1),u_brightness_low:new t.Uniform1f(e,i.u_brightness_low),u_brightness_high:new t.Uniform1f(e,i.u_brightness_high),u_saturation_factor:new t.Uniform1f(e,i.u_saturation_factor),u_contrast_factor:new t.Uniform1f(e,i.u_contrast_factor),u_spin_weights:new t.Uniform3f(e,i.u_spin_weights)}},symbolIcon:function(e,i){return {u_is_size_zoom_constant:new t.Uniform1i(e,i.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,i.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,i.u_size_t),u_size:new t.Uniform1f(e,i.u_size),u_camera_to_center_distance:new t.Uniform1f(e,i.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,i.u_pitch),u_rotate_symbol:new t.Uniform1i(e,i.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,i.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,i.u_fade_change),u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,i.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,i.u_coord_matrix),u_is_text:new t.Uniform1f(e,i.u_is_text),u_pitch_with_map:new t.Uniform1i(e,i.u_pitch_with_map),u_texsize:new t.Uniform2f(e,i.u_texsize),u_texture:new t.Uniform1i(e,i.u_texture)}},symbolSDF:function(e,i){return {u_is_size_zoom_constant:new t.Uniform1i(e,i.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,i.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,i.u_size_t),u_size:new t.Uniform1f(e,i.u_size),u_camera_to_center_distance:new t.Uniform1f(e,i.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,i.u_pitch),u_rotate_symbol:new t.Uniform1i(e,i.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,i.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,i.u_fade_change),u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,i.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,i.u_coord_matrix),u_is_text:new t.Uniform1f(e,i.u_is_text),u_pitch_with_map:new t.Uniform1i(e,i.u_pitch_with_map),u_texsize:new t.Uniform2f(e,i.u_texsize),u_texture:new t.Uniform1i(e,i.u_texture),u_gamma_scale:new t.Uniform1f(e,i.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,i.u_device_pixel_ratio),u_is_halo:new t.Uniform1f(e,i.u_is_halo)}},background:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_opacity:new t.Uniform1f(e,i.u_opacity),u_color:new t.UniformColor(e,i.u_color)}},backgroundPattern:function(e,i){return {u_matrix:new t.UniformMatrix4f(e,i.u_matrix),u_opacity:new t.Uniform1f(e,i.u_opacity),u_image:new t.Uniform1i(e,i.u_image),u_pattern_tl_a:new t.Uniform2f(e,i.u_pattern_tl_a),u_pattern_br_a:new t.Uniform2f(e,i.u_pattern_br_a),u_pattern_tl_b:new t.Uniform2f(e,i.u_pattern_tl_b),u_pattern_br_b:new t.Uniform2f(e,i.u_pattern_br_b),u_texsize:new t.Uniform2f(e,i.u_texsize),u_mix:new t.Uniform1f(e,i.u_mix),u_pattern_size_a:new t.Uniform2f(e,i.u_pattern_size_a),u_pattern_size_b:new t.Uniform2f(e,i.u_pattern_size_b),u_scale_a:new t.Uniform1f(e,i.u_scale_a),u_scale_b:new t.Uniform1f(e,i.u_scale_b),u_pixel_coord_upper:new t.Uniform2f(e,i.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,i.u_pixel_coord_lower),u_tile_units_to_pixels:new t.Uniform1f(e,i.u_tile_units_to_pixels)}}};function Gi(e,i){for(var o=e.sort((function(t,e){return t.tileID.isLessThan(e.tileID)?-1:e.tileID.isLessThan(t.tileID)?1:0})),r=0;r=0&&(f[g.associatedIconIndex]={shiftedAnchor:S,angle:P});}else ne(g.numGlyphs,d);}if(h){_.clear();for(var L=e.icon.placedSymbolArray,D=0;D0){var s=t.browser.now(),l=(s-e.timeAdded)/n,c=i?(s-i.timeAdded)/n:-1,u=o.getSource(),h=a.coveringZoomLevel({tileSize:u.tileSize,roundZoom:u.roundZoom}),p=!i||Math.abs(i.tileID.overscaledZ-h)>Math.abs(e.tileID.overscaledZ-h),d=p&&e.refreshedUponExpiration?1:t.clamp(p?l:1-c,0,1);return e.refreshedUponExpiration&&l>=1&&(e.refreshedUponExpiration=!1),i?{opacity:1,mix:1-d}:{opacity:d,mix:0}}return {opacity:1,mix:0}}function no(e,i,o){var r=e.context,a=r.gl,n=o.posMatrix,s=e.useProgram("debug"),l=It.disabled,c=Ct.disabled,u=e.colorModeForRenderPass(),h="$debug";s.draw(r,a.LINE_STRIP,l,c,u,Pt.disabled,Ii(n,t.Color.red),h,e.debugBuffer,e.tileBorderIndexBuffer,e.debugSegments);for(var p=i.getTileByID(o.key).latestRawTileData,d=p&&p.byteLength||0,_=Math.floor(d/1024),f=i.getTile(o).tileSize,m=512/Math.min(f,512),g=function(t,e,i,o){o=o||1;var r,a,n,s,l,c,u,h,p=[];for(r=0,a=t.length;r":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};var lo={symbol:function(e,i,o,r,a){if("translucent"===e.renderPass){var n=Ct.disabled,s=e.colorModeForRenderPass();o.layout.get("text-variable-anchor")&&function(e,i,o,r,a,n,s){for(var l=i.transform,c="map"===a,u="map"===n,h=0,p=e;he.y){var i=t;t=e,e=i;}return {x0:t.x,y0:t.y,x1:e.x,y1:e.y,dx:e.x-t.x,dy:e.y-t.y}}function ho(t,e,i,o,r){var a=Math.max(i,Math.floor(e.y0)),n=Math.min(o,Math.ceil(e.y1));if(t.x0===e.x0&&t.y0===e.y0?t.x0+e.dy/t.dy*t.dx0,h=e.dx<0,p=a;pl.dy&&(n=s,s=l,l=n),s.dy>c.dy&&(n=s,s=c,c=n),l.dy>c.dy&&(n=l,l=c,c=n),s.dy&&ho(c,s,o,r,a),l.dy&&ho(c,l,o,r,a);}co.prototype.resize=function(e,i){var o=this.context.gl;if(this.width=e*t.browser.devicePixelRatio,this.height=i*t.browser.devicePixelRatio,this.context.viewport.set([0,0,this.width,this.height]),this.style)for(var r=0,a=this.style._order;r256&&this.clearStencil(),i.setColorMode(St.disabled),i.setDepthMode(It.disabled);var r=this.useProgram("clippingMask");this._tileClippingMaskIDs={};for(var a=0,n=e;a256&&this.clearStencil();var t=this.nextStencilID++,e=this.context.gl;return new Ct({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)},co.prototype.stencilModeForClipping=function(t){var e=this.context.gl;return new Ct({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)},co.prototype.colorModeForRenderPass=function(){var e=this.context.gl;if(this._showOverdrawInspector){return new St([e.CONSTANT_COLOR,e.ONE],new t.Color(1/8,1/8,1/8,0),[!0,!0,!0,!0])}return "opaque"===this.renderPass?St.unblended:St.alphaBlended},co.prototype.depthModeForSublayer=function(t,e,i){if(!this.opaquePassEnabledForLayer())return It.disabled;var o=1-((1+this.currentLayer)*this.numSublayers+t)*this.depthEpsilon;return new It(i||this.context.gl.LEQUAL,e,[o,o])},co.prototype.opaquePassEnabledForLayer=function(){return this.currentLayer=0;this.currentLayer--){var C=this.style._layers[o[this.currentLayer]],S=r[C.source],P=s[C.source];this._renderTileClippingMasks(C,P),this.renderLayer(this,S,C,P);}for(this.renderPass="translucent",this.currentLayer=0;this.currentLayer0?e.pop():null},co.prototype.isPatternMissing=function(t){if(!t)return !1;var e=this.imageManager.getPattern(t.from.toString()),i=this.imageManager.getPattern(t.to.toString());return !e||!i},co.prototype.useProgram=function(t,e){void 0===e&&(e=this.emptyProgramConfiguration),this.cache=this.cache||{};var i=""+t+(e.cacheKey||"")+(this._showOverdrawInspector?"/overdraw":"");return this.cache[i]||(this.cache[i]=new _i(this.context,pi[t],e,ji[t],this._showOverdrawInspector)),this.cache[i]},co.prototype.setCustomLayerDefaults=function(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault();},co.prototype.setBaseState=function(){var t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD);};var _o=function(e,i,o){this.tileSize=512,this.maxValidLatitude=85.051129,this._renderWorldCopies=void 0===o||o,this._minZoom=e||0,this._maxZoom=i||22,this.setMaxBounds(),this.width=0,this.height=0,this._center=new t.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._posMatrixCache={},this._alignedPosMatrixCache={};},fo={minZoom:{configurable:!0},maxZoom:{configurable:!0},renderWorldCopies:{configurable:!0},worldSize:{configurable:!0},centerPoint:{configurable:!0},size:{configurable:!0},bearing:{configurable:!0},pitch:{configurable:!0},fov:{configurable:!0},zoom:{configurable:!0},center:{configurable:!0},unmodified:{configurable:!0},point:{configurable:!0}};_o.prototype.clone=function(){var t=new _o(this._minZoom,this._maxZoom,this._renderWorldCopies);return t.tileSize=this.tileSize,t.latRange=this.latRange,t.width=this.width,t.height=this.height,t._center=this._center,t.zoom=this.zoom,t.angle=this.angle,t._fov=this._fov,t._pitch=this._pitch,t._unmodified=this._unmodified,t._calcMatrices(),t},fo.minZoom.get=function(){return this._minZoom},fo.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t));},fo.maxZoom.get=function(){return this._maxZoom},fo.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t));},fo.renderWorldCopies.get=function(){return this._renderWorldCopies},fo.renderWorldCopies.set=function(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t;},fo.worldSize.get=function(){return this.tileSize*this.scale},fo.centerPoint.get=function(){return this.size._div(2)},fo.size.get=function(){return new t.Point(this.width,this.height)},fo.bearing.get=function(){return -this.angle/Math.PI*180},fo.bearing.set=function(e){var i=-t.wrap(e,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=t.create$2(),t.rotate(this.rotationMatrix,this.rotationMatrix,this.angle));},fo.pitch.get=function(){return this._pitch/Math.PI*180},fo.pitch.set=function(e){var i=t.clamp(e,0,60)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices());},fo.fov.get=function(){return this._fov/Math.PI*180},fo.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices());},fo.zoom.get=function(){return this._zoom},fo.zoom.set=function(t){var e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom,this._constrain(),this._calcMatrices());},fo.center.get=function(){return this._center},fo.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices());},_o.prototype.coveringZoomLevel=function(t){return (t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},_o.prototype.getVisibleUnwrappedCoordinates=function(e){var i=[new t.UnwrappedTileID(0,e)];if(this._renderWorldCopies)for(var o=this.pointCoordinate(new t.Point(0,0)),r=this.pointCoordinate(new t.Point(this.width,0)),a=this.pointCoordinate(new t.Point(this.width,this.height)),n=this.pointCoordinate(new t.Point(0,this.height)),s=Math.floor(Math.min(o.x,r.x,a.x,n.x)),l=Math.floor(Math.max(o.x,r.x,a.x,n.x)),c=s-1;c<=l+1;c++)0!==c&&i.push(new t.UnwrappedTileID(c,e));return i},_o.prototype.coveringTiles=function(e){var i=this.coveringZoomLevel(e),o=i;if(void 0!==e.minzoom&&ie.maxzoom&&(i=e.maxzoom);var r=t.MercatorCoordinate.fromLngLat(this.center),a=Math.pow(2,i),n=new t.Point(a*r.x-.5,a*r.y-.5);return function(e,i,o,r){void 0===r&&(r=!0);var a=1<=0&&l<=a)for(c=i;cn&&(r=n-m);}if(this.lngRange){var g=d.x,v=c.x/2;g-vl&&(o=l-v);}void 0===o&&void 0===r||(this.center=this.unproject(new t.Point(void 0!==o?o:d.x,void 0!==r?r:d.y))),this._unmodified=u,this._constraining=!1;}},_o.prototype._calcMatrices=function(){if(this.height){this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;var e=this._fov/2,i=Math.PI/2+this._pitch,o=Math.sin(e)*this.cameraToCenterDistance/Math.sin(Math.PI-i-e),r=this.point,a=r.x,n=r.y,s=1.01*(Math.cos(Math.PI/2-this._pitch)*o+this.cameraToCenterDistance),l=this.height/50,c=new Float64Array(16);t.perspective(c,this._fov,this.width/this.height,l,s),t.scale(c,c,[1,-1,1]),t.translate(c,c,[0,0,-this.cameraToCenterDistance]),t.rotateX(c,c,this._pitch),t.rotateZ(c,c,this.angle),t.translate(c,c,[-a,-n,0]),this.mercatorMatrix=t.scale([],c,[this.worldSize,this.worldSize,this.worldSize]),t.scale(c,c,[1,1,t.mercatorZfromAltitude(1,this.center.lat)*this.worldSize,1]),this.projMatrix=c;var u=this.width%2/2,h=this.height%2/2,p=Math.cos(this.angle),d=Math.sin(this.angle),_=a-Math.round(a)+p*u+d*h,f=n-Math.round(n)+p*h+d*u,m=new Float64Array(c);if(t.translate(m,m,[_>.5?_-1:_,f>.5?f-1:f,0]),this.alignedProjMatrix=m,c=t.create(),t.scale(c,c,[this.width/2,-this.height/2,1]),t.translate(c,c,[1,-1,0]),this.labelPlaneMatrix=c,c=t.create(),t.scale(c,c,[1,-1,1]),t.translate(c,c,[-1,-1,0]),t.scale(c,c,[2/this.width,2/this.height,1]),this.glCoordMatrix=c,this.pixelMatrix=t.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),!(c=t.invert(new Float64Array(16),this.pixelMatrix)))throw new Error("failed to invert matrix");this.pixelMatrixInverse=c,this._posMatrixCache={},this._alignedPosMatrixCache={};}},_o.prototype.maxPitchScaleFactor=function(){if(!this.pixelMatrixInverse)return 1;var e=this.pointCoordinate(new t.Point(0,0)),i=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(i,i,this.pixelMatrix)[3]/this.cameraToCenterDistance},_o.prototype.getCameraPoint=function(){var e=this._pitch,i=Math.tan(e)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new t.Point(0,i))},_o.prototype.getCameraQueryGeometry=function(e){var i=this.getCameraPoint();if(1===e.length)return [e[0],i];for(var o=i.x,r=i.y,a=i.x,n=i.y,s=0,l=e;s=3&&(this._map.jumpTo({center:[+e[2],+e[1]],zoom:+e[0],bearing:+(e[3]||0),pitch:+(e[4]||0)}),!0)},mo.prototype._updateHashUnthrottled=function(){var e=this.getHashString();try{t.window.history.replaceState(t.window.history.state,"",e);}catch(t){}};var go=function(e){function o(o,r,a,n){void 0===n&&(n={});var s=i.mousePos(r.getCanvasContainer(),a),l=r.unproject(s);e.call(this,o,t.extend({point:s,lngLat:l,originalEvent:a},n)),this._defaultPrevented=!1,this.target=r;}e&&(o.__proto__=e),o.prototype=Object.create(e&&e.prototype),o.prototype.constructor=o;var r={defaultPrevented:{configurable:!0}};return o.prototype.preventDefault=function(){this._defaultPrevented=!0;},r.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(o.prototype,r),o}(t.Event),vo=function(e){function o(o,r,a){var n=i.touchPos(r.getCanvasContainer(),a),s=n.map((function(t){return r.unproject(t)})),l=n.reduce((function(t,e,i,o){return t.add(e.div(o.length))}),new t.Point(0,0)),c=r.unproject(l);e.call(this,o,{points:n,point:l,lngLats:s,lngLat:c,originalEvent:a}),this._defaultPrevented=!1;}e&&(o.__proto__=e),o.prototype=Object.create(e&&e.prototype),o.prototype.constructor=o;var r={defaultPrevented:{configurable:!0}};return o.prototype.preventDefault=function(){this._defaultPrevented=!0;},r.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(o.prototype,r),o}(t.Event),yo=function(t){function e(e,i,o){t.call(this,e,{originalEvent:o}),this._defaultPrevented=!1;}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={defaultPrevented:{configurable:!0}};return e.prototype.preventDefault=function(){this._defaultPrevented=!0;},i.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(e.prototype,i),e}(t.Event),xo=function(e){this._map=e,this._el=e.getCanvasContainer(),this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=1/450,t.bindAll(["_onWheel","_onTimeout","_onScrollFrame","_onScrollFinished"],this);};xo.prototype.setZoomRate=function(t){this._defaultZoomRate=t;},xo.prototype.setWheelZoomRate=function(t){this._wheelZoomRate=t;},xo.prototype.isEnabled=function(){return !!this._enabled},xo.prototype.isActive=function(){return !!this._active},xo.prototype.isZooming=function(){return !!this._zooming},xo.prototype.enable=function(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=t&&"center"===t.around);},xo.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1);},xo.prototype.onWheel=function(e){if(this.isEnabled()){var i=e.deltaMode===t.window.WheelEvent.DOM_DELTA_LINE?40*e.deltaY:e.deltaY,o=t.browser.now(),r=o-(this._lastWheelEventTime||0);this._lastWheelEventTime=o,0!==i&&i%4.000244140625==0?this._type="wheel":0!==i&&Math.abs(i)<4?this._type="trackpad":r>400?(this._type=null,this._lastValue=i,this._timeout=setTimeout(this._onTimeout,40,e)):this._type||(this._type=Math.abs(r*i)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,i+=this._lastValue)),e.shiftKey&&i&&(i/=4),this._type&&(this._lastWheelEvent=e,this._delta-=i,this.isActive()||this._start(e)),e.preventDefault();}},xo.prototype._onTimeout=function(t){this._type="wheel",this._delta-=this._lastValue,this.isActive()||this._start(t);},xo.prototype._start=function(e){if(this._delta){this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0,this._map.fire(new t.Event("movestart",{originalEvent:e})),this._map.fire(new t.Event("zoomstart",{originalEvent:e}))),this._finishTimeout&&clearTimeout(this._finishTimeout);var o=i.mousePos(this._el,e);this._around=t.LngLat.convert(this._aroundCenter?this._map.getCenter():this._map.unproject(o)),this._aroundPoint=this._map.transform.locationPoint(this._around),this._frameId||(this._frameId=this._map._requestRenderFrame(this._onScrollFrame));}},xo.prototype._onScrollFrame=function(){var e=this;if(this._frameId=null,this.isActive()){var i=this._map.transform;if(0!==this._delta){var o="wheel"===this._type&&Math.abs(this._delta)>4.000244140625?this._wheelZoomRate:this._defaultZoomRate,r=2/(1+Math.exp(-Math.abs(this._delta*o)));this._delta<0&&0!==r&&(r=1/r);var a="number"==typeof this._targetZoom?i.zoomScale(this._targetZoom):i.scale;this._targetZoom=Math.min(i.maxZoom,Math.max(i.minZoom,i.scaleZoom(a*r))),"wheel"===this._type&&(this._startZoom=i.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0;}var n="number"==typeof this._targetZoom?this._targetZoom:i.zoom,s=this._startZoom,l=this._easing,c=!1;if("wheel"===this._type&&s&&l){var u=Math.min((t.browser.now()-this._lastWheelEventTime)/200,1),h=l(u);i.zoom=t.number(s,n,h),u<1?this._frameId||(this._frameId=this._map._requestRenderFrame(this._onScrollFrame)):c=!0;}else i.zoom=n,c=!0;i.setLocationAtPoint(this._around,this._aroundPoint),this._map.fire(new t.Event("move",{originalEvent:this._lastWheelEvent})),this._map.fire(new t.Event("zoom",{originalEvent:this._lastWheelEvent})),c&&(this._active=!1,this._finishTimeout=setTimeout((function(){e._zooming=!1,e._map.fire(new t.Event("zoomend",{originalEvent:e._lastWheelEvent})),e._map.fire(new t.Event("moveend",{originalEvent:e._lastWheelEvent})),delete e._targetZoom;}),200));}},xo.prototype._smoothOutEasing=function(e){var i=t.ease;if(this._prevEase){var o=this._prevEase,r=(t.browser.now()-o.start)/o.duration,a=o.easing(r+.01)-o.easing(r),n=.27/Math.sqrt(a*a+1e-4)*.01,s=Math.sqrt(.0729-n*n);i=t.bezier(n,s,.25,1);}return this._prevEase={start:t.browser.now(),duration:e,easing:i},i};var bo=function(e,i){this._map=e,this._el=e.getCanvasContainer(),this._container=e.getContainer(),this._clickTolerance=i.clickTolerance||1,t.bindAll(["_onMouseMove","_onMouseUp","_onKeyDown"],this);};bo.prototype.isEnabled=function(){return !!this._enabled},bo.prototype.isActive=function(){return !!this._active},bo.prototype.enable=function(){this.isEnabled()||(this._enabled=!0);},bo.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1);},bo.prototype.onMouseDown=function(e){this.isEnabled()&&e.shiftKey&&0===e.button&&(t.window.document.addEventListener("mousemove",this._onMouseMove,!1),t.window.document.addEventListener("keydown",this._onKeyDown,!1),t.window.document.addEventListener("mouseup",this._onMouseUp,!1),i.disableDrag(),this._startPos=this._lastPos=i.mousePos(this._el,e),this._active=!0);},bo.prototype._onMouseMove=function(t){var e=i.mousePos(this._el,t);if(!(this._lastPos.equals(e)||!this._box&&e.dist(this._startPos)180&&(d=180);var _=d/180;c+=h*d*(_/2),Math.abs(i._normalizeBearing(c,0))0&&i-e[0][0]>160;)e.shift();};var To=t.bezier(0,0,.3,1),Io=function(e,i){this._map=e,this._el=e.getCanvasContainer(),this._state="disabled",this._clickTolerance=i.clickTolerance||1,t.bindAll(["_onMove","_onMouseUp","_onTouchEnd","_onBlur","_onDragFrame"],this);};Io.prototype.isEnabled=function(){return "disabled"!==this._state},Io.prototype.isActive=function(){return "active"===this._state},Io.prototype.enable=function(){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-drag-pan"),this._state="enabled");},Io.prototype.disable=function(){if(this.isEnabled())switch(this._el.classList.remove("mapboxgl-touch-drag-pan"),this._state){case"active":this._state="disabled",this._unbind(),this._deactivate(),this._fireEvent("dragend"),this._fireEvent("moveend");break;case"pending":this._state="disabled",this._unbind();break;default:this._state="disabled";}},Io.prototype.onMouseDown=function(e){"enabled"===this._state&&(e.ctrlKey||0!==i.mouseButton(e)||(i.addEventListener(t.window.document,"mousemove",this._onMove,{capture:!0}),i.addEventListener(t.window.document,"mouseup",this._onMouseUp),this._start(e)));},Io.prototype.onTouchStart=function(e){this.isEnabled()&&(e.touches&&e.touches.length>1&&("pending"===this._state||"active"===this._state)||(i.addEventListener(t.window.document,"touchmove",this._onMove,{capture:!0,passive:!1}),i.addEventListener(t.window.document,"touchend",this._onTouchEnd),this._start(e)));},Io.prototype._start=function(e){t.window.addEventListener("blur",this._onBlur),this._state="pending",this._startPos=this._mouseDownPos=this._prevPos=this._lastPos=i.mousePos(this._el,e),this._startTouch=this._lastTouch=t.window.TouchEvent&&e instanceof t.window.TouchEvent?i.touchPos(this._el,e):null,this._inertia=[[t.browser.now(),this._startPos]];},Io.prototype._touchesMatch=function(t,e){return !(!t||!e||t.length!==e.length)&&t.every((function(t,i){return e[i]===t}))},Io.prototype._onMove=function(e){e.preventDefault();var o=t.window.TouchEvent&&e instanceof t.window.TouchEvent?i.touchPos(this._el,e):null,r=i.mousePos(this._el,e);(o?this._touchesMatch(this._lastTouch,o):this._lastPos.equals(r))||"pending"===this._state&&r.dist(this._mouseDownPos)1&&i.addEventListener(t.window.document,"touchend",this._onTouchEnd);break;case"pending":this._state="enabled",this._unbind();break;case"enabled":this._unbind();}},Io.prototype._onBlur=function(t){this._abort(t);},Io.prototype._unbind=function(){i.removeEventListener(t.window.document,"touchmove",this._onMove,{capture:!0,passive:!1}),i.removeEventListener(t.window.document,"touchend",this._onTouchEnd),i.removeEventListener(t.window.document,"mousemove",this._onMove,{capture:!0}),i.removeEventListener(t.window.document,"mouseup",this._onMouseUp),i.removeEventListener(t.window,"blur",this._onBlur);},Io.prototype._deactivate=function(){this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),delete this._lastMoveEvent,delete this._startPos,delete this._prevPos,delete this._mouseDownPos,delete this._lastPos,delete this._startTouch,delete this._lastTouch,delete this._shouldStart;},Io.prototype._inertialPan=function(t){this._fireEvent("dragend",t),this._drainInertiaBuffer();var e=this._inertia;if(e.length<2)this._fireEvent("moveend",t);else{var i=e[e.length-1],o=e[0],r=i[1].sub(o[1]),a=(i[0]-o[0])/1e3;if(0===a||i[1].equals(o[1]))this._fireEvent("moveend",t);else{var n=r.mult(.3/a),s=n.mag();s>1400&&(s=1400,n._unit()._mult(s));var l=s/750,c=n.mult(-l/2);this._map.panBy(c,{duration:1e3*l,easing:To,noMoveStart:!0},{originalEvent:t});}}},Io.prototype._fireEvent=function(e,i){return this._map.fire(new t.Event(e,i?{originalEvent:i}:{}))},Io.prototype._drainInertiaBuffer=function(){for(var e=this._inertia,i=t.browser.now();e.length>0&&i-e[0][0]>160;)e.shift();};var Co=function(e){this._map=e,this._el=e.getCanvasContainer(),t.bindAll(["_onKeyDown"],this);};function So(t){return t*(2-t)}Co.prototype.isEnabled=function(){return !!this._enabled},Co.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0);},Co.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1);},Co.prototype._onKeyDown=function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var e=0,i=0,o=0,r=0,a=0;switch(t.keyCode){case 61:case 107:case 171:case 187:e=1;break;case 189:case 109:case 173:e=-1;break;case 37:t.shiftKey?i=-1:(t.preventDefault(),r=-1);break;case 39:t.shiftKey?i=1:(t.preventDefault(),r=1);break;case 38:t.shiftKey?o=1:(t.preventDefault(),a=-1);break;case 40:t.shiftKey?o=-1:(a=1,t.preventDefault());break;default:return}var n=this._map,s=n.getZoom(),l={duration:300,delayEndEvents:500,easing:So,zoom:e?Math.round(s)+e*(t.shiftKey?2:1):s,bearing:n.getBearing()+15*i,pitch:n.getPitch()+10*o,offset:[100*-r,100*-a],center:n.getCenter()};n.easeTo(l,{originalEvent:t});}};var Po=function(e){this._map=e,t.bindAll(["_onDblClick","_onZoomEnd"],this);};Po.prototype.isEnabled=function(){return !!this._enabled},Po.prototype.isActive=function(){return !!this._active},Po.prototype.enable=function(){this.isEnabled()||(this._enabled=!0);},Po.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1);},Po.prototype.onTouchStart=function(t){var e=this;if(this.isEnabled()&&!(t.points.length>1))if(this._tapped){var i=t.points[0],o=this._tappedPoint;if(o&&o.dist(i)<=30){t.originalEvent.preventDefault();var r=function(){e._tapped&&e._zoom(t),e._map.off("touchcancel",a),e._resetTapped();},a=function(){e._map.off("touchend",r),e._resetTapped();};this._map.once("touchend",r),this._map.once("touchcancel",a);}else this._resetTapped();}else this._tappedPoint=t.points[0],this._tapped=setTimeout((function(){e._tapped=null,e._tappedPoint=null;}),300);},Po.prototype._resetTapped=function(){clearTimeout(this._tapped),this._tapped=null,this._tappedPoint=null;},Po.prototype.onDblClick=function(t){this.isEnabled()&&(t.originalEvent.preventDefault(),this._zoom(t));},Po.prototype._zoom=function(t){this._active=!0,this._map.on("zoomend",this._onZoomEnd),this._map.zoomTo(this._map.getZoom()+(t.originalEvent.shiftKey?-1:1),{around:t.lngLat},t);},Po.prototype._onZoomEnd=function(){this._active=!1,this._map.off("zoomend",this._onZoomEnd);};var zo=t.bezier(0,0,.15,1),Lo=function(e){this._map=e,this._el=e.getCanvasContainer(),t.bindAll(["_onMove","_onEnd","_onTouchFrame"],this);};Lo.prototype.isEnabled=function(){return !!this._enabled},Lo.prototype.enable=function(t){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-zoom-rotate"),this._enabled=!0,this._aroundCenter=!!t&&"center"===t.around);},Lo.prototype.disable=function(){this.isEnabled()&&(this._el.classList.remove("mapboxgl-touch-zoom-rotate"),this._enabled=!1);},Lo.prototype.disableRotation=function(){this._rotationDisabled=!0;},Lo.prototype.enableRotation=function(){this._rotationDisabled=!1;},Lo.prototype.isActive=function(){return this.isEnabled()&&!!this._gestureIntent},Lo.prototype.onStart=function(e){if(this.isEnabled()&&2===e.touches.length){var o=i.mousePos(this._el,e.touches[0]),r=i.mousePos(this._el,e.touches[1]),a=o.add(r).div(2);this._startVec=o.sub(r),this._startAround=this._map.transform.pointLocation(a),this._gestureIntent=void 0,this._inertia=[],i.addEventListener(t.window.document,"touchmove",this._onMove,{passive:!1}),i.addEventListener(t.window.document,"touchend",this._onEnd);}},Lo.prototype._getTouchEventData=function(t){var e=i.mousePos(this._el,t.touches[0]),o=i.mousePos(this._el,t.touches[1]),r=e.sub(o);return {vec:r,center:e.add(o).div(2),scale:r.mag()/this._startVec.mag(),bearing:this._rotationDisabled?0:180*r.angleWith(this._startVec)/Math.PI}},Lo.prototype._onMove=function(e){if(2===e.touches.length){var i=this._getTouchEventData(e),o=i.vec,r=i.scale,a=i.bearing;if(!this._gestureIntent){var n=this._rotationDisabled&&1!==r||Math.abs(1-r)>.15;Math.abs(a)>10?this._gestureIntent="rotate":n&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._map.fire(new t.Event(this._gestureIntent+"start",{originalEvent:e})),this._map.fire(new t.Event("movestart",{originalEvent:e})),this._startVec=o);}this._lastTouchEvent=e,this._frameId||(this._frameId=this._map._requestRenderFrame(this._onTouchFrame)),e.preventDefault();}},Lo.prototype._onTouchFrame=function(){this._frameId=null;var e=this._gestureIntent;if(e){var i=this._map.transform;this._startScale||(this._startScale=i.scale,this._startBearing=i.bearing);var o=this._getTouchEventData(this._lastTouchEvent),r=o.center,a=o.bearing,n=o.scale,s=i.pointLocation(r),l=i.locationPoint(s);"rotate"===e&&(i.bearing=this._startBearing+a),i.zoom=i.scaleZoom(this._startScale*n),i.setLocationAtPoint(this._startAround,l),this._map.fire(new t.Event(e,{originalEvent:this._lastTouchEvent})),this._map.fire(new t.Event("move",{originalEvent:this._lastTouchEvent})),this._drainInertiaBuffer(),this._inertia.push([t.browser.now(),n,r]);}},Lo.prototype._onEnd=function(e){i.removeEventListener(t.window.document,"touchmove",this._onMove,{passive:!1}),i.removeEventListener(t.window.document,"touchend",this._onEnd);var o=this._gestureIntent,r=this._startScale;if(this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),delete this._gestureIntent,delete this._startScale,delete this._startBearing,delete this._lastTouchEvent,o){this._map.fire(new t.Event(o+"end",{originalEvent:e})),this._drainInertiaBuffer();var a=this._inertia,n=this._map;if(a.length<2)n.snapToNorth({},{originalEvent:e});else{var s=a[a.length-1],l=a[0],c=n.transform.scaleZoom(r*s[1]),u=n.transform.scaleZoom(r*l[1]),h=c-u,p=(s[0]-l[0])/1e3,d=s[2];if(0!==p&&c!==u){var _=.15*h/p;Math.abs(_)>2.5&&(_=_>0?2.5:-2.5);var f=1e3*Math.abs(_/(12*.15)),m=c+_*f/2e3;m<0&&(m=0),n.easeTo({zoom:m,duration:f,easing:zo,around:this._aroundCenter?n.getCenter():n.unproject(d),noMoveStart:!0},{originalEvent:e});}else n.snapToNorth({},{originalEvent:e});}}},Lo.prototype._drainInertiaBuffer=function(){for(var e=this._inertia,i=t.browser.now();e.length>2&&i-e[0][0]>160;)e.shift();};var Do={scrollZoom:xo,boxZoom:bo,dragRotate:Eo,dragPan:Io,keyboard:Co,doubleClickZoom:Po,touchZoomRotate:Lo};var Mo=function(e){function i(i,o){e.call(this),this._moving=!1,this._zooming=!1,this.transform=i,this._bearingSnap=o.bearingSnap,t.bindAll(["_renderFrameCallback"],this);}return e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i,i.prototype.getCenter=function(){return new t.LngLat(this.transform.center.lng,this.transform.center.lat)},i.prototype.setCenter=function(t,e){return this.jumpTo({center:t},e)},i.prototype.panBy=function(e,i,o){return e=t.Point.convert(e).mult(-1),this.panTo(this.transform.center,t.extend({offset:e},i),o)},i.prototype.panTo=function(e,i,o){return this.easeTo(t.extend({center:e},i),o)},i.prototype.getZoom=function(){return this.transform.zoom},i.prototype.setZoom=function(t,e){return this.jumpTo({zoom:t},e),this},i.prototype.zoomTo=function(e,i,o){return this.easeTo(t.extend({zoom:e},i),o)},i.prototype.zoomIn=function(t,e){return this.zoomTo(this.getZoom()+1,t,e),this},i.prototype.zoomOut=function(t,e){return this.zoomTo(this.getZoom()-1,t,e),this},i.prototype.getBearing=function(){return this.transform.bearing},i.prototype.setBearing=function(t,e){return this.jumpTo({bearing:t},e),this},i.prototype.rotateTo=function(e,i,o){return this.easeTo(t.extend({bearing:e},i),o)},i.prototype.resetNorth=function(e,i){return this.rotateTo(0,t.extend({duration:1e3},e),i),this},i.prototype.resetNorthPitch=function(e,i){return this.easeTo(t.extend({bearing:0,pitch:0,duration:1e3},e),i),this},i.prototype.snapToNorth=function(t,e){return Math.abs(this.getBearing())e?1:0})),["bottom","left","right","top"])){var n=this.transform,s=n.project(t.LngLat.convert(e)),l=n.project(t.LngLat.convert(i)),c=s.rotate(-o*Math.PI/180),u=l.rotate(-o*Math.PI/180),h=new t.Point(Math.max(c.x,u.x),Math.max(c.y,u.y)),p=new t.Point(Math.min(c.x,u.x),Math.min(c.y,u.y)),d=h.sub(p),_=(n.width-r.padding.left-r.padding.right)/d.x,f=(n.height-r.padding.top-r.padding.bottom)/d.y;if(!(f<0||_<0)){var m=Math.min(n.scaleZoom(n.scale*Math.min(_,f)),r.maxZoom),g=t.Point.convert(r.offset),v=(r.padding.left-r.padding.right)/2,y=(r.padding.top-r.padding.bottom)/2,x=new t.Point(g.x+v,g.y+y).mult(n.scale/n.zoomScale(m));return {center:n.unproject(s.add(l).div(2).sub(x)),zoom:m,bearing:o}}t.warnOnce("Map cannot fit within canvas with the given bounds, padding, and/or offset.");}else t.warnOnce("options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'");},i.prototype.fitBounds=function(t,e,i){return this._fitInternal(this.cameraForBounds(t,e),e,i)},i.prototype.fitScreenCoordinates=function(e,i,o,r,a){return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(t.Point.convert(e)),this.transform.pointLocation(t.Point.convert(i)),o,r),r,a)},i.prototype._fitInternal=function(e,i,o){return e?(i=t.extend(e,i)).linear?this.easeTo(i,o):this.flyTo(i,o):this},i.prototype.jumpTo=function(e,i){this.stop();var o=this.transform,r=!1,a=!1,n=!1;return "zoom"in e&&o.zoom!==+e.zoom&&(r=!0,o.zoom=+e.zoom),void 0!==e.center&&(o.center=t.LngLat.convert(e.center)),"bearing"in e&&o.bearing!==+e.bearing&&(a=!0,o.bearing=+e.bearing),"pitch"in e&&o.pitch!==+e.pitch&&(n=!0,o.pitch=+e.pitch),this.fire(new t.Event("movestart",i)).fire(new t.Event("move",i)),r&&this.fire(new t.Event("zoomstart",i)).fire(new t.Event("zoom",i)).fire(new t.Event("zoomend",i)),a&&this.fire(new t.Event("rotatestart",i)).fire(new t.Event("rotate",i)).fire(new t.Event("rotateend",i)),n&&this.fire(new t.Event("pitchstart",i)).fire(new t.Event("pitch",i)).fire(new t.Event("pitchend",i)),this.fire(new t.Event("moveend",i))},i.prototype.easeTo=function(e,i){var o=this;this.stop(),(!1===(e=t.extend({offset:[0,0],duration:500,easing:t.ease},e)).animate||t.browser.prefersReducedMotion)&&(e.duration=0);var r=this.transform,a=this.getZoom(),n=this.getBearing(),s=this.getPitch(),l="zoom"in e?+e.zoom:a,c="bearing"in e?this._normalizeBearing(e.bearing,n):n,u="pitch"in e?+e.pitch:s,h=r.centerPoint.add(t.Point.convert(e.offset)),p=r.pointLocation(h),d=t.LngLat.convert(e.center||p);this._normalizeCenter(d);var _,f,m=r.project(p),g=r.project(d).sub(m),v=r.zoomScale(l-a);return e.around&&(_=t.LngLat.convert(e.around),f=r.locationPoint(_)),this._zooming=l!==a,this._rotating=n!==c,this._pitching=u!==s,this._prepareEase(i,e.noMoveStart),clearTimeout(this._easeEndTimeoutID),this._ease((function(e){if(o._zooming&&(r.zoom=t.number(a,l,e)),o._rotating&&(r.bearing=t.number(n,c,e)),o._pitching&&(r.pitch=t.number(s,u,e)),_)r.setLocationAtPoint(_,f);else{var p=r.zoomScale(r.zoom-a),d=l>a?Math.min(2,v):Math.max(.5,v),y=Math.pow(d,1-e),x=r.unproject(m.add(g.mult(e*y)).mult(p));r.setLocationAtPoint(r.renderWorldCopies?x.wrap():x,h);}o._fireMoveEvents(i);}),(function(){e.delayEndEvents?o._easeEndTimeoutID=setTimeout((function(){return o._afterEase(i)}),e.delayEndEvents):o._afterEase(i);}),e),this},i.prototype._prepareEase=function(e,i){this._moving=!0,i||this.fire(new t.Event("movestart",e)),this._zooming&&this.fire(new t.Event("zoomstart",e)),this._rotating&&this.fire(new t.Event("rotatestart",e)),this._pitching&&this.fire(new t.Event("pitchstart",e));},i.prototype._fireMoveEvents=function(e){this.fire(new t.Event("move",e)),this._zooming&&this.fire(new t.Event("zoom",e)),this._rotating&&this.fire(new t.Event("rotate",e)),this._pitching&&this.fire(new t.Event("pitch",e));},i.prototype._afterEase=function(e){var i=this._zooming,o=this._rotating,r=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,i&&this.fire(new t.Event("zoomend",e)),o&&this.fire(new t.Event("rotateend",e)),r&&this.fire(new t.Event("pitchend",e)),this.fire(new t.Event("moveend",e));},i.prototype.flyTo=function(e,i){var o=this;if(t.browser.prefersReducedMotion){var r=t.pick(e,["center","zoom","bearing","pitch","around"]);return this.jumpTo(r,i)}this.stop(),e=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},e);var a=this.transform,n=this.getZoom(),s=this.getBearing(),l=this.getPitch(),c="zoom"in e?t.clamp(+e.zoom,a.minZoom,a.maxZoom):n,u="bearing"in e?this._normalizeBearing(e.bearing,s):s,h="pitch"in e?+e.pitch:l,p=a.zoomScale(c-n),d=a.centerPoint.add(t.Point.convert(e.offset)),_=a.pointLocation(d),f=t.LngLat.convert(e.center||_);this._normalizeCenter(f);var m=a.project(_),g=a.project(f).sub(m),v=e.curve,y=Math.max(a.width,a.height),x=y/p,b=g.mag();if("minZoom"in e){var w=t.clamp(Math.min(e.minZoom,n,c),a.minZoom,a.maxZoom),E=y/a.zoomScale(w-n);v=Math.sqrt(E/b*2);}var T=v*v;function I(t){var e=(x*x-y*y+(t?-1:1)*T*T*b*b)/(2*(t?x:y)*T*b);return Math.log(Math.sqrt(e*e+1)-e)}function C(t){return (Math.exp(t)-Math.exp(-t))/2}function S(t){return (Math.exp(t)+Math.exp(-t))/2}var P=I(0),z=function(t){return S(P)/S(P+v*t)},L=function(t){return y*((S(P)*(C(e=P+v*t)/S(e))-C(P))/T)/b;var e;},D=(I(1)-P)/v;if(Math.abs(b)<1e-6||!isFinite(D)){if(Math.abs(y-x)<1e-6)return this.easeTo(e,i);var M=xe.maxDuration&&(e.duration=0),this._zooming=!0,this._rotating=s!==u,this._pitching=h!==l,this._prepareEase(i,!1),this._ease((function(e){var r=e*D,p=1/z(r);a.zoom=1===e?c:n+a.scaleZoom(p),o._rotating&&(a.bearing=t.number(s,u,e)),o._pitching&&(a.pitch=t.number(l,h,e));var _=1===e?f:a.unproject(m.add(g.mult(L(r))).mult(p));a.setLocationAtPoint(a.renderWorldCopies?_.wrap():_,d),o._fireMoveEvents(i);}),(function(){return o._afterEase(i)}),e),this},i.prototype.isEasing=function(){return !!this._easeFrameId},i.prototype.stop=function(){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){var t=this._onEaseEnd;delete this._onEaseEnd,t.call(this);}return this},i.prototype._ease=function(e,i,o){!1===o.animate||0===o.duration?(e(1),i()):(this._easeStart=t.browser.now(),this._easeOptions=o,this._onEaseFrame=e,this._onEaseEnd=i,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback));},i.prototype._renderFrameCallback=function(){var e=Math.min((t.browser.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(e)),e<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop();},i.prototype._normalizeBearing=function(e,i){e=t.wrap(e,-180,180);var o=Math.abs(e-i);return Math.abs(e-360-i)180?-360:i<-180?360:0;}},i}(t.Evented),Ro=function(e){void 0===e&&(e={}),this.options=e,t.bindAll(["_updateEditLink","_updateData","_updateCompact"],this);};Ro.prototype.getDefaultPosition=function(){return "bottom-right"},Ro.prototype.onAdd=function(t){var e=this.options&&this.options.compact;return this._map=t,this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-attrib"),this._innerContainer=i.create("div","mapboxgl-ctrl-attrib-inner",this._container),e&&this._container.classList.add("mapboxgl-compact"),this._updateAttributions(),this._updateEditLink(),this._map.on("styledata",this._updateData),this._map.on("sourcedata",this._updateData),this._map.on("moveend",this._updateEditLink),void 0===e&&(this._map.on("resize",this._updateCompact),this._updateCompact()),this._container},Ro.prototype.onRemove=function(){i.remove(this._container),this._map.off("styledata",this._updateData),this._map.off("sourcedata",this._updateData),this._map.off("moveend",this._updateEditLink),this._map.off("resize",this._updateCompact),this._map=void 0;},Ro.prototype._updateEditLink=function(){var e=this._editLink;e||(e=this._editLink=this._container.querySelector(".mapbox-improve-map"));var i=[{key:"owner",value:this.styleOwner},{key:"id",value:this.styleId},{key:"access_token",value:this._map._requestManager._customAccessToken||t.config.ACCESS_TOKEN}];if(e){var o=i.reduce((function(t,e,o){return e.value&&(t+=e.key+"="+e.value+(o=0)return !1;return !0}))).join(" | ");n!==this._attribHTML&&(this._attribHTML=n,t.length?(this._innerContainer.innerHTML=n,this._container.classList.remove("mapboxgl-attrib-empty")):this._container.classList.add("mapboxgl-attrib-empty"),this._editLink=null);}},Ro.prototype._updateCompact=function(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add("mapboxgl-compact"):this._container.classList.remove("mapboxgl-compact");};var Ao=function(){t.bindAll(["_updateLogo"],this),t.bindAll(["_updateCompact"],this);};Ao.prototype.onAdd=function(t){this._map=t,this._container=i.create("div","mapboxgl-ctrl");var e=i.create("a","mapboxgl-ctrl-logo");return e.target="_blank",e.rel="noopener nofollow",e.href="https://www.mapbox.com/",e.setAttribute("aria-label","Mapbox logo"),e.setAttribute("rel","noopener nofollow"),this._container.appendChild(e),this._container.style.display="none",this._map.on("sourcedata",this._updateLogo),this._updateLogo(),this._map.on("resize",this._updateCompact),this._updateCompact(),this._container},Ao.prototype.onRemove=function(){i.remove(this._container),this._map.off("sourcedata",this._updateLogo),this._map.off("resize",this._updateCompact);},Ao.prototype.getDefaultPosition=function(){return "bottom-left"},Ao.prototype._updateLogo=function(t){t&&"metadata"!==t.sourceDataType||(this._container.style.display=this._logoRequired()?"block":"none");},Ao.prototype._logoRequired=function(){if(this._map.style){var t=this._map.style.sourceCaches;for(var e in t){if(t[e].getSource().mapbox_logo)return !0}return !1}},Ao.prototype._updateCompact=function(){var t=this._container.children;if(t.length){var e=t[0];this._map.getCanvasContainer().offsetWidth<250?e.classList.add("mapboxgl-compact"):e.classList.remove("mapboxgl-compact");}};var ko=function(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1;};ko.prototype.add=function(t){var e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e},ko.prototype.remove=function(t){for(var e=this._currentlyRunning,i=0,o=e?this._queue.concat(e):this._queue;ie.maxZoom)throw new Error("maxZoom must be greater than minZoom");var a=new _o(e.minZoom,e.maxZoom,e.renderWorldCopies);if(o.call(this,a,e),this._interactive=e.interactive,this._maxTileCacheSize=e.maxTileCacheSize,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._antialias=e.antialias,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,this._fadeDuration=e.fadeDuration,this._crossSourceCollisions=e.crossSourceCollisions,this._crossFadingFactor=1,this._collectResourceTiming=e.collectResourceTiming,this._renderTaskQueue=new ko,this._controls=[],this._mapId=t.uniqueId(),this._requestManager=new t.RequestManager(e.transformRequest,e.accessToken),"string"==typeof e.container){if(this._container=t.window.document.getElementById(e.container),!this._container)throw new Error("Container '"+e.container+"' not found.")}else{if(!(e.container instanceof Oo))throw new Error("Invalid type: 'container' must be a String or HTMLElement.");this._container=e.container;}if(e.maxBounds&&this.setMaxBounds(e.maxBounds),t.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error("Failed to initialize WebGL.");this.on("move",(function(){return r._update(!1)})),this.on("moveend",(function(){return r._update(!1)})),this.on("zoom",(function(){return r._update(!0)})),void 0!==t.window&&(t.window.addEventListener("online",this._onWindowOnline,!1),t.window.addEventListener("resize",this._onWindowResize,!1)),function(t,e){var o=t.getCanvasContainer(),r=null,a=!1,n=null;for(var s in Do)t[s]=new Do[s](t,e),e.interactive&&e[s]&&t[s].enable(e[s]);i.addEventListener(o,"mouseout",(function(e){t.fire(new go("mouseout",t,e));})),i.addEventListener(o,"mousedown",(function(r){a=!0,n=i.mousePos(o,r);var s=new go("mousedown",t,r);if(t.fire(s),s.defaultPrevented)return;e.interactive&&!t.doubleClickZoom.isActive()&&t.stop();t.boxZoom.onMouseDown(r),t.boxZoom.isActive()||t.dragPan.isActive()||t.dragRotate.onMouseDown(r);t.boxZoom.isActive()||t.dragRotate.isActive()||t.dragPan.onMouseDown(r);})),i.addEventListener(o,"mouseup",(function(e){var i=t.dragRotate.isActive();r&&!i&&t.fire(new go("contextmenu",t,r));r=null,a=!1,t.fire(new go("mouseup",t,e));})),i.addEventListener(o,"mousemove",(function(e){if(t.dragPan.isActive())return;if(t.dragRotate.isActive())return;var i=e.target;for(;i&&i!==o;)i=i.parentNode;if(i!==o)return;t.fire(new go("mousemove",t,e));})),i.addEventListener(o,"mouseover",(function(e){var i=e.target;for(;i&&i!==o;)i=i.parentNode;if(i!==o)return;t.fire(new go("mouseover",t,e));})),i.addEventListener(o,"touchstart",(function(i){var o=new vo("touchstart",t,i);if(t.fire(o),o.defaultPrevented)return;e.interactive&&t.stop();t.boxZoom.isActive()||t.dragRotate.isActive()||t.dragPan.onTouchStart(i);t.touchZoomRotate.onStart(i),t.doubleClickZoom.onTouchStart(o);}),{passive:!1}),i.addEventListener(o,"touchmove",(function(e){t.fire(new vo("touchmove",t,e));}),{passive:!1}),i.addEventListener(o,"touchend",(function(e){t.fire(new vo("touchend",t,e));})),i.addEventListener(o,"touchcancel",(function(e){t.fire(new vo("touchcancel",t,e));})),i.addEventListener(o,"click",(function(r){var a=i.mousePos(o,r);(!n||a.equals(n)||a.dist(n)-1&&this._controls.splice(i,1),e.onRemove(this),this},r.prototype.resize=function(e){var i=this._containerDimensions(),o=i[0],r=i[1];return this._resizeCanvas(o,r),this.transform.resize(o,r),this.painter.resize(o,r),this.fire(new t.Event("movestart",e)).fire(new t.Event("move",e)).fire(new t.Event("resize",e)).fire(new t.Event("moveend",e)),this},r.prototype.getBounds=function(){return this.transform.getBounds()},r.prototype.getMaxBounds=function(){return this.transform.getMaxBounds()},r.prototype.setMaxBounds=function(e){return this.transform.setMaxBounds(t.LngLatBounds.convert(e)),this._update()},r.prototype.setMinZoom=function(t){if((t=null==t?0:t)>=0&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},r.prototype.getMaxZoom=function(){return this.transform.maxZoom},r.prototype.getRenderWorldCopies=function(){return this.transform.renderWorldCopies},r.prototype.setRenderWorldCopies=function(t){return this.transform.renderWorldCopies=t,this._update()},r.prototype.project=function(e){return this.transform.locationPoint(t.LngLat.convert(e))},r.prototype.unproject=function(e){return this.transform.pointLocation(t.Point.convert(e))},r.prototype.isMoving=function(){return this._moving||this.dragPan.isActive()||this.dragRotate.isActive()||this.scrollZoom.isActive()},r.prototype.isZooming=function(){return this._zooming||this.scrollZoom.isZooming()},r.prototype.isRotating=function(){return this._rotating||this.dragRotate.isActive()},r.prototype.on=function(t,e,i){var r=this;if(void 0===i)return o.prototype.on.call(this,t,e);var a=function(){var o;if("mouseenter"===t||"mouseover"===t){var a=!1;return {layer:e,listener:i,delegates:{mousemove:function(o){var n=r.getLayer(e)?r.queryRenderedFeatures(o.point,{layers:[e]}):[];n.length?a||(a=!0,i.call(r,new go(t,r,o.originalEvent,{features:n}))):a=!1;},mouseout:function(){a=!1;}}}}if("mouseleave"===t||"mouseout"===t){var n=!1;return {layer:e,listener:i,delegates:{mousemove:function(o){(r.getLayer(e)?r.queryRenderedFeatures(o.point,{layers:[e]}):[]).length?n=!0:n&&(n=!1,i.call(r,new go(t,r,o.originalEvent)));},mouseout:function(e){n&&(n=!1,i.call(r,new go(t,r,e.originalEvent)));}}}}return {layer:e,listener:i,delegates:(o={},o[t]=function(t){var o=r.getLayer(e)?r.queryRenderedFeatures(t.point,{layers:[e]}):[];o.length&&(t.features=o,i.call(r,t),delete t.features);},o)}}();for(var n in this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(a),a.delegates)this.on(n,a.delegates[n]);return this},r.prototype.off=function(t,e,i){if(void 0===i)return o.prototype.off.call(this,t,e);if(this._delegatedListeners&&this._delegatedListeners[t])for(var r=this._delegatedListeners[t],a=0;a180;){var s=o.locationPoint(e);if(s.x>=0&&s.y>=0&&s.x<=o.width&&s.y<=o.height)break;e.lng>o.center.lng?e.lng-=360:e.lng+=360;}return e}Vo.prototype._updateZoomButtons=function(){var t=this._map.getZoom();t===this._map.getMaxZoom()?this._zoomInButton.classList.add("mapboxgl-ctrl-icon-disabled"):this._zoomInButton.classList.remove("mapboxgl-ctrl-icon-disabled"),t===this._map.getMinZoom()?this._zoomOutButton.classList.add("mapboxgl-ctrl-icon-disabled"):this._zoomOutButton.classList.remove("mapboxgl-ctrl-icon-disabled");},Vo.prototype._rotateCompassArrow=function(){var t=this.options.visualizePitch?"scale("+1/Math.pow(Math.cos(this._map.transform.pitch*(Math.PI/180)),.5)+") rotateX("+this._map.transform.pitch+"deg) rotateZ("+this._map.transform.angle*(180/Math.PI)+"deg)":"rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t;},Vo.prototype.onAdd=function(t){return this._map=t,this.options.showZoom&&(this._map.on("zoom",this._updateZoomButtons),this._updateZoomButtons()),this.options.showCompass&&(this.options.visualizePitch&&this._map.on("pitch",this._rotateCompassArrow),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new Eo(t,{button:"left",element:this._compass}),i.addEventListener(this._compass,"mousedown",this._handler.onMouseDown),i.addEventListener(this._compass,"touchstart",this._handler.onMouseDown,{passive:!1}),this._handler.enable()),this._container},Vo.prototype.onRemove=function(){i.remove(this._container),this.options.showZoom&&this._map.off("zoom",this._updateZoomButtons),this.options.showCompass&&(this.options.visualizePitch&&this._map.off("pitch",this._rotateCompassArrow),this._map.off("rotate",this._rotateCompassArrow),i.removeEventListener(this._compass,"mousedown",this._handler.onMouseDown),i.removeEventListener(this._compass,"touchstart",this._handler.onMouseDown,{passive:!1}),this._handler.disable(),delete this._handler),delete this._map;},Vo.prototype._createButton=function(t,e,o){var r=i.create("button",t,this._container);return r.type="button",r.title=e,r.setAttribute("aria-label",e),r.addEventListener("click",o),r};var jo={center:"translate(-50%,-50%)",top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"};function Go(t,e,i){var o=t.classList;for(var r in jo)o.remove("mapboxgl-"+i+"-anchor-"+r);o.add("mapboxgl-"+i+"-anchor-"+e);}var Wo,Xo=function(e){function o(o,r){if(e.call(this),(o instanceof t.window.HTMLElement||r)&&(o=t.extend({element:o},r)),t.bindAll(["_update","_onMove","_onUp","_addDragHandler","_onMapClick"],this),this._anchor=o&&o.anchor||"center",this._color=o&&o.color||"#3FB1CE",this._draggable=o&&o.draggable||!1,this._state="inactive",o&&o.element)this._element=o.element,this._offset=t.Point.convert(o&&o.offset||[0,0]);else{this._defaultMarker=!0,this._element=i.create("div");var a=i.createNS("http://www.w3.org/2000/svg","svg");a.setAttributeNS(null,"display","block"),a.setAttributeNS(null,"height","41px"),a.setAttributeNS(null,"width","27px"),a.setAttributeNS(null,"viewBox","0 0 27 41");var n=i.createNS("http://www.w3.org/2000/svg","g");n.setAttributeNS(null,"stroke","none"),n.setAttributeNS(null,"stroke-width","1"),n.setAttributeNS(null,"fill","none"),n.setAttributeNS(null,"fill-rule","evenodd");var s=i.createNS("http://www.w3.org/2000/svg","g");s.setAttributeNS(null,"fill-rule","nonzero");var l=i.createNS("http://www.w3.org/2000/svg","g");l.setAttributeNS(null,"transform","translate(3.0, 29.0)"),l.setAttributeNS(null,"fill","#000000");for(var c=0,u=[{rx:"10.5",ry:"5.25002273"},{rx:"10.5",ry:"5.25002273"},{rx:"9.5",ry:"4.77275007"},{rx:"8.5",ry:"4.29549936"},{rx:"7.5",ry:"3.81822308"},{rx:"6.5",ry:"3.34094679"},{rx:"5.5",ry:"2.86367051"},{rx:"4.5",ry:"2.38636864"}];c5280)$o(e,c,p/5280,"mi");else $o(e,c,p,"ft");}else if(i&&"nautical"===i.unit){$o(e,c,h/1852,"nm");}else $o(e,c,h,"m");}function $o(t,e,i,o){var r,a,n,s=(r=i,a=Math.pow(10,(""+Math.floor(r)).length-1),n=(n=r/a)>=10?10:n>=5?5:n>=3?3:n>=2?2:n>=1?1:function(t){var e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(n),a*n),l=s/i;"m"===o&&s>=1e3&&(s/=1e3,o="km"),t.style.width=e*l+"px",t.innerHTML=s+o;}Yo.prototype.getDefaultPosition=function(){return "bottom-left"},Yo.prototype._onMove=function(){Qo(this._map,this._container,this.options);},Yo.prototype.onAdd=function(t){return this._map=t,this._container=i.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},Yo.prototype.onRemove=function(){i.remove(this._container),this._map.off("move",this._onMove),this._map=void 0;},Yo.prototype.setUnit=function(t){this.options.unit=t,Qo(this._map,this._container,this.options);};var tr=function(e){this._fullscreen=!1,e&&e.container&&(e.container instanceof t.window.HTMLElement?this._container=e.container:t.warnOnce("Full screen control 'container' must be a DOM element.")),t.bindAll(["_onClickFullscreen","_changeIcon"],this),"onfullscreenchange"in t.window.document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in t.window.document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in t.window.document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in t.window.document&&(this._fullscreenchange="MSFullscreenChange"),this._className="mapboxgl-ctrl";};tr.prototype.onAdd=function(e){return this._map=e,this._container||(this._container=this._map.getContainer()),this._controlContainer=i.create("div",this._className+" mapboxgl-ctrl-group"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display="none",t.warnOnce("This device does not support fullscreen mode.")),this._controlContainer},tr.prototype.onRemove=function(){i.remove(this._controlContainer),this._map=null,t.window.document.removeEventListener(this._fullscreenchange,this._changeIcon);},tr.prototype._checkFullscreenSupport=function(){return !!(t.window.document.fullscreenEnabled||t.window.document.mozFullScreenEnabled||t.window.document.msFullscreenEnabled||t.window.document.webkitFullscreenEnabled)},tr.prototype._setupUI=function(){(this._fullscreenButton=i.create("button",this._className+"-icon "+this._className+"-fullscreen",this._controlContainer)).type="button",this._updateTitle(),this._fullscreenButton.addEventListener("click",this._onClickFullscreen),t.window.document.addEventListener(this._fullscreenchange,this._changeIcon);},tr.prototype._updateTitle=function(){var t=this._isFullscreen()?"Exit fullscreen":"Enter fullscreen";this._fullscreenButton.setAttribute("aria-label",t),this._fullscreenButton.title=t;},tr.prototype._isFullscreen=function(){return this._fullscreen},tr.prototype._changeIcon=function(){(t.window.document.fullscreenElement||t.window.document.mozFullScreenElement||t.window.document.webkitFullscreenElement||t.window.document.msFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(this._className+"-shrink"),this._fullscreenButton.classList.toggle(this._className+"-fullscreen"),this._updateTitle());},tr.prototype._onClickFullscreen=function(){this._isFullscreen()?t.window.document.exitFullscreen?t.window.document.exitFullscreen():t.window.document.mozCancelFullScreen?t.window.document.mozCancelFullScreen():t.window.document.msExitFullscreen?t.window.document.msExitFullscreen():t.window.document.webkitCancelFullScreen&&t.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen();};var er={closeButton:!0,closeOnClick:!0,className:"",maxWidth:"240px"},ir=function(e){function o(i){e.call(this),this.options=t.extend(Object.create(er),i),t.bindAll(["_update","_onClickClose","remove"],this);}return e&&(o.__proto__=e),o.prototype=Object.create(e&&e.prototype),o.prototype.constructor=o,o.prototype.addTo=function(e){var i=this;return this._map=e,this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._map.on("remove",this.remove),this._update(),this._trackPointer?(this._map.on("mousemove",(function(t){i._update(t.point);})),this._map.on("mouseup",(function(t){i._update(t.point);})),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")):this._map.on("move",this._update),this.fire(new t.Event("open")),this},o.prototype.isOpen=function(){return !!this._map},o.prototype.remove=function(){return this._content&&i.remove(this._content),this._container&&(i.remove(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),this._map.off("remove",this.remove),this._map.off("mousemove"),delete this._map),this.fire(new t.Event("close")),this},o.prototype.getLngLat=function(){return this._lngLat},o.prototype.setLngLat=function(e){return this._lngLat=t.LngLat.convert(e),this._pos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on("move",this._update),this._map.off("mousemove"),this._container&&this._container.classList.remove("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.remove("mapboxgl-track-pointer")),this},o.prototype.trackPointer=function(){var t=this;return this._trackPointer=!0,this._pos=null,this._update(),this._map&&(this._map.off("move",this._update),this._map.on("mousemove",(function(e){t._update(e.point);})),this._map.on("drag",(function(e){t._update(e.point);})),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")),this},o.prototype.getElement=function(){return this._container},o.prototype.setText=function(e){return this.setDOMContent(t.window.document.createTextNode(e))},o.prototype.setHTML=function(e){var i,o=t.window.document.createDocumentFragment(),r=t.window.document.createElement("body");for(r.innerHTML=e;i=r.firstChild;)o.appendChild(i);return this.setDOMContent(o)},o.prototype.getMaxWidth=function(){return this._container.style.maxWidth},o.prototype.setMaxWidth=function(t){return this.options.maxWidth=t,this._update(),this},o.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},o.prototype._createContent=function(){this._content&&i.remove(this._content),this._content=i.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=i.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.setAttribute("aria-label","Close popup"),this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClickClose));},o.prototype._update=function(e){var o=this,r=this._lngLat||this._trackPointer;if(this._map&&r&&this._content&&(this._container||(this._container=i.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=i.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content),this.options.className&&this.options.className.split(" ").forEach((function(t){return o._container.classList.add(t)})),this._trackPointer&&this._container.classList.add("mapboxgl-popup-track-pointer")),this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=qo(this._lngLat,this._pos,this._map.transform)),!this._trackPointer||e)){var a=this._pos=this._trackPointer&&e?e:this._map.project(this._lngLat),n=this.options.anchor,s=function e(i){if(i){if("number"==typeof i){var o=Math.round(Math.sqrt(.5*Math.pow(i,2)));return {center:new t.Point(0,0),top:new t.Point(0,i),"top-left":new t.Point(o,o),"top-right":new t.Point(-o,o),bottom:new t.Point(0,-i),"bottom-left":new t.Point(o,-o),"bottom-right":new t.Point(-o,-o),left:new t.Point(i,0),right:new t.Point(-i,0)}}if(i instanceof t.Point||Array.isArray(i)){var r=t.Point.convert(i);return {center:r,top:r,"top-left":r,"top-right":r,bottom:r,"bottom-left":r,"bottom-right":r,left:r,right:r}}return {center:t.Point.convert(i.center||[0,0]),top:t.Point.convert(i.top||[0,0]),"top-left":t.Point.convert(i["top-left"]||[0,0]),"top-right":t.Point.convert(i["top-right"]||[0,0]),bottom:t.Point.convert(i.bottom||[0,0]),"bottom-left":t.Point.convert(i["bottom-left"]||[0,0]),"bottom-right":t.Point.convert(i["bottom-right"]||[0,0]),left:t.Point.convert(i.left||[0,0]),right:t.Point.convert(i.right||[0,0])}}return e(new t.Point(0,0))}(this.options.offset);if(!n){var l,c=this._container.offsetWidth,u=this._container.offsetHeight;l=a.y+s.bottom.ythis._map.transform.height-u?["bottom"]:[],a.xthis._map.transform.width-c/2&&l.push("right"),n=0===l.length?"bottom":l.join("-");}var h=a.add(s[n]).round();i.setTransform(this._container,jo[n]+" translate("+h.x+"px,"+h.y+"px)"),Go(this._container,n,"popup");}},o.prototype._onClickClose=function(){this.remove();},o}(t.Evented);var or={version:t.version,supported:e,setRTLTextPlugin:t.setRTLTextPlugin,Map:Uo,NavigationControl:Vo,GeolocateControl:Ko,AttributionControl:Ro,ScaleControl:Yo,FullscreenControl:tr,Popup:ir,Marker:Xo,Style:Fe,LngLat:t.LngLat,LngLatBounds:t.LngLatBounds,Point:t.Point,MercatorCoordinate:t.MercatorCoordinate,Evented:t.Evented,config:t.config,get accessToken(){return t.config.ACCESS_TOKEN},set accessToken(e){t.config.ACCESS_TOKEN=e;},get baseApiUrl(){return t.config.API_URL},set baseApiUrl(e){t.config.API_URL=e;},get workerCount(){return At.workerCount},set workerCount(t){At.workerCount=t;},get maxParallelImageRequests(){return t.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(e){t.config.MAX_PARALLEL_IMAGE_REQUESTS=e;},clearStorage:function(e){t.clearTileCache(e);},workerUrl:""};return or})); + +// + +return mapboxgl; + +})); +//# sourceMappingURL=mapbox-gl.js.map diff --git a/public/mapbox/sprite.json b/public/mapbox/sprite.json new file mode 100644 index 0000000..0fd4013 --- /dev/null +++ b/public/mapbox/sprite.json @@ -0,0 +1,290 @@ +{ + "水位站": { + "width": 32, + "height": 32, + "x": 0, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水位站-离线": { + "width": 32, + "height": 32, + "x": 0, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "水位站-设防": { + "width": 32, + "height": 32, + "x": 0, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "水位站-警戒": { + "width": 32, + "height": 32, + "x": 0, + "y": 96, + "pixelRatio": 1, + "visible": true + }, + "水位站-保证": { + "width": 32, + "height": 32, + "x": 0, + "y": 128, + "pixelRatio": 1, + "visible": true + }, + "雨量站": { + "width": 32, + "height": 32, + "x": 32, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水库": { + "width": 32, + "height": 32, + "x": 32, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水库-离线": { + "width": 32, + "height": 32, + "x": 32, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "水库-超汛限": { + "width": 32, + "height": 32, + "x": 32, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "bridge": { + "width": 32, + "height": 32, + "x": 64, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "culvert": { + "width": 32, + "height": 32, + "x": 96, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "daminfo": { + "width": 32, + "height": 32, + "x": 128, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "sluice": { + "width": 32, + "height": 32, + "x": 160, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "wbrinfo": { + "width": 32, + "height": 32, + "x": 192, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "swstinfo": { + "width": 32, + "height": 32, + "x": 224, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "skinfo": { + "width": 32, + "height": 32, + "x": 256, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "srstinfo": { + "width": 32, + "height": 32, + "x": 288, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "stinfo": { + "width": 32, + "height": 32, + "x": 320, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "placement": { + "width": 32, + "height": 32, + "x": 96, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "bsnssinfo": { + "width": 32, + "height": 32, + "x": 128, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "flrvvlg": { + "width": 32, + "height": 32, + "x": 160, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "Marker": { + "width": 32, + "height": 32, + "x": 64, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd4": { + "width": 32, + "height": 32, + "x": 96, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd5": { + "width": 32, + "height": 32, + "x": 128, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd6": { + "width": 32, + "height": 32, + "x": 160, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd7": { + "width": 32, + "height": 32, + "x": 192, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "防灾对象": { + "width": 32, + "height": 32, + "x": 64, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "地形": { + "width": 32, + "height": 32, + "x": 0, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "河流": { + "width": 32, + "height": 32, + "x": 32, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "道路": { + "width": 32, + "height": 32, + "x": 64, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "图像站": { + "width": 32, + "height": 32, + "x": 96, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "泵站": { + "width": 32, + "height": 32, + "x": 352, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水电站": { + "width": 32, + "height": 32, + "x": 384, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "病险水库": { + "width": 32, + "height": 32, + "x": 0, + "y": 256, + "pixelRatio": 1, + "visible": true + }, + "病险水库-超汛限": { + "width": 32, + "height": 32, + "x": 32, + "y": 256, + "pixelRatio": 1, + "visible": true + }, + "病险水库-离线": { + "width": 32, + "height": 32, + "x": 64, + "y": 256, + "pixelRatio": 1, + "visible": true + } +} \ No newline at end of file diff --git a/public/mapbox/sprite.png b/public/mapbox/sprite.png new file mode 100644 index 0000000..570a999 Binary files /dev/null and b/public/mapbox/sprite.png differ diff --git a/public/mapbox/sprite@2x.json b/public/mapbox/sprite@2x.json new file mode 100644 index 0000000..0fd4013 --- /dev/null +++ b/public/mapbox/sprite@2x.json @@ -0,0 +1,290 @@ +{ + "水位站": { + "width": 32, + "height": 32, + "x": 0, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水位站-离线": { + "width": 32, + "height": 32, + "x": 0, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "水位站-设防": { + "width": 32, + "height": 32, + "x": 0, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "水位站-警戒": { + "width": 32, + "height": 32, + "x": 0, + "y": 96, + "pixelRatio": 1, + "visible": true + }, + "水位站-保证": { + "width": 32, + "height": 32, + "x": 0, + "y": 128, + "pixelRatio": 1, + "visible": true + }, + "雨量站": { + "width": 32, + "height": 32, + "x": 32, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水库": { + "width": 32, + "height": 32, + "x": 32, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水库-离线": { + "width": 32, + "height": 32, + "x": 32, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "水库-超汛限": { + "width": 32, + "height": 32, + "x": 32, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "bridge": { + "width": 32, + "height": 32, + "x": 64, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "culvert": { + "width": 32, + "height": 32, + "x": 96, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "daminfo": { + "width": 32, + "height": 32, + "x": 128, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "sluice": { + "width": 32, + "height": 32, + "x": 160, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "wbrinfo": { + "width": 32, + "height": 32, + "x": 192, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "swstinfo": { + "width": 32, + "height": 32, + "x": 224, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "skinfo": { + "width": 32, + "height": 32, + "x": 256, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "srstinfo": { + "width": 32, + "height": 32, + "x": 288, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "stinfo": { + "width": 32, + "height": 32, + "x": 320, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "placement": { + "width": 32, + "height": 32, + "x": 96, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "bsnssinfo": { + "width": 32, + "height": 32, + "x": 128, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "flrvvlg": { + "width": 32, + "height": 32, + "x": 160, + "y": 160, + "pixelRatio": 1, + "visible": true + }, + "Marker": { + "width": 32, + "height": 32, + "x": 64, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd4": { + "width": 32, + "height": 32, + "x": 96, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd5": { + "width": 32, + "height": 32, + "x": 128, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd6": { + "width": 32, + "height": 32, + "x": 160, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "adcd7": { + "width": 32, + "height": 32, + "x": 192, + "y": 192, + "pixelRatio": 1, + "visible": true + }, + "防灾对象": { + "width": 32, + "height": 32, + "x": 64, + "y": 64, + "pixelRatio": 1, + "visible": true + }, + "地形": { + "width": 32, + "height": 32, + "x": 0, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "河流": { + "width": 32, + "height": 32, + "x": 32, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "道路": { + "width": 32, + "height": 32, + "x": 64, + "y": 224, + "pixelRatio": 1, + "visible": true + }, + "图像站": { + "width": 32, + "height": 32, + "x": 96, + "y": 32, + "pixelRatio": 1, + "visible": true + }, + "泵站": { + "width": 32, + "height": 32, + "x": 352, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "水电站": { + "width": 32, + "height": 32, + "x": 384, + "y": 0, + "pixelRatio": 1, + "visible": true + }, + "病险水库": { + "width": 32, + "height": 32, + "x": 0, + "y": 256, + "pixelRatio": 1, + "visible": true + }, + "病险水库-超汛限": { + "width": 32, + "height": 32, + "x": 32, + "y": 256, + "pixelRatio": 1, + "visible": true + }, + "病险水库-离线": { + "width": 32, + "height": 32, + "x": 64, + "y": 256, + "pixelRatio": 1, + "visible": true + } +} \ No newline at end of file diff --git a/public/mapbox/sprite@2x.png b/public/mapbox/sprite@2x.png new file mode 100644 index 0000000..570a999 Binary files /dev/null and b/public/mapbox/sprite@2x.png differ diff --git a/public/popmotion.xl.min.js b/public/popmotion.xl.min.js new file mode 100644 index 0000000..c5f8aa0 --- /dev/null +++ b/public/popmotion.xl.min.js @@ -0,0 +1 @@ +!function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=37)}([function(t,e,n){"use strict";function r(t){var e=t.length;return function(n){for(var r={},o=s(f(n)),i=0;i=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var i=Object.assign||function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{};o(this,t),this.scheduledUpdate=function(){e.lastUpdated=(0,a.timeSinceLastFrame)(),e.prev=e.current;var t=e.props,n=t.onUpdate,r=t.passive;return e.update&&(e.current=e.update(e.current)),n&&(n.registerAction?n.set(e.get()):n(e.get(),e)),e.fireListeners(),!r&&e._isActive&&(0,a.onFrameUpdate)(e.scheduledUpdate),e.isActionComplete&&e.isActionComplete()&&e.complete(),e},this.props=i({},this.constructor.defaultProps),this.setProps(n),this.lastUpdated=0,this.prev=this.current=n.current||n.from||0}return t.prototype.start=function(){var t=this.props,e=t.onStart,n=t._onStart;return t.passive||(this._isActive=!0,(0,a.onFrameUpdate)(this.scheduledUpdate)),this.onStart&&this.onStart(),e&&e(this),n&&n(this),this},t.prototype.stop=function(){var t=this.props,e=t.onStop,n=t._onStop;return t.passive||(this._isActive=!1,(0,a.cancelOnFrameUpdate)(this.scheduledUpdate)),this.onStop&&this.onStop(),e&&e(this),n&&n(this),this},t.prototype.complete=function(){var t=this.props,e=t.onComplete,n=t._onComplete;return this.stop(),this.onComplete&&this.onComplete(),e&&e(this),n&&n(this),this},t.prototype.setProps=function(t){var e=t.onUpdate,n=r(t,["onUpdate"]);return this.props=i({},this.props,n),e&&this.output(e),this},t.prototype.output=function(t){return this.props.onUpdate=t,t.registerAction&&t.registerAction(this),this},t.prototype.get=function(){var t=this.props.transform;return t?t(this.current):this.current},t.prototype.getBeforeTransform=function(){return this.current},t.prototype.set=function(t){return this.current=t,this},t.prototype.getProp=function(t){return this.props[t]},t.prototype.getVelocity=function(){return(0,s.speedPerSecond)(this.current-this.prev,this.lastUpdated)},t.prototype.isActive=function(){return this._isActive},t.prototype.addListener=function(t){return this.listeners=this.listeners||[],this.numListeners=this.numListeners||0,-1===this.listeners.indexOf(t)&&(this.listeners.push(t),this.numListeners++),this},t.prototype.removeListener=function(t){var e=this.listeners?this.listeners.indexOf(t):-1;return-1!==e&&(this.numListeners--,this.listeners.splice(e,1)),this},t.prototype.fireListeners=function(){for(var t=this.get(),e=0;e1&&void 0!==arguments[1]?arguments[1]:2;return e=Math.pow(10,e),Math.round(t*e)/e},i={x:0,y:0,z:0},a=function(t,e){return Math.abs(t-e)},s=(e.angle=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i;return u(Math.atan2(e.y-t.y,e.x-t.x))},e.degreesToRadians=function(t){return t*Math.PI/180}),u=(e.dilate=function(t,e,n){return t+(e-t)*n},e.distance=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i;if((0,r.isNum)(t))return a(t,e);var n=a(t.x,e.x),o=a(t.y,e.y),s=(0,r.isNum)(t.z)?a(t.z,e.z):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2)+Math.pow(s,2))},e.getProgressFromValue=function(t,e,n){return(n-t)/(e-t)},e.getValueFromProgress=function(t,e,n){return-n*t+n*e+t},e.pointFromAngleAndDistance=function(t,e,n){return e=s(e),{x:n*Math.cos(e)+t.x,y:n*Math.sin(e)+t.y}},e.radiansToDegrees=function(t){return 180*t/Math.PI});e.smooth=function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return o(e+n*(t-e)/Math.max(r,n))},e.speedPerFrame=function(t,e){return(0,r.isNum)(t)?t/(1e3/e):0},e.speedPerSecond=function(t,e){return e?t*(1e3/e):0},e.stepProgress=function(t,e){var n=1/(t-1),r=1-1/t,o=Math.min(e/r,1);return Math.floor(o/n)*n}},function(t,e,n){"use strict";e.__esModule=!0,e.bezier=e.blendColor=e.alpha=e.color=e.hsla=e.rgba=e.rgbUnit=e.px=e.degrees=e.percent=e.transformChildValues=e.steps=e.snap=e.smooth=e.wrap=e.nonlinearSpring=e.spring=e.generateNonIntergratedSpring=e.multiply=e.divide=e.add=e.subtract=e.interpolate=e.flow=e.pipe=e.conditional=e.clamp=e.clampMin=e.clampMax=e.applyOffset=e.appendUnit=void 0;var r=Object.assign||function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:u;return function(r,o){return t(r,o)?e(r,o):n(r,o)}},e.pipe=function(){for(var t=arguments.length,e=Array(t),n=0;n1?n-1:0),a=1;a=t[i])return e[i];for(var s=1;sa||s===i);s++);var u=(0,o.getProgressFromValue)(t[s-1],t[s],a),c=n?n[s-1](u):u;return(0,o.getValueFromProgress)(e[s-1],e[s],c)}},e.subtract=function(t){return function(e){return e-t}}),v=e.add=function(t){return function(e){return e+t}},y=(e.divide=function(t){return function(e){return e/t}},e.multiply=function(t){return function(e){return e*t}},e.generateNonIntergratedSpring=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u;return function(e,n){return function(r){var o=n-r,i=-e*(0-t(Math.abs(o)));return o<=0?n+i:n-i}}}),m=(e.spring=y(),e.nonlinearSpring=y(Math.sqrt),e.wrap=function(t,e){return function(n){var r=e-t;return((n-t)%r+r)%r+t}},e.smooth=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50,e=0,n=0;return function(r){var i=(0,s.currentFrameTime)(),a=i!==n?i-n:0,u=a?(0,o.smooth)(r,e,a,t):e;return n=i,e=u,u}},e.snap=function(t){if("number"==typeof t)return function(e){return Math.round(e/t)*t};var e=0,n=t.length;return function(r){var o=Math.abs(t[0]-r);for(e=1;eo)return t[e-1];if(e===n-1)return i;o=a}}},e.steps=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"start";return function(i){var a=(0,o.getProgressFromValue)(e,n,i);return(0,o.getValueFromProgress)(e,n,(0,o.stepProgress)(t,a,r))}},e.transformChildValues=function(t){var e={};return function(n){for(var r in n){var o=t[r];o&&(e[r]=o(n[r]))}return e}}),g=e.percent=c("%"),b=(e.degrees=c("deg"),e.px=c("px"),e.rgbUnit=h(p(0,255),Math.round)),O=function(t){var e=t.red,n=t.green,r=t.blue,o=t.alpha;return"rgba("+e+", "+n+", "+r+", "+(void 0===o?1:o)+")"},w=e.rgba=h(m({red:b,green:b,blue:b,alpha:M}),O),_=function(t){var e=t.hue,n=t.saturation,r=t.lightness,o=t.alpha;return"hsla("+e+", "+n+", "+r+", "+(void 0===o?1:o)+")"},P=e.hsla=h(m({hue:parseInt,saturation:g,lightness:g,alpha:M}),_),M=(e.color=function(t){return t.hasOwnProperty("red")?w(t):t.hasOwnProperty("hue")?P(t):t},e.alpha=p(0,1)),x=function(t,e,n){var r=t*t,o=e*e;return Math.sqrt(n*(o-r)+r)},j=(e.blendColor=function(t,e){var n=(0,i.isString)(t)?(0,a.color)(t):t,s=(0,i.isString)(e)?(0,a.color)(e):e,u=r({},n);return function(t){for(var e in u)u[e]=x(n[e],s[e],t);return u.red=x(n.red,s.red,t),u.green=x(n.green,s.green,t),u.blue=x(n.blue,s.blue,t),u.alpha=(0,o.getValueFromProgress)(n.alpha,s.alpha,t),u}},function(t){return function(e){var n=1-e;return(t[0]*n+t[1]*e)*n+(t[1]*n+t[2]*e)*e}}),E=function(t){return function(e){var n=1-e,r=t[1]*n+t[2]*e;return((t[0]*n+t[1]*e)*n+r*e)*n+(r*n+(t[2]*n+t[3]*e)*e)*e}};e.bezier=function(t){return 3===t.length?j(t):E(t)}},function(t,e,n){"use strict";e.__esModule=!0,e.complex=e.color=e.hsla=e.hex=e.rgba=e.rgbUnit=e.scale=e.px=e.percent=e.degrees=e.alpha=e.number=void 0;var r=Object.assign||function(t){for(var e=1;e1},parse:function(t){var e={};return t.match(c).forEach(function(t,n){return e[n]=parseFloat(t)}),e},createTransformer:function(t){var e=0,n=t.replace(c,function(){return f(e++)});return function(t){var e=n;for(var r in t)t.hasOwnProperty(r)&&(e=e.replace(f(r),t[r]));return e}}}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var a=n(2),s=function(t){return t&&t.__esModule?t:{default:t}}(a),u=n(1),c=n(4),f=n(3),l=n(10),p=(0,c.clamp)(0,1),h={loop:function(t){return t.start()},yoyo:function(t){return t.reverse().start()},flip:function(t){return t.flip().start()}},d=function(t){function e(){return r(this,e),o(this,t.apply(this,arguments))}return i(e,t),e.prototype.onStart=function(){var t=this.props,e=t.duration,n=t.playDirection;this.elapsed=1===n?0:e,this.progress=0},e.prototype.update=function(){var t=this.props,e=t.duration,n=t.ease,r=t.from,o=t.to,i=t.playDirection;return this.isManualUpdate||(this.elapsed+=(0,u.timeSinceLastFrame)()*i),this.isManualUpdate=!1,this.progress=p((0,f.getProgressFromValue)(0,e,this.elapsed)),(0,f.getValueFromProgress)(r,o,n(this.progress))},e.prototype.isActionComplete=function(){var t=this.props,e=t.duration,n=t.playDirection,r=t.yoyo,o=t.loop,i=t.flip,a=1===n?this.elapsed>=e:this.elapsed<=0;if(a&&(r||o||i)){var s=!1;for(var u in h){var c=h[u],f=u+"Count",l=this.getProp(u),p=this.getProp(f);if(l>p){var d;this.setProps((d={},d[f]=p+1,d)),c(this),s=!0}}s&&(a=!1)}return a},e.prototype.getElapsed=function(){return this.elapsed},e.prototype.flip=function(){this.elapsed=this.props.duration-this.elapsed;var t=[this.props.to,this.props.from];return this.props.from=t[0],this.props.to=t[1],this},e.prototype.reverse=function(){return this.props.playDirection*=-1,this},e.prototype.seek=function(t){var e=this.props.duration;this.elapsed=(0,f.getValueFromProgress)(0,e,t),this.isManualUpdate=!0,this.isActive()||this.scheduledUpdate()},e}(s.default);d.defaultProps={duration:300,ease:l.easeOut,from:0,to:1,flip:0,flipCount:0,yoyo:0,yoyoCount:0,loop:0,loopCount:0,playDirection:1},e.default=function(t){return new d(t)}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}e.__esModule=!0;var o=Object.assign||function(t){for(var e=1;e0&&void 0!==arguments[0]&&arguments[0]||this.hasChanged)&&this.onRender&&this.onRender(),this.changedValues.length=0,this.hasChanged=!1,this},t}();e.default=s},function(t,e,n){"use strict";e.__esModule=!0;var r=["X","Y","Z"],o={x:!0,y:!0,z:!0},i=["translate","scale","rotate","skew","transformPerspective"];o.rotate=o.scale=o.transformPerspective=!0,i.forEach(function(t){return r.forEach(function(e){return o[t+e]=!0})}),e.default=o},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}e.__esModule=!0,e.svgPath=e.svg=e.css=e.Renderer=e.value=e.spring=e.stagger=e.tween=e.trackOffset=e.touches=e.pointer=e.physics=e.parallel=e.delay=e.crossFade=e.composite=e.colorTween=e.chain=e.Action=e.valueTypes=e.transform=e.easing=e.calc=e.currentFrameTimestamp=e.timeSinceLastFrame=e.cancelOnFrameEnd=e.cancelOnFrameRender=e.cancelOnFrameUpdate=e.cancelOnFrameStart=e.onFrameEnd=e.onFrameRender=e.onFrameUpdate=e.onFrameStart=void 0;var i=n(1);Object.defineProperty(e,"onFrameStart",{enumerable:!0,get:function(){return i.onFrameStart}}),Object.defineProperty(e,"onFrameUpdate",{enumerable:!0,get:function(){return i.onFrameUpdate}}),Object.defineProperty(e,"onFrameRender",{enumerable:!0,get:function(){return i.onFrameRender}}),Object.defineProperty(e,"onFrameEnd",{enumerable:!0,get:function(){return i.onFrameEnd}}),Object.defineProperty(e,"cancelOnFrameStart",{enumerable:!0,get:function(){return i.cancelOnFrameStart}}),Object.defineProperty(e,"cancelOnFrameUpdate",{enumerable:!0,get:function(){return i.cancelOnFrameUpdate}}),Object.defineProperty(e,"cancelOnFrameRender",{enumerable:!0,get:function(){return i.cancelOnFrameRender}}),Object.defineProperty(e,"cancelOnFrameEnd",{enumerable:!0,get:function(){return i.cancelOnFrameEnd}}),Object.defineProperty(e,"timeSinceLastFrame",{enumerable:!0,get:function(){return i.timeSinceLastFrame}}),Object.defineProperty(e,"currentFrameTimestamp",{enumerable:!0,get:function(){return i.currentFrameTime}});var a=n(3),s=o(a),u=n(10),c=o(u),f=n(4),l=o(f),p=n(5),h=o(p),d=n(2),v=r(d),y=n(15),m=r(y),g=n(21),b=r(g),O=n(11),w=r(O),_=n(22),P=r(_),M=n(16),x=r(M),j=n(12),E=r(j),S=n(23),F=r(S),C=n(24),T=r(C),A=n(25),U=r(A),R=n(26),L=r(R),V=n(6),D=r(V),k=n(27),I=r(k),X=n(28),Y=r(X),z=n(13),B=r(z),N=n(7),Z=r(N),q=n(29),H=r(q),K=n(31),$=r(K),W=n(34),G=r(W);e.calc=s,e.easing=c,e.transform=l,e.valueTypes=h,e.Action=v.default,e.chain=m.default,e.colorTween=b.default,e.composite=w.default,e.crossFade=P.default,e.delay=x.default,e.parallel=E.default,e.physics=F.default,e.pointer=T.default,e.touches=U.default,e.trackOffset=L.default,e.tween=D.default,e.stagger=I.default,e.spring=Y.default,e.value=B.default,e.Renderer=Z.default,e.css=H.default,e.svg=$.default,e.svgPath=G.default},function(t,e,n){"use strict";e.__esModule=!0,e.cubicBezier=e.anticipate=e.createAnticipateEasing=e.backInOut=e.backOut=e.backIn=e.createBackIn=e.circInOut=e.circOut=e.circIn=e.easeInOut=e.easeOut=e.easeIn=e.createExpoIn=e.linear=e.createMirroredEasing=e.createReversedEasing=void 0;var r=n(4),o=e.createReversedEasing=function(t){return function(e){return 1-t(1-e)}},i=e.createMirroredEasing=function(t){return function(e){return e<=.5?t(2*e)/2:(2-t(2*(1-e)))/2}},a=(e.linear=function(t){return t},e.createExpoIn=function(t){return function(e){return Math.pow(e,t)}}),s=e.easeIn=a(2),u=(e.easeOut=o(s),e.easeInOut=i(s),e.circIn=function(t){return 1-Math.sin(Math.acos(t))}),c=e.circOut=o(u),f=(e.circInOut=i(c),e.createBackIn=function(t){return function(e){return e*e*((t+1)*e-t)}}),l=e.backIn=f(1.525),p=(e.backOut=o(l),e.backInOut=i(l),e.createAnticipateEasing=function(t){var e=f(t);return function(t){return(t*=2)<1?.5*e(t):.5*(2-Math.pow(2,-10*(t-1)))}});e.anticipate=p(1.525),e.cubicBezier=function(t,e,n,o){var i=(0,r.bezier)(0,t,n,1),a=(0,r.bezier)(0,e,o,1);return function(t){return a(i(t))}}},function(t,e,n){"use strict";function r(t,e){var n={};for(var r in t)e.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var s=Object.assign||function(t){for(var e=1;e=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var s=Object.assign||function(t){for(var e=1;e4?(e=t.substr(1,2),n=t.substr(3,2),r=t.substr(5,2)):(e=t.substr(1,1),n=t.substr(2,1),r=t.substr(3,1),e+=e,n+=n,r+=r),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(r,16),alpha:1}},i=e.rgba=(0,r.splitColorValues)(["red","green","blue","alpha"]),a=e.hsla=(0,r.splitColorValues)(["hue","saturation","lightness","alpha"]);e.color=function(t){return(0,r.isRgb)(t)?i(t):(0,r.isHex)(t)?o(t):(0,r.isHsl)(t)?a(t):t}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var a=n(2),s=function(t){return t&&t.__esModule?t:{default:t}}(a),u=function(t){function e(){var n,i,a;r(this,e);for(var s=arguments.length,u=Array(s),c=0;c=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}e.__esModule=!0;var o=Object.assign||function(t){for(var e=1;e=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function i(t,e){var n=t.x,r=t.y,i=e.eventToPoints,s=e.moveEvent,c=o(e,["eventToPoints","moveEvent"]),l=(0,f.default)({x:(0,u.default)(n),y:(0,u.default)(r)},a({preventDefault:!0},c)),p=function(t){l.getProp("preventDefault")&&t.preventDefault();var e=i(t);l.x.set(e.x),l.y.set(e.y)};return l.setProps({_onStart:function(){return document.documentElement.addEventListener(s,p,{passive:!l.getProp("preventDefault")})},_onStop:function(){return document.documentElement.removeEventListener(s,p)}}),l}e.__esModule=!0;var a=Object.assign||function(t){for(var e=1;e=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function i(t,e){function n(t){u.preventDefault&&t.preventDefault();var e=r(t);s(f,e)}var r=e.eventToTouches,i=e.moveEvent,u=o(e,["eventToTouches","moveEvent"]),f=(0,v.default)(a(t),c({preventDefault:!0},u));return f.setProps({_onStart:function(){return document.documentElement.addEventListener(i,n)},_onStop:function(){return document.documentElement.removeEventListener(i,n)}}),f}function a(t){for(var e=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:{},i=r.x,a=void 0===i||i,s=r.y,u=void 0===s||s,c=r.initialX,f=void 0===c?0:c,l=r.initialY,p=void 0===l?0:l,h=r.onDrag,d=r.onDragStart,v=r.onDragStop,y=(0,o.css)(t),m={};a&&(m.x=(0,o.value)(f,function(t){return y.set("x",t)})),u&&(m.y=(0,o.value)(p,function(t){return y.set("y",t)}));var g=(0,o.composite)(m,{onUpdate:h});return t.addEventListener("mousedown",e),t.addEventListener("touchstart",e,{passive:!1}),document.addEventListener("mouseup",n),document.addEventListener("touchend",n),g}e.__esModule=!0,e.default=r;var o=n(9)},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var a=n(9),s=function(t){function e(){return r(this,e),o(this,t.apply(this,arguments))}return i(e,t),e.prototype.onStart=function(){var t=this.props,e=t.velocity,n=t.power,r=t.modifyTarget;this.amplitude=n*e,this.target=Math.round(this.current+this.amplitude),this.elapsed=0,r&&(this.target=r(this.target))},e.prototype.update=function(){var t=this.props,e=t.autoStopDelta,n=t.timeConstant;this.elapsed+=(0,a.timeSinceLastFrame)();var r=-this.amplitude*Math.exp(-this.elapsed/n),o=r>e||r<-e;return o||(this.isComplete=!0),o?this.target+r:this.target},e.prototype.isActionComplete=function(){return this.isComplete},e}(a.Action);s.defaultProps={velocity:0,from:0,power:.8,timeConstant:350,autoStopDelta:.5},e.default=function(t){return new s(t)}},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}e.__esModule=!0;var a=n(9),s=function(t){function e(){return r(this,e),o(this,t.apply(this,arguments))}return i(e,t),e.prototype.get=function(e){return this.state[e]=void 0,t.prototype.get.call(this,e)},e}(a.Renderer),u=function(t){function e(){return r(this,e),o(this,t.apply(this,arguments))}return i(e,t),e.prototype.onRender=function(){var t=this.props.element,e=this.state,n=e.top,r=e.left;t.scrollLeft=r,t.scrollTop=n},e.prototype.onRead=function(){var t=arguments.length<=0||void 0===arguments[0]?"top":arguments[0],e=this.props.element;return"top"===t?e.scrollTop:e.scrollLeft},e}(s),c=function(t){function e(){return r(this,e),o(this,t.apply(this,arguments))}return i(e,t),e.prototype.onRender=function(){var t=this.state,e=t.top,n=t.left;void 0!==typeof window&&window.scrollTo(n,e)},e.prototype.onRead=function(t){return void 0===typeof window?0:"top"===t?window.pageYOffset:window.pageXOffset},e}(s);e.default=function(t){return t?new u({element:t}):new c}},function(t,e,n){"use strict";function r(t,e){function n(e){e.preventDefault();var n=(0,o.pointer)(e,{transform:function(e){var n=t.getBoundingClientRect(),r={x:n.left+n.width/2,y:n.top+n.height/2};return i(r,e)}}).start();(0,o.trackOffset)(n,{from:h.get(),onUpdate:h,onStop:function(){return n.stop()}}).start()}function r(){(0,o.physics)({from:h.get(),velocity:h.getVelocity(),friction:c,onUpdate:h}).start()}var a=e.initialRotation,s=void 0===a?0:a,u=e.friction,c=void 0===u?.4:u,f=e.transformSpin,l=e.onSpin,p=(0,o.css)(t),h=(0,o.value)(s,function(t){var e=f?f(t):t;l&&l(e),p.set("rotate",e)});return t.addEventListener("mousedown",n),t.addEventListener("touchstart",n,{passive:!1}),document.addEventListener("mouseup",r),document.addEventListener("touchend",r),h}e.__esModule=!0,e.default=r;var o=n(9),i=o.calc.angle},function(t,e,n){"use strict";function r(t,e){if(e.constructor===Array){var n=e[e.length-1],r="number"==typeof n,o=r?e.slice(0,-1):e,i=o.length,a=0;o.forEach(function(e,o){if(t.push(e),o!==i-1){var s=e.getProp("duration");a+=r?n:0,t.push("-"+(s-a))}})}else t.push(e);return t}function o(t,e){var n=0,o=0,c=t.reduce(r,[]).reduce(function(t,e){var r=void 0===e?"undefined":a(e);if("string"===r)n+=parseFloat(e);else if("number"===r)n=e;else{var i=n+e.getProp("duration");t.push({tween:e,from:n,to:i}),n=i,o=Math.max(o,i)}return t},[]).reduce(function(t,e){var n=e.tween.getProp("onUpdate"),r=t.targets.indexOf(n);return-1===r&&(t.targets.push(n),t.fragments.push([]),r=t.fragments.length-1),t.fragments[r].push({tween:e.tween,from:u(0,o,e.from),to:u(0,o,e.to)}),n.get&&(t.initialValues[r]=n.get()),t},{initialValues:[],targets:[],fragments:[]}),l=c.fragments.length;return(0,s.tween)(i({duration:o,ease:s.easing.linear},e,{onUpdate:function(t){for(var e=0;e=0&&v<=1)o=!0,d.tween.seek(v);else if(v>1){p=!0;var y=v<0?Math.abs(v):v-1;y> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' + + _lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' + + _lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] + + _lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ]; + + // .toUpperCase() here flattens concatenated strings to save heap memory space. + return uuid.toUpperCase(); + +} + +function clamp( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + +} + +// compute euclidian modulo of m % n +// https://en.wikipedia.org/wiki/Modulo_operation +function euclideanModulo( n, m ) { + + return ( ( n % m ) + m ) % m; + +} + +// Linear mapping from range to range +function mapLinear( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + +} + +// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/ +function inverseLerp( x, y, value ) { + + if ( x !== y ) { + + return ( value - x ) / ( y - x ); + + } else { + + return 0; + + } + +} + +// https://en.wikipedia.org/wiki/Linear_interpolation +function lerp( x, y, t ) { + + return ( 1 - t ) * x + t * y; + +} + +// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/ +function damp( x, y, lambda, dt ) { + + return lerp( x, y, 1 - Math.exp( - lambda * dt ) ); + +} + +// https://www.desmos.com/calculator/vcsjnyz7x4 +function pingpong( x, length = 1 ) { + + return length - Math.abs( euclideanModulo( x, length * 2 ) - length ); + +} + +// http://en.wikipedia.org/wiki/Smoothstep +function smoothstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + +} + +function smootherstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + +} + +// Random integer from interval +function randInt( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + +} + +// Random float from interval +function randFloat( low, high ) { + + return low + Math.random() * ( high - low ); + +} + +// Random float from <-range/2, range/2> interval +function randFloatSpread( range ) { + + return range * ( 0.5 - Math.random() ); + +} + +// Deterministic pseudo-random float in the interval [ 0, 1 ] +function seededRandom( s ) { + + if ( s !== undefined ) _seed = s % 2147483647; + + // Park-Miller algorithm + + _seed = _seed * 16807 % 2147483647; + + return ( _seed - 1 ) / 2147483646; + +} + +function degToRad( degrees ) { + + return degrees * DEG2RAD; + +} + +function radToDeg( radians ) { + + return radians * RAD2DEG; + +} + +function isPowerOfTwo( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + +} + +function ceilPowerOfTwo( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + +} + +function floorPowerOfTwo( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + +} + +function setQuaternionFromProperEuler( q, a, b, c, order ) { + + // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles + + // rotations are applied to the axes in the order specified by 'order' + // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c' + // angles are in radians + + const cos = Math.cos; + const sin = Math.sin; + + const c2 = cos( b / 2 ); + const s2 = sin( b / 2 ); + + const c13 = cos( ( a + c ) / 2 ); + const s13 = sin( ( a + c ) / 2 ); + + const c1_3 = cos( ( a - c ) / 2 ); + const s1_3 = sin( ( a - c ) / 2 ); + + const c3_1 = cos( ( c - a ) / 2 ); + const s3_1 = sin( ( c - a ) / 2 ); + + switch ( order ) { + + case 'XYX': + q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 ); + break; + + case 'YZY': + q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 ); + break; + + case 'ZXZ': + q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 ); + break; + + case 'XZX': + q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 ); + break; + + case 'YXY': + q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 ); + break; + + case 'ZYZ': + q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 ); + break; + + default: + console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order ); + + } + +} + +var MathUtils = /*#__PURE__*/Object.freeze({ + __proto__: null, + DEG2RAD: DEG2RAD, + RAD2DEG: RAD2DEG, + generateUUID: generateUUID, + clamp: clamp, + euclideanModulo: euclideanModulo, + mapLinear: mapLinear, + inverseLerp: inverseLerp, + lerp: lerp, + damp: damp, + pingpong: pingpong, + smoothstep: smoothstep, + smootherstep: smootherstep, + randInt: randInt, + randFloat: randFloat, + randFloatSpread: randFloatSpread, + seededRandom: seededRandom, + degToRad: degToRad, + radToDeg: radToDeg, + isPowerOfTwo: isPowerOfTwo, + ceilPowerOfTwo: ceilPowerOfTwo, + floorPowerOfTwo: floorPowerOfTwo, + setQuaternionFromProperEuler: setQuaternionFromProperEuler +}); + +class Vector2 { + + constructor( x = 0, y = 0 ) { + + this.x = x; + this.y = y; + + } + + get width() { + + return this.x; + + } + + set width( value ) { + + this.x = value; + + } + + get height() { + + return this.y; + + } + + set height( value ) { + + this.y = value; + + } + + set( x, y ) { + + this.x = x; + this.y = y; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + } + + add( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + } + + sub( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + } + + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + } + + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + applyMatrix3( m ) { + + const x = this.x, y = this.y; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + } + + roundToZero() { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y; + + } + + cross( v ) { + + return this.x * v.y - this.y * v.x; + + } + + lengthSq() { + + return this.x * this.x + this.y * this.y; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + angle() { + + // computes the angle in radians with respect to the positive x-axis + + const angle = Math.atan2( - this.y, - this.x ) + Math.PI; + + return angle; + + } + + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + } + + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + + return this; + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + } + + fromBufferAttribute( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + } + + rotateAround( center, angle ) { + + const c = Math.cos( angle ), s = Math.sin( angle ); + + const x = this.x - center.x; + const y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + + } + +} + +Vector2.prototype.isVector2 = true; + +class Matrix3 { + + constructor() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + } + + identity() { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + } + + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + } + + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrix3Column( this, 0 ); + yAxis.setFromMatrix3Column( this, 1 ); + zAxis.setFromMatrix3Column( this, 2 ); + + return this; + + } + + setFromMatrix4( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + } + + multiply( m ) { + + return this.multiplyMatrices( this, m ); + + } + + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + const a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + const a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + const b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + const b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + const b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + } + + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + } + + determinant() { + + const te = this.elements; + + const a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + } + + invert() { + + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], + n12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ], + n13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + } + + transpose() { + + let tmp; + const m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + } + + getNormalMatrix( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).invert().transpose(); + + } + + transposeIntoArray( r ) { + + const m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + } + + setUvTransform( tx, ty, sx, sy, rotation, cx, cy ) { + + const c = Math.cos( rotation ); + const s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + return this; + + } + + scale( sx, sy ) { + + const te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + } + + rotate( theta ) { + + const c = Math.cos( theta ); + const s = Math.sin( theta ); + + const te = this.elements; + + const a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + const a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + } + + translate( tx, ty ) { + + const te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + } + + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + clone() { + + return new this.constructor().fromArray( this.elements ); + + } + +} + +Matrix3.prototype.isMatrix3 = true; + +function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + let max = array[ 0 ]; + + for ( let i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + +} + +const TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + Uint8ClampedArray: Uint8ClampedArray, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array +}; + +function getTypedArray( type, buffer ) { + + return new TYPED_ARRAYS[ type ]( buffer ); + +} + +function createElementNS( name ) { + + return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); + +} + +/** + * cyrb53 hash for string from: https://stackoverflow.com/a/52171480 + * + * Public Domain, @bryc - https://stackoverflow.com/users/815680/bryc + * + * It is roughly similar to the well-known MurmurHash/xxHash algorithms. It uses a combination + * of multiplication and Xorshift to generate the hash, but not as thorough. As a result it's + * faster than either would be in JavaScript and significantly simpler to implement. Keep in + * mind this is not a secure algorithm, if privacy/security is a concern, this is not for you. + * + * @param {string} str + * @param {number} seed, default 0 + * @returns number + */ +function hashString( str, seed = 0 ) { + + let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; + + for ( let i = 0, ch; i < str.length; i ++ ) { + + ch = str.charCodeAt( i ); + + h1 = Math.imul( h1 ^ ch, 2654435761 ); + + h2 = Math.imul( h2 ^ ch, 1597334677 ); + + } + + h1 = Math.imul( h1 ^ ( h1 >>> 16 ), 2246822507 ) ^ Math.imul( h2 ^ ( h2 >>> 13 ), 3266489909 ); + + h2 = Math.imul( h2 ^ ( h2 >>> 16 ), 2246822507 ) ^ Math.imul( h1 ^ ( h1 >>> 13 ), 3266489909 ); + + return 4294967296 * ( 2097151 & h2 ) + ( h1 >>> 0 ); + +} + +let _canvas; + +class ImageUtils { + + static getDataURL( image ) { + + if ( /^data:/i.test( image.src ) ) { + + return image.src; + + } + + if ( typeof HTMLCanvasElement == 'undefined' ) { + + return image.src; + + } + + let canvas; + + if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + if ( _canvas === undefined ) _canvas = createElementNS( 'canvas' ); + + _canvas.width = image.width; + _canvas.height = image.height; + + const context = _canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + canvas = _canvas; + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + console.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image ); + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + +} + +let textureId = 0; + +class Texture extends EventDispatcher { + + constructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) { + + super(); + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + + this.image = image; + this.mipmaps = []; + + this.mapping = mapping; + + this.wrapS = wrapS; + this.wrapT = wrapT; + + this.magFilter = magFilter; + this.minFilter = minFilter; + + this.anisotropy = anisotropy; + + this.format = format; + this.internalFormat = null; + this.type = type; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding; + + this.userData = {}; + + this.version = 0; + this.onUpdate = null; + + this.isRenderTargetTexture = false; + + } + + updateMatrix() { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + return this; + + } + + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + const output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + type: this.type, + encoding: this.encoding, + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY, + + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + const image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + let url; + + if ( Array.isArray( image ) ) { + + // process array of images e.g. CubeTexture + + url = []; + + for ( let i = 0, l = image.length; i < l; i ++ ) { + + // check cube texture with data textures + + if ( image[ i ].isDataTexture ) { + + url.push( serializeImage( image[ i ].image ) ); + + } else { + + url.push( serializeImage( image[ i ] ) ); + + } + + } + + } else { + + // process single image + + url = serializeImage( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; + + } + + output.image = image.uuid; + + } + + if ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData; + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + transformUv( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + +} + +Texture.DEFAULT_IMAGE = undefined; +Texture.DEFAULT_MAPPING = UVMapping; + +Texture.prototype.isTexture = true; + +function serializeImage( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + // default images + + return ImageUtils.getDataURL( image ); + + } else { + + if ( image.data ) { + + // images of DataTexture + + return { + data: Array.prototype.slice.call( image.data ), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + + } else { + + console.warn( 'THREE.Texture: Unable to serialize Texture.' ); + return {}; + + } + + } + +} + +class Vector4 { + + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + } + + get width() { + + return this.z; + + } + + set width( value ) { + + this.z = value; + + } + + get height() { + + return this.w; + + } + + set height( value ) { + + this.w = value; + + } + + set( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setZ( z ) { + + this.z = z; + + return this; + + } + + setW( w ) { + + this.w = w; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + } + + add( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + } + + sub( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + } + + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + this.w *= v.w; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + } + + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + setAxisAngleFromQuaternion( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + const s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + } + + setAxisAngleFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + let angle, x, y, z; // variables for result + const epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + const xx = ( m11 + 1 ) / 2; + const yy = ( m22 + 1 ) / 2; + const zz = ( m33 + 1 ) / 2; + const xy = ( m12 + m21 ) / 4; + const xz = ( m13 + m31 ) / 4; + const yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + let s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); + this.w = Math.max( minVal, Math.min( maxVal, this.w ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + } + + roundToZero() { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + } + + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + this.w = v1.w + ( v2.w - v1.w ) * alpha; + + return this; + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + } + + fromBufferAttribute( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + yield this.w; + + } + +} + +Vector4.prototype.isVector4 = true; + +/* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers +*/ +class WebGLRenderTarget extends EventDispatcher { + + constructor( width, height, options = {} ) { + + super(); + + this.width = width; + this.height = height; + this.depth = 1; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + this.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + this.texture.isRenderTargetTexture = true; + + this.texture.image = { width: width, height: height, depth: 1 }; + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; + this.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null; + this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter; + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + setTexture( texture ) { + + texture.image = { + width: this.width, + height: this.height, + depth: this.depth + }; + + this.texture = texture; + + } + + setSize( width, height, depth = 1 ) { + + if ( this.width !== width || this.height !== height || this.depth !== depth ) { + + this.width = width; + this.height = height; + this.depth = depth; + + this.texture.image.width = width; + this.texture.image.height = height; + this.texture.image.depth = depth; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + this.texture.image = { ...this.texture.image }; // See #20328. + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +WebGLRenderTarget.prototype.isWebGLRenderTarget = true; + +class WebGLMultipleRenderTargets extends WebGLRenderTarget { + + constructor( width, height, count ) { + + super( width, height ); + + const texture = this.texture; + + this.texture = []; + + for ( let i = 0; i < count; i ++ ) { + + this.texture[ i ] = texture.clone(); + + } + + } + + setSize( width, height, depth = 1 ) { + + if ( this.width !== width || this.height !== height || this.depth !== depth ) { + + this.width = width; + this.height = height; + this.depth = depth; + + for ( let i = 0, il = this.texture.length; i < il; i ++ ) { + + this.texture[ i ].image.width = width; + this.texture[ i ].image.height = height; + this.texture[ i ].image.depth = depth; + + } + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + return this; + + } + + copy( source ) { + + this.dispose(); + + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + + this.viewport.set( 0, 0, this.width, this.height ); + this.scissor.set( 0, 0, this.width, this.height ); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + this.texture.length = 0; + + for ( let i = 0, il = source.texture.length; i < il; i ++ ) { + + this.texture[ i ] = source.texture[ i ].clone(); + + } + + return this; + + } + +} + +WebGLMultipleRenderTargets.prototype.isWebGLMultipleRenderTargets = true; + +class WebGLMultisampleRenderTarget extends WebGLRenderTarget { + + constructor( width, height, options ) { + + super( width, height, options ); + + this.samples = 4; + + } + + copy( source ) { + + super.copy.call( this, source ); + + this.samples = source.samples; + + return this; + + } + +} + +WebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true; + +class Quaternion { + + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + } + + static slerp( qa, qb, qm, t ) { + + console.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' ); + return qm.slerpQuaternions( qa, qb, t ); + + } + + static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + let x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( t === 0 ) { + + dst[ dstOffset + 0 ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + return; + + } + + if ( t === 1 ) { + + dst[ dstOffset + 0 ] = x1; + dst[ dstOffset + 1 ] = y1; + dst[ dstOffset + 2 ] = z1; + dst[ dstOffset + 3 ] = w1; + return; + + } + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + let s = 1 - t; + const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + const sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + const tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + const f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) { + + const x0 = src0[ srcOffset0 ]; + const y0 = src0[ srcOffset0 + 1 ]; + const z0 = src0[ srcOffset0 + 2 ]; + const w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 ]; + const y1 = src1[ srcOffset1 + 1 ]; + const z1 = src1[ srcOffset1 + 2 ]; + const w1 = src1[ srcOffset1 + 3 ]; + + dst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + + return dst; + + } + + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + get w() { + + return this._w; + + } + + set w( value ) { + + this._w = value; + this._onChangeCallback(); + + } + + set( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this._onChangeCallback(); + + return this; + + } + + clone() { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + } + + copy( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this._onChangeCallback(); + + return this; + + } + + setFromEuler( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + const cos = Math.cos; + const sin = Math.sin; + + const c1 = cos( x / 2 ); + const c2 = cos( y / 2 ); + const c3 = cos( z / 2 ); + + const s1 = sin( x / 2 ); + const s2 = sin( y / 2 ); + const s3 = sin( z / 2 ); + + switch ( order ) { + + case 'XYZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'YXZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'ZXY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'ZYX': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'YZX': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'XZY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + default: + console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order ); + + } + + if ( update !== false ) this._onChangeCallback(); + + return this; + + } + + setFromAxisAngle( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + const halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this._onChangeCallback(); + + return this; + + } + + setFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + const te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33; + + if ( trace > 0 ) { + + const s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this._onChangeCallback(); + + return this; + + } + + setFromUnitVectors( vFrom, vTo ) { + + // assumes direction vectors vFrom and vTo are normalized + + let r = vFrom.dot( vTo ) + 1; + + if ( r < Number.EPSILON ) { + + // vFrom and vTo point in opposite directions + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + this._x = - vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + + } else { + + this._x = 0; + this._y = - vFrom.z; + this._z = vFrom.y; + this._w = r; + + } + + } else { + + // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3 + + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; + + } + + return this.normalize(); + + } + + angleTo( q ) { + + return 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) ); + + } + + rotateTowards( q, step ) { + + const angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + const t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + } + + identity() { + + return this.set( 0, 0, 0, 1 ); + + } + + invert() { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + } + + conjugate() { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this._onChangeCallback(); + + return this; + + } + + dot( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + } + + lengthSq() { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + } + + length() { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + } + + normalize() { + + let l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this._onChangeCallback(); + + return this; + + } + + multiply( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + } + + premultiply( q ) { + + return this.multiplyQuaternions( q, this ); + + } + + multiplyQuaternions( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this._onChangeCallback(); + + return this; + + } + + slerp( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + const x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + const s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + this.normalize(); + this._onChangeCallback(); + + return this; + + } + + const sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + const halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + const ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this._onChangeCallback(); + + return this; + + } + + slerpQuaternions( qa, qb, t ) { + + this.copy( qa ).slerp( qb, t ); + + } + + random() { + + // Derived from http://planning.cs.uiuc.edu/node198.html + // Note, this source uses w, x, y, z ordering, + // so we swap the order below. + + const u1 = Math.random(); + const sqrt1u1 = Math.sqrt( 1 - u1 ); + const sqrtu1 = Math.sqrt( u1 ); + + const u2 = 2 * Math.PI * Math.random(); + + const u3 = 2 * Math.PI * Math.random(); + + return this.set( + sqrt1u1 * Math.cos( u2 ), + sqrtu1 * Math.sin( u3 ), + sqrtu1 * Math.cos( u3 ), + sqrt1u1 * Math.sin( u2 ), + ); + + } + + equals( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + } + + fromArray( array, offset = 0 ) { + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this._onChangeCallback(); + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this._x = attribute.getX( index ); + this._y = attribute.getY( index ); + this._z = attribute.getZ( index ); + this._w = attribute.getW( index ); + + return this; + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + +} + +Quaternion.prototype.isQuaternion = true; + +class Vector3 { + + constructor( x = 0, y = 0, z = 0 ) { + + this.x = x; + this.y = y; + this.z = z; + + } + + set( x, y, z ) { + + if ( z === undefined ) z = this.z; // sprite.scale.set(x,y) + + this.x = x; + this.y = y; + this.z = z; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setZ( z ) { + + this.z = z; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y, this.z ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + } + + add( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + } + + sub( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + } + + multiply( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + } + + multiplyVectors( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + } + + applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( _quaternion$4.setFromEuler( euler ) ); + + } + + applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) ); + + } + + applyMatrix3( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + } + + applyNormalMatrix( m ) { + + return this.applyMatrix3( m ).normalize(); + + } + + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + const w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + } + + applyQuaternion( q ) { + + const x = this.x, y = this.y, z = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + const ix = qw * x + qy * z - qz * y; + const iy = qw * y + qz * x - qx * z; + const iz = qw * z + qx * y - qy * x; + const iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + } + + project( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + } + + unproject( camera ) { + + return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld ); + + } + + transformDirection( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + } + + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + } + + roundToZero() { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + } + + // TODO lengthSquared? + + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + + return this; + + } + + cross( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + } + + crossVectors( a, b ) { + + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + } + + projectOnVector( v ) { + + const denominator = v.lengthSq(); + + if ( denominator === 0 ) return this.set( 0, 0, 0 ); + + const scalar = v.dot( this ) / denominator; + + return this.copy( v ).multiplyScalar( scalar ); + + } + + projectOnPlane( planeNormal ) { + + _vector$c.copy( this ).projectOnVector( planeNormal ); + + return this.sub( _vector$c ); + + } + + reflect( normal ) { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + return this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + angleTo( v ) { + + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); + + if ( denominator === 0 ) return Math.PI / 2; + + const theta = this.dot( v ) / denominator; + + // clamp, to handle numerical problems + + return Math.acos( clamp( theta, - 1, 1 ) ); + + } + + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + } + + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + } + + setFromSpherical( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + } + + setFromSphericalCoords( radius, phi, theta ) { + + const sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + } + + setFromCylindrical( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + } + + setFromCylindricalCoords( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + } + + setFromMatrixPosition( m ) { + + const e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + } + + setFromMatrixScale( m ) { + + const sx = this.setFromMatrixColumn( m, 0 ).length(); + const sy = this.setFromMatrixColumn( m, 1 ).length(); + const sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + } + + setFromMatrixColumn( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + } + + setFromMatrix3Column( m, index ) { + + return this.fromArray( m.elements, index * 3 ); + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + } + + fromBufferAttribute( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + + return this; + + } + + randomDirection() { + + // Derived from https://mathworld.wolfram.com/SpherePointPicking.html + + const u = ( Math.random() - 0.5 ) * 2; + const t = Math.random() * Math.PI * 2; + const f = Math.sqrt( 1 - u ** 2 ); + + this.x = f * Math.cos( t ); + this.y = f * Math.sin( t ); + this.z = u; + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + + } + +} + +Vector3.prototype.isVector3 = true; + +const _vector$c = /*@__PURE__*/ new Vector3(); +const _quaternion$4 = /*@__PURE__*/ new Quaternion(); + +class Box3 { + + constructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) { + + this.min = min; + this.max = max; + + } + + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + setFromArray( array ) { + + let minX = + Infinity; + let minY = + Infinity; + let minZ = + Infinity; + + let maxX = - Infinity; + let maxY = - Infinity; + let maxZ = - Infinity; + + for ( let i = 0, l = array.length; i < l; i += 3 ) { + + const x = array[ i ]; + const y = array[ i + 1 ]; + const z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + } + + setFromBufferAttribute( attribute ) { + + let minX = + Infinity; + let minY = + Infinity; + let minZ = + Infinity; + + let maxX = - Infinity; + let maxY = - Infinity; + let maxZ = - Infinity; + + for ( let i = 0, l = attribute.count; i < l; i ++ ) { + + const x = attribute.getX( i ); + const y = attribute.getY( i ); + const z = attribute.getZ( i ); + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + } + + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + setFromObject( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + makeEmpty() { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + } + + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + } + + getCenter( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + getSize( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + expandByObject( object ) { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + object.updateWorldMatrix( false, false ); + + const geometry = object.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); + + } + + _box$3.copy( geometry.boundingBox ); + _box$3.applyMatrix4( object.matrixWorld ); + + this.union( _box$3 ); + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + this.expandByObject( children[ i ] ); + + } + + return this; + + } + + containsPoint( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + } + + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + } + + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + } + + intersectsBox( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + } + + intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, _vector$b ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + intersectsPlane( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + let min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + } + + intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( _center ); + _extents.subVectors( this.max, _center ); + + // translate triangle to aabb origin + _v0$2.subVectors( triangle.a, _center ); + _v1$7.subVectors( triangle.b, _center ); + _v2$3.subVectors( triangle.c, _center ); + + // compute edge vectors for triangle + _f0.subVectors( _v1$7, _v0$2 ); + _f1.subVectors( _v2$3, _v1$7 ); + _f2.subVectors( _v0$2, _v2$3 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + let axes = [ + 0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y, + _f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x, + - _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0 + ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + _triangleNormal.crossVectors( _f0, _f1 ); + axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ]; + + return satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ); + + } + + clampPoint( point, target ) { + + return target.copy( point ).clamp( this.min, this.max ); + + } + + distanceToPoint( point ) { + + const clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max ); + + return clampedPoint.sub( point ).length(); + + } + + getBoundingSphere( target ) { + + this.getCenter( target.center ); + + target.radius = this.getSize( _vector$b ).length() * 0.5; + + return target; + + } + + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + } + + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + _points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + _points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + _points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + _points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + _points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + _points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + _points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + _points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( _points ); + + return this; + + } + + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} + +Box3.prototype.isBox3 = true; + +const _points = [ + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3() +]; + +const _vector$b = /*@__PURE__*/ new Vector3(); + +const _box$3 = /*@__PURE__*/ new Box3(); + +// triangle centered vertices + +const _v0$2 = /*@__PURE__*/ new Vector3(); +const _v1$7 = /*@__PURE__*/ new Vector3(); +const _v2$3 = /*@__PURE__*/ new Vector3(); + +// triangle edge vectors + +const _f0 = /*@__PURE__*/ new Vector3(); +const _f1 = /*@__PURE__*/ new Vector3(); +const _f2 = /*@__PURE__*/ new Vector3(); + +const _center = /*@__PURE__*/ new Vector3(); +const _extents = /*@__PURE__*/ new Vector3(); +const _triangleNormal = /*@__PURE__*/ new Vector3(); +const _testAxis = /*@__PURE__*/ new Vector3(); + +function satForAxes( axes, v0, v1, v2, extents ) { + + for ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + _testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + const r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z ); + // project all 3 vertices of the triangle onto the seperating axis + const p0 = v0.dot( _testAxis ); + const p1 = v1.dot( _testAxis ); + const p2 = v2.dot( _testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false; + + } + + } + + return true; + +} + +const _box$2 = /*@__PURE__*/ new Box3(); +const _v1$6 = /*@__PURE__*/ new Vector3(); +const _toFarthestPoint = /*@__PURE__*/ new Vector3(); +const _toPoint = /*@__PURE__*/ new Vector3(); + +class Sphere { + + constructor( center = new Vector3(), radius = - 1 ) { + + this.center = center; + this.radius = radius; + + } + + set( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + } + + setFromPoints( points, optionalCenter ) { + + const center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + _box$2.setFromPoints( points ).getCenter( center ); + + } + + let maxRadiusSq = 0; + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + } + + copy( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + } + + isEmpty() { + + return ( this.radius < 0 ); + + } + + makeEmpty() { + + this.center.set( 0, 0, 0 ); + this.radius = - 1; + + return this; + + } + + containsPoint( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + } + + distanceToPoint( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + } + + intersectsSphere( sphere ) { + + const radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + } + + intersectsBox( box ) { + + return box.intersectsSphere( this ); + + } + + intersectsPlane( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + } + + clampPoint( point, target ) { + + const deltaLengthSq = this.center.distanceToSquared( point ); + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + } + + getBoundingBox( target ) { + + if ( this.isEmpty() ) { + + // Empty sphere produces empty bounding box + target.makeEmpty(); + return target; + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + } + + applyMatrix4( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + } + + translate( offset ) { + + this.center.add( offset ); + + return this; + + } + + expandByPoint( point ) { + + // from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671 + + _toPoint.subVectors( point, this.center ); + + const lengthSq = _toPoint.lengthSq(); + + if ( lengthSq > ( this.radius * this.radius ) ) { + + const length = Math.sqrt( lengthSq ); + const missingRadiusHalf = ( length - this.radius ) * 0.5; + + // Nudge this sphere towards the target point. Add half the missing distance to radius, + // and the other half to position. This gives a tighter enclosure, instead of if + // the whole missing distance were just added to radius. + + this.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) ); + this.radius += missingRadiusHalf; + + } + + return this; + + } + + union( sphere ) { + + // from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769 + + // To enclose another sphere into this sphere, we only need to enclose two points: + // 1) Enclose the farthest point on the other sphere into this sphere. + // 2) Enclose the opposite point of the farthest point into this sphere. + + _toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius ); + + this.expandByPoint( _v1$6.copy( sphere.center ).add( _toFarthestPoint ) ); + this.expandByPoint( _v1$6.copy( sphere.center ).sub( _toFarthestPoint ) ); + + return this; + + } + + equals( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$a = /*@__PURE__*/ new Vector3(); +const _segCenter = /*@__PURE__*/ new Vector3(); +const _segDir = /*@__PURE__*/ new Vector3(); +const _diff = /*@__PURE__*/ new Vector3(); + +const _edge1 = /*@__PURE__*/ new Vector3(); +const _edge2 = /*@__PURE__*/ new Vector3(); +const _normal$1 = /*@__PURE__*/ new Vector3(); + +class Ray { + + constructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) { + + this.origin = origin; + this.direction = direction; + + } + + set( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + } + + copy( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + } + + at( t, target ) { + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + } + + lookAt( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + } + + recast( t ) { + + this.origin.copy( this.at( t, _vector$a ) ); + + return this; + + } + + closestPointToPoint( point, target ) { + + target.subVectors( point, this.origin ); + + const directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + } + + distanceToPoint( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + } + + distanceSqToPoint( point ) { + + const directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + _vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return _vector$a.distanceToSquared( point ); + + } + + distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + _segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + _segDir.copy( v1 ).sub( v0 ).normalize(); + _diff.copy( this.origin ).sub( _segCenter ); + + const segExtent = v0.distanceTo( v1 ) * 0.5; + const a01 = - this.direction.dot( _segDir ); + const b0 = _diff.dot( this.direction ); + const b1 = - _diff.dot( _segDir ); + const c = _diff.lengthSq(); + const det = Math.abs( 1 - a01 * a01 ); + let s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter ); + + } + + return sqrDist; + + } + + intersectSphere( sphere, target ) { + + _vector$a.subVectors( sphere.center, this.origin ); + const tca = _vector$a.dot( this.direction ); + const d2 = _vector$a.dot( _vector$a ) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + const thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + const t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + } + + intersectsSphere( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + distanceToPlane( plane ) { + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + const t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + } + + intersectPlane( plane, target ) { + + const t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + } + + intersectsPlane( plane ) { + + // check if the ray lies on the plane first + + const distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + } + + intersectBox( box, target ) { + + let tmin, tmax, tymin, tymax, tzmin, tzmax; + + const invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + const origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + } + + intersectsBox( box ) { + + return this.intersectBox( box, _vector$a ) !== null; + + } + + intersectTriangle( a, b, c, backfaceCulling, target ) { + + // Compute the offset origin, edges, and normal. + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + _edge1.subVectors( b, a ); + _edge2.subVectors( c, a ); + _normal$1.crossVectors( _edge1, _edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + let DdN = this.direction.dot( _normal$1 ); + let sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + _diff.subVectors( this.origin, a ); + const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + const QdN = - sign * _diff.dot( _normal$1 ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + } + + applyMatrix4( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + } + + equals( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +class Matrix4 { + + constructor() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + } + + identity() { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + clone() { + + return new Matrix4().fromArray( this.elements ); + + } + + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + } + + copyPosition( m ) { + + const te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + } + + setFromMatrix3( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], 0, + me[ 1 ], me[ 4 ], me[ 7 ], 0, + me[ 2 ], me[ 5 ], me[ 8 ], 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + } + + makeBasis( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + } + + extractRotation( m ) { + + // this method does not support reflection matrices + + const te = this.elements; + const me = m.elements; + + const scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length(); + const scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length(); + const scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + makeRotationFromEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + const te = this.elements; + + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos( x ), b = Math.sin( x ); + const c = Math.cos( y ), d = Math.sin( y ); + const e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + makeRotationFromQuaternion( q ) { + + return this.compose( _zero, q, _one ); + + } + + lookAt( eye, target, up ) { + + const te = this.elements; + + _z.subVectors( eye, target ); + + if ( _z.lengthSq() === 0 ) { + + // eye and target are in the same position + + _z.z = 1; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + if ( _x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + _z.x += 0.0001; + + } else { + + _z.z += 0.0001; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + } + + _x.normalize(); + _y.crossVectors( _z, _x ); + + te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x; + te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y; + te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z; + + return this; + + } + + multiply( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + } + + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + const a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + const a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + const a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + const b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + const b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + const b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + const b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + } + + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + } + + determinant() { + + const te = this.elements; + + const n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + const n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + } + + transpose() { + + const te = this.elements; + let tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + } + + setPosition( x, y, z ) { + + const te = this.elements; + + if ( x.isVector3 ) { + + te[ 12 ] = x.x; + te[ 13 ] = x.y; + te[ 14 ] = x.z; + + } else { + + te[ 12 ] = x; + te[ 13 ] = y; + te[ 14 ] = z; + + } + + return this; + + } + + invert() { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ], + n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ], + n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ], + n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + } + + scale( v ) { + + const te = this.elements; + const x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + } + + getMaxScaleOnAxis() { + + const te = this.elements; + + const scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + const scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + const scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + } + + makeTranslation( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationX( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationY( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationZ( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationAxis( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + const c = Math.cos( angle ); + const s = Math.sin( angle ); + const t = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeScale( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeShear( xy, xz, yx, yz, zx, zy ) { + + this.set( + + 1, yx, zx, 0, + xy, 1, zy, 0, + xz, yz, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + compose( position, quaternion, scale ) { + + const te = this.elements; + + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; + + const sx = scale.x, sy = scale.y, sz = scale.z; + + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; + + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; + + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; + + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; + + return this; + + } + + decompose( position, quaternion, scale ) { + + const te = this.elements; + + let sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + const sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + const sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + const det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + _m1$2.copy( this ); + + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; + + _m1$2.elements[ 0 ] *= invSX; + _m1$2.elements[ 1 ] *= invSX; + _m1$2.elements[ 2 ] *= invSX; + + _m1$2.elements[ 4 ] *= invSY; + _m1$2.elements[ 5 ] *= invSY; + _m1$2.elements[ 6 ] *= invSY; + + _m1$2.elements[ 8 ] *= invSZ; + _m1$2.elements[ 9 ] *= invSZ; + _m1$2.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( _m1$2 ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + } + + makePerspective( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + const te = this.elements; + const x = 2 * near / ( right - left ); + const y = 2 * near / ( top - bottom ); + + const a = ( right + left ) / ( right - left ); + const b = ( top + bottom ) / ( top - bottom ); + const c = - ( far + near ) / ( far - near ); + const d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + } + + makeOrthographic( left, right, top, bottom, near, far ) { + + const te = this.elements; + const w = 1.0 / ( right - left ); + const h = 1.0 / ( top - bottom ); + const p = 1.0 / ( far - near ); + + const x = ( right + left ) * w; + const y = ( top + bottom ) * h; + const z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + } + + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + +} + +Matrix4.prototype.isMatrix4 = true; + +const _v1$5 = /*@__PURE__*/ new Vector3(); +const _m1$2 = /*@__PURE__*/ new Matrix4(); +const _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 ); +const _one = /*@__PURE__*/ new Vector3( 1, 1, 1 ); +const _x = /*@__PURE__*/ new Vector3(); +const _y = /*@__PURE__*/ new Vector3(); +const _z = /*@__PURE__*/ new Vector3(); + +const _matrix$1 = /*@__PURE__*/ new Matrix4(); +const _quaternion$3 = /*@__PURE__*/ new Quaternion(); + +class Euler { + + constructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + } + + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + get order() { + + return this._order; + + } + + set order( value ) { + + this._order = value; + this._onChangeCallback(); + + } + + set( x, y, z, order = this._order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + this._onChangeCallback(); + + return this; + + } + + clone() { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + } + + copy( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this._onChangeCallback(); + + return this; + + } + + setFromRotationMatrix( m, order = this._order, update = true ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + const te = m.elements; + const m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + const m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + const m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + switch ( order ) { + + case 'XYZ': + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + break; + + case 'YXZ': + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.9999999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + break; + + case 'ZXY': + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.9999999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + break; + + case 'ZYX': + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + break; + + case 'YZX': + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + break; + + case 'XZY': + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + break; + + default: + + console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order ); + + } + + this._order = order; + + if ( update === true ) this._onChangeCallback(); + + return this; + + } + + setFromQuaternion( q, order, update ) { + + _matrix$1.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( _matrix$1, order, update ); + + } + + setFromVector3( v, order = this._order ) { + + return this.set( v.x, v.y, v.z, order ); + + } + + reorder( newOrder ) { + + // WARNING: this discards revolution information -bhouston + + _quaternion$3.setFromEuler( this ); + + return this.setFromQuaternion( _quaternion$3, newOrder ); + + } + + equals( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + } + + fromArray( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this._onChangeCallback(); + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + } + + toVector3( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + +} + +Euler.prototype.isEuler = true; + +Euler.DefaultOrder = 'XYZ'; +Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +class Layers { + + constructor() { + + this.mask = 1 | 0; + + } + + set( channel ) { + + this.mask = 1 << channel | 0; + + } + + enable( channel ) { + + this.mask |= 1 << channel | 0; + + } + + enableAll() { + + this.mask = 0xffffffff | 0; + + } + + toggle( channel ) { + + this.mask ^= 1 << channel | 0; + + } + + disable( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + } + + disableAll() { + + this.mask = 0; + + } + + test( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + +} + +let _object3DId = 0; + +const _v1$4 = /*@__PURE__*/ new Vector3(); +const _q1 = /*@__PURE__*/ new Quaternion(); +const _m1$1 = /*@__PURE__*/ new Matrix4(); +const _target = /*@__PURE__*/ new Vector3(); + +const _position$3 = /*@__PURE__*/ new Vector3(); +const _scale$2 = /*@__PURE__*/ new Vector3(); +const _quaternion$2 = /*@__PURE__*/ new Quaternion(); + +const _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 ); +const _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 ); +const _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 ); + +const _addedEvent = { type: 'added' }; +const _removedEvent = { type: 'removed' }; + +class Object3D extends EventDispatcher { + + constructor() { + + super(); + + Object.defineProperty( this, 'id', { value: _object3DId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation._onChange( onRotationChange ); + quaternion._onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.animations = []; + + this.userData = {}; + + } + + onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + applyMatrix4( matrix ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + this.matrix.premultiply( matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + } + + applyQuaternion( q ) { + + this.quaternion.premultiply( q ); + + return this; + + } + + setRotationFromAxisAngle( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + } + + setRotationFromEuler( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + } + + setRotationFromMatrix( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + } + + setRotationFromQuaternion( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + } + + rotateOnAxis( axis, angle ) { + + // rotate object on axis in object space + // axis is assumed to be normalized + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( _q1 ); + + return this; + + } + + rotateOnWorldAxis( axis, angle ) { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( _q1 ); + + return this; + + } + + rotateX( angle ) { + + return this.rotateOnAxis( _xAxis, angle ); + + } + + rotateY( angle ) { + + return this.rotateOnAxis( _yAxis, angle ); + + } + + rotateZ( angle ) { + + return this.rotateOnAxis( _zAxis, angle ); + + } + + translateOnAxis( axis, distance ) { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + _v1$4.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( _v1$4.multiplyScalar( distance ) ); + + return this; + + } + + translateX( distance ) { + + return this.translateOnAxis( _xAxis, distance ); + + } + + translateY( distance ) { + + return this.translateOnAxis( _yAxis, distance ); + + } + + translateZ( distance ) { + + return this.translateOnAxis( _zAxis, distance ); + + } + + localToWorld( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + } + + worldToLocal( vector ) { + + return vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() ); + + } + + lookAt( x, y, z ) { + + // This method does not support objects having non-uniformly-scaled parent(s) + + if ( x.isVector3 ) { + + _target.copy( x ); + + } else { + + _target.set( x, y, z ); + + } + + const parent = this.parent; + + this.updateWorldMatrix( true, false ); + + _position$3.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera || this.isLight ) { + + _m1$1.lookAt( _position$3, _target, this.up ); + + } else { + + _m1$1.lookAt( _target, _position$3, this.up ); + + } + + this.quaternion.setFromRotationMatrix( _m1$1 ); + + if ( parent ) { + + _m1$1.extractRotation( parent.matrixWorld ); + _q1.setFromRotationMatrix( _m1$1 ); + this.quaternion.premultiply( _q1.invert() ); + + } + + } + + add( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( 'THREE.Object3D.add: object can\'t be added as a child of itself.', object ); + return this; + + } + + if ( object && object.isObject3D ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + this.children.push( object ); + + object.dispatchEvent( _addedEvent ); + + } else { + + console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object ); + + } + + return this; + + } + + remove( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + const index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + this.children.splice( index, 1 ); + + object.dispatchEvent( _removedEvent ); + + } + + return this; + + } + + removeFromParent() { + + const parent = this.parent; + + if ( parent !== null ) { + + parent.remove( this ); + + } + + return this; + + } + + clear() { + + for ( let i = 0; i < this.children.length; i ++ ) { + + const object = this.children[ i ]; + + object.parent = null; + + object.dispatchEvent( _removedEvent ); + + } + + this.children.length = 0; + + return this; + + + } + + attach( object ) { + + // adds object as a child of this, while maintaining the object's world transform + + this.updateWorldMatrix( true, false ); + + _m1$1.copy( this.matrixWorld ).invert(); + + if ( object.parent !== null ) { + + object.parent.updateWorldMatrix( true, false ); + + _m1$1.multiply( object.parent.matrixWorld ); + + } + + object.applyMatrix4( _m1$1 ); + + this.add( object ); + + object.updateWorldMatrix( false, true ); + + return this; + + } + + getObjectById( id ) { + + return this.getObjectByProperty( 'id', id ); + + } + + getObjectByName( name ) { + + return this.getObjectByProperty( 'name', name ); + + } + + getObjectByProperty( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( let i = 0, l = this.children.length; i < l; i ++ ) { + + const child = this.children[ i ]; + const object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + } + + getWorldPosition( target ) { + + this.updateWorldMatrix( true, false ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + } + + getWorldQuaternion( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, target, _scale$2 ); + + return target; + + } + + getWorldScale( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, _quaternion$2, target ); + + return target; + + } + + getWorldDirection( target ) { + + this.updateWorldMatrix( true, false ); + + const e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + } + + raycast() {} + + traverse( callback ) { + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + } + + traverseVisible( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + } + + traverseAncestors( callback ) { + + const parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + } + + updateMatrix() { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + } + + updateMatrixWorld( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + } + + updateWorldMatrix( updateParents, updateChildren ) { + + const parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateWorldMatrix( false, true ); + + } + + } + + } + + toJSON( meta ) { + + // meta is a string when called from JSON.stringify + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + const output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + const object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // object specific properties + + if ( this.isInstancedMesh ) { + + object.type = 'InstancedMesh'; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); + if ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON(); + + } + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isScene ) { + + if ( this.background ) { + + if ( this.background.isColor ) { + + object.background = this.background.toJSON(); + + } else if ( this.background.isTexture ) { + + object.background = this.background.toJSON( meta ).uuid; + + } + + } + + if ( this.environment && this.environment.isTexture ) { + + object.environment = this.environment.toJSON( meta ).uuid; + + } + + } else if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + const parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + const shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.isSkinnedMesh ) { + + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); + + if ( this.skeleton !== undefined ) { + + serialize( meta.skeletons, this.skeleton ); + + object.skeleton = this.skeleton.uuid; + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + const uuids = []; + + for ( let i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( let i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + // + + if ( this.animations.length > 0 ) { + + object.animations = []; + + for ( let i = 0; i < this.animations.length; i ++ ) { + + const animation = this.animations[ i ]; + + object.animations.push( serialize( meta.animations, animation ) ); + + } + + } + + if ( isRootObject ) { + + const geometries = extractFromCache( meta.geometries ); + const materials = extractFromCache( meta.materials ); + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + const shapes = extractFromCache( meta.shapes ); + const skeletons = extractFromCache( meta.skeletons ); + const animations = extractFromCache( meta.animations ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + if ( skeletons.length > 0 ) output.skeletons = skeletons; + if ( animations.length > 0 ) output.animations = animations; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + const values = []; + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + } + + clone( recursive ) { + + return new this.constructor().copy( this, recursive ); + + } + + copy( source, recursive = true ) { + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.rotation.order = source.rotation.order; + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( let i = 0; i < source.children.length; i ++ ) { + + const child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +} + +Object3D.DefaultUp = new Vector3( 0, 1, 0 ); +Object3D.DefaultMatrixAutoUpdate = true; + +Object3D.prototype.isObject3D = true; + +const _v0$1 = /*@__PURE__*/ new Vector3(); +const _v1$3 = /*@__PURE__*/ new Vector3(); +const _v2$2 = /*@__PURE__*/ new Vector3(); +const _v3$1 = /*@__PURE__*/ new Vector3(); + +const _vab = /*@__PURE__*/ new Vector3(); +const _vac = /*@__PURE__*/ new Vector3(); +const _vbc = /*@__PURE__*/ new Vector3(); +const _vap = /*@__PURE__*/ new Vector3(); +const _vbp = /*@__PURE__*/ new Vector3(); +const _vcp = /*@__PURE__*/ new Vector3(); + +class Triangle { + + constructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) { + + this.a = a; + this.b = b; + this.c = c; + + } + + static getNormal( a, b, c, target ) { + + target.subVectors( c, b ); + _v0$1.subVectors( a, b ); + target.cross( _v0$1 ); + + const targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + } + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + static getBarycoord( point, a, b, c, target ) { + + _v0$1.subVectors( c, a ); + _v1$3.subVectors( b, a ); + _v2$2.subVectors( point, a ); + + const dot00 = _v0$1.dot( _v0$1 ); + const dot01 = _v0$1.dot( _v1$3 ); + const dot02 = _v0$1.dot( _v2$2 ); + const dot11 = _v1$3.dot( _v1$3 ); + const dot12 = _v1$3.dot( _v2$2 ); + + const denom = ( dot00 * dot11 - dot01 * dot01 ); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return target.set( - 2, - 1, - 1 ); + + } + + const invDenom = 1 / denom; + const u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + const v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + } + + static containsPoint( point, a, b, c ) { + + this.getBarycoord( point, a, b, c, _v3$1 ); + + return ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 ); + + } + + static getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, _v3$1 ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, _v3$1.x ); + target.addScaledVector( uv2, _v3$1.y ); + target.addScaledVector( uv3, _v3$1.z ); + + return target; + + } + + static isFrontFacing( a, b, c, direction ) { + + _v0$1.subVectors( c, b ); + _v1$3.subVectors( a, b ); + + // strictly front facing + return ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false; + + } + + set( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + } + + setFromPointsAndIndices( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + } + + setFromAttributeAndIndices( attribute, i0, i1, i2 ) { + + this.a.fromBufferAttribute( attribute, i0 ); + this.b.fromBufferAttribute( attribute, i1 ); + this.c.fromBufferAttribute( attribute, i2 ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + } + + getArea() { + + _v0$1.subVectors( this.c, this.b ); + _v1$3.subVectors( this.a, this.b ); + + return _v0$1.cross( _v1$3 ).length() * 0.5; + + } + + getMidpoint( target ) { + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + } + + getNormal( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + } + + getPlane( target ) { + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + } + + getBarycoord( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + } + + getUV( point, uv1, uv2, uv3, target ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target ); + + } + + containsPoint( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + } + + isFrontFacing( direction ) { + + return Triangle.isFrontFacing( this.a, this.b, this.c, direction ); + + } + + intersectsBox( box ) { + + return box.intersectsTriangle( this ); + + } + + closestPointToPoint( p, target ) { + + const a = this.a, b = this.b, c = this.c; + let v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + _vab.subVectors( b, a ); + _vac.subVectors( c, a ); + _vap.subVectors( p, a ); + const d1 = _vab.dot( _vap ); + const d2 = _vac.dot( _vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + _vbp.subVectors( p, b ); + const d3 = _vab.dot( _vbp ); + const d4 = _vac.dot( _vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + const vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( _vab, v ); + + } + + _vcp.subVectors( p, c ); + const d5 = _vab.dot( _vcp ); + const d6 = _vac.dot( _vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + const vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( _vac, w ); + + } + + const va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + _vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC + + } + + // face region + const denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + + return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w ); + + } + + equals( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +} + +let materialId = 0; + +class Material extends EventDispatcher { + + constructor() { + + super(); + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.vertexColors = false; + + this.opacity = 1; + this.format = RGBAFormat; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.stencilWriteMask = 0xff; + this.stencilFunc = AlwaysStencilFunc; + this.stencilRef = 0; + this.stencilFuncMask = 0xff; + this.stencilFail = KeepStencilOp; + this.stencilZFail = KeepStencilOp; + this.stencilZPass = KeepStencilOp; + this.stencilWrite = false; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaToCoverage = false; + this.premultipliedAlpha = false; + + this.visible = true; + + this.toneMapped = true; + + this.userData = {}; + + this.version = 0; + + this._alphaTest = 0; + + } + + get alphaTest() { + + return this._alphaTest; + + } + + set alphaTest( value ) { + + if ( this._alphaTest > 0 !== value > 0 ) { + + this.version ++; + + } + + this._alphaTest = value; + + } + + onBuild( /* shaderobject, renderer */ ) {} + + onBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {} + + onBeforeCompile( /* shaderobject, renderer */ ) {} + + customProgramCacheKey() { + + return this.onBeforeCompile.toString(); + + } + + setValues( values ) { + + if ( values === undefined ) return; + + for ( const key in values ) { + + const newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( 'THREE.Material: \'' + key + '\' parameter is undefined.' ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + const currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( 'THREE.' + this.type + ': \'' + key + '\' is not a property of this material.' ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + } + + toJSON( meta ) { + + const isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + const data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.sheen !== undefined ) data.sheen = this.sheen; + if ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex(); + if ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness; + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity; + if ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat; + if ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness; + + if ( this.clearcoatMap && this.clearcoatMap.isTexture ) { + + data.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) { + + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) { + + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); + + } + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + + if ( this.lightMap && this.lightMap.isTexture ) { + + data.lightMap = this.lightMap.toJSON( meta ).uuid; + data.lightMapIntensity = this.lightMapIntensity; + + } + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + if ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid; + if ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + + if ( this.combine !== undefined ) data.combine = this.combine; + + } + + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + if ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity; + if ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio; + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.transmission !== undefined ) data.transmission = this.transmission; + if ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid; + if ( this.thickness !== undefined ) data.thickness = this.thickness; + if ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid; + if ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance; + if ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex(); + + if ( this.size !== undefined ) data.size = this.size; + if ( this.shadowSide !== null ) data.shadowSide = this.shadowSide; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors ) data.vertexColors = true; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.format !== RGBAFormat ) data.format = this.format; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + data.colorWrite = this.colorWrite; + + data.stencilWrite = this.stencilWrite; + data.stencilWriteMask = this.stencilWriteMask; + data.stencilFunc = this.stencilFunc; + data.stencilRef = this.stencilRef; + data.stencilFuncMask = this.stencilFuncMask; + data.stencilFail = this.stencilFail; + data.stencilZFail = this.stencilZFail; + data.stencilZPass = this.stencilZPass; + + // rotation (SpriteMaterial) + if ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.flatShading === true ) data.flatShading = this.flatShading; + + if ( this.visible === false ) data.visible = false; + + if ( this.toneMapped === false ) data.toneMapped = false; + + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + const values = []; + + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.name = source.name; + + this.fog = source.fog; + + this.blending = source.blending; + this.side = source.side; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.format = source.format; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; + + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; + + if ( srcPlanes !== null ) { + + const n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( let i = 0; i !== n; ++ i ) { + + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + } + + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; + + this.shadowSide = source.shadowSide; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.alphaToCoverage = source.alphaToCoverage; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.visible = source.visible; + + this.toneMapped = source.toneMapped; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + +} + +Material.prototype.isMaterial = true; + +const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +const _hslA = { h: 0, s: 0, l: 0 }; +const _hslB = { h: 0, s: 0, l: 0 }; + +function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + +} + +function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + +} + +function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + +} + +class Color { + + constructor( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + set( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + } + + setScalar( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + } + + setHex( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + } + + setRGB( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + } + + setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = euclideanModulo( h, 1 ); + s = clamp( s, 0, 1 ); + l = clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + const q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + } + + setStyle( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + let m; + + if ( m = /^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + let color; + const name = m[ 1 ]; + const components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 4 ] ); + + return this; + + } + + if ( color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 4 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + const h = parseFloat( color[ 1 ] ) / 360; + const s = parseInt( color[ 2 ], 10 ) / 100; + const l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 4 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f\d]+)$/.exec( style ) ) { + + // hex color + + const hex = m[ 1 ]; + const size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + return this.setColorName( style ); + + } + + return this; + + } + + setColorName( style ) { + + // color keywords + const hex = _colorKeywords[ style.toLowerCase() ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + return this; + + } + + clone() { + + return new this.constructor( this.r, this.g, this.b ); + + } + + copy( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + } + + copyGammaToLinear( color, gammaFactor = 2.0 ) { + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + } + + copyLinearToGamma( color, gammaFactor = 2.0 ) { + + const safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + } + + convertGammaToLinear( gammaFactor ) { + + this.copyGammaToLinear( this, gammaFactor ); + + return this; + + } + + convertLinearToGamma( gammaFactor ) { + + this.copyLinearToGamma( this, gammaFactor ); + + return this; + + } + + copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + } + + copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + } + + convertSRGBToLinear() { + + this.copySRGBToLinear( this ); + + return this; + + } + + convertLinearToSRGB() { + + this.copyLinearToSRGB( this ); + + return this; + + } + + getHex() { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + } + + getHexString() { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + } + + getHSL( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + const r = this.r, g = this.g, b = this.b; + + const max = Math.max( r, g, b ); + const min = Math.min( r, g, b ); + + let hue, saturation; + const lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + const delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + } + + getStyle() { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + } + + offsetHSL( h, s, l ) { + + this.getHSL( _hslA ); + + _hslA.h += h; _hslA.s += s; _hslA.l += l; + + this.setHSL( _hslA.h, _hslA.s, _hslA.l ); + + return this; + + } + + add( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + } + + addColors( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + } + + addScalar( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + } + + sub( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + } + + multiply( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + } + + multiplyScalar( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + } + + lerp( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + } + + lerpColors( color1, color2, alpha ) { + + this.r = color1.r + ( color2.r - color1.r ) * alpha; + this.g = color1.g + ( color2.g - color1.g ) * alpha; + this.b = color1.b + ( color2.b - color1.b ) * alpha; + + return this; + + } + + lerpHSL( color, alpha ) { + + this.getHSL( _hslA ); + color.getHSL( _hslB ); + + const h = lerp( _hslA.h, _hslB.h, alpha ); + const s = lerp( _hslA.s, _hslB.s, alpha ); + const l = lerp( _hslA.l, _hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + } + + equals( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + } + + fromArray( array, offset = 0 ) { + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this.r = attribute.getX( index ); + this.g = attribute.getY( index ); + this.b = attribute.getZ( index ); + + if ( attribute.normalized === true ) { + + // assuming Uint8Array + + this.r /= 255; + this.g /= 255; + this.b /= 255; + + } + + return this; + + } + + toJSON() { + + return this.getHex(); + + } + +} + +Color.NAMES = _colorKeywords; + +Color.prototype.isColor = true; +Color.prototype.r = 1; +Color.prototype.g = 1; +Color.prototype.b = 1; + +/** + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * } + */ + +class MeshBasicMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + return this; + + } + +} + +MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + +const _vector$9 = /*@__PURE__*/ new Vector3(); +const _vector2$1 = /*@__PURE__*/ new Vector2(); + +class BufferAttribute { + + constructor( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.usage = StaticDrawUsage; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + copy( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.usage = source.usage; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( let i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + copyArray( array ) { + + this.array.set( array ); + + return this; + + } + + copyColorsArray( colors ) { + + const array = this.array; + let offset = 0; + + for ( let i = 0, l = colors.length; i < l; i ++ ) { + + let color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + } + + copyVector2sArray( vectors ) { + + const array = this.array; + let offset = 0; + + for ( let i = 0, l = vectors.length; i < l; i ++ ) { + + let vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + } + + copyVector3sArray( vectors ) { + + const array = this.array; + let offset = 0; + + for ( let i = 0, l = vectors.length; i < l; i ++ ) { + + let vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + } + + copyVector4sArray( vectors ) { + + const array = this.array; + let offset = 0; + + for ( let i = 0, l = vectors.length; i < l; i ++ ) { + + let vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + } + + applyMatrix3( m ) { + + if ( this.itemSize === 2 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector2$1.fromBufferAttribute( this, i ); + _vector2$1.applyMatrix3( m ); + + this.setXY( i, _vector2$1.x, _vector2$1.y ); + + } + + } else if ( this.itemSize === 3 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + _vector$9.applyMatrix3( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + } + + return this; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.x = this.getX( i ); + _vector$9.y = this.getY( i ); + _vector$9.z = this.getZ( i ); + + _vector$9.applyMatrix4( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.x = this.getX( i ); + _vector$9.y = this.getY( i ); + _vector$9.z = this.getZ( i ); + + _vector$9.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.x = this.getX( i ); + _vector$9.y = this.getY( i ); + _vector$9.z = this.getZ( i ); + + _vector$9.transformDirection( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + set( value, offset = 0 ) { + + this.array.set( value, offset ); + + return this; + + } + + getX( index ) { + + return this.array[ index * this.itemSize ]; + + } + + setX( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + } + + getY( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + } + + setY( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + } + + getZ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + } + + setZ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + } + + getW( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + } + + setW( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + } + + setXY( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + clone() { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + toJSON() { + + const data = { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.prototype.slice.call( this.array ), + normalized: this.normalized + }; + + if ( this.name !== '' ) data.name = this.name; + if ( this.usage !== StaticDrawUsage ) data.usage = this.usage; + if ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange; + + return data; + + } + +} + +BufferAttribute.prototype.isBufferAttribute = true; + +// + +class Int8BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int8Array( array ), itemSize, normalized ); + + } + +} + +class Uint8BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint8Array( array ), itemSize, normalized ); + + } + +} + +class Uint8ClampedBufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint8ClampedArray( array ), itemSize, normalized ); + + } + +} + +class Int16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int16Array( array ), itemSize, normalized ); + + } + +} + +class Uint16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint16Array( array ), itemSize, normalized ); + + } + +} + +class Int32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int32Array( array ), itemSize, normalized ); + + } + +} + +class Uint32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint32Array( array ), itemSize, normalized ); + + } + +} + +class Float16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint16Array( array ), itemSize, normalized ); + + } + +} + +Float16BufferAttribute.prototype.isFloat16BufferAttribute = true; + +class Float32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Float32Array( array ), itemSize, normalized ); + + } + +} + +class Float64BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Float64Array( array ), itemSize, normalized ); + + } + +} + +let _id = 0; + +const _m1 = /*@__PURE__*/ new Matrix4(); +const _obj = /*@__PURE__*/ new Object3D(); +const _offset = /*@__PURE__*/ new Vector3(); +const _box$1 = /*@__PURE__*/ new Box3(); +const _boxMorphTargets = /*@__PURE__*/ new Box3(); +const _vector$8 = /*@__PURE__*/ new Vector3(); + +class BufferGeometry extends EventDispatcher { + + constructor() { + + super(); + + Object.defineProperty( this, 'id', { value: _id ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + this.morphTargetsRelative = false; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + + } + + getIndex() { + + return this.index; + + } + + setIndex( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + return this; + + } + + getAttribute( name ) { + + return this.attributes[ name ]; + + } + + setAttribute( name, attribute ) { + + this.attributes[ name ] = attribute; + + return this; + + } + + deleteAttribute( name ) { + + delete this.attributes[ name ]; + + return this; + + } + + hasAttribute( name ) { + + return this.attributes[ name ] !== undefined; + + } + + addGroup( start, count, materialIndex = 0 ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + } + + clearGroups() { + + this.groups = []; + + } + + setDrawRange( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + } + + applyMatrix4( matrix ) { + + const position = this.attributes.position; + + if ( position !== undefined ) { + + position.applyMatrix4( matrix ); + + position.needsUpdate = true; + + } + + const normal = this.attributes.normal; + + if ( normal !== undefined ) { + + const normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normal.applyNormalMatrix( normalMatrix ); + + normal.needsUpdate = true; + + } + + const tangent = this.attributes.tangent; + + if ( tangent !== undefined ) { + + tangent.transformDirection( matrix ); + + tangent.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + } + + applyQuaternion( q ) { + + _m1.makeRotationFromQuaternion( q ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateX( angle ) { + + // rotate geometry around world x-axis + + _m1.makeRotationX( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateY( angle ) { + + // rotate geometry around world y-axis + + _m1.makeRotationY( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateZ( angle ) { + + // rotate geometry around world z-axis + + _m1.makeRotationZ( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + translate( x, y, z ) { + + // translate geometry + + _m1.makeTranslation( x, y, z ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + scale( x, y, z ) { + + // scale geometry + + _m1.makeScale( x, y, z ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + lookAt( vector ) { + + _obj.lookAt( vector ); + + _obj.updateMatrix(); + + this.applyMatrix4( _obj.matrix ); + + return this; + + } + + center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( _offset ).negate(); + + this.translate( _offset.x, _offset.y, _offset.z ); + + return this; + + } + + setFromPoints( points ) { + + const position = []; + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + } + + computeBoundingBox() { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this ); + + this.boundingBox.set( + new Vector3( - Infinity, - Infinity, - Infinity ), + new Vector3( + Infinity, + Infinity, + Infinity ) + ); + + return; + + } + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _box$1.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( this.boundingBox.min, _box$1.min ); + this.boundingBox.expandByPoint( _vector$8 ); + + _vector$8.addVectors( this.boundingBox.max, _box$1.max ); + this.boundingBox.expandByPoint( _vector$8 ); + + } else { + + this.boundingBox.expandByPoint( _box$1.min ); + this.boundingBox.expandByPoint( _box$1.max ); + + } + + } + + } + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this ); + + this.boundingSphere.set( new Vector3(), Infinity ); + + return; + + } + + if ( position ) { + + // first, find the center of the bounding sphere + + const center = this.boundingSphere.center; + + _box$1.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _boxMorphTargets.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( _box$1.min, _boxMorphTargets.min ); + _box$1.expandByPoint( _vector$8 ); + + _vector$8.addVectors( _box$1.max, _boxMorphTargets.max ); + _box$1.expandByPoint( _vector$8 ); + + } else { + + _box$1.expandByPoint( _boxMorphTargets.min ); + _box$1.expandByPoint( _boxMorphTargets.max ); + + } + + } + + } + + _box$1.getCenter( center ); + + // second, try to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + let maxRadiusSq = 0; + + for ( let i = 0, il = position.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( position, i ); + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + const morphTargetsRelative = this.morphTargetsRelative; + + for ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) { + + _vector$8.fromBufferAttribute( morphAttribute, j ); + + if ( morphTargetsRelative ) { + + _offset.fromBufferAttribute( position, j ); + _vector$8.add( _offset ); + + } + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + } + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + } + + computeTangents() { + + const index = this.index; + const attributes = this.attributes; + + // based on http://www.terathon.com/code/tangent.html + // (per vertex tangents) + + if ( index === null || + attributes.position === undefined || + attributes.normal === undefined || + attributes.uv === undefined ) { + + console.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' ); + return; + + } + + const indices = index.array; + const positions = attributes.position.array; + const normals = attributes.normal.array; + const uvs = attributes.uv.array; + + const nVertices = positions.length / 3; + + if ( attributes.tangent === undefined ) { + + this.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) ); + + } + + const tangents = attributes.tangent.array; + + const tan1 = [], tan2 = []; + + for ( let i = 0; i < nVertices; i ++ ) { + + tan1[ i ] = new Vector3(); + tan2[ i ] = new Vector3(); + + } + + const vA = new Vector3(), + vB = new Vector3(), + vC = new Vector3(), + + uvA = new Vector2(), + uvB = new Vector2(), + uvC = new Vector2(), + + sdir = new Vector3(), + tdir = new Vector3(); + + function handleTriangle( a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + vB.sub( vA ); + vC.sub( vA ); + + uvB.sub( uvA ); + uvC.sub( uvA ); + + const r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y ); + + // silently ignore degenerate uv triangles having coincident or colinear vertices + + if ( ! isFinite( r ) ) return; + + sdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r ); + tdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r ); + + tan1[ a ].add( sdir ); + tan1[ b ].add( sdir ); + tan1[ c ].add( sdir ); + + tan2[ a ].add( tdir ); + tan2[ b ].add( tdir ); + tan2[ c ].add( tdir ); + + } + + let groups = this.groups; + + if ( groups.length === 0 ) { + + groups = [ { + start: 0, + count: indices.length + } ]; + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleTriangle( + indices[ j + 0 ], + indices[ j + 1 ], + indices[ j + 2 ] + ); + + } + + } + + const tmp = new Vector3(), tmp2 = new Vector3(); + const n = new Vector3(), n2 = new Vector3(); + + function handleVertex( v ) { + + n.fromArray( normals, v * 3 ); + n2.copy( n ); + + const t = tan1[ v ]; + + // Gram-Schmidt orthogonalize + + tmp.copy( t ); + tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize(); + + // Calculate handedness + + tmp2.crossVectors( n2, t ); + const test = tmp2.dot( tan2[ v ] ); + const w = ( test < 0.0 ) ? - 1.0 : 1.0; + + tangents[ v * 4 ] = tmp.x; + tangents[ v * 4 + 1 ] = tmp.y; + tangents[ v * 4 + 2 ] = tmp.z; + tangents[ v * 4 + 3 ] = w; + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleVertex( indices[ j + 0 ] ); + handleVertex( indices[ j + 1 ] ); + handleVertex( indices[ j + 2 ] ); + + } + + } + + } + + computeVertexNormals() { + + const index = this.index; + const positionAttribute = this.getAttribute( 'position' ); + + if ( positionAttribute !== undefined ) { + + let normalAttribute = this.getAttribute( 'normal' ); + + if ( normalAttribute === undefined ) { + + normalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 ); + this.setAttribute( 'normal', normalAttribute ); + + } else { + + // reset existing normals to zero + + for ( let i = 0, il = normalAttribute.count; i < il; i ++ ) { + + normalAttribute.setXYZ( i, 0, 0, 0 ); + + } + + } + + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + for ( let i = 0, il = index.count; i < il; i += 3 ) { + + const vA = index.getX( i + 0 ); + const vB = index.getX( i + 1 ); + const vC = index.getX( i + 2 ); + + pA.fromBufferAttribute( positionAttribute, vA ); + pB.fromBufferAttribute( positionAttribute, vB ); + pC.fromBufferAttribute( positionAttribute, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + nA.fromBufferAttribute( normalAttribute, vA ); + nB.fromBufferAttribute( normalAttribute, vB ); + nC.fromBufferAttribute( normalAttribute, vC ); + + nA.add( cb ); + nB.add( cb ); + nC.add( cb ); + + normalAttribute.setXYZ( vA, nA.x, nA.y, nA.z ); + normalAttribute.setXYZ( vB, nB.x, nB.y, nB.z ); + normalAttribute.setXYZ( vC, nC.x, nC.y, nC.z ); + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) { + + pA.fromBufferAttribute( positionAttribute, i + 0 ); + pB.fromBufferAttribute( positionAttribute, i + 1 ); + pC.fromBufferAttribute( positionAttribute, i + 2 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z ); + + } + + } + + this.normalizeNormals(); + + normalAttribute.needsUpdate = true; + + } + + } + + merge( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + const attributes = this.attributes; + + for ( const key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + const attribute1 = attributes[ key ]; + const attributeArray1 = attribute1.array; + + const attribute2 = geometry.attributes[ key ]; + const attributeArray2 = attribute2.array; + + const attributeOffset = attribute2.itemSize * offset; + const length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset ); + + for ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + } + + normalizeNormals() { + + const normals = this.attributes.normal; + + for ( let i = 0, il = normals.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( normals, i ); + + _vector$8.normalize(); + + normals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z ); + + } + + } + + toNonIndexed() { + + function convertBufferAttribute( attribute, indices ) { + + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + + const array2 = new array.constructor( indices.length * itemSize ); + + let index = 0, index2 = 0; + + for ( let i = 0, l = indices.length; i < l; i ++ ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + index = indices[ i ] * attribute.data.stride + attribute.offset; + + } else { + + index = indices[ i ] * itemSize; + + } + + for ( let j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + return new BufferAttribute( array2, itemSize, normalized ); + + } + + // + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' ); + return this; + + } + + const geometry2 = new BufferGeometry(); + + const indices = this.index.array; + const attributes = this.attributes; + + // attributes + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + geometry2.setAttribute( name, newAttribute ); + + } + + // morph attributes + + const morphAttributes = this.morphAttributes; + + for ( const name in morphAttributes ) { + + const morphArray = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, il = morphAttribute.length; i < il; i ++ ) { + + const attribute = morphAttribute[ i ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + morphArray.push( newAttribute ); + + } + + geometry2.morphAttributes[ name ] = morphArray; + + } + + geometry2.morphTargetsRelative = this.morphTargetsRelative; + + // groups + + const groups = this.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + const parameters = this.parameters; + + for ( const key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + // for simplicity the code assumes attributes are not shared across geometries, see #15811 + + data.data = { attributes: {} }; + + const index = this.index; + + if ( index !== null ) { + + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call( index.array ) + }; + + } + + const attributes = this.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + + data.data.attributes[ key ] = attribute.toJSON( data.data ); + + } + + const morphAttributes = {}; + let hasMorphAttributes = false; + + for ( const key in this.morphAttributes ) { + + const attributeArray = this.morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + + array.push( attribute.toJSON( data.data ) ); + + } + + if ( array.length > 0 ) { + + morphAttributes[ key ] = array; + + hasMorphAttributes = true; + + } + + } + + if ( hasMorphAttributes ) { + + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; + + } + + const groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + const boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // used for storing cloned, shared data + + const data = {}; + + // name + + this.name = source.name; + + // index + + const index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone( data ) ); + + } + + // attributes + + const attributes = source.attributes; + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + this.setAttribute( name, attribute.clone( data ) ); + + } + + // morph attributes + + const morphAttributes = source.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone( data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + this.morphTargetsRelative = source.morphTargetsRelative; + + // groups + + const groups = source.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + const boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + const boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + // geometry generator parameters + + if ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +BufferGeometry.prototype.isBufferGeometry = true; + +const _inverseMatrix$2 = /*@__PURE__*/ new Matrix4(); +const _ray$2 = /*@__PURE__*/ new Ray(); +const _sphere$3 = /*@__PURE__*/ new Sphere(); + +const _vA$1 = /*@__PURE__*/ new Vector3(); +const _vB$1 = /*@__PURE__*/ new Vector3(); +const _vC$1 = /*@__PURE__*/ new Vector3(); + +const _tempA = /*@__PURE__*/ new Vector3(); +const _tempB = /*@__PURE__*/ new Vector3(); +const _tempC = /*@__PURE__*/ new Vector3(); + +const _morphA = /*@__PURE__*/ new Vector3(); +const _morphB = /*@__PURE__*/ new Vector3(); +const _morphC = /*@__PURE__*/ new Vector3(); + +const _uvA$1 = /*@__PURE__*/ new Vector2(); +const _uvB$1 = /*@__PURE__*/ new Vector2(); +const _uvC$1 = /*@__PURE__*/ new Vector2(); + +const _intersectionPoint = /*@__PURE__*/ new Vector3(); +const _intersectionPointWorld = /*@__PURE__*/ new Vector3(); + +class Mesh extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) { + + super(); + + this.type = 'Mesh'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source ) { + + super.copy( source ); + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + this.material = source.material; + this.geometry = source.geometry; + + return this; + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$3.copy( geometry.boundingSphere ); + _sphere$3.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return; + + // + + _inverseMatrix$2.copy( matrixWorld ).invert(); + _ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( _ray$2.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + let intersection; + + if ( geometry.isBufferGeometry ) { + + const index = geometry.index; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + const uv = geometry.attributes.uv; + const uv2 = geometry.attributes.uv2; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = index.getX( j ); + const b = index.getX( j + 1 ); + const c = index.getX( j + 2 ); + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + const c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = j; + const b = j + 1; + const c = j + 2; + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = i; + const b = i + 1; + const c = i + 2; + + intersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + console.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + +} + +Mesh.prototype.isMesh = true; + +function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + let intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + _intersectionPointWorld.copy( point ); + _intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: _intersectionPointWorld.clone(), + object: object + }; + +} + +function checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) { + + _vA$1.fromBufferAttribute( position, a ); + _vB$1.fromBufferAttribute( position, b ); + _vC$1.fromBufferAttribute( position, c ); + + const morphInfluences = object.morphTargetInfluences; + + if ( morphPosition && morphInfluences ) { + + _morphA.set( 0, 0, 0 ); + _morphB.set( 0, 0, 0 ); + _morphC.set( 0, 0, 0 ); + + for ( let i = 0, il = morphPosition.length; i < il; i ++ ) { + + const influence = morphInfluences[ i ]; + const morphAttribute = morphPosition[ i ]; + + if ( influence === 0 ) continue; + + _tempA.fromBufferAttribute( morphAttribute, a ); + _tempB.fromBufferAttribute( morphAttribute, b ); + _tempC.fromBufferAttribute( morphAttribute, c ); + + if ( morphTargetsRelative ) { + + _morphA.addScaledVector( _tempA, influence ); + _morphB.addScaledVector( _tempB, influence ); + _morphC.addScaledVector( _tempC, influence ); + + } else { + + _morphA.addScaledVector( _tempA.sub( _vA$1 ), influence ); + _morphB.addScaledVector( _tempB.sub( _vB$1 ), influence ); + _morphC.addScaledVector( _tempC.sub( _vC$1 ), influence ); + + } + + } + + _vA$1.add( _morphA ); + _vB$1.add( _morphB ); + _vC$1.add( _morphC ); + + } + + if ( object.isSkinnedMesh ) { + + object.boneTransform( a, _vA$1 ); + object.boneTransform( b, _vB$1 ); + object.boneTransform( c, _vC$1 ); + + } + + const intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + _uvA$1.fromBufferAttribute( uv, a ); + _uvB$1.fromBufferAttribute( uv, b ); + _uvC$1.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ); + + } + + if ( uv2 ) { + + _uvA$1.fromBufferAttribute( uv2, a ); + _uvB$1.fromBufferAttribute( uv2, b ); + _uvC$1.fromBufferAttribute( uv2, c ); + + intersection.uv2 = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ); + + } + + const face = { + a: a, + b: b, + c: c, + normal: new Vector3(), + materialIndex: 0 + }; + + Triangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal ); + + intersection.face = face; + + } + + return intersection; + +} + +class BoxGeometry extends BufferGeometry { + + constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) { + + super(); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + const scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ); + heightSegments = Math.floor( heightSegments ); + depthSegments = Math.floor( depthSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let numberOfVertices = 0; + let groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + const segmentWidth = width / gridX; + const segmentHeight = height / gridY; + + const widthHalf = width / 2; + const heightHalf = height / 2; + const depthHalf = depth / 2; + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + let vertexCounter = 0; + let groupCount = 0; + + const vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segmentHeight - heightHalf; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + static fromJSON( data ) { + + return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); + + } + +} + +/** + * Uniform Utilities + */ + +function cloneUniforms( src ) { + + const dst = {}; + + for ( const u in src ) { + + dst[ u ] = {}; + + for ( const p in src[ u ] ) { + + const property = src[ u ][ p ]; + + if ( property && ( property.isColor || + property.isMatrix3 || property.isMatrix4 || + property.isVector2 || property.isVector3 || property.isVector4 || + property.isTexture || property.isQuaternion ) ) { + + dst[ u ][ p ] = property.clone(); + + } else if ( Array.isArray( property ) ) { + + dst[ u ][ p ] = property.slice(); + + } else { + + dst[ u ][ p ] = property; + + } + + } + + } + + return dst; + +} + +function mergeUniforms( uniforms ) { + + const merged = {}; + + for ( let u = 0; u < uniforms.length; u ++ ) { + + const tmp = cloneUniforms( uniforms[ u ] ); + + for ( const p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + +} + +// Legacy + +const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; + +var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; + +var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; + +/** + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: + * } + */ + +class ShaderMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + this.glslVersion = null; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = cloneUniforms( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.extensions = Object.assign( {}, source.extensions ); + + this.glslVersion = source.glslVersion; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.glslVersion = this.glslVersion; + data.uniforms = {}; + + for ( const name in this.uniforms ) { + + const uniform = this.uniforms[ name ]; + const value = uniform.value; + + if ( value && value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value && value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value && value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value && value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value && value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value && value.isMatrix3 ) { + + data.uniforms[ name ] = { + type: 'm3', + value: value.toArray() + }; + + } else if ( value && value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + const extensions = {}; + + for ( const key in this.extensions ) { + + if ( this.extensions[ key ] === true ) extensions[ key ] = true; + + } + + if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions; + + return data; + + } + +} + +ShaderMaterial.prototype.isShaderMaterial = true; + +class Camera extends Object3D { + + constructor() { + + super(); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + return this; + + } + + getWorldDirection( target ) { + + this.updateWorldMatrix( true, false ); + + const e = this.matrixWorld.elements; + + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + updateWorldMatrix( updateParents, updateChildren ) { + + super.updateWorldMatrix( updateParents, updateChildren ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +Camera.prototype.isCamera = true; + +class PerspectiveCamera extends Camera { + + constructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) { + + super(); + + this.type = 'PerspectiveCamera'; + + this.fov = fov; + this.zoom = 1; + + this.near = near; + this.far = far; + this.focus = 10; + + this.aspect = aspect; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + } + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength( focalLength ) { + + /** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */ + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + } + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength() { + + const vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + } + + getEffectiveFOV() { + + return RAD2DEG * 2 * Math.atan( + Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + } + + getFilmWidth() { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + } + + getFilmHeight() { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + } + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + updateProjectionMatrix() { + + const near = this.near; + let top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = - 0.5 * width; + const view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + const fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + const skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + +} + +PerspectiveCamera.prototype.isPerspectiveCamera = true; + +const fov = 90, aspect = 1; + +class CubeCamera extends Object3D { + + constructor( near, far, renderTarget ) { + + super(); + + this.type = 'CubeCamera'; + + if ( renderTarget.isWebGLCubeRenderTarget !== true ) { + + console.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' ); + return; + + } + + this.renderTarget = renderTarget; + + const cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.layers = this.layers; + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + const cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.layers = this.layers; + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + const cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.layers = this.layers; + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + const cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.layers = this.layers; + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + const cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.layers = this.layers; + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + const cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.layers = this.layers; + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + } + + update( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + const renderTarget = this.renderTarget; + + const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children; + + const currentXrEnabled = renderer.xr.enabled; + const currentRenderTarget = renderer.getRenderTarget(); + + renderer.xr.enabled = false; + + const generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderer.setRenderTarget( renderTarget, 0 ); + renderer.render( scene, cameraPX ); + + renderer.setRenderTarget( renderTarget, 1 ); + renderer.render( scene, cameraNX ); + + renderer.setRenderTarget( renderTarget, 2 ); + renderer.render( scene, cameraPY ); + + renderer.setRenderTarget( renderTarget, 3 ); + renderer.render( scene, cameraNY ); + + renderer.setRenderTarget( renderTarget, 4 ); + renderer.render( scene, cameraPZ ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderer.setRenderTarget( renderTarget, 5 ); + renderer.render( scene, cameraNZ ); + + renderer.setRenderTarget( currentRenderTarget ); + + renderer.xr.enabled = currentXrEnabled; + + } + +} + +class CubeTexture extends Texture { + + constructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + super( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + get images() { + + return this.image; + + } + + set images( value ) { + + this.image = value; + + } + +} + +CubeTexture.prototype.isCubeTexture = true; + +class WebGLCubeRenderTarget extends WebGLRenderTarget { + + constructor( size, options, dummy ) { + + if ( Number.isInteger( options ) ) { + + console.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' ); + + options = dummy; + + } + + super( size, size, options ); + + options = options || {}; + + // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js) + // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words, + // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly. + + // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped + // and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture + // as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures). + + this.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + this.texture.isRenderTargetTexture = true; + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; + this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter; + + this.texture._needsFlipEnvMap = false; + + } + + fromEquirectangularTexture( renderer, texture ) { + + this.texture.type = texture.type; + this.texture.format = RGBAFormat; // see #18859 + this.texture.encoding = texture.encoding; + + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + + const shader = { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: /* glsl */` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + `, + + fragmentShader: /* glsl */` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + ` + }; + + const geometry = new BoxGeometry( 5, 5, 5 ); + + const material = new ShaderMaterial( { + + name: 'CubemapFromEquirect', + + uniforms: cloneUniforms( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending + + } ); + + material.uniforms.tEquirect.value = texture; + + const mesh = new Mesh( geometry, material ); + + const currentMinFilter = texture.minFilter; + + // Avoid blurred poles + if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter; + + const camera = new CubeCamera( 1, 10, this ); + camera.update( renderer, mesh ); + + texture.minFilter = currentMinFilter; + + mesh.geometry.dispose(); + mesh.material.dispose(); + + return this; + + } + + clear( renderer, color, depth, stencil ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + for ( let i = 0; i < 6; i ++ ) { + + renderer.setRenderTarget( this, i ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( currentRenderTarget ); + + } + +} + +WebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true; + +const _vector1 = /*@__PURE__*/ new Vector3(); +const _vector2 = /*@__PURE__*/ new Vector3(); +const _normalMatrix = /*@__PURE__*/ new Matrix3(); + +class Plane { + + constructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) { + + // normal is assumed to be normalized + + this.normal = normal; + this.constant = constant; + + } + + set( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + } + + setComponents( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + } + + setFromNormalAndCoplanarPoint( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + } + + setFromCoplanarPoints( a, b, c ) { + + const normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + } + + copy( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + } + + normalize() { + + // Note: will lead to a divide by zero if the plane is invalid. + + const inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + } + + negate() { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + } + + distanceToPoint( point ) { + + return this.normal.dot( point ) + this.constant; + + } + + distanceToSphere( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + } + + projectPoint( point, target ) { + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + } + + intersectLine( line, target ) { + + const direction = line.delta( _vector1 ); + + const denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return null; + + } + + const t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return null; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + } + + intersectsLine( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + const startSign = this.distanceToPoint( line.start ); + const endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + } + + intersectsBox( box ) { + + return box.intersectsPlane( this ); + + } + + intersectsSphere( sphere ) { + + return sphere.intersectsPlane( this ); + + } + + coplanarPoint( target ) { + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + } + + applyMatrix4( matrix, optionalNormalMatrix ) { + + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix ); + + const referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix ); + + const normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + } + + translate( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + } + + equals( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +Plane.prototype.isPlane = true; + +const _sphere$2 = /*@__PURE__*/ new Sphere(); +const _vector$7 = /*@__PURE__*/ new Vector3(); + +class Frustum { + + constructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) { + + this.planes = [ p0, p1, p2, p3, p4, p5 ]; + + } + + set( p0, p1, p2, p3, p4, p5 ) { + + const planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + } + + copy( frustum ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + } + + setFromProjectionMatrix( m ) { + + const planes = this.planes; + const me = m.elements; + const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + } + + intersectsObject( object ) { + + const geometry = object.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$2.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( _sphere$2 ); + + } + + intersectsSprite( sprite ) { + + _sphere$2.center.set( 0, 0, 0 ); + _sphere$2.radius = 0.7071067811865476; + _sphere$2.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( _sphere$2 ); + + } + + intersectsSphere( sphere ) { + + const planes = this.planes; + const center = sphere.center; + const negRadius = - sphere.radius; + + for ( let i = 0; i < 6; i ++ ) { + + const distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + } + + intersectsBox( box ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + const plane = planes[ i ]; + + // corner at max distance + + _vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( _vector$7 ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + containsPoint( point ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +function WebGLAnimation() { + + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + + function onAnimationFrame( time, frame ) { + + animationLoop( time, frame ); + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + context.cancelAnimationFrame( requestId ); + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + +} + +function WebGLAttributes( gl, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + const buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + const array = attribute.array; + const usage = attribute.usage; + + const buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + let type = 5126; + + if ( array instanceof Float32Array ) { + + type = 5126; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + if ( attribute.isFloat16BufferAttribute ) { + + if ( isWebGL2 ) { + + type = 5131; + + } else { + + console.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' ); + + } + + } else { + + type = 5123; + + } + + } else if ( array instanceof Int16Array ) { + + type = 5122; + + } else if ( array instanceof Uint32Array ) { + + type = 5125; + + } else if ( array instanceof Int32Array ) { + + type = 5124; + + } else if ( array instanceof Int8Array ) { + + type = 5120; + + } else if ( array instanceof Uint8Array ) { + + type = 5121; + + } else if ( array instanceof Uint8ClampedArray ) { + + type = 5121; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + const array = attribute.array; + const updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else { + + if ( isWebGL2 ) { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array, updateRange.offset, updateRange.count ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + } + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isGLBufferAttribute ) { + + const cached = buffers.get( attribute ); + + if ( ! cached || cached.version < attribute.version ) { + + buffers.set( attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + } ); + + } + + return; + + } + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + +} + +class PlaneGeometry extends BufferGeometry { + + constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) { + + super(); + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + const width_half = width / 2; + const height_half = height / 2; + + const gridX = Math.floor( widthSegments ); + const gridY = Math.floor( heightSegments ); + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + const segment_width = width / gridX; + const segment_height = height / gridY; + + // + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segment_height - height_half; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = ix + gridX1 * iy; + const b = ix + gridX1 * ( iy + 1 ); + const c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = ( ix + 1 ) + gridX1 * iy; + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + static fromJSON( data ) { + + return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); + + } + +} + +var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif"; + +var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var alphatest_fragment = "#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif"; + +var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif"; + +var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; + +var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + +var begin_vertex = "vec3 transformed = vec3( position );"; + +var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif"; + +var bsdfs = "vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif"; + +var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; + +var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif"; + +var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; + +var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif"; + +var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; + +var color_fragment = "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif"; + +var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; + +var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}"; + +var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; + +var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif"; + +var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif"; + +var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif"; + +var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; + +var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif"; + +var encodings_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; + +var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}"; + +var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; + +var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif"; + +var envmap_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif"; + +var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif"; + +var envmap_vertex = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif"; + +var fog_vertex = "#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif"; + +var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif"; + +var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; + +var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif"; + +var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}"; + +var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif"; + +var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + +var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif"; + +var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif"; + +var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif"; + +var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; + +var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)"; + +var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; + +var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)"; + +var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= specularColorMapTexelToLinear( texture2D( specularColorMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= sheenColorMapTexelToLinear( texture2D( sheenColorMap, vUv ) ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif"; + +var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; + +var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; + +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; + +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif"; + +var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + +var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; + +var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif"; + +var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif"; + +var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif"; + +var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif"; + +var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; + +var map_particle_pars_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif"; + +var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + +var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif"; + +var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif"; + +var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\t#ifndef USE_MORPHNORMALS\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\t\t\t#else\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\t\t\t#endif\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif"; + +var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;"; + +var normal_fragment_maps = "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; + +var normal_pars_fragment = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_pars_vertex = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_vertex = "#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif"; + +var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif"; + +var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif"; + +var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif"; + +var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif"; + +var output_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; + +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}"; + +var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; + +var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; + +var dithering_fragment = "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; + +var dithering_pars_fragment = "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; + +var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif"; + +var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + +var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif"; + +var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; + +var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif"; + +var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}"; + +var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + +var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif"; + +var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; + +var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; + +var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + +var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + +var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; + +var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; + +var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif"; + +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif"; + +var uv_pars_fragment = "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif"; + +var uv_pars_vertex = "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif"; + +var uv_vertex = "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif"; + +var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + +var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif"; + +var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif"; + +var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif"; + +const vertex$g = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; + +const fragment$g = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}"; + +const vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; + +const fragment$f = "#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}"; + +const vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}"; + +const fragment$e = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}"; + +const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}"; + +const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}"; + +const vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}"; + +const fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}"; + +const vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$b = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$9 = "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$9 = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; + +const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}"; + +const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}"; + +const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}"; + +const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - clearcoat * Fcc ) + clearcoatSpecular * clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$2 = "#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}"; + +const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + alphatest_pars_fragment: alphatest_pars_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_common_pars_fragment: envmap_common_pars_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_toon_fragment: lights_toon_fragment, + lights_toon_pars_fragment: lights_toon_pars_fragment, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normal_pars_fragment: normal_pars_fragment, + normal_pars_vertex: normal_pars_vertex, + normal_vertex: normal_vertex, + normalmap_pars_fragment: normalmap_pars_fragment, + clearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin, + clearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps, + clearcoat_pars_fragment: clearcoat_pars_fragment, + output_fragment: output_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + transmission_fragment: transmission_fragment, + transmission_pars_fragment: transmission_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_vert: vertex$g, + background_frag: fragment$g, + cube_vert: vertex$f, + cube_frag: fragment$f, + depth_vert: vertex$e, + depth_frag: fragment$e, + distanceRGBA_vert: vertex$d, + distanceRGBA_frag: fragment$d, + equirect_vert: vertex$c, + equirect_frag: fragment$c, + linedashed_vert: vertex$b, + linedashed_frag: fragment$b, + meshbasic_vert: vertex$a, + meshbasic_frag: fragment$a, + meshlambert_vert: vertex$9, + meshlambert_frag: fragment$9, + meshmatcap_vert: vertex$8, + meshmatcap_frag: fragment$8, + meshnormal_vert: vertex$7, + meshnormal_frag: fragment$7, + meshphong_vert: vertex$6, + meshphong_frag: fragment$6, + meshphysical_vert: vertex$5, + meshphysical_frag: fragment$5, + meshtoon_vert: vertex$4, + meshtoon_frag: fragment$4, + points_vert: vertex$3, + points_frag: fragment$3, + shadow_vert: vertex$2, + shadow_frag: fragment$2, + sprite_vert: vertex$1, + sprite_frag: fragment$1 +}; + +/** + * Uniforms library for shared webgl shaders + */ + +const UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + uv2Transform: { value: new Matrix3() }, + + alphaMap: { value: null }, + alphaTest: { value: 0 } + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, // basic, lambert, phong + ior: { value: 1.5 }, // standard, physical + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + lightProbe: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + + directionalLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + + spotLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + + pointLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + + ltc_1: { value: null }, + ltc_2: { value: null } + + }, + + points: { + + diffuse: { value: new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + alphaMap: { value: null }, + alphaTest: { value: 0 }, + uvTransform: { value: new Matrix3() } + + }, + + sprite: { + + diffuse: { value: new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + alphaMap: { value: null }, + alphaTest: { value: 0 }, + uvTransform: { value: new Matrix3() } + + } + +}; + +const ShaderLib = { + + basic: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 1.0 }, + metalness: { value: 0.0 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + toon: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag + + }, + + matcap: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: mergeUniforms( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.meshnormal_vert, + fragmentShader: ShaderChunk.meshnormal_frag + + }, + + sprite: { + + uniforms: mergeUniforms( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + uvTransform: { value: new Matrix3() }, + t2D: { value: null }, + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: mergeUniforms( [ + UniformsLib.envmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: mergeUniforms( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + +}; + +ShaderLib.physical = { + + uniforms: mergeUniforms( [ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatNormalScale: { value: new Vector2( 1, 1 ) }, + clearcoatNormalMap: { value: null }, + sheen: { value: 0 }, + sheenColor: { value: new Color( 0x000000 ) }, + sheenColorMap: { value: null }, + sheenRoughness: { value: 0 }, + sheenRoughnessMap: { value: null }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + transmissionSamplerSize: { value: new Vector2() }, + transmissionSamplerMap: { value: null }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + attenuationDistance: { value: 0 }, + attenuationColor: { value: new Color( 0x000000 ) }, + specularIntensity: { value: 0 }, + specularIntensityMap: { value: null }, + specularColor: { value: new Color( 1, 1, 1 ) }, + specularColorMap: { value: null }, + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + +}; + +function WebGLBackground( renderer, cubemaps, state, objects, premultipliedAlpha ) { + + const clearColor = new Color( 0x000000 ); + let clearAlpha = 0; + + let planeMesh; + let boxMesh; + + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; + + function render( renderList, scene ) { + + let forceClear = false; + let background = scene.isScene === true ? scene.background : null; + + if ( background && background.isTexture ) { + + background = cubemaps.get( background ); + + } + + // Ignore background in AR + // TODO: Reconsider this. + + const xr = renderer.xr; + const session = xr.getSession && xr.getSession(); + + if ( session && session.environmentBlendMode === 'additive' ) { + + background = null; + + } + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxGeometry( 1, 1, 1 ), + new ShaderMaterial( { + name: 'BackgroundCubeMaterial', + uniforms: cloneUniforms( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.deleteAttribute( 'normal' ); + boxMesh.geometry.deleteAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + // enable code injection for non-built-in material + Object.defineProperty( boxMesh.material, 'envMap', { + + get: function () { + + return this.uniforms.envMap.value; + + } + + } ); + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1; + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + boxMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + // push to the pre-sorted opaque render list + renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneGeometry( 2, 2 ), + new ShaderMaterial( { + name: 'BackgroundMaterial', + uniforms: cloneUniforms( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.deleteAttribute( 'normal' ); + + // enable code injection for non-built-in material + Object.defineProperty( planeMesh.material, 'map', { + + get: function () { + + return this.uniforms.t2D.value; + + } + + } ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + + if ( background.matrixAutoUpdate === true ) { + + background.updateMatrix(); + + } + + planeMesh.material.uniforms.uvTransform.value.copy( background.matrix ); + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + planeMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + + // push to the pre-sorted opaque render list + renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha = 1 ) { + + clearColor.set( color ); + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + +} + +function WebGLBindingStates( gl, extensions, attributes, capabilities ) { + + const maxVertexAttributes = gl.getParameter( 34921 ); + + const extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' ); + const vaoAvailable = capabilities.isWebGL2 || extension !== null; + + const bindingStates = {}; + + const defaultState = createBindingState( null ); + let currentState = defaultState; + + function setup( object, material, program, geometry, index ) { + + let updateBuffers = false; + + if ( vaoAvailable ) { + + const state = getBindingState( geometry, program, material ); + + if ( currentState !== state ) { + + currentState = state; + bindVertexArrayObject( currentState.object ); + + } + + updateBuffers = needsUpdate( geometry, index ); + + if ( updateBuffers ) saveCache( geometry, index ); + + } else { + + const wireframe = ( material.wireframe === true ); + + if ( currentState.geometry !== geometry.id || + currentState.program !== program.id || + currentState.wireframe !== wireframe ) { + + currentState.geometry = geometry.id; + currentState.program = program.id; + currentState.wireframe = wireframe; + + updateBuffers = true; + + } + + } + + if ( object.isInstancedMesh === true ) { + + updateBuffers = true; + + } + + if ( index !== null ) { + + attributes.update( index, 34963 ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( object, material, program, geometry ); + + if ( index !== null ) { + + gl.bindBuffer( 34963, attributes.get( index ).buffer ); + + } + + } + + } + + function createVertexArrayObject() { + + if ( capabilities.isWebGL2 ) return gl.createVertexArray(); + + return extension.createVertexArrayOES(); + + } + + function bindVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao ); + + return extension.bindVertexArrayOES( vao ); + + } + + function deleteVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao ); + + return extension.deleteVertexArrayOES( vao ); + + } + + function getBindingState( geometry, program, material ) { + + const wireframe = ( material.wireframe === true ); + + let programMap = bindingStates[ geometry.id ]; + + if ( programMap === undefined ) { + + programMap = {}; + bindingStates[ geometry.id ] = programMap; + + } + + let stateMap = programMap[ program.id ]; + + if ( stateMap === undefined ) { + + stateMap = {}; + programMap[ program.id ] = stateMap; + + } + + let state = stateMap[ wireframe ]; + + if ( state === undefined ) { + + state = createBindingState( createVertexArrayObject() ); + stateMap[ wireframe ] = state; + + } + + return state; + + } + + function createBindingState( vao ) { + + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + + for ( let i = 0; i < maxVertexAttributes; i ++ ) { + + newAttributes[ i ] = 0; + enabledAttributes[ i ] = 0; + attributeDivisors[ i ] = 0; + + } + + return { + + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + + newAttributes: newAttributes, + enabledAttributes: enabledAttributes, + attributeDivisors: attributeDivisors, + object: vao, + attributes: {}, + index: null + + }; + + } + + function needsUpdate( geometry, index ) { + + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + + let attributesNum = 0; + + for ( const key in geometryAttributes ) { + + const cachedAttribute = cachedAttributes[ key ]; + const geometryAttribute = geometryAttributes[ key ]; + + if ( cachedAttribute === undefined ) return true; + + if ( cachedAttribute.attribute !== geometryAttribute ) return true; + + if ( cachedAttribute.data !== geometryAttribute.data ) return true; + + attributesNum ++; + + } + + if ( currentState.attributesNum !== attributesNum ) return true; + + if ( currentState.index !== index ) return true; + + return false; + + } + + function saveCache( geometry, index ) { + + const cache = {}; + const attributes = geometry.attributes; + let attributesNum = 0; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + + const data = {}; + data.attribute = attribute; + + if ( attribute.data ) { + + data.data = attribute.data; + + } + + cache[ key ] = data; + + attributesNum ++; + + } + + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + + currentState.index = index; + + } + + function initAttributes() { + + const newAttributes = currentState.newAttributes; + + for ( let i = 0, il = newAttributes.length; i < il; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + const extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + + for ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function vertexAttribPointer( index, size, type, normalized, stride, offset ) { + + if ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) { + + gl.vertexAttribIPointer( index, size, type, stride, offset ); + + } else { + + gl.vertexAttribPointer( index, size, type, normalized, stride, offset ); + + } + + } + + function setupVertexAttributes( object, material, program, geometry ) { + + if ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return; + + } + + initAttributes(); + + const geometryAttributes = geometry.attributes; + + const programAttributes = program.getAttributes(); + + const materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + let geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor; + + } + + if ( geometryAttribute !== undefined ) { + + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + + const attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( 34962, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + stride * bytesPerElement, + ( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement + ); + + } + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( 34962, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + size * bytesPerElement, + ( size / programAttribute.locationSize ) * i * bytesPerElement + ); + + } + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + const value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + gl.vertexAttrib2fv( programAttribute.location, value ); + break; + + case 3: + gl.vertexAttrib3fv( programAttribute.location, value ); + break; + + case 4: + gl.vertexAttrib4fv( programAttribute.location, value ); + break; + + default: + gl.vertexAttrib1fv( programAttribute.location, value ); + + } + + } + + } + + } + + } + + disableUnusedAttributes(); + + } + + function dispose() { + + reset(); + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometryId ]; + + } + + } + + function releaseStatesOfGeometry( geometry ) { + + if ( bindingStates[ geometry.id ] === undefined ) return; + + const programMap = bindingStates[ geometry.id ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometry.id ]; + + } + + function releaseStatesOfProgram( program ) { + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + if ( programMap[ program.id ] === undefined ) continue; + + const stateMap = programMap[ program.id ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ program.id ]; + + } + + } + + function reset() { + + resetDefaultState(); + + if ( currentState === defaultState ) return; + + currentState = defaultState; + bindVertexArrayObject( currentState.object ); + + } + + // for backward-compatilibity + + function resetDefaultState() { + + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; + + } + + return { + + setup: setup, + reset: reset, + resetDefaultState: resetDefaultState, + dispose: dispose, + releaseStatesOfGeometry: releaseStatesOfGeometry, + releaseStatesOfProgram: releaseStatesOfProgram, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + disableUnusedAttributes: disableUnusedAttributes + + }; + +} + +function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawArraysInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawArraysInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, start, count, primcount ); + + info.update( count, mode, primcount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + +} + +function WebGLCapabilities( gl, extensions, parameters ) { + + let maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + /* eslint-disable no-undef */ + const isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) || + ( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext ); + /* eslint-enable no-undef */ + + let precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + const maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + const drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ); + + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + const maxTextures = gl.getParameter( 34930 ); + const maxVertexTextures = gl.getParameter( 35660 ); + const maxTextureSize = gl.getParameter( 3379 ); + const maxCubemapSize = gl.getParameter( 34076 ); + + const maxAttributes = gl.getParameter( 34921 ); + const maxVertexUniforms = gl.getParameter( 36347 ); + const maxVaryings = gl.getParameter( 36348 ); + const maxFragmentUniforms = gl.getParameter( 36349 ); + + const vertexTextures = maxVertexTextures > 0; + const floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' ); + const floatVertexTextures = vertexTextures && floatFragmentTextures; + + const maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0; + + return { + + isWebGL2: isWebGL2, + + drawBuffers: drawBuffers, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures, + + maxSamples: maxSamples + + }; + +} + +function WebGLClipping( properties ) { + + const scope = this; + + let globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false; + + const plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + const enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( material, camera, useCache ) { + + const planes = material.clippingPlanes, + clipIntersection = material.clipIntersection, + clipShadows = material.clipShadows; + + const materialProperties = properties.get( material ); + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4; + + let dstArray = materialProperties.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, useCache ); + + for ( let i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + const flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + + return dstArray; + + } + +} + +function WebGLCubeMaps( renderer ) { + + let cubemaps = new WeakMap(); + + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + + function get( texture ) { + + if ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubemaps.has( texture ) ) { + + const cubemap = cubemaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + const renderTarget = new WebGLCubeRenderTarget( image.height / 2 ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubemaps.set( texture, renderTarget ); + + renderer.setRenderTarget( currentRenderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemap = cubemaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubemaps.delete( texture ); + cubemap.dispose(); + + } + + } + + function dispose() { + + cubemaps = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +class OrthographicCamera extends Camera { + + constructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) { + + super(); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = near; + this.far = far; + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + } + + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + updateProjectionMatrix() { + + const dx = ( this.right - this.left ) / ( 2 * this.zoom ); + const dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + const cx = ( this.right + this.left ) / 2; + const cy = ( this.top + this.bottom ) / 2; + + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + const scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom; + const scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom; + + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + +} + +OrthographicCamera.prototype.isOrthographicCamera = true; + +class RawShaderMaterial extends ShaderMaterial { + + constructor( parameters ) { + + super( parameters ); + + this.type = 'RawShaderMaterial'; + + } + +} + +RawShaderMaterial.prototype.isRawShaderMaterial = true; + +const LOD_MIN = 4; +const LOD_MAX = 8; +const SIZE_MAX = Math.pow( 2, LOD_MAX ); + +// The standard deviations (radians) associated with the extra mips. These are +// chosen to approximate a Trowbridge-Reitz distribution function times the +// geometric shadowing function. These sigma values squared must match the +// variance #defines in cube_uv_reflection_fragment.glsl.js. +const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ]; + +const TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + +// The maximum length of the blur for loop. Smaller sigmas will use fewer +// samples and exit early, but not recompile the shader. +const MAX_SAMPLES = 20; + +const ENCODINGS = { + [ LinearEncoding ]: 0, + [ sRGBEncoding ]: 1, + [ RGBEEncoding ]: 2, + [ RGBM7Encoding ]: 3, + [ RGBM16Encoding ]: 4, + [ RGBDEncoding ]: 5, + [ GammaEncoding ]: 6 +}; + +const _flatCamera = /*@__PURE__*/ new OrthographicCamera(); +const { _lodPlanes, _sizeLods, _sigmas } = /*@__PURE__*/ _createPlanes(); +const _clearColor = /*@__PURE__*/ new Color(); +let _oldTarget = null; + +// Golden Ratio +const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; +const INV_PHI = 1 / PHI; + +// Vertices of a dodecahedron (except the opposites, which represent the +// same axis), used as axis directions evenly spread on a sphere. +const _axisDirections = [ + /*@__PURE__*/ new Vector3( 1, 1, 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, 1 ), + /*@__PURE__*/ new Vector3( 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ), + /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ), + /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ), + /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ]; + +/** + * This class generates a Prefiltered, Mipmapped Radiance Environment Map + * (PMREM) from a cubeMap environment texture. This allows different levels of + * blur to be quickly accessed based on material roughness. It is packed into a + * special CubeUV format that allows us to perform custom interpolation so that + * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap + * chain, it only goes down to the LOD_MIN level (above), and then creates extra + * even more filtered 'mips' at the same LOD_MIN resolution, associated with + * higher roughness levels. In this way we maintain resolution to smoothly + * interpolate diffuse lighting while limiting sampling computation. + * + * Paper: Fast, Accurate Image-Based Lighting + * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view +*/ + +class PMREMGenerator { + + constructor( renderer ) { + + this._renderer = renderer; + this._pingPongRenderTarget = null; + + this._blurMaterial = _getBlurShader( MAX_SAMPLES ); + this._equirectShader = null; + this._cubemapShader = null; + + this._compileMaterial( this._blurMaterial ); + + } + + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety (the cubeCamera + * is placed at the origin). + */ + fromScene( scene, sigma = 0, near = 0.1, far = 100 ) { + + _oldTarget = this._renderer.getRenderTarget(); + const cubeUVRenderTarget = this._allocateTargets(); + + this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget ); + if ( sigma > 0 ) { + + this._blur( cubeUVRenderTarget, 0, 0, sigma ); + + } + + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * (RGBFormat) or HDR (RGBEFormat). The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + */ + fromEquirectangular( equirectangular ) { + + return this._fromTexture( equirectangular ); + + } + + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * (RGBFormat) or HDR (RGBEFormat). The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + */ + fromCubemap( cubemap ) { + + return this._fromTexture( cubemap ); + + } + + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + + if ( this._cubemapShader === null ) { + + this._cubemapShader = _getCubemapShader(); + this._compileMaterial( this._cubemapShader ); + + } + + } + + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + + if ( this._equirectShader === null ) { + + this._equirectShader = _getEquirectShader(); + this._compileMaterial( this._equirectShader ); + + } + + } + + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + + this._blurMaterial.dispose(); + + if ( this._cubemapShader !== null ) this._cubemapShader.dispose(); + if ( this._equirectShader !== null ) this._equirectShader.dispose(); + + for ( let i = 0; i < _lodPlanes.length; i ++ ) { + + _lodPlanes[ i ].dispose(); + + } + + } + + // private interface + + _cleanup( outputTarget ) { + + this._pingPongRenderTarget.dispose(); + this._renderer.setRenderTarget( _oldTarget ); + outputTarget.scissorTest = false; + _setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height ); + + } + + _fromTexture( texture ) { + + _oldTarget = this._renderer.getRenderTarget(); + const cubeUVRenderTarget = this._allocateTargets( texture ); + this._textureToCubeUV( texture, cubeUVRenderTarget ); + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + _allocateTargets( texture ) { // warning: null texture is valid + + const params = { + magFilter: NearestFilter, + minFilter: NearestFilter, + generateMipmaps: false, + type: UnsignedByteType, + format: RGBEFormat, + encoding: _isLDR( texture ) ? texture.encoding : RGBEEncoding, + depthBuffer: false + }; + + const cubeUVRenderTarget = _createRenderTarget( params ); + cubeUVRenderTarget.depthBuffer = texture ? false : true; + this._pingPongRenderTarget = _createRenderTarget( params ); + return cubeUVRenderTarget; + + } + + _compileMaterial( material ) { + + const tmpMesh = new Mesh( _lodPlanes[ 0 ], material ); + this._renderer.compile( tmpMesh, _flatCamera ); + + } + + _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) { + + const fov = 90; + const aspect = 1; + const cubeCamera = new PerspectiveCamera( fov, aspect, near, far ); + const upSign = [ 1, - 1, 1, 1, 1, 1 ]; + const forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ]; + const renderer = this._renderer; + + const originalAutoClear = renderer.autoClear; + const outputEncoding = renderer.outputEncoding; + const toneMapping = renderer.toneMapping; + renderer.getClearColor( _clearColor ); + + renderer.toneMapping = NoToneMapping; + renderer.outputEncoding = LinearEncoding; + renderer.autoClear = false; + + const backgroundMaterial = new MeshBasicMaterial( { + name: 'PMREM.Background', + side: BackSide, + depthWrite: false, + depthTest: false, + } ); + + const backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial ); + + let useSolidColor = false; + const background = scene.background; + + if ( background ) { + + if ( background.isColor ) { + + backgroundMaterial.color.copy( background ); + scene.background = null; + useSolidColor = true; + + } + + } else { + + backgroundMaterial.color.copy( _clearColor ); + useSolidColor = true; + + } + + for ( let i = 0; i < 6; i ++ ) { + + const col = i % 3; + if ( col == 0 ) { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( forwardSign[ i ], 0, 0 ); + + } else if ( col == 1 ) { + + cubeCamera.up.set( 0, 0, upSign[ i ] ); + cubeCamera.lookAt( 0, forwardSign[ i ], 0 ); + + } else { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( 0, 0, forwardSign[ i ] ); + + } + + _setViewport( cubeUVRenderTarget, + col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX ); + renderer.setRenderTarget( cubeUVRenderTarget ); + + if ( useSolidColor ) { + + renderer.render( backgroundBox, cubeCamera ); + + } + + renderer.render( scene, cubeCamera ); + + } + + backgroundBox.geometry.dispose(); + backgroundBox.material.dispose(); + + renderer.toneMapping = toneMapping; + renderer.outputEncoding = outputEncoding; + renderer.autoClear = originalAutoClear; + scene.background = background; + + } + + _setEncoding( uniform, texture ) { + + if ( this._renderer.capabilities.isWebGL2 === true && texture.format === RGBAFormat && texture.type === UnsignedByteType && texture.encoding === sRGBEncoding ) { + + uniform.value = ENCODINGS[ LinearEncoding ]; + + } else { + + uniform.value = ENCODINGS[ texture.encoding ]; + + } + + } + + _textureToCubeUV( texture, cubeUVRenderTarget ) { + + const renderer = this._renderer; + + const isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ); + + if ( isCubeTexture ) { + + if ( this._cubemapShader == null ) { + + this._cubemapShader = _getCubemapShader(); + + } + + } else { + + if ( this._equirectShader == null ) { + + this._equirectShader = _getEquirectShader(); + + } + + } + + const material = isCubeTexture ? this._cubemapShader : this._equirectShader; + const mesh = new Mesh( _lodPlanes[ 0 ], material ); + + const uniforms = material.uniforms; + + uniforms[ 'envMap' ].value = texture; + + if ( ! isCubeTexture ) { + + uniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height ); + + } + + this._setEncoding( uniforms[ 'inputEncoding' ], texture ); + this._setEncoding( uniforms[ 'outputEncoding' ], cubeUVRenderTarget.texture ); + + _setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + renderer.render( mesh, _flatCamera ); + + } + + _applyPMREM( cubeUVRenderTarget ) { + + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + + for ( let i = 1; i < TOTAL_LODS; i ++ ) { + + const sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] ); + + const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ]; + + this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis ); + + } + + renderer.autoClear = autoClear; + + } + + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + */ + _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) { + + const pingPongRenderTarget = this._pingPongRenderTarget; + + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + 'latitudinal', + poleAxis ); + + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + 'longitudinal', + poleAxis ); + + } + + _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) { + + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + + if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) { + + console.error( + 'blur direction must be either latitudinal or longitudinal!' ); + + } + + // Number of standard deviations at which to cut off the discrete approximation. + const STANDARD_DEVIATIONS = 3; + + const blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial ); + const blurUniforms = blurMaterial.uniforms; + + const pixels = _sizeLods[ lodIn ] - 1; + const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 ); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES; + + if ( samples > MAX_SAMPLES ) { + + console.warn( `sigmaRadians, ${ + sigmaRadians}, is too large and will clip, as it requested ${ + samples} samples when the maximum is set to ${MAX_SAMPLES}` ); + + } + + const weights = []; + let sum = 0; + + for ( let i = 0; i < MAX_SAMPLES; ++ i ) { + + const x = i / sigmaPixels; + const weight = Math.exp( - x * x / 2 ); + weights.push( weight ); + + if ( i == 0 ) { + + sum += weight; + + } else if ( i < samples ) { + + sum += 2 * weight; + + } + + } + + for ( let i = 0; i < weights.length; i ++ ) { + + weights[ i ] = weights[ i ] / sum; + + } + + blurUniforms[ 'envMap' ].value = targetIn.texture; + blurUniforms[ 'samples' ].value = samples; + blurUniforms[ 'weights' ].value = weights; + blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal'; + + if ( poleAxis ) { + + blurUniforms[ 'poleAxis' ].value = poleAxis; + + } + + blurUniforms[ 'dTheta' ].value = radiansPerPixel; + blurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn; + + this._setEncoding( blurUniforms[ 'inputEncoding' ], targetIn.texture ); + this._setEncoding( blurUniforms[ 'outputEncoding' ], targetIn.texture ); + + const outputSize = _sizeLods[ lodOut ]; + const x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize ); + const y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 ); + + _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + renderer.setRenderTarget( targetOut ); + renderer.render( blurMesh, _flatCamera ); + + } + +} + +function _isLDR( texture ) { + + if ( texture === undefined || texture.type !== UnsignedByteType ) return false; + + return texture.encoding === LinearEncoding || texture.encoding === sRGBEncoding || texture.encoding === GammaEncoding; + +} + +function _createPlanes() { + + const _lodPlanes = []; + const _sizeLods = []; + const _sigmas = []; + + let lod = LOD_MAX; + + for ( let i = 0; i < TOTAL_LODS; i ++ ) { + + const sizeLod = Math.pow( 2, lod ); + _sizeLods.push( sizeLod ); + let sigma = 1.0 / sizeLod; + + if ( i > LOD_MAX - LOD_MIN ) { + + sigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ]; + + } else if ( i == 0 ) { + + sigma = 0; + + } + + _sigmas.push( sigma ); + + const texelSize = 1.0 / ( sizeLod - 1 ); + const min = - texelSize / 2; + const max = 1 + texelSize / 2; + const uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ]; + + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + + const position = new Float32Array( positionSize * vertices * cubeFaces ); + const uv = new Float32Array( uvSize * vertices * cubeFaces ); + const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces ); + + for ( let face = 0; face < cubeFaces; face ++ ) { + + const x = ( face % 3 ) * 2 / 3 - 1; + const y = face > 2 ? 0 : - 1; + const coordinates = [ + x, y, 0, + x + 2 / 3, y, 0, + x + 2 / 3, y + 1, 0, + x, y, 0, + x + 2 / 3, y + 1, 0, + x, y + 1, 0 + ]; + position.set( coordinates, positionSize * vertices * face ); + uv.set( uv1, uvSize * vertices * face ); + const fill = [ face, face, face, face, face, face ]; + faceIndex.set( fill, faceIndexSize * vertices * face ); + + } + + const planes = new BufferGeometry(); + planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) ); + planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) ); + planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) ); + _lodPlanes.push( planes ); + + if ( lod > LOD_MIN ) { + + lod --; + + } + + } + + return { _lodPlanes, _sizeLods, _sigmas }; + +} + +function _createRenderTarget( params ) { + + const cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params ); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = 'PMREM.cubeUv'; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; + +} + +function _setViewport( target, x, y, width, height ) { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + +} + +function _getBlurShader( maxSamples ) { + + const weights = new Float32Array( maxSamples ); + const poleAxis = new Vector3( 0, 1, 0 ); + const shaderMaterial = new RawShaderMaterial( { + + name: 'SphericalGaussianBlur', + + defines: { 'n': maxSamples }, + + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'mipInt': { value: 0 }, + 'poleAxis': { value: poleAxis }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + ${ _getEncodings() } + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + +} + +function _getEquirectShader() { + + const texelSize = new Vector2( 1, 1 ); + const shaderMaterial = new RawShaderMaterial( { + + name: 'EquirectangularToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'texelSize': { value: texelSize }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform vec2 texelSize; + + ${ _getEncodings() } + + #include + + void main() { + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + vec2 f = fract( uv / texelSize - 0.5 ); + uv -= f * texelSize; + vec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.x += texelSize.x; + vec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.y += texelSize.y; + vec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + uv.x -= texelSize.x; + vec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb; + + vec3 tm = mix( tl, tr, f.x ); + vec3 bm = mix( bl, br, f.x ); + gl_FragColor.rgb = mix( tm, bm, f.y ); + + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + +} + +function _getCubemapShader() { + + const shaderMaterial = new RawShaderMaterial( { + + name: 'CubemapToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'inputEncoding': { value: ENCODINGS[ LinearEncoding ] }, + 'outputEncoding': { value: ENCODINGS[ LinearEncoding ] } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + ${ _getEncodings() } + + void main() { + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb; + gl_FragColor = linearToOutputTexel( gl_FragColor ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + +} + +function _getCommonVertexShader() { + + return /* glsl */` + + precision mediump float; + precision mediump int; + + attribute vec3 position; + attribute vec2 uv; + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + `; + +} + +function _getEncodings() { + + return /* glsl */` + + uniform int inputEncoding; + uniform int outputEncoding; + + #include + + vec4 inputTexelToLinear( vec4 value ) { + + if ( inputEncoding == 0 ) { + + return value; + + } else if ( inputEncoding == 1 ) { + + return sRGBToLinear( value ); + + } else if ( inputEncoding == 2 ) { + + return RGBEToLinear( value ); + + } else if ( inputEncoding == 3 ) { + + return RGBMToLinear( value, 7.0 ); + + } else if ( inputEncoding == 4 ) { + + return RGBMToLinear( value, 16.0 ); + + } else if ( inputEncoding == 5 ) { + + return RGBDToLinear( value, 256.0 ); + + } else { + + return GammaToLinear( value, 2.2 ); + + } + + } + + vec4 linearToOutputTexel( vec4 value ) { + + if ( outputEncoding == 0 ) { + + return value; + + } else if ( outputEncoding == 1 ) { + + return LinearTosRGB( value ); + + } else if ( outputEncoding == 2 ) { + + return LinearToRGBE( value ); + + } else if ( outputEncoding == 3 ) { + + return LinearToRGBM( value, 7.0 ); + + } else if ( outputEncoding == 4 ) { + + return LinearToRGBM( value, 16.0 ); + + } else if ( outputEncoding == 5 ) { + + return LinearToRGBD( value, 256.0 ); + + } else { + + return LinearToGamma( value, 2.2 ); + + } + + } + + vec4 envMapTexelToLinear( vec4 color ) { + + return inputTexelToLinear( color ); + + } + `; + +} + +function WebGLCubeUVMaps( renderer ) { + + let cubeUVmaps = new WeakMap(); + + let pmremGenerator = null; + + function get( texture ) { + + if ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) { + + const mapping = texture.mapping; + + const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ); + const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping ); + + if ( isEquirectMap || isCubeMap ) { + + // equirect/cube map to cubeUV conversion + + if ( cubeUVmaps.has( texture ) ) { + + return cubeUVmaps.get( texture ).texture; + + } else { + + const image = texture.image; + + if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + const renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); + cubeUVmaps.set( texture, renderTarget ); + + renderer.setRenderTarget( currentRenderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return renderTarget.texture; + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function isCubeTextureComplete( image ) { + + let count = 0; + const length = 6; + + for ( let i = 0; i < length; i ++ ) { + + if ( image[ i ] !== undefined ) count ++; + + } + + return count === length; + + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemapUV = cubeUVmaps.get( texture ); + + if ( cubemapUV !== undefined ) { + + cubeUVmaps.delete( texture ); + cubemapUV.dispose(); + + } + + } + + function dispose() { + + cubeUVmaps = new WeakMap(); + + if ( pmremGenerator !== null ) { + + pmremGenerator.dispose(); + pmremGenerator = null; + + } + + } + + return { + get: get, + dispose: dispose + }; + +} + +function WebGLExtensions( gl ) { + + const extensions = {}; + + function getExtension( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + let extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + return { + + has: function ( name ) { + + return getExtension( name ) !== null; + + }, + + init: function ( capabilities ) { + + if ( capabilities.isWebGL2 ) { + + getExtension( 'EXT_color_buffer_float' ); + + } else { + + getExtension( 'WEBGL_depth_texture' ); + getExtension( 'OES_texture_float' ); + getExtension( 'OES_texture_half_float' ); + getExtension( 'OES_texture_half_float_linear' ); + getExtension( 'OES_standard_derivatives' ); + getExtension( 'OES_element_index_uint' ); + getExtension( 'OES_vertex_array_object' ); + getExtension( 'ANGLE_instanced_arrays' ); + + } + + getExtension( 'OES_texture_float_linear' ); + getExtension( 'EXT_color_buffer_half_float' ); + + }, + + get: function ( name ) { + + const extension = getExtension( name ); + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + return extension; + + } + + }; + +} + +function WebGLGeometries( gl, attributes, info, bindingStates ) { + + const geometries = {}; + const wireframeAttributes = new WeakMap(); + + function onGeometryDispose( event ) { + + const geometry = event.target; + + if ( geometry.index !== null ) { + + attributes.remove( geometry.index ); + + } + + for ( const name in geometry.attributes ) { + + attributes.remove( geometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + const attribute = wireframeAttributes.get( geometry ); + + if ( attribute ) { + + attributes.remove( attribute ); + wireframeAttributes.delete( geometry ); + + } + + bindingStates.releaseStatesOfGeometry( geometry ); + + if ( geometry.isInstancedBufferGeometry === true ) { + + delete geometry._maxInstanceCount; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + if ( geometries[ geometry.id ] === true ) return geometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + geometries[ geometry.id ] = true; + + info.memory.geometries ++; + + return geometry; + + } + + function update( geometry ) { + + const geometryAttributes = geometry.attributes; + + // Updating index buffer in VAO now. See WebGLBindingStates. + + for ( const name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], 34962 ); + + } + + // morph targets + + const morphAttributes = geometry.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = morphAttributes[ name ]; + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], 34962 ); + + } + + } + + } + + function updateWireframeAttribute( geometry ) { + + const indices = []; + + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + + if ( geometryIndex !== null ) { + + const array = geometryIndex.array; + version = geometryIndex.version; + + for ( let i = 0, l = array.length; i < l; i += 3 ) { + + const a = array[ i + 0 ]; + const b = array[ i + 1 ]; + const c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + const array = geometryPosition.array; + version = geometryPosition.version; + + for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + const a = i + 0; + const b = i + 1; + const c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + const attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + attribute.version = version; + + // Updating index buffer in VAO now. See WebGLBindingStates + + // + + const previousAttribute = wireframeAttributes.get( geometry ); + + if ( previousAttribute ) attributes.remove( previousAttribute ); + + // + + wireframeAttributes.set( geometry, attribute ); + + } + + function getWireframeAttribute( geometry ) { + + const currentAttribute = wireframeAttributes.get( geometry ); + + if ( currentAttribute ) { + + const geometryIndex = geometry.index; + + if ( geometryIndex !== null ) { + + // if the attribute is obsolete, create a new one + + if ( currentAttribute.version < geometryIndex.version ) { + + updateWireframeAttribute( geometry ); + + } + + } + + } else { + + updateWireframeAttribute( geometry ); + + } + + return wireframeAttributes.get( geometry ); + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + +} + +function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + let type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawElementsInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawElementsInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount ); + + info.update( count, mode, primcount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + +} + +function WebGLInfo( gl ) { + + const memory = { + geometries: 0, + textures: 0 + }; + + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + render.calls ++; + + switch ( mode ) { + + case 4: + render.triangles += instanceCount * ( count / 3 ); + break; + + case 1: + render.lines += instanceCount * ( count / 2 ); + break; + + case 3: + render.lines += instanceCount * ( count - 1 ); + break; + + case 2: + render.lines += instanceCount * count; + break; + + case 0: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + +} + +class DataTexture2DArray extends Texture { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + super( null ); + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + this.needsUpdate = true; + + } + +} + +DataTexture2DArray.prototype.isDataTexture2DArray = true; + +function numericalSort( a, b ) { + + return a[ 0 ] - b[ 0 ]; + +} + +function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + +} + +function denormalize( morph, attribute ) { + + let denominator = 1; + const array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array; + + if ( array instanceof Int8Array ) denominator = 127; + else if ( array instanceof Int16Array ) denominator = 32767; + else if ( array instanceof Int32Array ) denominator = 2147483647; + else console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array ); + + morph.divideScalar( denominator ); + +} + +function WebGLMorphtargets( gl, capabilities, textures ) { + + const influencesList = {}; + const morphInfluences = new Float32Array( 8 ); + const morphTextures = new WeakMap(); + const morph = new Vector3(); + + const workInfluences = []; + + for ( let i = 0; i < 8; i ++ ) { + + workInfluences[ i ] = [ i, 0 ]; + + } + + function update( object, geometry, material, program ) { + + const objectInfluences = object.morphTargetInfluences; + + if ( capabilities.isWebGL2 === true ) { + + // instead of using attributes, the WebGL 2 code path encodes morph targets + // into an array of data textures. Each layer represents a single morph target. + + const numberOfMorphTargets = geometry.morphAttributes.position.length; + + let entry = morphTextures.get( geometry ); + + if ( entry === undefined || entry.count !== numberOfMorphTargets ) { + + if ( entry !== undefined ) entry.texture.dispose(); + + const hasMorphNormals = geometry.morphAttributes.normal !== undefined; + + const morphTargets = geometry.morphAttributes.position; + const morphNormals = geometry.morphAttributes.normal || []; + + const numberOfVertices = geometry.attributes.position.count; + const numberOfVertexData = ( hasMorphNormals === true ) ? 2 : 1; // (v,n) vs. (v) + + let width = numberOfVertices * numberOfVertexData; + let height = 1; + + if ( width > capabilities.maxTextureSize ) { + + height = Math.ceil( width / capabilities.maxTextureSize ); + width = capabilities.maxTextureSize; + + } + + const buffer = new Float32Array( width * height * 4 * numberOfMorphTargets ); + + const texture = new DataTexture2DArray( buffer, width, height, numberOfMorphTargets ); + texture.format = RGBAFormat; // using RGBA since RGB might be emulated (and is thus slower) + texture.type = FloatType; + + // fill buffer + + const vertexDataStride = numberOfVertexData * 4; + + for ( let i = 0; i < numberOfMorphTargets; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const morphNormal = morphNormals[ i ]; + + const offset = width * height * 4 * i; + + for ( let j = 0; j < morphTarget.count; j ++ ) { + + morph.fromBufferAttribute( morphTarget, j ); + + if ( morphTarget.normalized === true ) denormalize( morph, morphTarget ); + + const stride = j * vertexDataStride; + + buffer[ offset + stride + 0 ] = morph.x; + buffer[ offset + stride + 1 ] = morph.y; + buffer[ offset + stride + 2 ] = morph.z; + buffer[ offset + stride + 3 ] = 0; + + if ( hasMorphNormals === true ) { + + morph.fromBufferAttribute( morphNormal, j ); + + if ( morphNormal.normalized === true ) denormalize( morph, morphNormal ); + + buffer[ offset + stride + 4 ] = morph.x; + buffer[ offset + stride + 5 ] = morph.y; + buffer[ offset + stride + 6 ] = morph.z; + buffer[ offset + stride + 7 ] = 0; + + } + + } + + } + + entry = { + count: numberOfMorphTargets, + texture: texture, + size: new Vector2( width, height ) + }; + + morphTextures.set( geometry, entry ); + + } + + // + + let morphInfluencesSum = 0; + + for ( let i = 0; i < objectInfluences.length; i ++ ) { + + morphInfluencesSum += objectInfluences[ i ]; + + } + + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences ); + + program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures ); + program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size ); + + + } else { + + // When object doesn't have morph target influences defined, we treat it as a 0-length array + // This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences + + const length = objectInfluences === undefined ? 0 : objectInfluences.length; + + let influences = influencesList[ geometry.id ]; + + if ( influences === undefined || influences.length !== length ) { + + // initialise list + + influences = []; + + for ( let i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + // Collect influences + + for ( let i = 0; i < length; i ++ ) { + + const influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + for ( let i = 0; i < 8; i ++ ) { + + if ( i < length && influences[ i ][ 1 ] ) { + + workInfluences[ i ][ 0 ] = influences[ i ][ 0 ]; + workInfluences[ i ][ 1 ] = influences[ i ][ 1 ]; + + } else { + + workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER; + workInfluences[ i ][ 1 ] = 0; + + } + + } + + workInfluences.sort( numericalSort ); + + const morphTargets = geometry.morphAttributes.position; + const morphNormals = geometry.morphAttributes.normal; + + let morphInfluencesSum = 0; + + for ( let i = 0; i < 8; i ++ ) { + + const influence = workInfluences[ i ]; + const index = influence[ 0 ]; + const value = influence[ 1 ]; + + if ( index !== Number.MAX_SAFE_INTEGER && value ) { + + if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) { + + geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] ); + + } + + if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) { + + geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + } + + morphInfluences[ i ] = value; + morphInfluencesSum += value; + + } else { + + if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) { + + geometry.deleteAttribute( 'morphTarget' + i ); + + } + + if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) { + + geometry.deleteAttribute( 'morphNormal' + i ); + + } + + morphInfluences[ i ] = 0; + + } + + } + + // GLSL shader uses formula baseinfluence * base + sum(target * influence) + // This allows us to switch between absolute morphs and relative morphs without changing shader code + // When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence) + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + } + + return { + + update: update + + }; + +} + +function WebGLObjects( gl, geometries, attributes, info ) { + + let updateMap = new WeakMap(); + + function update( object ) { + + const frame = info.render.frame; + + const geometry = object.geometry; + const buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateMap.get( buffergeometry ) !== frame ) { + + geometries.update( buffergeometry ); + + updateMap.set( buffergeometry, frame ); + + } + + if ( object.isInstancedMesh ) { + + if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) { + + object.addEventListener( 'dispose', onInstancedMeshDispose ); + + } + + attributes.update( object.instanceMatrix, 34962 ); + + if ( object.instanceColor !== null ) { + + attributes.update( object.instanceColor, 34962 ); + + } + + } + + return buffergeometry; + + } + + function dispose() { + + updateMap = new WeakMap(); + + } + + function onInstancedMeshDispose( event ) { + + const instancedMesh = event.target; + + instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose ); + + attributes.remove( instancedMesh.instanceMatrix ); + + if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor ); + + } + + return { + + update: update, + dispose: dispose + + }; + +} + +class DataTexture3D extends Texture { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // const texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + super( null ); + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + this.needsUpdate = true; + + } + +} + +DataTexture3D.prototype.isDataTexture3D = true; + +/** + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [textures] ) + * + * uploads a uniform value(s) + * the 'textures' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (textures factorizations): + * + * .upload( gl, seq, values, textures ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (textures factorizations): + * + * .setValue( gl, name, value, textures ) + * + * sets uniform with name 'name' to 'value' + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + +const emptyTexture = new Texture(); +const emptyTexture2dArray = new DataTexture2DArray(); +const emptyTexture3d = new DataTexture3D(); +const emptyCubeTexture = new CubeTexture(); + +// --- Utilities --- + +// Array Caches (provide typed arrays for temporary by size) + +const arrayCacheF32 = []; +const arrayCacheI32 = []; + +// Float32Array caches used for uploading Matrix uniforms + +const mat4array = new Float32Array( 16 ); +const mat3array = new Float32Array( 9 ); +const mat2array = new Float32Array( 4 ); + +// Flattening for arrays of vectors and matrices + +function flatten( array, nBlocks, blockSize ) { + + const firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + const n = nBlocks * blockSize; + let r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( let i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + +} + +function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( let i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + +} + +function copyArray( a, b ) { + + for ( let i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + +} + +// Texture unit allocation + +function allocTexUnits( textures, n ) { + + let r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( let i = 0; i !== n; ++ i ) { + + r[ i ] = textures.allocateTextureUnit(); + + } + + return r; + +} + +// --- Setters --- + +// Note: Defining these methods externally, because they come in a bunch +// and this way their names minify. + +// Single scalar + +function setValueV1f( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single float vector (from flat array or THREE.VectorN) + +function setValueV2f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single matrix (from flat array or THREE.MatrixN) + +function setValueM2( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM3( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM4( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + +} + +// Single integer / boolean + +function setValueV1i( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single integer / boolean vector (from flat array) + +function setValueV2i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValueV3i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValueV4i( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + +} + +// Single unsigned integer + +function setValueV1ui( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1ui( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single unsigned integer vector (from flat array) + +function setValueV2ui( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2uiv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValueV3ui( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3uiv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValueV4ui( gl, v ) { + + const cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4uiv( this.addr, v ); + + copyArray( cache, v ); + +} + + +// Single texture (2D / Cube) + +function setValueT1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.safeSetTexture2D( v || emptyTexture, unit ); + +} + +function setValueT3D1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture3D( v || emptyTexture3d, unit ); + +} + +function setValueT6( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.safeSetTextureCube( v || emptyCubeTexture, unit ); + +} + +function setValueT2DArray1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture2DArray( v || emptyTexture2dArray, unit ); + +} + +// Helper to pick the right setter for the singular case + +function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1f; // FLOAT + case 0x8b50: return setValueV2f; // _VEC2 + case 0x8b51: return setValueV3f; // _VEC3 + case 0x8b52: return setValueV4f; // _VEC4 + + case 0x8b5a: return setValueM2; // _MAT2 + case 0x8b5b: return setValueM3; // _MAT3 + case 0x8b5c: return setValueM4; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2i; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3i; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4i; // _VEC4 + + case 0x1405: return setValueV1ui; // UINT + case 0x8dc6: return setValueV2ui; // _VEC2 + case 0x8dc7: return setValueV3ui; // _VEC3 + case 0x8dc8: return setValueV4ui; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3D1; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArray1; + + } + +} + + +// Array of scalars + +function setValueV1fArray( gl, v ) { + + gl.uniform1fv( this.addr, v ); + +} + +// Array of vectors (from flat array or array of THREE.VectorN) + +function setValueV2fArray( gl, v ) { + + const data = flatten( v, this.size, 2 ); + + gl.uniform2fv( this.addr, data ); + +} + +function setValueV3fArray( gl, v ) { + + const data = flatten( v, this.size, 3 ); + + gl.uniform3fv( this.addr, data ); + +} + +function setValueV4fArray( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniform4fv( this.addr, data ); + +} + +// Array of matrices (from flat array or array of THREE.MatrixN) + +function setValueM2Array( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniformMatrix2fv( this.addr, false, data ); + +} + +function setValueM3Array( gl, v ) { + + const data = flatten( v, this.size, 9 ); + + gl.uniformMatrix3fv( this.addr, false, data ); + +} + +function setValueM4Array( gl, v ) { + + const data = flatten( v, this.size, 16 ); + + gl.uniformMatrix4fv( this.addr, false, data ); + +} + +// Array of integer / boolean + +function setValueV1iArray( gl, v ) { + + gl.uniform1iv( this.addr, v ); + +} + +// Array of integer / boolean vectors (from flat array) + +function setValueV2iArray( gl, v ) { + + gl.uniform2iv( this.addr, v ); + +} + +function setValueV3iArray( gl, v ) { + + gl.uniform3iv( this.addr, v ); + +} + +function setValueV4iArray( gl, v ) { + + gl.uniform4iv( this.addr, v ); + +} + +// Array of unsigned integer + +function setValueV1uiArray( gl, v ) { + + gl.uniform1uiv( this.addr, v ); + +} + +// Array of unsigned integer vectors (from flat array) + +function setValueV2uiArray( gl, v ) { + + gl.uniform2uiv( this.addr, v ); + +} + +function setValueV3uiArray( gl, v ) { + + gl.uniform3uiv( this.addr, v ); + +} + +function setValueV4uiArray( gl, v ) { + + gl.uniform4uiv( this.addr, v ); + +} + + +// Array of textures (2D / Cube) + +function setValueT1Array( gl, v, textures ) { + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + gl.uniform1iv( this.addr, units ); + + for ( let i = 0; i !== n; ++ i ) { + + textures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + +} + +function setValueT6Array( gl, v, textures ) { + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + gl.uniform1iv( this.addr, units ); + + for ( let i = 0; i !== n; ++ i ) { + + textures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + +} + +// Helper to pick the right setter for a pure (bottom-level) array + +function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1fArray; // FLOAT + case 0x8b50: return setValueV2fArray; // _VEC2 + case 0x8b51: return setValueV3fArray; // _VEC3 + case 0x8b52: return setValueV4fArray; // _VEC4 + + case 0x8b5a: return setValueM2Array; // _MAT2 + case 0x8b5b: return setValueM3Array; // _MAT3 + case 0x8b5c: return setValueM4Array; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4 + + case 0x1405: return setValueV1uiArray; // UINT + case 0x8dc6: return setValueV2uiArray; // _VEC2 + case 0x8dc7: return setValueV3uiArray; // _VEC3 + case 0x8dc8: return setValueV4uiArray; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1Array; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6Array; + + } + +} + +// --- Uniform Classes --- + +function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +PureArrayUniform.prototype.updateCache = function ( data ) { + + const cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + +}; + +function StructuredUniform( id ) { + + this.id = id; + + this.seq = []; + this.map = {}; + +} + +StructuredUniform.prototype.setValue = function ( gl, value, textures ) { + + const seq = this.seq; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + u.setValue( gl, value[ u.id ], textures ); + + } + +}; + +// --- Top-level --- + +// Parser - builds up the property tree from the path strings + +const RePathPart = /(\w+)(\])?(\[|\.)?/g; + +// extracts +// - the identifier (member name or array index) +// - followed by an optional right bracket (found when array index) +// - followed by an optional left bracket or dot (type of subscript) +// +// Note: These portions can be read in a non-overlapping fashion and +// allow straightforward parsing of the hierarchy that WebGL encodes +// in the uniform names. + +function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + +} + +function parseUniform( activeInfo, addr, container ) { + + const path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + const match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex; + + let id = match[ 1 ]; + const idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + const map = container.map; + let next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + +} + +// Root Container + +function WebGLUniforms( gl, program ) { + + this.seq = []; + this.map = {}; + + const n = gl.getProgramParameter( program, 35718 ); + + for ( let i = 0; i < n; ++ i ) { + + const info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + +} + +WebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) { + + const u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, textures ); + +}; + +WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + const v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + +}; + + +// Static interface + +WebGLUniforms.upload = function ( gl, seq, values, textures ) { + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, textures ); + + } + + } + +}; + +WebGLUniforms.seqWithValue = function ( seq, values ) { + + const r = []; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + +}; + +function WebGLShader( gl, type, string ) { + + const shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + return shader; + +} + +let programIdCount = 0; + +function addLineNumbers( string ) { + + const lines = string.split( '\n' ); + + for ( let i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + +} + +function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + case LogLuvEncoding: + return [ 'LogLuv', '( value )' ]; + default: + console.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding ); + return [ 'Linear', '( value )' ]; + + } + +} + +function getShaderErrors( gl, shader, type ) { + + const status = gl.getShaderParameter( shader, 35713 ); + const errors = gl.getShaderInfoLog( shader ).trim(); + + if ( status && errors === '' ) return ''; + + // --enable-privileged-webgl-extension + // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return type.toUpperCase() + '\n\n' + errors + '\n\n' + addLineNumbers( gl.getShaderSource( shader ) ); + +} + +function getTexelDecodingFunction( functionName, encoding ) { + + const components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + +} + +function getTexelEncodingFunction( functionName, encoding ) { + + const components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + +} + +function getToneMappingFunction( functionName, toneMapping ) { + + let toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + case ACESFilmicToneMapping: + toneMappingName = 'ACESFilmic'; + break; + + case CustomToneMapping: + toneMappingName = 'Custom'; + break; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping ); + toneMappingName = 'Linear'; + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + +} + +function generateExtensions( parameters ) { + + const chunks = [ + ( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '', + ( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateDefines( defines ) { + + const chunks = []; + + for ( const name in defines ) { + + const value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + +} + +function fetchAttributeLocations( gl, program ) { + + const attributes = {}; + + const n = gl.getProgramParameter( program, 35721 ); + + for ( let i = 0; i < n; i ++ ) { + + const info = gl.getActiveAttrib( program, i ); + const name = info.name; + + let locationSize = 1; + if ( info.type === 35674 ) locationSize = 2; + if ( info.type === 35675 ) locationSize = 3; + if ( info.type === 35676 ) locationSize = 4; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = { + type: info.type, + location: gl.getAttribLocation( program, name ), + locationSize: locationSize + }; + + } + + return attributes; + +} + +function filterEmptyLine( string ) { + + return string !== ''; + +} + +function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ) + .replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows ) + .replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows ) + .replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows ); + +} + +function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + +} + +// Resolve Includes + +const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + +function resolveIncludes( string ) { + + return string.replace( includePattern, includeReplacer ); + +} + +function includeReplacer( match, include ) { + + const string = ShaderChunk[ include ]; + + if ( string === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return resolveIncludes( string ); + +} + +// Unroll Loops + +const deprecatedUnrollLoopPattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; +const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; + +function unrollLoops( string ) { + + return string + .replace( unrollLoopPattern, loopReplacer ) + .replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer ); + +} + +function deprecatedLoopReplacer( match, start, end, snippet ) { + + console.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' ); + return loopReplacer( match, start, end, snippet ); + +} + +function loopReplacer( match, start, end, snippet ) { + + let string = ''; + + for ( let i = parseInt( start ); i < parseInt( end ); i ++ ) { + + string += snippet + .replace( /\[\s*i\s*\]/g, '[ ' + i + ' ]' ) + .replace( /UNROLLED_LOOP_INDEX/g, i ); + + } + + return string; + +} + +// + +function generatePrecision( parameters ) { + + let precisionstring = 'precision ' + parameters.precision + ' float;\nprecision ' + parameters.precision + ' int;'; + + if ( parameters.precision === 'highp' ) { + + precisionstring += '\n#define HIGH_PRECISION'; + + } else if ( parameters.precision === 'mediump' ) { + + precisionstring += '\n#define MEDIUM_PRECISION'; + + } else if ( parameters.precision === 'lowp' ) { + + precisionstring += '\n#define LOW_PRECISION'; + + } + + return precisionstring; + +} + +function generateShadowMapTypeDefine( parameters ) { + + let shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } else if ( parameters.shadowMapType === VSMShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM'; + + } + + return shadowMapTypeDefine; + +} + +function generateEnvMapTypeDefine( parameters ) { + + let envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + } + + } + + return envMapTypeDefine; + +} + +function generateEnvMapModeDefine( parameters ) { + + let envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeRefractionMapping: + case CubeUVRefractionMapping: + + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + } + + return envMapModeDefine; + +} + +function generateEnvMapBlendingDefine( parameters ) { + + let envMapBlendingDefine = 'ENVMAP_BLENDING_NONE'; + + if ( parameters.envMap ) { + + switch ( parameters.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + return envMapBlendingDefine; + +} + +function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { + + // TODO Send this event to Three.js DevTools + // console.log( 'WebGLProgram', cacheKey ); + + const gl = renderer.getContext(); + + const defines = parameters.defines; + + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + + const shadowMapTypeDefine = generateShadowMapTypeDefine( parameters ); + const envMapTypeDefine = generateEnvMapTypeDefine( parameters ); + const envMapModeDefine = generateEnvMapModeDefine( parameters ); + const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters ); + + + const gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters ); + + const customDefines = generateDefines( defines ); + + const program = gl.createProgram(); + + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : ''; + + if ( parameters.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + generatePrecision( parameters ), + + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.instancing ? '#define USE_INSTANCING' : '', + parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '', + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + ( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '', + + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '', + + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '', + + parameters.vertexTangents ? '#define USE_TANGENT' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUvs ? '#define USE_UV' : '', + parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + ( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '', + ( parameters.morphTargets && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + '#ifdef USE_INSTANCING', + + ' attribute mat4 instanceMatrix;', + + '#endif', + + '#ifdef USE_INSTANCING_COLOR', + + ' attribute vec3 instanceColor;', + + '#endif', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_TANGENT', + + ' attribute vec4 tangent;', + + '#endif', + + '#if defined( USE_COLOR_ALPHA )', + + ' attribute vec4 color;', + + '#elif defined( USE_COLOR )', + + ' attribute vec3 color;', + + '#endif', + + '#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + generatePrecision( parameters ), + + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.matcap ? '#define USE_MATCAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + ( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '', + + parameters.clearcoat ? '#define USE_CLEARCOAT' : '', + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.alphaTest ? '#define USE_ALPHATEST' : '', + + parameters.sheen ? '#define USE_SHEEN' : '', + parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.vertexTangents ? '#define USE_TANGENT' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUvs ? '#define USE_UV' : '', + parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + ( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + parameters.format === RGBFormat ? '#define OPAQUE' : '', + + ShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below + parameters.map ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcap ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMap ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMap ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.specularColorMap ? getTexelDecodingFunction( 'specularColorMapTexelToLinear', parameters.specularColorMapEncoding ) : '', + parameters.sheenColorMap ? getTexelDecodingFunction( 'sheenColorMapTexelToLinear', parameters.sheenColorMapEncoding ) : '', + parameters.lightMap ? getTexelDecodingFunction( 'lightMapTexelToLinear', parameters.lightMapEncoding ) : '', + getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ), + + parameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = resolveIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = resolveIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) { + + // GLSL 3.0 conversion for built-in materials and ShaderMaterial + + versionString = '#version 300 es\n'; + + prefixVertex = [ + 'precision mediump sampler2DArray;', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#define varying in', + ( parameters.glslVersion === GLSL3 ) ? '' : 'out highp vec4 pc_fragColor;', + ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + const glVertexShader = WebGLShader( gl, 35633, vertexGlsl ); + const glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( parameters.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, parameters.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + // check for link errors + if ( renderer.debug.checkShaderErrors ) { + + const programLog = gl.getProgramInfoLog( program ).trim(); + const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + let runnable = true; + let haveDiagnostics = true; + + if ( gl.getProgramParameter( program, 35714 ) === false ) { + + runnable = false; + + const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' ); + const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' ); + + console.error( + 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' + + 'VALIDATE_STATUS ' + gl.getProgramParameter( program, 35715 ) + '\n\n' + + 'Program Info Log: ' + programLog + '\n' + + vertexErrors + '\n' + + fragmentErrors + ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + } + + // Clean up + + // Crashes in iOS9 and iOS10. #18402 + // gl.detachShader( program, glVertexShader ); + // gl.detachShader( program, glFragmentShader ); + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + let cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + let cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + bindingStates.releaseStatesOfProgram( this ); + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // + + this.name = parameters.shaderName; + this.id = programIdCount ++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + +} + +function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { + + const programs = []; + + const isWebGL2 = capabilities.isWebGL2; + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + const floatVertexTextures = capabilities.floatVertexTextures; + const maxVertexUniforms = capabilities.maxVertexUniforms; + const vertexTextures = capabilities.vertexTextures; + + let precision = capabilities.precision; + + const shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'toon', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + const parameterNames = [ + 'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor', + 'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV', + 'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap', + 'objectSpaceNormalMap', 'tangentSpaceNormalMap', + 'clearcoat', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap', + 'displacementMap', 'specularMap', , 'roughnessMap', 'metalnessMap', 'gradientMap', + 'alphaMap', 'alphaTest', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2', + 'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning', + 'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals', 'morphTargetsCount', 'premultipliedAlpha', + 'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights', + 'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows', + 'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights', + 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering', 'format', + 'specularIntensityMap', 'specularColorMap', 'specularColorMapEncoding', + 'transmission', 'transmissionMap', 'thicknessMap', + 'sheen', 'sheenColorMap', 'sheenColorMapEncoding', 'sheenRoughnessMap' + ]; + + function getMaxBones( object ) { + + const skeleton = object.skeleton; + const bones = skeleton.bones; + + if ( floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + const nVertexUniforms = maxVertexUniforms; + const nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + const maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map ) { + + let encoding; + + if ( map && map.isTexture ) { + + encoding = map.encoding; + + } else if ( map && map.isWebGLRenderTarget ) { + + console.warn( 'THREE.WebGLPrograms.getTextureEncodingFromMap: don\'t use render targets as textures. Use their .texture property instead.' ); + encoding = map.texture.encoding; + + } else { + + encoding = LinearEncoding; + + } + + if ( isWebGL2 && map && map.isTexture && map.format === RGBAFormat && map.type === UnsignedByteType && map.encoding === sRGBEncoding ) { + + encoding = LinearEncoding; // disable inline decode for sRGB textures in WebGL 2 + + } + + return encoding; + + } + + function getParameters( material, lights, shadows, scene, object ) { + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + + const shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + const maxBones = object.isSkinnedMesh ? getMaxBones( object ) : 0; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + let vertexShader, fragmentShader; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + + } else { + + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + + } + + const currentRenderTarget = renderer.getRenderTarget(); + + const useAlphaTest = material.alphaTest > 0; + const useClearcoat = material.clearcoat > 0; + + const parameters = { + + isWebGL2: isWebGL2, + + shaderID: shaderID, + shaderName: material.type, + + vertexShader: vertexShader, + fragmentShader: fragmentShader, + defines: material.defines, + + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + + precision: precision, + + instancing: object.isInstancedMesh === true, + instancingColor: object.isInstancedMesh === true && object.instanceColor !== null, + + supportsVertexTextures: vertexTextures, + outputEncoding: ( currentRenderTarget !== null ) ? getTextureEncodingFromMap( currentRenderTarget.texture ) : renderer.outputEncoding, + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap ), + envMap: !! envMap, + envMapMode: envMap && envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( envMap ), + envMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + lightMapEncoding: getTextureEncodingFromMap( material.lightMap ), + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap, + + clearcoat: useClearcoat, + clearcoatMap: useClearcoat && !! material.clearcoatMap, + clearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap, + clearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap, + + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + specularIntensityMap: !! material.specularIntensityMap, + specularColorMap: !! material.specularColorMap, + specularColorMapEncoding: getTextureEncodingFromMap( material.specularColorMap ), + + alphaMap: !! material.alphaMap, + alphaTest: useAlphaTest, + + gradientMap: !! material.gradientMap, + + sheen: material.sheen > 0, + sheenColorMap: !! material.sheenColorMap, + sheenColorMapEncoding: getTextureEncodingFromMap( material.sheenColorMap ), + sheenRoughnessMap: !! material.sheenRoughnessMap, + + transmission: material.transmission > 0, + transmissionMap: !! material.transmissionMap, + thicknessMap: !! material.thicknessMap, + + combine: material.combine, + + vertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ), + vertexColors: material.vertexColors, + vertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4, + vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || material.sheenRoughnessMap, + uvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap, + + fog: !! fog, + useFog: material.fog, + fogExp2: ( fog && fog.isFogExp2 ), + + flatShading: !! material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + skinning: object.isSkinnedMesh === true && maxBones > 0, + maxBones: maxBones, + useVertexTexture: floatVertexTextures, + + morphTargets: !! object.geometry && !! object.geometry.morphAttributes.position, + morphNormals: !! object.geometry && !! object.geometry.morphAttributes.normal, + morphTargetsCount: ( !! object.geometry && !! object.geometry.morphAttributes.position ) ? object.geometry.morphAttributes.position.length : 0, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + + format: material.format, + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false, + + index0AttributeName: material.index0AttributeName, + + extensionDerivatives: material.extensions && material.extensions.derivatives, + extensionFragDepth: material.extensions && material.extensions.fragDepth, + extensionDrawBuffers: material.extensions && material.extensions.drawBuffers, + extensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD, + + rendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ), + rendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ), + rendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ), + + customProgramCacheKey: material.customProgramCacheKey() + + }; + + return parameters; + + } + + function getProgramCacheKey( parameters ) { + + const array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( hashString( parameters.fragmentShader ) ); + array.push( hashString( parameters.vertexShader ) ); + + } + + if ( parameters.defines !== undefined ) { + + for ( const name in parameters.defines ) { + + array.push( name ); + array.push( parameters.defines[ name ] ); + + } + + } + + if ( parameters.isRawShaderMaterial === false ) { + + for ( let i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( renderer.outputEncoding ); + array.push( renderer.gammaFactor ); + + } + + array.push( parameters.customProgramCacheKey ); + + return array.join(); + + } + + function getUniforms( material ) { + + const shaderID = shaderIDs[ material.type ]; + let uniforms; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + uniforms = UniformsUtils.clone( shader.uniforms ); + + } else { + + uniforms = material.uniforms; + + } + + return uniforms; + + } + + function acquireProgram( parameters, cacheKey ) { + + let program; + + // Check if code has been already compiled + for ( let p = 0, pl = programs.length; p < pl; p ++ ) { + + const preexistingProgram = programs[ p ]; + + if ( preexistingProgram.cacheKey === cacheKey ) { + + program = preexistingProgram; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates ); + programs.push( program ); + + } + + return program; + + } + + function releaseProgram( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + const i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + } + + return { + getParameters: getParameters, + getProgramCacheKey: getProgramCacheKey, + getUniforms: getUniforms, + acquireProgram: acquireProgram, + releaseProgram: releaseProgram, + // Exposed for resource monitoring & error feedback via renderer.info: + programs: programs + }; + +} + +function WebGLProperties() { + + let properties = new WeakMap(); + + function get( object ) { + + let map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + +} + +function painterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + +} + +function reversePainterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + +} + + +function WebGLRenderList( properties ) { + + const renderItems = []; + let renderItemsIndex = 0; + + const opaque = []; + const transmissive = []; + const transparent = []; + + const defaultProgram = { id: - 1 }; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transmissive.length = 0; + transparent.length = 0; + + } + + function getNextRenderItem( object, geometry, material, groupOrder, z, group ) { + + let renderItem = renderItems[ renderItemsIndex ]; + const materialProperties = properties.get( material ); + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: materialProperties.program || defaultProgram, + groupOrder: groupOrder, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = materialProperties.program || defaultProgram; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + renderItemsIndex ++; + + return renderItem; + + } + + function push( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.push( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.push( renderItem ); + + } else { + + opaque.push( renderItem ); + + } + + } + + function unshift( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.unshift( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.unshift( renderItem ); + + } else { + + opaque.unshift( renderItem ); + + } + + } + + function sort( customOpaqueSort, customTransparentSort ) { + + if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable ); + if ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable ); + if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable ); + + } + + function finish() { + + // Clear references from inactive renderItems in the list + + for ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) { + + const renderItem = renderItems[ i ]; + + if ( renderItem.id === null ) break; + + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.program = null; + renderItem.group = null; + + } + + } + + return { + + opaque: opaque, + transmissive: transmissive, + transparent: transparent, + + init: init, + push: push, + unshift: unshift, + finish: finish, + + sort: sort + }; + +} + +function WebGLRenderLists( properties ) { + + let lists = new WeakMap(); + + function get( scene, renderCallDepth ) { + + let list; + + if ( lists.has( scene ) === false ) { + + list = new WebGLRenderList( properties ); + lists.set( scene, [ list ] ); + + } else { + + if ( renderCallDepth >= lists.get( scene ).length ) { + + list = new WebGLRenderList( properties ); + lists.get( scene ).push( list ); + + } else { + + list = lists.get( scene )[ renderCallDepth ]; + + } + + } + + return list; + + } + + function dispose() { + + lists = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +function UniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + +function ShadowUniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + // TODO (abelnation): set RectAreaLight shadow uniforms + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + + + +let nextVersion = 0; + +function shadowCastingLightsFirst( lightA, lightB ) { + + return ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 ); + +} + +function WebGLLights( extensions, capabilities ) { + + const cache = new UniformsCache(); + + const shadowCache = ShadowUniformsCache(); + + const state = { + + version: 0, + + hash: { + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + + numDirectionalShadows: - 1, + numPointShadows: - 1, + numSpotShadows: - 1 + }, + + ambient: [ 0, 0, 0 ], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadow: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + for ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() ); + + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + + function setup( lights, physicallyCorrectLights ) { + + let r = 0, g = 0, b = 0; + + for ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 ); + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + + lights.sort( shadowCastingLightsFirst ); + + // artist-friendly light intensity scaling factor + const scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + + const shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity * scaleFactor; + g += color.g * intensity * scaleFactor; + b += color.b * intensity * scaleFactor; + + } else if ( light.isLightProbe ) { + + for ( let j = 0; j < 9; j ++ ) { + + state.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity ); + + } + + } else if ( light.isDirectionalLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor ); + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.directionalShadow[ directionalLength ] = shadowUniforms; + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + + numDirectionalShadows ++; + + } + + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + + uniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor ); + uniforms.distance = distance; + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.spotShadow[ spotLength ] = shadowUniforms; + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + + numSpotShadows ++; + + } + + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + + state.pointShadow[ pointLength ] = shadowUniforms; + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + + numPointShadows ++; + + } + + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = cache.get( light ); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + if ( rectAreaLength > 0 ) { + + if ( capabilities.isWebGL2 ) { + + // WebGL 2 + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else { + + // WebGL 1 + + if ( extensions.has( 'OES_texture_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + + } else { + + console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' ); + + } + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + const hash = state.hash; + + if ( hash.directionalLength !== directionalLength || + hash.pointLength !== pointLength || + hash.spotLength !== spotLength || + hash.rectAreaLength !== rectAreaLength || + hash.hemiLength !== hemiLength || + hash.numDirectionalShadows !== numDirectionalShadows || + hash.numPointShadows !== numPointShadows || + hash.numSpotShadows !== numSpotShadows ) { + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotShadowMatrix.length = numSpotShadows; + + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + + state.version = nextVersion ++; + + } + + } + + function setupView( lights, camera ) { + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + const viewMatrix = camera.matrixWorldInverse; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + if ( light.isDirectionalLight ) { + + const uniforms = state.directional[ directionalLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = state.spot[ spotLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = state.rectArea[ rectAreaLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = state.point[ pointLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = state.hemi[ hemiLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + hemiLength ++; + + } + + } + + } + + return { + setup: setup, + setupView: setupView, + state: state + }; + +} + +function WebGLRenderState( extensions, capabilities ) { + + const lights = new WebGLLights( extensions, capabilities ); + + const lightsArray = []; + const shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( physicallyCorrectLights ) { + + lights.setup( lightsArray, physicallyCorrectLights ); + + } + + function setupLightsView( camera ) { + + lights.setupView( lightsArray, camera ); + + } + + const state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + setupLightsView: setupLightsView, + + pushLight: pushLight, + pushShadow: pushShadow + }; + +} + +function WebGLRenderStates( extensions, capabilities ) { + + let renderStates = new WeakMap(); + + function get( scene, renderCallDepth = 0 ) { + + let renderState; + + if ( renderStates.has( scene ) === false ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStates.set( scene, [ renderState ] ); + + } else { + + if ( renderCallDepth >= renderStates.get( scene ).length ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStates.get( scene ).push( renderState ); + + } else { + + renderState = renderStates.get( scene )[ renderCallDepth ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +/** + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +class MeshDepthMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.depthPacking = source.depthPacking; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + } + +} + +MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + +/** + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + +class MeshDistanceMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + } + +} + +MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + +const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; + +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; + +function WebGLShadowMap( _renderer, _objects, _capabilities ) { + + let _frustum = new Frustum(); + + const _shadowMapSize = new Vector2(), + _viewportSize = new Vector2(), + + _viewport = new Vector4(), + + _depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ), + _distanceMaterial = new MeshDistanceMaterial(), + + _materialCache = {}, + + _maxTextureSize = _capabilities.maxTextureSize; + + const shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + const shadowMaterialVertical = new ShaderMaterial( { + defines: { + VSM_SAMPLES: 8 + }, + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4.0 } + }, + + vertexShader: vertex, + fragmentShader: fragment + + } ); + + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + 'position', + new BufferAttribute( + new Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ), + 3 + ) + ); + + const fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical ); + + const scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + const currentRenderTarget = _renderer.getRenderTarget(); + const activeCubeFace = _renderer.getActiveCubeFace(); + const activeMipmapLevel = _renderer.getActiveMipmapLevel(); + + const _state = _renderer.state; + + // Set GL state for depth map. + _state.setBlending( NoBlending ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + for ( let i = 0, il = lights.length; i < il; i ++ ) { + + const light = lights[ i ]; + const shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + if ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue; + + _shadowMapSize.copy( shadow.mapSize ); + + const shadowFrameExtents = shadow.getFrameExtents(); + + _shadowMapSize.multiply( shadowFrameExtents ); + + _viewportSize.copy( shadow.mapSize ); + + if ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) { + + if ( _shadowMapSize.x > _maxTextureSize ) { + + _viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x ); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + + } + + if ( _shadowMapSize.y > _maxTextureSize ) { + + _viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y ); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; + + } + + } + + if ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) { + + const pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + + shadow.camera.updateProjectionMatrix(); + + } + + if ( shadow.map === null ) { + + const pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.camera.updateProjectionMatrix(); + + } + + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + + const viewportCount = shadow.getViewportCount(); + + for ( let vp = 0; vp < viewportCount; vp ++ ) { + + const viewport = shadow.getViewport( vp ); + + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + + _state.viewport( _viewport ); + + shadow.updateMatrices( light, vp ); + + _frustum = shadow.getFrustum(); + + renderObject( scene, camera, shadow.camera, light, this.type ); + + } + + // do blur pass for VSM + + if ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) { + + VSMPass( shadow, camera ); + + } + + shadow.needsUpdate = false; + + } + + scope.needsUpdate = false; + + _renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel ); + + }; + + function VSMPass( shadow, camera ) { + + const geometry = _objects.update( fullScreenMesh ); + + if ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) { + + shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; + + shadowMaterialVertical.needsUpdate = true; + shadowMaterialHorizontal.needsUpdate = true; + + } + + // vertical pass + + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.mapPass ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null ); + + // horizontal pass + + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null ); + + } + + function getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) { + + let result = null; + + const customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial; + + if ( customMaterial !== undefined ) { + + result = customMaterial; + + } else { + + result = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial; + + } + + if ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) || + ( material.displacementMap && material.displacementScale !== 0 ) || + ( material.alphaMap && material.alphaTest > 0 ) ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + const keyA = result.uuid, keyB = material.uuid; + + let materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + let cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + if ( type === VSMShadowMap ) { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ]; + + } + + result.alphaMap = material.alphaMap; + result.alphaTest = material.alphaTest; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.displacementMap = material.displacementMap; + result.displacementScale = material.displacementScale; + result.displacementBias = material.displacementBias; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) { + + result.referencePosition.setFromMatrixPosition( light.matrixWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, light, type ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + const geometry = _objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let k = 0, kl = groups.length; k < kl; k ++ ) { + + const group = groups[ k ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + const depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + const depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, light, type ); + + } + + } + +} + +function WebGLState( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function ColorBuffer() { + + let locked = false; + + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + let locked = false; + + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( 2929 ); + + } else { + + disable( 2929 ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( 512 ); + break; + + case AlwaysDepth: + + gl.depthFunc( 519 ); + break; + + case LessDepth: + + gl.depthFunc( 513 ); + break; + + case LessEqualDepth: + + gl.depthFunc( 515 ); + break; + + case EqualDepth: + + gl.depthFunc( 514 ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( 518 ); + break; + + case GreaterDepth: + + gl.depthFunc( 516 ); + break; + + case NotEqualDepth: + + gl.depthFunc( 517 ); + break; + + default: + + gl.depthFunc( 515 ); + + } + + } else { + + gl.depthFunc( 515 ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + let locked = false; + + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( ! locked ) { + + if ( stencilTest ) { + + enable( 2960 ); + + } else { + + disable( 2960 ); + + } + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + + let enabledCapabilities = {}; + + let xrFramebuffer = null; + let currentBoundFramebuffers = {}; + + let currentProgram = null; + + let currentBlendingEnabled = false; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentPremultipledAlpha = false; + + let currentFlipSided = null; + let currentCullFace = null; + + let currentLineWidth = null; + + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + + const maxTextures = gl.getParameter( 35661 ); + + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter( 7938 ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL ES (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + let currentTextureSlot = null; + let currentBoundTextures = {}; + + const scissorParam = gl.getParameter( 3088 ); + const viewportParam = gl.getParameter( 2978 ); + + const currentScissor = new Vector4().fromArray( scissorParam ); + const currentViewport = new Vector4().fromArray( viewportParam ); + + function createTexture( type, target, count ) { + + const data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + const texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, 10241, 9728 ); + gl.texParameteri( type, 10240, 9728 ); + + for ( let i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data ); + + } + + return texture; + + } + + const emptyTextures = {}; + emptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 ); + emptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( 2929 ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( 2884 ); + + setBlending( NoBlending ); + + // + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function bindXRFramebuffer( framebuffer ) { + + if ( framebuffer !== xrFramebuffer ) { + + gl.bindFramebuffer( 36160, framebuffer ); + + xrFramebuffer = framebuffer; + + } + + } + + function bindFramebuffer( target, framebuffer ) { + + if ( framebuffer === null && xrFramebuffer !== null ) framebuffer = xrFramebuffer; // use active XR framebuffer if available + + if ( currentBoundFramebuffers[ target ] !== framebuffer ) { + + gl.bindFramebuffer( target, framebuffer ); + + currentBoundFramebuffers[ target ] = framebuffer; + + if ( isWebGL2 ) { + + // 36009 is equivalent to 36160 + + if ( target === 36009 ) { + + currentBoundFramebuffers[ 36160 ] = framebuffer; + + } + + if ( target === 36160 ) { + + currentBoundFramebuffers[ 36009 ] = framebuffer; + + } + + } + + return true; + + } + + return false; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + const equationToGL = { + [ AddEquation ]: 32774, + [ SubtractEquation ]: 32778, + [ ReverseSubtractEquation ]: 32779 + }; + + if ( isWebGL2 ) { + + equationToGL[ MinEquation ] = 32775; + equationToGL[ MaxEquation ] = 32776; + + } else { + + const extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + equationToGL[ MinEquation ] = extension.MIN_EXT; + equationToGL[ MaxEquation ] = extension.MAX_EXT; + + } + + } + + const factorToGL = { + [ ZeroFactor ]: 0, + [ OneFactor ]: 1, + [ SrcColorFactor ]: 768, + [ SrcAlphaFactor ]: 770, + [ SrcAlphaSaturateFactor ]: 776, + [ DstColorFactor ]: 774, + [ DstAlphaFactor ]: 772, + [ OneMinusSrcColorFactor ]: 769, + [ OneMinusSrcAlphaFactor ]: 771, + [ OneMinusDstColorFactor ]: 775, + [ OneMinusDstAlphaFactor ]: 773 + }; + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled === true ) { + + disable( 3042 ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( currentBlendingEnabled === false ) { + + enable( 3042 ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( 32774 ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 1, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 1, 1 ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( 0, 0, 769, 771 ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( 0, 768, 0, 770 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 770, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 770, 1 ); + break; + + case SubtractiveBlending: + gl.blendFunc( 0, 769 ); + break; + + case MultiplyBlending: + gl.blendFunc( 0, 768 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( 2884 ) + : enable( 2884 ); + + let flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest( stencilWrite ); + if ( stencilWrite ) { + + stencilBuffer.setMask( material.stencilWriteMask ); + stencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask ); + stencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass ); + + } + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + material.alphaToCoverage === true + ? enable( 32926 ) + : disable( 32926 ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( 2304 ); + + } else { + + gl.frontFace( 2305 ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( 2884 ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( 1029 ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( 1028 ); + + } else { + + gl.cullFace( 1032 ); + + } + + } + + } else { + + disable( 2884 ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( 32823 ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( 32823 ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( 3089 ); + + } else { + + disable( 3089 ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + let boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function unbindTexture() { + + const boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture !== undefined && boundTexture.type !== undefined ) { + + gl.bindTexture( boundTexture.type, null ); + + boundTexture.type = undefined; + boundTexture.texture = undefined; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + // reset state + + gl.disable( 3042 ); + gl.disable( 2884 ); + gl.disable( 2929 ); + gl.disable( 32823 ); + gl.disable( 3089 ); + gl.disable( 2960 ); + gl.disable( 32926 ); + + gl.blendEquation( 32774 ); + gl.blendFunc( 1, 0 ); + gl.blendFuncSeparate( 1, 0, 1, 0 ); + + gl.colorMask( true, true, true, true ); + gl.clearColor( 0, 0, 0, 0 ); + + gl.depthMask( true ); + gl.depthFunc( 513 ); + gl.clearDepth( 1 ); + + gl.stencilMask( 0xffffffff ); + gl.stencilFunc( 519, 0, 0xffffffff ); + gl.stencilOp( 7680, 7680, 7680 ); + gl.clearStencil( 0 ); + + gl.cullFace( 1029 ); + gl.frontFace( 2305 ); + + gl.polygonOffset( 0, 0 ); + + gl.activeTexture( 33984 ); + + gl.bindFramebuffer( 36160, null ); + + if ( isWebGL2 === true ) { + + gl.bindFramebuffer( 36009, null ); + gl.bindFramebuffer( 36008, null ); + + } + + gl.useProgram( null ); + + gl.lineWidth( 1 ); + + gl.scissor( 0, 0, gl.canvas.width, gl.canvas.height ); + gl.viewport( 0, 0, gl.canvas.width, gl.canvas.height ); + + // reset internals + + enabledCapabilities = {}; + + currentTextureSlot = null; + currentBoundTextures = {}; + + xrFramebuffer = null; + currentBoundFramebuffers = {}; + + currentProgram = null; + + currentBlendingEnabled = false; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentPremultipledAlpha = false; + + currentFlipSided = null; + currentCullFace = null; + + currentLineWidth = null; + + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + + currentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height ); + currentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height ); + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + enable: enable, + disable: disable, + + bindFramebuffer: bindFramebuffer, + bindXRFramebuffer: bindXRFramebuffer, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + unbindTexture: unbindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + +} + +function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + const isWebGL2 = capabilities.isWebGL2; + const maxTextures = capabilities.maxTextures; + const maxCubemapSize = capabilities.maxCubemapSize; + const maxTextureSize = capabilities.maxTextureSize; + const maxSamples = capabilities.maxSamples; + + const _videoTextures = new WeakMap(); + let _canvas; + + // cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas, + // also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")! + // Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d). + + let useOffscreenCanvas = false; + + try { + + useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' + && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null; + + } catch ( err ) { + + // Ignore any errors + + } + + function createCanvas( width, height ) { + + // Use OffscreenCanvas when available. Specially needed in web workers + + return useOffscreenCanvas ? + new OffscreenCanvas( width, height ) : createElementNS( 'canvas' ); + + } + + function resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) { + + let scale = 1; + + // handle case if texture exceeds max size + + if ( image.width > maxSize || image.height > maxSize ) { + + scale = maxSize / Math.max( image.width, image.height ); + + } + + // only perform resize if necessary + + if ( scale < 1 || needsPowerOfTwo === true ) { + + // only perform resize for certain image types + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor; + + const width = floor( scale * image.width ); + const height = floor( scale * image.height ); + + if ( _canvas === undefined ) _canvas = createCanvas( width, height ); + + // cube textures can't reuse the same canvas + + const canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas; + + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, width, height ); + + console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' ); + + return canvas; + + } else { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + + } + + return image; + + } + + } + + return image; + + } + + function isPowerOfTwo$1( image ) { + + return isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ); + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, supportsMips ) { + + return texture.generateMipmaps && supportsMips && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height, depth = 1 ) { + + _gl.generateMipmap( target ); + + const textureProperties = properties.get( texture ); + + textureProperties.__maxMipLevel = Math.log2( Math.max( width, height, depth ) ); + + } + + function getInternalFormat( internalFormatName, glFormat, glType, encoding ) { + + if ( isWebGL2 === false ) return glFormat; + + if ( internalFormatName !== null ) { + + if ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ]; + + console.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \'' + internalFormatName + '\'' ); + + } + + let internalFormat = glFormat; + + if ( glFormat === 6403 ) { + + if ( glType === 5126 ) internalFormat = 33326; + if ( glType === 5131 ) internalFormat = 33325; + if ( glType === 5121 ) internalFormat = 33321; + + } + + if ( glFormat === 6407 ) { + + if ( glType === 5126 ) internalFormat = 34837; + if ( glType === 5131 ) internalFormat = 34843; + if ( glType === 5121 ) internalFormat = 32849; + + } + + if ( glFormat === 6408 ) { + + if ( glType === 5126 ) internalFormat = 34836; + if ( glType === 5131 ) internalFormat = 34842; + if ( glType === 5121 ) internalFormat = ( encoding === sRGBEncoding ) ? 35907 : 32856; + + } + + if ( internalFormat === 33325 || internalFormat === 33326 || + internalFormat === 34842 || internalFormat === 34836 ) { + + extensions.get( 'EXT_color_buffer_float' ); + + } + + return internalFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) { + + return 9728; + + } + + return 9729; + + } + + // + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + _videoTextures.delete( texture ); + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + const renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + } + + // + + function deallocateTexture( texture ) { + + const textureProperties = properties.get( texture ); + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + const texture = renderTarget.texture; + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + info.memory.textures --; + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + for ( let i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer ); + if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer ); + if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer ); + + } + + if ( renderTarget.isWebGLMultipleRenderTargets ) { + + for ( let i = 0, il = texture.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( texture[ i ] ); + + if ( attachmentProperties.__webglTexture ) { + + _gl.deleteTexture( attachmentProperties.__webglTexture ); + + info.memory.textures --; + + } + + properties.remove( texture[ i ] ); + + } + + } + + properties.remove( texture ); + properties.remove( renderTarget ); + + } + + // + + let textureUnits = 0; + + function resetTextureUnits() { + + textureUnits = 0; + + } + + function allocateTextureUnit() { + + const textureUnit = textureUnits; + + if ( textureUnit >= maxTextures ) { + + console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures ); + + } + + textureUnits += 1; + + return textureUnit; + + } + + // + + function setTexture2D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + const image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 3553, textureProperties.__webglTexture ); + + } + + function setTexture2DArray( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 35866, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 32879, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadCubeTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__webglTexture ); + + } + + const wrappingToGL = { + [ RepeatWrapping ]: 10497, + [ ClampToEdgeWrapping ]: 33071, + [ MirroredRepeatWrapping ]: 33648 + }; + + const filterToGL = { + [ NearestFilter ]: 9728, + [ NearestMipmapNearestFilter ]: 9984, + [ NearestMipmapLinearFilter ]: 9986, + + [ LinearFilter ]: 9729, + [ LinearMipmapNearestFilter ]: 9985, + [ LinearMipmapLinearFilter ]: 9987 + }; + + function setTextureParameters( textureType, texture, supportsMips ) { + + if ( supportsMips ) { + + _gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] ); + _gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] ); + + if ( textureType === 32879 || textureType === 35866 ) { + + _gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] ); + + } + + _gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] ); + _gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] ); + + } else { + + _gl.texParameteri( textureType, 10242, 33071 ); + _gl.texParameteri( textureType, 10243, 33071 ); + + if ( textureType === 32879 || textureType === 35866 ) { + + _gl.texParameteri( textureType, 32882, 33071 ); + + } + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2 + if ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function initTexture( textureProperties, texture ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + let textureType = 3553; + + if ( texture.isDataTexture2DArray ) textureType = 35866; + if ( texture.isDataTexture3D ) textureType = 32879; + + initTexture( textureProperties, texture ); + + state.activeTexture( 33984 + slot ); + state.bindTexture( textureType, textureProperties.__webglTexture ); + + _gl.pixelStorei( 37440, texture.flipY ); + _gl.pixelStorei( 37441, texture.premultiplyAlpha ); + _gl.pixelStorei( 3317, texture.unpackAlignment ); + _gl.pixelStorei( 37443, 0 ); + + const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false; + const image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize ); + + const supportsMips = isPowerOfTwo$1( image ) || isWebGL2, + glFormat = utils.convert( texture.format ); + + let glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding ); + + setTextureParameters( textureType, texture, supportsMips ); + + let mipmap; + const mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = 6402; + + if ( isWebGL2 ) { + + if ( texture.type === FloatType ) { + + glInternalFormat = 36012; + + } else if ( texture.type === UnsignedIntType ) { + + glInternalFormat = 33190; + + } else if ( texture.type === UnsignedInt248Type ) { + + glInternalFormat = 35056; + + } else { + + glInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D + + } + + } else { + + if ( texture.type === FloatType ) { + + console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' ); + + } + + } + + // validation checks for WebGL 1 + + if ( texture.format === DepthFormat && glInternalFormat === 6402 ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + if ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) { + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + glInternalFormat = 34041; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + // + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( glFormat !== null ) { + + state.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture2DArray ) { + + state.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( textureType, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + function uploadCubeTexture( textureProperties, texture, slot ) { + + if ( texture.image.length !== 6 ) return; + + initTexture( textureProperties, texture ); + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__webglTexture ); + + _gl.pixelStorei( 37440, texture.flipY ); + _gl.pixelStorei( 37441, texture.premultiplyAlpha ); + _gl.pixelStorei( 3317, texture.unpackAlignment ); + _gl.pixelStorei( 37443, 0 ); + + const isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) ); + const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + const cubeImage = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + const image = cubeImage[ 0 ], + supportsMips = isPowerOfTwo$1( image ) || isWebGL2, + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding ); + + setTextureParameters( 34067, texture, supportsMips ); + + let mipmaps; + + if ( isCompressed ) { + + for ( let i = 0; i < 6; i ++ ) { + + mipmaps = cubeImage[ i ].mipmaps; + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( glFormat !== null ) { + + state.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + mipmaps = texture.mipmaps; + + for ( let i = 0; i < 6; i ++ ) { + + if ( isDataTexture ) { + + state.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + const mipmapImage = mipmap.image[ i ].image; + + state.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data ); + + } + + } else { + + state.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + state.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] ); + + } + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length; + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + // We assume images for cube map have the same size. + generateMipmap( 34067, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) { + + const glFormat = utils.convert( texture.format ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding ); + + if ( textureTarget === 32879 || textureTarget === 35866 ) { + + state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null ); + + } else { + + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + + } + + state.bindFramebuffer( 36160, framebuffer ); + _gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 ); + state.bindFramebuffer( 36160, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) { + + _gl.bindRenderbuffer( 36161, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + let glInternalFormat = 33189; + + if ( isMultisample ) { + + const depthTexture = renderTarget.depthTexture; + + if ( depthTexture && depthTexture.isDepthTexture ) { + + if ( depthTexture.type === FloatType ) { + + glInternalFormat = 36012; + + } else if ( depthTexture.type === UnsignedIntType ) { + + glInternalFormat = 33190; + + } + + } + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + _gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + if ( isMultisample ) { + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height ); + + } + + + _gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer ); + + } else { + + // Use the first texture for MRT so far + const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture; + + const glFormat = utils.convert( texture.format ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding ); + + if ( isMultisample ) { + + const samples = getRenderTargetSamples( renderTarget ); + + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + } + + _gl.bindRenderbuffer( 36161, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + const isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + state.bindFramebuffer( 36160, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + state.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false ); + + } + + } else { + + state.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false ); + + } + + } + + state.bindFramebuffer( 36160, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + const texture = renderTarget.texture; + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + if ( renderTarget.isWebGLMultipleRenderTargets !== true ) { + + textureProperties.__webglTexture = _gl.createTexture(); + textureProperties.__version = texture.version; + info.memory.textures ++; + + } + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true ); + const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true ); + const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray; + const supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2; + + // Handles WebGL2 RGBFormat fallback - #18858 + + if ( isWebGL2 && texture.format === RGBFormat && ( texture.type === FloatType || texture.type === HalfFloatType ) ) { + + texture.format = RGBAFormat; + + console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' ); + + } + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + if ( isMultipleRenderTargets ) { + + if ( capabilities.drawBuffers ) { + + const textures = renderTarget.texture; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( textures[ i ] ); + + if ( attachmentProperties.__webglTexture === undefined ) { + + attachmentProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' ); + + } + + } else if ( isMultisample ) { + + if ( isWebGL2 ) { + + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer(); + + _gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer ); + + const glFormat = utils.convert( texture.format ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding ); + const samples = getRenderTargetSamples( renderTarget ); + _gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + state.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer ); + _gl.bindRenderbuffer( 36161, null ); + + if ( renderTarget.depthBuffer ) { + + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true ); + + } + + state.bindFramebuffer( 36160, null ); + + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); + + } + + } + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( 34067, textureProperties.__webglTexture ); + setTextureParameters( 34067, texture, supportsMips ); + + for ( let i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, 36064, 34069 + i ); + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( 34067, texture, renderTarget.width, renderTarget.height ); + + } + + state.unbindTexture(); + + } else if ( isMultipleRenderTargets ) { + + const textures = renderTarget.texture; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachment = textures[ i ]; + const attachmentProperties = properties.get( attachment ); + + state.bindTexture( 3553, attachmentProperties.__webglTexture ); + setTextureParameters( 3553, attachment, supportsMips ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, 36064 + i, 3553 ); + + if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) { + + generateMipmap( 3553, attachment, renderTarget.width, renderTarget.height ); + + } + + } + + state.unbindTexture(); + + } else { + + let glTextureType = 3553; + + if ( isRenderTarget3D ) { + + // Render targets containing layers, i.e: Texture 3D and 2d arrays + + if ( isWebGL2 ) { + + const isTexture3D = texture.isDataTexture3D; + glTextureType = isTexture3D ? 32879 : 35866; + + } else { + + console.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' ); + + } + + } + + state.bindTexture( glTextureType, textureProperties.__webglTexture ); + setTextureParameters( glTextureType, texture, supportsMips ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, 36064, glTextureType ); + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( glTextureType, texture, renderTarget.width, renderTarget.height, renderTarget.depth ); + + } + + state.unbindTexture(); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + const supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2; + + const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ]; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const texture = textures[ i ]; + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + const target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553; + const webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.unbindTexture(); + + } + + } + + } + + function updateMultisampleRenderTarget( renderTarget ) { + + if ( renderTarget.isWebGLMultisampleRenderTarget ) { + + if ( isWebGL2 ) { + + const width = renderTarget.width; + const height = renderTarget.height; + let mask = 16384; + + if ( renderTarget.depthBuffer ) mask |= 256; + if ( renderTarget.stencilBuffer ) mask |= 1024; + + const renderTargetProperties = properties.get( renderTarget ); + + state.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer ); + state.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer ); + + _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 ); + + state.bindFramebuffer( 36008, null ); + state.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer ); + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); + + } + + } + + } + + function getRenderTargetSamples( renderTarget ) { + + return ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ? + Math.min( maxSamples, renderTarget.samples ) : 0; + + } + + function updateVideoTexture( texture ) { + + const frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures.get( texture ) !== frame ) { + + _videoTextures.set( texture, frame ); + texture.update(); + + } + + } + + // backwards compatibility + + let warnedTexture2D = false; + let warnedTextureCube = false; + + function safeSetTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( warnedTexture2D === false ) { + + console.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\'t use render targets as textures. Use their .texture property instead.' ); + warnedTexture2D = true; + + } + + texture = texture.texture; + + } + + setTexture2D( texture, slot ); + + } + + function safeSetTextureCube( texture, slot ) { + + if ( texture && texture.isWebGLCubeRenderTarget ) { + + if ( warnedTextureCube === false ) { + + console.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\'t use cube render targets as textures. Use their .texture property instead.' ); + warnedTextureCube = true; + + } + + texture = texture.texture; + + } + + + setTextureCube( texture, slot ); + + } + + // + + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + + this.safeSetTexture2D = safeSetTexture2D; + this.safeSetTextureCube = safeSetTextureCube; + +} + +function WebGLUtils( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function convert( p ) { + + let extension; + + if ( p === UnsignedByteType ) return 5121; + if ( p === UnsignedShort4444Type ) return 32819; + if ( p === UnsignedShort5551Type ) return 32820; + if ( p === UnsignedShort565Type ) return 33635; + + if ( p === ByteType ) return 5120; + if ( p === ShortType ) return 5122; + if ( p === UnsignedShortType ) return 5123; + if ( p === IntType ) return 5124; + if ( p === UnsignedIntType ) return 5125; + if ( p === FloatType ) return 5126; + + if ( p === HalfFloatType ) { + + if ( isWebGL2 ) return 5131; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) { + + return extension.HALF_FLOAT_OES; + + } else { + + return null; + + } + + } + + if ( p === AlphaFormat ) return 6406; + if ( p === RGBFormat ) return 6407; + if ( p === RGBAFormat ) return 6408; + if ( p === LuminanceFormat ) return 6409; + if ( p === LuminanceAlphaFormat ) return 6410; + if ( p === DepthFormat ) return 6402; + if ( p === DepthStencilFormat ) return 34041; + if ( p === RedFormat ) return 6403; + + // WebGL2 formats. + + if ( p === RedIntegerFormat ) return 36244; + if ( p === RGFormat ) return 33319; + if ( p === RGIntegerFormat ) return 33320; + if ( p === RGBIntegerFormat ) return 36248; + if ( p === RGBAIntegerFormat ) return 36249; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } else { + + return null; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) { + + return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } else { + + return null; + + } + + } + + if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc' ); + + if ( extension !== null ) { + + if ( p === RGB_ETC2_Format ) return extension.COMPRESSED_RGB8_ETC2; + if ( p === RGBA_ETC2_EAC_Format ) return extension.COMPRESSED_RGBA8_ETC2_EAC; + + } + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format || + p === SRGB8_ALPHA8_ASTC_4x4_Format || p === SRGB8_ALPHA8_ASTC_5x4_Format || p === SRGB8_ALPHA8_ASTC_5x5_Format || + p === SRGB8_ALPHA8_ASTC_6x5_Format || p === SRGB8_ALPHA8_ASTC_6x6_Format || p === SRGB8_ALPHA8_ASTC_8x5_Format || + p === SRGB8_ALPHA8_ASTC_8x6_Format || p === SRGB8_ALPHA8_ASTC_8x8_Format || p === SRGB8_ALPHA8_ASTC_10x5_Format || + p === SRGB8_ALPHA8_ASTC_10x6_Format || p === SRGB8_ALPHA8_ASTC_10x8_Format || p === SRGB8_ALPHA8_ASTC_10x10_Format || + p === SRGB8_ALPHA8_ASTC_12x10_Format || p === SRGB8_ALPHA8_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + // TODO Complete? + + return p; + + } else { + + return null; + + } + + } + + if ( p === RGBA_BPTC_Format ) { + + extension = extensions.get( 'EXT_texture_compression_bptc' ); + + if ( extension !== null ) { + + // TODO Complete? + + return p; + + } else { + + return null; + + } + + } + + if ( p === UnsignedInt248Type ) { + + if ( isWebGL2 ) return 34042; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) { + + return extension.UNSIGNED_INT_24_8_WEBGL; + + } else { + + return null; + + } + + } + + } + + return { convert: convert }; + +} + +class ArrayCamera extends PerspectiveCamera { + + constructor( array = [] ) { + + super(); + + this.cameras = array; + + } + +} + +ArrayCamera.prototype.isArrayCamera = true; + +class Group extends Object3D { + + constructor() { + + super(); + + this.type = 'Group'; + + } + +} + +Group.prototype.isGroup = true; + +const _moveEvent = { type: 'move' }; + +class WebXRController { + + constructor() { + + this._targetRay = null; + this._grip = null; + this._hand = null; + + } + + getHandSpace() { + + if ( this._hand === null ) { + + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + + this._hand.joints = {}; + this._hand.inputState = { pinching: false }; + + } + + return this._hand; + + } + + getTargetRaySpace() { + + if ( this._targetRay === null ) { + + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + this._targetRay.hasLinearVelocity = false; + this._targetRay.linearVelocity = new Vector3(); + this._targetRay.hasAngularVelocity = false; + this._targetRay.angularVelocity = new Vector3(); + + } + + return this._targetRay; + + } + + getGripSpace() { + + if ( this._grip === null ) { + + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + this._grip.hasLinearVelocity = false; + this._grip.linearVelocity = new Vector3(); + this._grip.hasAngularVelocity = false; + this._grip.angularVelocity = new Vector3(); + + } + + return this._grip; + + } + + dispatchEvent( event ) { + + if ( this._targetRay !== null ) { + + this._targetRay.dispatchEvent( event ); + + } + + if ( this._grip !== null ) { + + this._grip.dispatchEvent( event ); + + } + + if ( this._hand !== null ) { + + this._hand.dispatchEvent( event ); + + } + + return this; + + } + + disconnect( inputSource ) { + + this.dispatchEvent( { type: 'disconnected', data: inputSource } ); + + if ( this._targetRay !== null ) { + + this._targetRay.visible = false; + + } + + if ( this._grip !== null ) { + + this._grip.visible = false; + + } + + if ( this._hand !== null ) { + + this._hand.visible = false; + + } + + return this; + + } + + update( inputSource, frame, referenceSpace ) { + + let inputPose = null; + let gripPose = null; + let handPose = null; + + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + + if ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) { + + if ( targetRay !== null ) { + + inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace ); + + if ( inputPose !== null ) { + + targetRay.matrix.fromArray( inputPose.transform.matrix ); + targetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale ); + + if ( inputPose.linearVelocity ) { + + targetRay.hasLinearVelocity = true; + targetRay.linearVelocity.copy( inputPose.linearVelocity ); + + } else { + + targetRay.hasLinearVelocity = false; + + } + + if ( inputPose.angularVelocity ) { + + targetRay.hasAngularVelocity = true; + targetRay.angularVelocity.copy( inputPose.angularVelocity ); + + } else { + + targetRay.hasAngularVelocity = false; + + } + + this.dispatchEvent( _moveEvent ); + + } + + } + + if ( hand && inputSource.hand ) { + + handPose = true; + + for ( const inputjoint of inputSource.hand.values() ) { + + // Update the joints groups with the XRJoint poses + const jointPose = frame.getJointPose( inputjoint, referenceSpace ); + + if ( hand.joints[ inputjoint.jointName ] === undefined ) { + + // The transform of this joint will be updated with the joint pose on each frame + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + hand.joints[ inputjoint.jointName ] = joint; + // ?? + hand.add( joint ); + + } + + const joint = hand.joints[ inputjoint.jointName ]; + + if ( jointPose !== null ) { + + joint.matrix.fromArray( jointPose.transform.matrix ); + joint.matrix.decompose( joint.position, joint.rotation, joint.scale ); + joint.jointRadius = jointPose.radius; + + } + + joint.visible = jointPose !== null; + + } + + // Custom events + + // Check pinchz + const indexTip = hand.joints[ 'index-finger-tip' ]; + const thumbTip = hand.joints[ 'thumb-tip' ]; + const distance = indexTip.position.distanceTo( thumbTip.position ); + + const distanceToPinch = 0.02; + const threshold = 0.005; + + if ( hand.inputState.pinching && distance > distanceToPinch + threshold ) { + + hand.inputState.pinching = false; + this.dispatchEvent( { + type: 'pinchend', + handedness: inputSource.handedness, + target: this + } ); + + } else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) { + + hand.inputState.pinching = true; + this.dispatchEvent( { + type: 'pinchstart', + handedness: inputSource.handedness, + target: this + } ); + + } + + } else { + + if ( grip !== null && inputSource.gripSpace ) { + + gripPose = frame.getPose( inputSource.gripSpace, referenceSpace ); + + if ( gripPose !== null ) { + + grip.matrix.fromArray( gripPose.transform.matrix ); + grip.matrix.decompose( grip.position, grip.rotation, grip.scale ); + + if ( gripPose.linearVelocity ) { + + grip.hasLinearVelocity = true; + grip.linearVelocity.copy( gripPose.linearVelocity ); + + } else { + + grip.hasLinearVelocity = false; + + } + + if ( gripPose.angularVelocity ) { + + grip.hasAngularVelocity = true; + grip.angularVelocity.copy( gripPose.angularVelocity ); + + } else { + + grip.hasAngularVelocity = false; + + } + + } + + } + + } + + } + + if ( targetRay !== null ) { + + targetRay.visible = ( inputPose !== null ); + + } + + if ( grip !== null ) { + + grip.visible = ( gripPose !== null ); + + } + + if ( hand !== null ) { + + hand.visible = ( handPose !== null ); + + } + + return this; + + } + +} + +class WebXRManager extends EventDispatcher { + + constructor( renderer, gl ) { + + super(); + + const scope = this; + const state = renderer.state; + + let session = null; + let framebufferScaleFactor = 1.0; + + let referenceSpace = null; + let referenceSpaceType = 'local-floor'; + + let pose = null; + let glBinding = null; + let glFramebuffer = null; + let glProjLayer = null; + let glBaseLayer = null; + let isMultisample = false; + let glMultisampledFramebuffer = null; + let glColorRenderbuffer = null; + let glDepthRenderbuffer = null; + let xrFrame = null; + let depthStyle = null; + let clearStyle = null; + + const controllers = []; + const inputSourcesMap = new Map(); + + // + + const cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + const cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + const cameras = [ cameraL, cameraR ]; + + const cameraVR = new ArrayCamera(); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + let _currentDepthNear = null; + let _currentDepthFar = null; + + // + + this.cameraAutoUpdate = true; + this.enabled = false; + + this.isPresenting = false; + + this.getController = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getTargetRaySpace(); + + }; + + this.getControllerGrip = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getGripSpace(); + + }; + + this.getHand = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getHandSpace(); + + }; + + // + + function onSessionEvent( event ) { + + const controller = inputSourcesMap.get( event.inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: event.type, data: event.inputSource } ); + + } + + } + + function onSessionEnd() { + + inputSourcesMap.forEach( function ( controller, inputSource ) { + + controller.disconnect( inputSource ); + + } ); + + inputSourcesMap.clear(); + + _currentDepthNear = null; + _currentDepthFar = null; + + // restore framebuffer/rendering state + + state.bindXRFramebuffer( null ); + renderer.setRenderTarget( renderer.getRenderTarget() ); + + if ( glFramebuffer ) gl.deleteFramebuffer( glFramebuffer ); + if ( glMultisampledFramebuffer ) gl.deleteFramebuffer( glMultisampledFramebuffer ); + if ( glColorRenderbuffer ) gl.deleteRenderbuffer( glColorRenderbuffer ); + if ( glDepthRenderbuffer ) gl.deleteRenderbuffer( glDepthRenderbuffer ); + glFramebuffer = null; + glMultisampledFramebuffer = null; + glColorRenderbuffer = null; + glDepthRenderbuffer = null; + glBaseLayer = null; + glProjLayer = null; + glBinding = null; + session = null; + + // + + animation.stop(); + + scope.isPresenting = false; + + scope.dispatchEvent( { type: 'sessionend' } ); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' ); + + } + + }; + + this.setReferenceSpaceType = function ( value ) { + + referenceSpaceType = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' ); + + } + + }; + + this.getReferenceSpace = function () { + + return referenceSpace; + + }; + + this.getBaseLayer = function () { + + return glProjLayer !== null ? glProjLayer : glBaseLayer; + + }; + + this.getBinding = function () { + + return glBinding; + + }; + + this.getFrame = function () { + + return xrFrame; + + }; + + this.getSession = function () { + + return session; + + }; + + this.setSession = async function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'squeeze', onSessionEvent ); + session.addEventListener( 'squeezestart', onSessionEvent ); + session.addEventListener( 'squeezeend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + session.addEventListener( 'inputsourceschange', onInputSourcesChange ); + + const attributes = gl.getContextAttributes(); + + if ( attributes.xrCompatible !== true ) { + + await gl.makeXRCompatible(); + + } + + if ( session.renderState.layers === undefined ) { + + const layerInit = { + antialias: attributes.antialias, + alpha: attributes.alpha, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor: framebufferScaleFactor + }; + + glBaseLayer = new XRWebGLLayer( session, gl, layerInit ); + + session.updateRenderState( { baseLayer: glBaseLayer } ); + + } else if ( gl instanceof WebGLRenderingContext ) { + + // Use old style webgl layer because we can't use MSAA + // WebGL2 support. + + const layerInit = { + antialias: true, + alpha: attributes.alpha, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor: framebufferScaleFactor + }; + + glBaseLayer = new XRWebGLLayer( session, gl, layerInit ); + + session.updateRenderState( { layers: [ glBaseLayer ] } ); + + } else { + + isMultisample = attributes.antialias; + let depthFormat = null; + + + if ( attributes.depth ) { + + clearStyle = 256; + + if ( attributes.stencil ) clearStyle |= 1024; + + depthStyle = attributes.stencil ? 33306 : 36096; + depthFormat = attributes.stencil ? 35056 : 33190; + + } + + const projectionlayerInit = { + colorFormat: attributes.alpha ? 32856 : 32849, + depthFormat: depthFormat, + scaleFactor: framebufferScaleFactor + }; + + glBinding = new XRWebGLBinding( session, gl ); + + glProjLayer = glBinding.createProjectionLayer( projectionlayerInit ); + + glFramebuffer = gl.createFramebuffer(); + + session.updateRenderState( { layers: [ glProjLayer ] } ); + + if ( isMultisample ) { + + glMultisampledFramebuffer = gl.createFramebuffer(); + glColorRenderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer( 36161, glColorRenderbuffer ); + gl.renderbufferStorageMultisample( + 36161, + 4, + 32856, + glProjLayer.textureWidth, + glProjLayer.textureHeight ); + state.bindFramebuffer( 36160, glMultisampledFramebuffer ); + gl.framebufferRenderbuffer( 36160, 36064, 36161, glColorRenderbuffer ); + gl.bindRenderbuffer( 36161, null ); + + if ( depthFormat !== null ) { + + glDepthRenderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer( 36161, glDepthRenderbuffer ); + gl.renderbufferStorageMultisample( 36161, 4, depthFormat, glProjLayer.textureWidth, glProjLayer.textureHeight ); + gl.framebufferRenderbuffer( 36160, depthStyle, 36161, glDepthRenderbuffer ); + gl.bindRenderbuffer( 36161, null ); + + } + + state.bindFramebuffer( 36160, null ); + + } + + } + + referenceSpace = await session.requestReferenceSpace( referenceSpaceType ); + + animation.setContext( session ); + animation.start(); + + scope.isPresenting = true; + + scope.dispatchEvent( { type: 'sessionstart' } ); + + } + + }; + + function onInputSourcesChange( event ) { + + const inputSources = session.inputSources; + + // Assign inputSources to available controllers + + for ( let i = 0; i < controllers.length; i ++ ) { + + inputSourcesMap.set( inputSources[ i ], controllers[ i ] ); + + } + + // Notify disconnected + + for ( let i = 0; i < event.removed.length; i ++ ) { + + const inputSource = event.removed[ i ]; + const controller = inputSourcesMap.get( inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: 'disconnected', data: inputSource } ); + inputSourcesMap.delete( inputSource ); + + } + + } + + // Notify connected + + for ( let i = 0; i < event.added.length; i ++ ) { + + const inputSource = event.added[ i ]; + const controller = inputSourcesMap.get( inputSource ); + + if ( controller ) { + + controller.dispatchEvent( { type: 'connected', data: inputSource } ); + + } + + } + + } + + // + + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + const ipd = cameraLPos.distanceTo( cameraRPos ); + + const projL = cameraL.projectionMatrix.elements; + const projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + const near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + const far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + const left = near * leftFov; + const right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + const zOffset = ipd / ( - leftFov + rightFov ); + const xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + ( ipd - xOffset ); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + + } + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + } + + this.updateCamera = function ( camera ) { + + if ( session === null ) return; + + cameraVR.near = cameraR.near = cameraL.near = camera.near; + cameraVR.far = cameraR.far = cameraL.far = camera.far; + + if ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) { + + // Note that the new renderState won't apply until the next frame. See #18320 + + session.updateRenderState( { + depthNear: cameraVR.near, + depthFar: cameraVR.far + } ); + + _currentDepthNear = cameraVR.near; + _currentDepthFar = cameraVR.far; + + } + + const parent = camera.parent; + const cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( let i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + cameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale ); + + // update user camera and its children + + camera.position.copy( cameraVR.position ); + camera.quaternion.copy( cameraVR.quaternion ); + camera.scale.copy( cameraVR.scale ); + camera.matrix.copy( cameraVR.matrix ); + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + const children = camera.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + // update projection matrix for proper view frustum culling + + if ( cameras.length === 2 ) { + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + } else { + + // assume single camera setup (AR) + + cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + + } + + }; + + this.getCamera = function () { + + return cameraVR; + + }; + + this.getFoveation = function () { + + if ( glProjLayer !== null ) { + + return glProjLayer.fixedFoveation; + + } + + if ( glBaseLayer !== null ) { + + return glBaseLayer.fixedFoveation; + + } + + return undefined; + + }; + + this.setFoveation = function ( foveation ) { + + // 0 = no foveation = full resolution + // 1 = maximum foveation = the edges render at lower resolution + + if ( glProjLayer !== null ) { + + glProjLayer.fixedFoveation = foveation; + + } + + if ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) { + + glBaseLayer.fixedFoveation = foveation; + + } + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getViewerPose( referenceSpace ); + xrFrame = frame; + + if ( pose !== null ) { + + const views = pose.views; + + if ( glBaseLayer !== null ) { + + state.bindXRFramebuffer( glBaseLayer.framebuffer ); + + } + + let cameraVRNeedsUpdate = false; + + // check if it's necessary to rebuild cameraVR's camera list + + if ( views.length !== cameraVR.cameras.length ) { + + cameraVR.cameras.length = 0; + + cameraVRNeedsUpdate = true; + + } + + for ( let i = 0; i < views.length; i ++ ) { + + const view = views[ i ]; + + let viewport = null; + + if ( glBaseLayer !== null ) { + + viewport = glBaseLayer.getViewport( view ); + + } else { + + const glSubImage = glBinding.getViewSubImage( glProjLayer, view ); + + state.bindXRFramebuffer( glFramebuffer ); + + if ( glSubImage.depthStencilTexture !== undefined ) { + + gl.framebufferTexture2D( 36160, depthStyle, 3553, glSubImage.depthStencilTexture, 0 ); + + } + + gl.framebufferTexture2D( 36160, 36064, 3553, glSubImage.colorTexture, 0 ); + + viewport = glSubImage.viewport; + + } + + const camera = cameras[ i ]; + + camera.matrix.fromArray( view.transform.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + if ( cameraVRNeedsUpdate === true ) { + + cameraVR.cameras.push( camera ); + + } + + } + + if ( isMultisample ) { + + state.bindXRFramebuffer( glMultisampledFramebuffer ); + + if ( clearStyle !== null ) gl.clear( clearStyle ); + + } + + } + + // + + const inputSources = session.inputSources; + + for ( let i = 0; i < controllers.length; i ++ ) { + + const controller = controllers[ i ]; + const inputSource = inputSources[ i ]; + + controller.update( inputSource, frame, referenceSpace ); + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame ); + + if ( isMultisample ) { + + const width = glProjLayer.textureWidth; + const height = glProjLayer.textureHeight; + + state.bindFramebuffer( 36008, glMultisampledFramebuffer ); + state.bindFramebuffer( 36009, glFramebuffer ); + // Invalidate the depth here to avoid flush of the depth data to main memory. + gl.invalidateFramebuffer( 36008, [ depthStyle ] ); + gl.invalidateFramebuffer( 36009, [ depthStyle ] ); + gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, 16384, 9728 ); + // Invalidate the MSAA buffer because it's not needed anymore. + gl.invalidateFramebuffer( 36008, [ 36064 ] ); + state.bindFramebuffer( 36008, null ); + state.bindFramebuffer( 36009, null ); + + state.bindFramebuffer( 36160, glMultisampledFramebuffer ); + + } + + xrFrame = null; + + } + + const animation = new WebGLAnimation(); + + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + } + +} + +function WebGLMaterials( properties ) { + + function refreshFogUniforms( uniforms, fog ) { + + uniforms.fogColor.value.copy( fog.color ); + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) { + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsLambert( uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsToon( uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsPhong( uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ); + + } else { + + refreshUniformsStandard( uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsMatcap( uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDepth( uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDistance( uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsNormal( uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( uniforms, material, pixelRatio, height ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + uniforms.color.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } else if ( material.isShaderMaterial ) { + + material.uniformsNeedUpdate = false; // #15581 + + } + + } + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value.copy( material.color ); + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + uniforms.envMap.value = envMap; + + uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.ior.value = material.ior; + uniforms.refractionRatio.value = material.refractionRatio; + + const maxMipLevel = properties.get( envMap ).__maxMipLevel; + + if ( maxMipLevel !== undefined ) { + + uniforms.maxMipLevel.value = maxMipLevel; + + } + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. displacementMap map + // 4. normal map + // 5. bump map + // 6. roughnessMap map + // 7. metalnessMap map + // 8. alphaMap map + // 9. emissiveMap map + // 10. clearcoat map + // 11. clearcoat normal map + // 12. clearcoat roughnessMap map + // 13. specular intensity map + // 14. specular tint map + // 15. transmission map + // 16. thickness map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } else if ( material.clearcoatMap ) { + + uvScaleMap = material.clearcoatMap; + + } else if ( material.clearcoatNormalMap ) { + + uvScaleMap = material.clearcoatNormalMap; + + } else if ( material.clearcoatRoughnessMap ) { + + uvScaleMap = material.clearcoatRoughnessMap; + + } else if ( material.specularIntensityMap ) { + + uvScaleMap = material.specularIntensityMap; + + } else if ( material.specularColorMap ) { + + uvScaleMap = material.specularColorMap; + + } else if ( material.transmissionMap ) { + + uvScaleMap = material.transmissionMap; + + } else if ( material.thicknessMap ) { + + uvScaleMap = material.thicknessMap; + + } else if ( material.sheenColorMap ) { + + uvScaleMap = material.sheenColorMap; + + } else if ( material.sheenRoughnessMap ) { + + uvScaleMap = material.sheenRoughnessMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + // uv repeat and offset setting priorities for uv2 + // 1. ao map + // 2. light map + + let uv2ScaleMap; + + if ( material.aoMap ) { + + uv2ScaleMap = material.aoMap; + + } else if ( material.lightMap ) { + + uv2ScaleMap = material.lightMap; + + } + + if ( uv2ScaleMap !== undefined ) { + + // backwards compatibility + if ( uv2ScaleMap.isWebGLRenderTarget ) { + + uv2ScaleMap = uv2ScaleMap.texture; + + } + + if ( uv2ScaleMap.matrixAutoUpdate === true ) { + + uv2ScaleMap.updateMatrix(); + + } + + uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material, pixelRatio, height ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. alpha map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. alpha map + + let uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value.copy( material.specular ); + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.ior.value = material.ior; // also part of uniforms common + + if ( material.sheen > 0 ) { + + uniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen ); + + uniforms.sheenRoughness.value = material.sheenRoughness; + + if ( material.sheenColorMap ) { + + uniforms.sheenColorMap.value = material.sheenColorMap; + + } + + if ( material.sheenRoughnessMap ) { + + uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; + + } + + } + + if ( material.clearcoat > 0 ) { + + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + + if ( material.clearcoatMap ) { + + uniforms.clearcoatMap.value = material.clearcoatMap; + + } + + if ( material.clearcoatRoughnessMap ) { + + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + + } + + if ( material.clearcoatNormalMap ) { + + uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale ); + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + + if ( material.side === BackSide ) { + + uniforms.clearcoatNormalScale.value.negate(); + + } + + } + + } + + if ( material.transmission > 0 ) { + + uniforms.transmission.value = material.transmission; + uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; + uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height ); + + if ( material.transmissionMap ) { + + uniforms.transmissionMap.value = material.transmissionMap; + + } + + uniforms.thickness.value = material.thickness; + + if ( material.thicknessMap ) { + + uniforms.thicknessMap.value = material.thicknessMap; + + } + + uniforms.attenuationDistance.value = material.attenuationDistance; + uniforms.attenuationColor.value.copy( material.attenuationColor ); + + } + + uniforms.specularIntensity.value = material.specularIntensity; + uniforms.specularColor.value.copy( material.specularColor ); + + if ( material.specularIntensityMap ) { + + uniforms.specularIntensityMap.value = material.specularIntensityMap; + + } + + if ( material.specularColorMap ) { + + uniforms.specularColorMap.value = material.specularColorMap; + + } + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + return { + refreshFogUniforms: refreshFogUniforms, + refreshMaterialUniforms: refreshMaterialUniforms + }; + +} + +function createCanvasElement() { + + const canvas = createElementNS( 'canvas' ); + canvas.style.display = 'block'; + return canvas; + +} + +function WebGLRenderer( parameters = {} ) { + + const _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default', + _failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false; + + let currentRenderList = null; + let currentRenderState = null; + + // render() can be called from within a callback triggered by another render. + // We track this so that the nested render call gets its list and state isolated from the parent render call. + + const renderListStack = []; + const renderStateStack = []; + + // public properties + + this.domElement = _canvas; + + // Debug configuration container + this.debug = { + + /** + * Enables error checking and reporting when shader programs are being compiled + * @type {boolean} + */ + checkShaderErrors: true + }; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.outputEncoding = LinearEncoding; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1.0; + + // internal properties + + const _this = this; + + let _isContextLost = false; + + // internal state cache + + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentMaterialId = - 1; + + let _currentCamera = null; + + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + + // + + let _width = _canvas.width; + let _height = _canvas.height; + + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + + const _viewport = new Vector4( 0, 0, _width, _height ); + const _scissor = new Vector4( 0, 0, _width, _height ); + let _scissorTest = false; + + // + + const _currentDrawBuffers = []; + + // frustum + + const _frustum = new Frustum(); + + // clipping + + let _clippingEnabled = false; + let _localClippingEnabled = false; + + // transmission + + let _transmissionRenderTarget = null; + + // camera matrices cache + + const _projScreenMatrix = new Matrix4(); + + const _vector3 = new Vector3(); + + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + let _gl = _context; + + function getContext( contextNames, contextAttributes ) { + + for ( let i = 0; i < contextNames.length; i ++ ) { + + const contextName = contextNames[ i ]; + const context = _canvas.getContext( contextName, contextAttributes ); + if ( context !== null ) return context; + + } + + return null; + + } + + try { + + const contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference, + failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + if ( _gl === null ) { + + const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ]; + + if ( _this.isWebGL1Renderer === true ) { + + contextNames.shift(); + + } + + _gl = getContext( contextNames, contextAttributes ); + + if ( _gl === null ) { + + if ( getContext( contextNames ) ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + throw error; + + } + + let extensions, capabilities, state, info; + let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping, shadowMap; + + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + + let utils, bindingStates; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + extensions.init( capabilities ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, capabilities ); + + _currentDrawBuffers[ 0 ] = 1029; + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + cubemaps = new WebGLCubeMaps( _this ); + cubeuvmaps = new WebGLCubeUVMaps( _this ); + attributes = new WebGLAttributes( _gl, capabilities ); + bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities ); + geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); + objects = new WebGLObjects( _gl, geometries, attributes, info ); + morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); + clipping = new WebGLClipping( properties ); + programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + materials = new WebGLMaterials( properties ); + renderLists = new WebGLRenderLists( properties ); + renderStates = new WebGLRenderStates( extensions, capabilities ); + background = new WebGLBackground( _this, cubemaps, state, objects, _premultipliedAlpha ); + shadowMap = new WebGLShadowMap( _this, objects, capabilities ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.shadowMap = shadowMap; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // xr + + const xr = new WebXRManager( _this, _gl ); + + this.xr = xr; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function ( target ) { + + return target.set( _width, _height ); + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( xr.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = Math.floor( width * _pixelRatio ); + _canvas.height = Math.floor( height * _pixelRatio ); + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function ( target ) { + + return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor(); + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = Math.floor( width * pixelRatio ); + _canvas.height = Math.floor( height * pixelRatio ); + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function ( target ) { + + return target.copy( _currentViewport ); + + }; + + this.getViewport = function ( target ) { + + return target.copy( _viewport ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _viewport.set( x.x, x.y, x.z, x.w ); + + } else { + + _viewport.set( x, y, width, height ); + + } + + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissor = function ( target ) { + + return target.copy( _scissor ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _scissor.set( x.x, x.y, x.z, x.w ); + + } else { + + _scissor.set( x, y, width, height ); + + } + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissorTest = function () { + + return _scissorTest; + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + this.setOpaqueSort = function ( method ) { + + _opaqueSort = method; + + }; + + this.setTransparentSort = function ( method ) { + + _transparentSort = method; + + }; + + // Clearing + + this.getClearColor = function ( target ) { + + return target.copy( background.getClearColor() ); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + let bits = 0; + + if ( color === undefined || color ) bits |= 16384; + if ( depth === undefined || depth ) bits |= 256; + if ( stencil === undefined || stencil ) bits |= 1024; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + cubeuvmaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + + xr.dispose(); + + xr.removeEventListener( 'sessionstart', onXRSessionStart ); + xr.removeEventListener( 'sessionend', onXRSessionEnd ); + + if ( _transmissionRenderTarget ) { + + _transmissionRenderTarget.dispose(); + _transmissionRenderTarget = null; + + } + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + const infoAutoReset = info.autoReset; + const shadowMapEnabled = shadowMap.enabled; + const shadowMapAutoUpdate = shadowMap.autoUpdate; + const shadowMapNeedsUpdate = shadowMap.needsUpdate; + const shadowMapType = shadowMap.type; + + initGLContext(); + + info.autoReset = infoAutoReset; + shadowMap.enabled = shadowMapEnabled; + shadowMap.autoUpdate = shadowMapAutoUpdate; + shadowMap.needsUpdate = shadowMapNeedsUpdate; + shadowMap.type = shadowMapType; + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReferences( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReferences( material ) { + + const programs = properties.get( material ).programs; + + if ( programs !== undefined ) { + + programs.forEach( function ( program ) { + + programCache.releaseProgram( program ); + + } ); + + } + + } + + // Buffer rendering + + this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) { + + if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null) + + const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + const program = setProgram( camera, scene, geometry, material, object ); + + state.setMaterial( material, frontFaceCW ); + + // + + let index = geometry.index; + const position = geometry.attributes.position; + + // + + if ( index === null ) { + + if ( position === undefined || position.count === 0 ) return; + + } else if ( index.count === 0 ) { + + return; + + } + + // + + let rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + bindingStates.setup( object, material, program, geometry, index ); + + let attribute; + let renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + // + + const dataCount = ( index !== null ) ? index.count : position.count; + + const rangeStart = geometry.drawRange.start * rangeFactor; + const rangeCount = geometry.drawRange.count * rangeFactor; + + const groupStart = group !== null ? group.start * rangeFactor : 0; + const groupCount = group !== null ? group.count * rangeFactor : Infinity; + + const drawStart = Math.max( rangeStart, groupStart ); + const drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + const drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( 1 ); + + } else { + + renderer.setMode( 4 ); + + } + + } else if ( object.isLine ) { + + let lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( 1 ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( 2 ); + + } else { + + renderer.setMode( 3 ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( 0 ); + + } else if ( object.isSprite ) { + + renderer.setMode( 4 ); + + } + + if ( object.isInstancedMesh ) { + + renderer.renderInstances( drawStart, drawCount, object.count ); + + } else if ( geometry.isInstancedBufferGeometry ) { + + const instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount ); + + renderer.renderInstances( drawStart, drawCount, instanceCount ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene ); + currentRenderState.init(); + + renderStateStack.push( currentRenderState ); + + scene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( _this.physicallyCorrectLights ); + + scene.traverse( function ( object ) { + + const material = object.material; + + if ( material ) { + + if ( Array.isArray( material ) ) { + + for ( let i = 0; i < material.length; i ++ ) { + + const material2 = material[ i ]; + + getProgram( material2, scene, object ); + + } + + } else { + + getProgram( material, scene, object ); + + } + + } + + } ); + + renderStateStack.pop(); + currentRenderState = null; + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + function onXRSessionStart() { + + animation.stop(); + + } + + function onXRSessionEnd() { + + animation.start(); + + } + + const animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + xr.setAnimationLoop( callback ); + + ( callback === null ) ? animation.stop() : animation.start(); + + }; + + xr.addEventListener( 'sessionstart', onXRSessionStart ); + xr.addEventListener( 'sessionend', onXRSessionEnd ); + + // Rendering + + this.render = function ( scene, camera ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost === true ) return; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( xr.enabled === true && xr.isPresenting === true ) { + + if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); + + camera = xr.getCamera(); // use XR camera for rendering + + } + + // + if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget ); + + currentRenderState = renderStates.get( scene, renderStateStack.length ); + currentRenderState.init(); + + renderStateStack.push( currentRenderState ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromProjectionMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, renderListStack.length ); + currentRenderList.init(); + + renderListStack.push( currentRenderList ); + + projectObject( scene, camera, 0, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort( _opaqueSort, _transparentSort ); + + } + + // + + if ( _clippingEnabled === true ) clipping.beginShadows(); + + const shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + if ( _clippingEnabled === true ) clipping.endShadows(); + + // + + if ( this.info.autoReset === true ) this.info.reset(); + + // + + background.render( currentRenderList, scene ); + + // render scene + + currentRenderState.setupLights( _this.physicallyCorrectLights ); + + if ( camera.isArrayCamera ) { + + const cameras = camera.cameras; + + for ( let i = 0, l = cameras.length; i < l; i ++ ) { + + const camera2 = cameras[ i ]; + + renderScene( currentRenderList, scene, camera2, camera2.viewport ); + + } + + } else { + + renderScene( currentRenderList, scene, camera ); + + } + + // + + if ( _currentRenderTarget !== null ) { + + // resolve multisample renderbuffers to a single-sample texture if necessary + + textures.updateMultisampleRenderTarget( _currentRenderTarget ); + + // Generate mipmap if we're using any kind of mipmap filtering + + textures.updateRenderTargetMipmap( _currentRenderTarget ); + + } + + // + + if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera ); + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + // _gl.finish(); + + bindingStates.resetDefaultState(); + _currentMaterialId = - 1; + _currentCamera = null; + + renderStateStack.pop(); + + if ( renderStateStack.length > 0 ) { + + currentRenderState = renderStateStack[ renderStateStack.length - 1 ]; + + } else { + + currentRenderState = null; + + } + + renderListStack.pop(); + + if ( renderListStack.length > 0 ) { + + currentRenderList = renderListStack[ renderListStack.length - 1 ]; + + } else { + + currentRenderList = null; + + } + + }; + + function projectObject( object, camera, groupOrder, sortObjects ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isGroup ) { + + groupOrder = object.renderOrder; + + } else if ( object.isLOD ) { + + if ( object.autoUpdate === true ) object.update( camera ); + + } else if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + // update skeleton only once in a frame + + if ( object.skeleton.frame !== info.render.frame ) { + + object.skeleton.update(); + object.skeleton.frame = info.render.frame; + + } + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, groupOrder, sortObjects ); + + } + + } + + function renderScene( currentRenderList, scene, camera, viewport ) { + + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + const transparentObjects = currentRenderList.transparent; + + currentRenderState.setupLightsView( camera ); + + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera ); + + if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); + + if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera ); + if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera ); + + } + + function renderTransmissionPass( opaqueObjects, scene, camera ) { + + if ( _transmissionRenderTarget === null ) { + + const needsAntialias = _antialias === true && capabilities.isWebGL2 === true; + const renderTargetType = needsAntialias ? WebGLMultisampleRenderTarget : WebGLRenderTarget; + + _transmissionRenderTarget = new renderTargetType( 1024, 1024, { + generateMipmaps: true, + type: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType, + minFilter: LinearMipmapLinearFilter, + magFilter: NearestFilter, + wrapS: ClampToEdgeWrapping, + wrapT: ClampToEdgeWrapping + } ); + + } + + const currentRenderTarget = _this.getRenderTarget(); + _this.setRenderTarget( _transmissionRenderTarget ); + _this.clear(); + + // Turn off the features which can affect the frag color for opaque objects pass. + // Otherwise they are applied twice in opaque objects pass and transmission objects pass. + const currentToneMapping = _this.toneMapping; + _this.toneMapping = NoToneMapping; + + renderObjects( opaqueObjects, scene, camera ); + + _this.toneMapping = currentToneMapping; + + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); + textures.updateRenderTargetMipmap( _transmissionRenderTarget ); + + _this.setRenderTarget( currentRenderTarget ); + + } + + function renderObjects( renderList, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + for ( let i = 0, l = renderList.length; i < l; i ++ ) { + + const renderItem = renderList[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = overrideMaterial === null ? renderItem.material : overrideMaterial; + const group = renderItem.group; + + if ( object.layers.test( camera.layers ) ) { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + material.onBeforeRender( _this, scene, camera, geometry, object, group ); + + if ( material.transparent === true && material.side === DoubleSide ) { + + material.side = BackSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = FrontSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = DoubleSide; + + } else { + + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + function getProgram( material, scene, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + const materialProperties = properties.get( material ); + + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + + const lightsStateVersion = lights.state.version; + + const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object ); + const programCacheKey = programCache.getProgramCacheKey( parameters ); + + let programs = materialProperties.programs; + + // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change + + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + + if ( programs === undefined ) { + + // new material + + material.addEventListener( 'dispose', onMaterialDispose ); + + programs = new Map(); + materialProperties.programs = programs; + + } + + let program = programs.get( programCacheKey ); + + if ( program !== undefined ) { + + // early out if program and light state is identical + + if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) { + + updateCommonMaterialProperties( material, parameters ); + + return program; + + } + + } else { + + parameters.uniforms = programCache.getUniforms( material ); + + material.onBuild( object, parameters, _this ); + + material.onBeforeCompile( parameters, _this ); + + program = programCache.acquireProgram( parameters, programCacheKey ); + programs.set( programCacheKey, program ); + + materialProperties.uniforms = parameters.uniforms; + + } + + const uniforms = materialProperties.uniforms; + + if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) { + + uniforms.clippingPlanes = clipping.uniform; + + } + + updateCommonMaterialProperties( material, parameters ); + + // store the light setup it was created for + + materialProperties.needsLights = materialNeedsLights( material ); + materialProperties.lightsStateVersion = lightsStateVersion; + + if ( materialProperties.needsLights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + const progUniforms = program.getUniforms(); + const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.currentProgram = program; + materialProperties.uniformsList = uniformsList; + + return program; + + } + + function updateCommonMaterialProperties( material, parameters ) { + + const materialProperties = properties.get( material ); + + materialProperties.outputEncoding = parameters.outputEncoding; + materialProperties.instancing = parameters.instancing; + materialProperties.skinning = parameters.skinning; + materialProperties.morphTargets = parameters.morphTargets; + materialProperties.morphNormals = parameters.morphNormals; + materialProperties.morphTargetsCount = parameters.morphTargetsCount; + materialProperties.numClippingPlanes = parameters.numClippingPlanes; + materialProperties.numIntersection = parameters.numClipIntersection; + materialProperties.vertexAlphas = parameters.vertexAlphas; + materialProperties.vertexTangents = parameters.vertexTangents; + + } + + function setProgram( camera, scene, geometry, material, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + textures.resetTextureUnits(); + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : _currentRenderTarget.texture.encoding; + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; + const vertexTangents = !! material.normalMap && !! geometry.attributes.tangent; + const morphTargets = !! geometry.morphAttributes.position; + const morphNormals = !! geometry.morphAttributes.normal; + const morphTargetsCount = !! geometry.morphAttributes.position ? geometry.morphAttributes.position.length : 0; + + const materialProperties = properties.get( material ); + const lights = currentRenderState.state.lights; + + if ( _clippingEnabled === true ) { + + if ( _localClippingEnabled === true || camera !== _currentCamera ) { + + const useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + clipping.setState( material, camera, useCache ); + + } + + } + + // + + let needsProgramChange = false; + + if ( material.version === materialProperties.__version ) { + + if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.outputEncoding !== encoding ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancing === false ) { + + needsProgramChange = true; + + } else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) { + + needsProgramChange = true; + + } else if ( object.isSkinnedMesh && materialProperties.skinning === false ) { + + needsProgramChange = true; + + } else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) { + + needsProgramChange = true; + + } else if ( materialProperties.envMap !== envMap ) { + + needsProgramChange = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + needsProgramChange = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== clipping.numPlanes || + materialProperties.numIntersection !== clipping.numIntersection ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexAlphas !== vertexAlphas ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexTangents !== vertexTangents ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphTargets !== morphTargets ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphNormals !== morphNormals ) { + + needsProgramChange = true; + + } else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) { + + needsProgramChange = true; + + } + + } else { + + needsProgramChange = true; + materialProperties.__version = material.version; + + } + + // + + let program = materialProperties.currentProgram; + + if ( needsProgramChange === true ) { + + program = getProgram( material, scene, object ); + + } + + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + + const p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + const uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial ) { + + p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true ); + + } + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.isShadowMaterial || + object.isSkinnedMesh ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning and morph target uniforms must be set even if material didn't change + // auto-setting of texture unit for bone and morph texture must go before other textures + // otherwise textures used for skinning and morphing can take over texture units reserved for other material textures + + if ( object.isSkinnedMesh ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + const skeleton = object.skeleton; + + if ( skeleton ) { + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture(); + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( !! geometry && ( geometry.morphAttributes.position !== undefined || geometry.morphAttributes.normal !== undefined ) ) { + + morphtargets.update( object, geometry, material, program ); + + } + + + if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) { + + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow ); + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + + if ( materialProperties.needsLights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + materials.refreshFogUniforms( m_uniforms, fog ); + + } + + materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget ); + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + function materialNeedsLights( material ) { + + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || + material.isMeshStandardMaterial || material.isShadowMaterial || + ( material.isShaderMaterial && material.lights === true ); + + } + + this.getActiveCubeFace = function () { + + return _currentActiveCubeFace; + + }; + + this.getActiveMipmapLevel = function () { + + return _currentActiveMipmapLevel; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) { + + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + let framebuffer = null; + let isCube = false; + let isRenderTarget3D = false; + + if ( renderTarget ) { + + const texture = renderTarget.texture; + + if ( texture.isDataTexture3D || texture.isDataTexture2DArray ) { + + isRenderTarget3D = true; + + } + + const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + framebuffer = __webglFramebuffer[ activeCubeFace ]; + isCube = true; + + } else if ( renderTarget.isWebGLMultisampleRenderTarget ) { + + framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor(); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor(); + _currentScissorTest = _scissorTest; + + } + + const framebufferBound = state.bindFramebuffer( 36160, framebuffer ); + + if ( framebufferBound && capabilities.drawBuffers ) { + + let needsUpdate = false; + + if ( renderTarget ) { + + if ( renderTarget.isWebGLMultipleRenderTargets ) { + + const textures = renderTarget.texture; + + if ( _currentDrawBuffers.length !== textures.length || _currentDrawBuffers[ 0 ] !== 36064 ) { + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + _currentDrawBuffers[ i ] = 36064 + i; + + } + + _currentDrawBuffers.length = textures.length; + + needsUpdate = true; + + } + + } else { + + if ( _currentDrawBuffers.length !== 1 || _currentDrawBuffers[ 0 ] !== 36064 ) { + + _currentDrawBuffers[ 0 ] = 36064; + _currentDrawBuffers.length = 1; + + needsUpdate = true; + + } + + } + + } else { + + if ( _currentDrawBuffers.length !== 1 || _currentDrawBuffers[ 0 ] !== 1029 ) { + + _currentDrawBuffers[ 0 ] = 1029; + _currentDrawBuffers.length = 1; + + needsUpdate = true; + + } + + } + + if ( needsUpdate ) { + + if ( capabilities.isWebGL2 ) { + + _gl.drawBuffers( _currentDrawBuffers ); + + } else { + + extensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( _currentDrawBuffers ); + + } + + } + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + const textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel ); + + } else if ( isRenderTarget3D ) { + + const textureProperties = properties.get( renderTarget.texture ); + const layer = activeCubeFace || 0; + _gl.framebufferTextureLayer( 36160, 36064, textureProperties.__webglTexture, activeMipmapLevel || 0, layer ); + + } + + _currentMaterialId = - 1; // reset current material to ensure correct uniform bindings + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + let framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) { + + framebuffer = framebuffer[ activeCubeFaceIndex ]; + + } + + if ( framebuffer ) { + + state.bindFramebuffer( 36160, framebuffer ); + + try { + + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) ); + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! halfFloatSupportedByExt ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + // restore framebuffer of current render target if necessary + + const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null; + state.bindFramebuffer( 36160, framebuffer ); + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level = 0 ) { + + const levelScale = Math.pow( 2, - level ); + const width = Math.floor( texture.image.width * levelScale ); + const height = Math.floor( texture.image.height * levelScale ); + + let glFormat = utils.convert( texture.format ); + + if ( capabilities.isWebGL2 ) { + + // Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1120100 + // Not needed in Chrome 93+ + + if ( glFormat === 6407 ) glFormat = 32849; + if ( glFormat === 6408 ) glFormat = 32856; + + } + + textures.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( 3553, level, glFormat, position.x, position.y, width, height, 0 ); + + state.unbindTexture(); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) { + + const width = srcTexture.image.width; + const height = srcTexture.image.height; + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + + textures.setTexture2D( dstTexture, 0 ); + + // As another texture upload may have changed pixelStorei + // parameters, make sure they are correct for the dstTexture + _gl.pixelStorei( 37440, dstTexture.flipY ); + _gl.pixelStorei( 37441, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( 3317, dstTexture.unpackAlignment ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + if ( srcTexture.isCompressedTexture ) { + + _gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data ); + + } else { + + _gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + } + + // Generate mipmaps only when copying level 0 + if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 ); + + state.unbindTexture(); + + }; + + this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) { + + if ( _this.isWebGL1Renderer ) { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' ); + return; + + } + + const width = sourceBox.max.x - sourceBox.min.x + 1; + const height = sourceBox.max.y - sourceBox.min.y + 1; + const depth = sourceBox.max.z - sourceBox.min.z + 1; + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + let glTarget; + + if ( dstTexture.isDataTexture3D ) { + + textures.setTexture3D( dstTexture, 0 ); + glTarget = 32879; + + } else if ( dstTexture.isDataTexture2DArray ) { + + textures.setTexture2DArray( dstTexture, 0 ); + glTarget = 35866; + + } else { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' ); + return; + + } + + _gl.pixelStorei( 37440, dstTexture.flipY ); + _gl.pixelStorei( 37441, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( 3317, dstTexture.unpackAlignment ); + + const unpackRowLen = _gl.getParameter( 3314 ); + const unpackImageHeight = _gl.getParameter( 32878 ); + const unpackSkipPixels = _gl.getParameter( 3316 ); + const unpackSkipRows = _gl.getParameter( 3315 ); + const unpackSkipImages = _gl.getParameter( 32877 ); + + const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image; + + _gl.pixelStorei( 3314, image.width ); + _gl.pixelStorei( 32878, image.height ); + _gl.pixelStorei( 3316, sourceBox.min.x ); + _gl.pixelStorei( 3315, sourceBox.min.y ); + _gl.pixelStorei( 32877, sourceBox.min.z ); + + if ( srcTexture.isDataTexture || srcTexture.isDataTexture3D ) { + + _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data ); + + } else { + + if ( srcTexture.isCompressedTexture ) { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' ); + _gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data ); + + } else { + + _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image ); + + } + + } + + _gl.pixelStorei( 3314, unpackRowLen ); + _gl.pixelStorei( 32878, unpackImageHeight ); + _gl.pixelStorei( 3316, unpackSkipPixels ); + _gl.pixelStorei( 3315, unpackSkipRows ); + _gl.pixelStorei( 32877, unpackSkipImages ); + + // Generate mipmaps only when copying level 0 + if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget ); + + state.unbindTexture(); + + }; + + this.initTexture = function ( texture ) { + + textures.setTexture2D( texture, 0 ); + + state.unbindTexture(); + + }; + + this.resetState = function () { + + _currentActiveCubeFace = 0; + _currentActiveMipmapLevel = 0; + _currentRenderTarget = null; + + state.reset(); + bindingStates.reset(); + + }; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef + + } + +} + +WebGLRenderer.prototype.isWebGLRenderer = true; + +class WebGL1Renderer extends WebGLRenderer {} + +WebGL1Renderer.prototype.isWebGL1Renderer = true; + +class FogExp2 { + + constructor( color, density = 0.00025 ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = density; + + } + + clone() { + + return new FogExp2( this.color, this.density ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + } + +} + +FogExp2.prototype.isFogExp2 = true; + +class Fog { + + constructor( color, near = 1, far = 1000 ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = near; + this.far = far; + + } + + clone() { + + return new Fog( this.color, this.near, this.far ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + } + +} + +Fog.prototype.isFog = true; + +class Scene extends Object3D { + + constructor() { + + super(); + + this.type = 'Scene'; + + this.background = null; + this.environment = null; + this.fog = null; + + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.environment !== null ) this.environment = source.environment.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + +} + +Scene.prototype.isScene = true; + +class InterleavedBuffer { + + constructor( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.usage = StaticDrawUsage; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + this.uuid = generateUUID(); + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + copy( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( let i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + set( value, offset = 0 ) { + + this.array.set( value, offset ); + + return this; + + } + + clone( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer; + + } + + const array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] ); + + const ib = new this.constructor( array, this.stride ); + ib.setUsage( this.usage ); + + return ib; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + toJSON( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + // generate UUID for array buffer if necessary + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) ); + + } + + // + + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + + } + +} + +InterleavedBuffer.prototype.isInterleavedBuffer = true; + +const _vector$6 = /*@__PURE__*/ new Vector3(); + +class InterleavedBufferAttribute { + + constructor( interleavedBuffer, itemSize, offset, normalized = false ) { + + this.name = ''; + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + get count() { + + return this.data.count; + + } + + get array() { + + return this.data.array; + + } + + set needsUpdate( value ) { + + this.data.needsUpdate = value; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.data.count; i < l; i ++ ) { + + _vector$6.x = this.getX( i ); + _vector$6.y = this.getY( i ); + _vector$6.z = this.getZ( i ); + + _vector$6.applyMatrix4( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$6.x = this.getX( i ); + _vector$6.y = this.getY( i ); + _vector$6.z = this.getZ( i ); + + _vector$6.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$6.x = this.getX( i ); + _vector$6.y = this.getY( i ); + _vector$6.z = this.getZ( i ); + + _vector$6.transformDirection( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + setX( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + } + + setY( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + } + + setZ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + } + + setW( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + } + + getX( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + } + + getY( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + } + + getZ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + } + + getW( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + } + + setXY( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + clone( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + return new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized ); + + } else { + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.clone( data ); + + } + + return new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized ); + + } + + } + + toJSON( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + // deinterleave data and save it as an ordinary buffer attribute for now + + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: array, + normalized: this.normalized + }; + + } else { + + // save as true interlaved attribtue + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data ); + + } + + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; + + } + + } + +} + +InterleavedBufferAttribute.prototype.isInterleavedBufferAttribute = true; + +/** + * parameters = { + * color: , + * map: new THREE.Texture( ), + * alphaMap: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + +class SpriteMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.transparent = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + } + +} + +SpriteMaterial.prototype.isSpriteMaterial = true; + +let _geometry; + +const _intersectPoint = /*@__PURE__*/ new Vector3(); +const _worldScale = /*@__PURE__*/ new Vector3(); +const _mvPosition = /*@__PURE__*/ new Vector3(); + +const _alignedPosition = /*@__PURE__*/ new Vector2(); +const _rotatedPosition = /*@__PURE__*/ new Vector2(); +const _viewWorldMatrix = /*@__PURE__*/ new Matrix4(); + +const _vA = /*@__PURE__*/ new Vector3(); +const _vB = /*@__PURE__*/ new Vector3(); +const _vC = /*@__PURE__*/ new Vector3(); + +const _uvA = /*@__PURE__*/ new Vector2(); +const _uvB = /*@__PURE__*/ new Vector2(); +const _uvC = /*@__PURE__*/ new Vector2(); + +class Sprite extends Object3D { + + constructor( material ) { + + super(); + + this.type = 'Sprite'; + + if ( _geometry === undefined ) { + + _geometry = new BufferGeometry(); + + const float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + const interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + _geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + _geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + _geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = _geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + raycast( raycaster, intersects ) { + + if ( raycaster.camera === null ) { + + console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' ); + + } + + _worldScale.setFromMatrixScale( this.matrixWorld ); + + _viewWorldMatrix.copy( raycaster.camera.matrixWorld ); + this.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld ); + + _mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + if ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) { + + _worldScale.multiplyScalar( - _mvPosition.z ); + + } + + const rotation = this.material.rotation; + let sin, cos; + + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + const center = this.center; + + transformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + + _uvA.set( 0, 0 ); + _uvB.set( 1, 0 ); + _uvC.set( 1, 1 ); + + // check first triangle + let intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + _uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + const distance = raycaster.ray.origin.distanceTo( _intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: _intersectPoint.clone(), + uv: Triangle.getUV( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ), + face: null, + object: this + + } ); + + } + + copy( source ) { + + super.copy( source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + this.material = source.material; + + return this; + + } + +} + +Sprite.prototype.isSprite = true; + +function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + _alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + _rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y ); + _rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y ); + + } else { + + _rotatedPosition.copy( _alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += _rotatedPosition.x; + vertexPosition.y += _rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( _viewWorldMatrix ); + +} + +const _v1$2 = /*@__PURE__*/ new Vector3(); +const _v2$1 = /*@__PURE__*/ new Vector3(); + +class LOD extends Object3D { + + constructor() { + + super(); + + this._currentLevel = 0; + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + }, + isLOD: { + value: true, + } + } ); + + this.autoUpdate = true; + + } + + copy( source ) { + + super.copy( source, false ); + + const levels = source.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + this.autoUpdate = source.autoUpdate; + + return this; + + } + + addLevel( object, distance = 0 ) { + + distance = Math.abs( distance ); + + const levels = this.levels; + + let l; + + for ( l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + return this; + + } + + getCurrentLevel() { + + return this._currentLevel; + + } + + getObjectForDistance( distance ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + } + + return null; + + } + + raycast( raycaster, intersects ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + _v1$2.setFromMatrixPosition( this.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _v1$2 ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + } + + } + + update( camera ) { + + const levels = this.levels; + + if ( levels.length > 1 ) { + + _v1$2.setFromMatrixPosition( camera.matrixWorld ); + _v2$1.setFromMatrixPosition( this.matrixWorld ); + + const distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom; + + levels[ 0 ].object.visible = true; + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + this._currentLevel = i - 1; + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.autoUpdate === false ) data.object.autoUpdate = false; + + data.object.levels = []; + + const levels = this.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + +} + +const _basePosition = /*@__PURE__*/ new Vector3(); + +const _skinIndex = /*@__PURE__*/ new Vector4(); +const _skinWeight = /*@__PURE__*/ new Vector4(); + +const _vector$5 = /*@__PURE__*/ new Vector3(); +const _matrix = /*@__PURE__*/ new Matrix4(); + +class SkinnedMesh extends Mesh { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + } + + copy( source ) { + + super.copy( source ); + + this.bindMode = source.bindMode; + this.bindMatrix.copy( source.bindMatrix ); + this.bindMatrixInverse.copy( source.bindMatrixInverse ); + + this.skeleton = source.skeleton; + + return this; + + } + + bind( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.copy( bindMatrix ).invert(); + + } + + pose() { + + this.skeleton.pose(); + + } + + normalizeSkinWeights() { + + const vector = new Vector4(); + + const skinWeight = this.geometry.attributes.skinWeight; + + for ( let i = 0, l = skinWeight.count; i < l; i ++ ) { + + vector.x = skinWeight.getX( i ); + vector.y = skinWeight.getY( i ); + vector.z = skinWeight.getZ( i ); + vector.w = skinWeight.getW( i ); + + const scale = 1.0 / vector.manhattanLength(); + + if ( scale !== Infinity ) { + + vector.multiplyScalar( scale ); + + } else { + + vector.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w ); + + } + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.copy( this.matrixWorld ).invert(); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.copy( this.bindMatrix ).invert(); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + } + + boneTransform( index, target ) { + + const skeleton = this.skeleton; + const geometry = this.geometry; + + _skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index ); + _skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index ); + + _basePosition.copy( target ).applyMatrix4( this.bindMatrix ); + + target.set( 0, 0, 0 ); + + for ( let i = 0; i < 4; i ++ ) { + + const weight = _skinWeight.getComponent( i ); + + if ( weight !== 0 ) { + + const boneIndex = _skinIndex.getComponent( i ); + + _matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] ); + + target.addScaledVector( _vector$5.copy( _basePosition ).applyMatrix4( _matrix ), weight ); + + } + + } + + return target.applyMatrix4( this.bindMatrixInverse ); + + } + +} + +SkinnedMesh.prototype.isSkinnedMesh = true; + +class Bone extends Object3D { + + constructor() { + + super(); + + this.type = 'Bone'; + + } + +} + +Bone.prototype.isBone = true; + +class DataTexture extends Texture { + + constructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, encoding ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter; + this.minFilter = minFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + this.needsUpdate = true; + + } + +} + +DataTexture.prototype.isDataTexture = true; + +const _offsetMatrix = /*@__PURE__*/ new Matrix4(); +const _identityMatrix = /*@__PURE__*/ new Matrix4(); + +class Skeleton { + + constructor( bones = [], boneInverses = [] ) { + + this.uuid = generateUUID(); + + this.bones = bones.slice( 0 ); + this.boneInverses = boneInverses; + this.boneMatrices = null; + + this.boneTexture = null; + this.boneTextureSize = 0; + + this.frame = - 1; + + this.init(); + + } + + init() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + + this.boneMatrices = new Float32Array( bones.length * 16 ); + + // calculate inverse bone matrices if necessary + + if ( boneInverses.length === 0 ) { + + this.calculateInverses(); + + } else { + + // handle special case + + if ( bones.length !== boneInverses.length ) { + + console.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' ); + + this.boneInverses = []; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + calculateInverses() { + + this.boneInverses.length = 0; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.copy( this.bones[ i ].matrixWorld ).invert(); + + } + + this.boneInverses.push( inverse ); + + } + + } + + pose() { + + // recover the bind-time world matrices + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.copy( this.boneInverses[ i ] ).invert(); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.copy( bone.parent.matrixWorld ).invert(); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + } + + update() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( let i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + const matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix; + + _offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + _offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== null ) { + + boneTexture.needsUpdate = true; + + } + + } + + clone() { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + computeBoneTexture() { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + let size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + const boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( this.boneMatrices ); // copy current values + + const boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + + this.boneMatrices = boneMatrices; + this.boneTexture = boneTexture; + this.boneTextureSize = size; + + return this; + + } + + getBoneByName( name ) { + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + dispose( ) { + + if ( this.boneTexture !== null ) { + + this.boneTexture.dispose(); + + this.boneTexture = null; + + } + + } + + fromJSON( json, bones ) { + + this.uuid = json.uuid; + + for ( let i = 0, l = json.bones.length; i < l; i ++ ) { + + const uuid = json.bones[ i ]; + let bone = bones[ uuid ]; + + if ( bone === undefined ) { + + console.warn( 'THREE.Skeleton: No bone found with UUID:', uuid ); + bone = new Bone(); + + } + + this.bones.push( bone ); + this.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) ); + + } + + this.init(); + + return this; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.5, + type: 'Skeleton', + generator: 'Skeleton.toJSON' + }, + bones: [], + boneInverses: [] + }; + + data.uuid = this.uuid; + + const bones = this.bones; + const boneInverses = this.boneInverses; + + for ( let i = 0, l = bones.length; i < l; i ++ ) { + + const bone = bones[ i ]; + data.bones.push( bone.uuid ); + + const boneInverse = boneInverses[ i ]; + data.boneInverses.push( boneInverse.toArray() ); + + } + + return data; + + } + +} + +class InstancedBufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized, meshPerAttribute = 1 ) { + + if ( typeof normalized === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + super( array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute; + + } + + copy( source ) { + + super.copy( source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.meshPerAttribute = this.meshPerAttribute; + + data.isInstancedBufferAttribute = true; + + return data; + + } + +} + +InstancedBufferAttribute.prototype.isInstancedBufferAttribute = true; + +const _instanceLocalMatrix = /*@__PURE__*/ new Matrix4(); +const _instanceWorldMatrix = /*@__PURE__*/ new Matrix4(); + +const _instanceIntersects = []; + +const _mesh = /*@__PURE__*/ new Mesh(); + +class InstancedMesh extends Mesh { + + constructor( geometry, material, count ) { + + super( geometry, material ); + + this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 ); + this.instanceColor = null; + + this.count = count; + + this.frustumCulled = false; + + } + + copy( source ) { + + super.copy( source ); + + this.instanceMatrix.copy( source.instanceMatrix ); + + if ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone(); + + this.count = source.count; + + return this; + + } + + getColorAt( index, color ) { + + color.fromArray( this.instanceColor.array, index * 3 ); + + } + + getMatrixAt( index, matrix ) { + + matrix.fromArray( this.instanceMatrix.array, index * 16 ); + + } + + raycast( raycaster, intersects ) { + + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + + _mesh.geometry = this.geometry; + _mesh.material = this.material; + + if ( _mesh.material === undefined ) return; + + for ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) { + + // calculate the world matrix for each instance + + this.getMatrixAt( instanceId, _instanceLocalMatrix ); + + _instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix ); + + // the mesh represents this single instance + + _mesh.matrixWorld = _instanceWorldMatrix; + + _mesh.raycast( raycaster, _instanceIntersects ); + + // process the result of raycast + + for ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) { + + const intersect = _instanceIntersects[ i ]; + intersect.instanceId = instanceId; + intersect.object = this; + intersects.push( intersect ); + + } + + _instanceIntersects.length = 0; + + } + + } + + setColorAt( index, color ) { + + if ( this.instanceColor === null ) { + + this.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 ); + + } + + color.toArray( this.instanceColor.array, index * 3 ); + + } + + setMatrixAt( index, matrix ) { + + matrix.toArray( this.instanceMatrix.array, index * 16 ); + + } + + updateMorphTargets() { + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +InstancedMesh.prototype.isInstancedMesh = true; + +/** + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + +class LineBasicMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.setValues( parameters ); + + } + + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + } + +} + +LineBasicMaterial.prototype.isLineBasicMaterial = true; + +const _start$1 = /*@__PURE__*/ new Vector3(); +const _end$1 = /*@__PURE__*/ new Vector3(); +const _inverseMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _ray$1 = /*@__PURE__*/ new Ray(); +const _sphere$1 = /*@__PURE__*/ new Sphere(); + +class Line extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) { + + super(); + + this.type = 'Line'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source ) { + + super.copy( source ); + + this.material = source.material; + this.geometry = source.geometry; + + return this; + + } + + computeLineDistances() { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = [ 0 ]; + + for ( let i = 1, l = positionAttribute.count; i < l; i ++ ) { + + _start$1.fromBufferAttribute( positionAttribute, i - 1 ); + _end$1.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += _start$1.distanceTo( _end$1 ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + console.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + return this; + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$1.copy( geometry.boundingSphere ); + _sphere$1.applyMatrix4( matrixWorld ); + _sphere$1.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return; + + // + + _inverseMatrix$1.copy( matrixWorld ).invert(); + _ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const vStart = new Vector3(); + const vEnd = new Vector3(); + const interSegment = new Vector3(); + const interRay = new Vector3(); + const step = this.isLineSegments ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + + vStart.fromBufferAttribute( positionAttribute, a ); + vEnd.fromBufferAttribute( positionAttribute, b ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + vStart.fromBufferAttribute( positionAttribute, i ); + vEnd.fromBufferAttribute( positionAttribute, i + 1 ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + console.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + } + +} + +Line.prototype.isLine = true; + +const _start = /*@__PURE__*/ new Vector3(); +const _end = /*@__PURE__*/ new Vector3(); + +class LineSegments extends Line { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.type = 'LineSegments'; + + } + + computeLineDistances() { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + + for ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + _start.fromBufferAttribute( positionAttribute, i ); + _end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + console.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + return this; + + } + +} + +LineSegments.prototype.isLineSegments = true; + +class LineLoop extends Line { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.type = 'LineLoop'; + + } + +} + +LineLoop.prototype.isLineLoop = true; + +/** + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * alphaMap: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * } + */ + +class PointsMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + } + +} + +PointsMaterial.prototype.isPointsMaterial = true; + +const _inverseMatrix = /*@__PURE__*/ new Matrix4(); +const _ray = /*@__PURE__*/ new Ray(); +const _sphere = /*@__PURE__*/ new Sphere(); +const _position$2 = /*@__PURE__*/ new Vector3(); + +class Points extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) { + + super(); + + this.type = 'Points'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source ) { + + super.copy( source ); + + this.material = source.material; + this.geometry = source.geometry; + + return this; + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ); + _sphere.applyMatrix4( matrixWorld ); + _sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere ) === false ) return; + + // + + _inverseMatrix.copy( matrixWorld ).invert(); + _ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + if ( geometry.isBufferGeometry ) { + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i ++ ) { + + const a = index.getX( i ); + + _position$2.fromBufferAttribute( positionAttribute, a ); + + testPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end; i < l; i ++ ) { + + _position$2.fromBufferAttribute( positionAttribute, i ); + + testPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } + + } else { + + console.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + const morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + console.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); + + } + + } + + } + +} + +Points.prototype.isPoints = true; + +function testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) { + + const rayPointDistanceSq = _ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + const intersectPoint = new Vector3(); + + _ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint, + index: index, + face: null, + object: object + + } ); + + } + +} + +class VideoTexture extends Texture { + + constructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.format = format !== undefined ? format : RGBFormat; + + this.minFilter = minFilter !== undefined ? minFilter : LinearFilter; + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + + this.generateMipmaps = false; + + const scope = this; + + function updateVideo() { + + scope.needsUpdate = true; + video.requestVideoFrameCallback( updateVideo ); + + } + + if ( 'requestVideoFrameCallback' in video ) { + + video.requestVideoFrameCallback( updateVideo ); + + } + + } + + clone() { + + return new this.constructor( this.image ).copy( this ); + + } + + update() { + + const video = this.image; + const hasVideoFrameCallback = 'requestVideoFrameCallback' in video; + + if ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + +} + +VideoTexture.prototype.isVideoTexture = true; + +class CompressedTexture extends Texture { + + constructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + +} + +CompressedTexture.prototype.isCompressedTexture = true; + +class CanvasTexture extends Texture { + + constructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + +} + +CanvasTexture.prototype.isCanvasTexture = true; + +class DepthTexture extends Texture { + + constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + +} + +DepthTexture.prototype.isDepthTexture = true; + +class CircleGeometry extends BufferGeometry { + + constructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + segments = Math.max( 3, segments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + const segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( let i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + static fromJSON( data ) { + + return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength ); + + } + +} + +class CylinderGeometry extends BufferGeometry { + + constructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + const scope = this; + + radialSegments = Math.floor( radialSegments ); + heightSegments = Math.floor( heightSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let index = 0; + const indexArray = []; + const halfHeight = height / 2; + let groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + const normal = new Vector3(); + const vertex = new Vector3(); + + let groupCount = 0; + + // this will be used to calculate the normal + const slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( let y = 0; y <= heightSegments; y ++ ) { + + const indexRow = []; + + const v = y / heightSegments; + + // calculate the radius of the current row + + const radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + + const theta = u * thetaLength + thetaStart; + + const sinTheta = Math.sin( theta ); + const cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + for ( let y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + const a = indexArray[ y ][ x ]; + const b = indexArray[ y + 1 ][ x ]; + const c = indexArray[ y + 1 ][ x + 1 ]; + const d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + // save the index of the first center vertex + const centerIndexStart = index; + + const uv = new Vector2(); + const vertex = new Vector3(); + + let groupCount = 0; + + const radius = ( top === true ) ? radiusTop : radiusBottom; + const sign = ( top === true ) ? 1 : - 1; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( let x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + const centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + + const cosTheta = Math.cos( theta ); + const sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + const c = centerIndexStart + x; + const i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + static fromJSON( data ) { + + return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); + + } + +} + +class ConeGeometry extends CylinderGeometry { + + constructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + static fromJSON( data ) { + + return new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); + + } + +} + +class PolyhedronGeometry extends BufferGeometry { + + constructor( vertices = [], indices = [], radius = 1, detail = 0 ) { + + super(); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + // default buffer data + + const vertexBuffer = []; + const uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + applyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( let i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + const cols = detail + 1; + + // we use this multidimensional array as a data structure for creating the subdivision + + const v = []; + + // construct all of the vertices for this subdivision + + for ( let i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + const aj = a.clone().lerp( c, i / cols ); + const bj = b.clone().lerp( c, i / cols ); + + const rows = cols - i; + + for ( let j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( let i = 0; i < cols; i ++ ) { + + for ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + const k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function applyRadius( radius ) { + + const vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + const vertex = new Vector3(); + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + const u = azimuth( vertex ) / 2 / Math.PI + 0.5; + const v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( let i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + const x0 = uvBuffer[ i + 0 ]; + const x1 = uvBuffer[ i + 2 ]; + const x2 = uvBuffer[ i + 4 ]; + + const max = Math.max( x0, x1, x2 ); + const min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + const stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + const centroid = new Vector3(); + + const uvA = new Vector2(); + const uvB = new Vector2(); + const uvC = new Vector2(); + + for ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + const azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + static fromJSON( data ) { + + return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details ); + + } + +} + +class DodecahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + const r = 1 / t; + + const vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + const indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new DodecahedronGeometry( data.radius, data.detail ); + + } + +} + +const _v0 = new Vector3(); +const _v1$1 = new Vector3(); +const _normal = new Vector3(); +const _triangle = new Triangle(); + +class EdgesGeometry extends BufferGeometry { + + constructor( geometry = null, thresholdAngle = 1 ) { + + super(); + this.type = 'EdgesGeometry'; + + this.parameters = { + geometry: geometry, + thresholdAngle: thresholdAngle + }; + + if ( geometry !== null ) { + + const precisionPoints = 4; + const precision = Math.pow( 10, precisionPoints ); + const thresholdDot = Math.cos( DEG2RAD * thresholdAngle ); + + const indexAttr = geometry.getIndex(); + const positionAttr = geometry.getAttribute( 'position' ); + const indexCount = indexAttr ? indexAttr.count : positionAttr.count; + + const indexArr = [ 0, 0, 0 ]; + const vertKeys = [ 'a', 'b', 'c' ]; + const hashes = new Array( 3 ); + + const edgeData = {}; + const vertices = []; + for ( let i = 0; i < indexCount; i += 3 ) { + + if ( indexAttr ) { + + indexArr[ 0 ] = indexAttr.getX( i ); + indexArr[ 1 ] = indexAttr.getX( i + 1 ); + indexArr[ 2 ] = indexAttr.getX( i + 2 ); + + } else { + + indexArr[ 0 ] = i; + indexArr[ 1 ] = i + 1; + indexArr[ 2 ] = i + 2; + + } + + const { a, b, c } = _triangle; + a.fromBufferAttribute( positionAttr, indexArr[ 0 ] ); + b.fromBufferAttribute( positionAttr, indexArr[ 1 ] ); + c.fromBufferAttribute( positionAttr, indexArr[ 2 ] ); + _triangle.getNormal( _normal ); + + // create hashes for the edge from the vertices + hashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`; + hashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`; + hashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`; + + // skip degenerate triangles + if ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) { + + continue; + + } + + // iterate over every edge + for ( let j = 0; j < 3; j ++ ) { + + // get the first and next vertex making up the edge + const jNext = ( j + 1 ) % 3; + const vecHash0 = hashes[ j ]; + const vecHash1 = hashes[ jNext ]; + const v0 = _triangle[ vertKeys[ j ] ]; + const v1 = _triangle[ vertKeys[ jNext ] ]; + + const hash = `${ vecHash0 }_${ vecHash1 }`; + const reverseHash = `${ vecHash1 }_${ vecHash0 }`; + + if ( reverseHash in edgeData && edgeData[ reverseHash ] ) { + + // if we found a sibling edge add it into the vertex array if + // it meets the angle threshold and delete the edge from the map. + if ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) { + + vertices.push( v0.x, v0.y, v0.z ); + vertices.push( v1.x, v1.y, v1.z ); + + } + + edgeData[ reverseHash ] = null; + + } else if ( ! ( hash in edgeData ) ) { + + // if we've already got an edge here then skip adding a new one + edgeData[ hash ] = { + + index0: indexArr[ j ], + index1: indexArr[ jNext ], + normal: _normal.clone(), + + }; + + } + + } + + } + + // iterate over all remaining, unmatched edges and add them to the vertex array + for ( const key in edgeData ) { + + if ( edgeData[ key ] ) { + + const { index0, index1 } = edgeData[ key ]; + _v0.fromBufferAttribute( positionAttr, index0 ); + _v1$1.fromBufferAttribute( positionAttr, index1 ); + + vertices.push( _v0.x, _v0.y, _v0.z ); + vertices.push( _v1$1.x, _v1$1.y, _v1$1.z ); + + } + + } + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + +} + +/** + * Extensible curve object. + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + +class Curve { + + constructor() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + } + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + } + + // Get sequence of points using getPoint( t ) + + getPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + } + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + } + + // Get total curve arc length + + getLength() { + + const lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + } + + // Get list of cumulative segment lengths + + getLengths( divisions = this.arcLengthDivisions ) { + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + const cache = []; + let current, last = this.getPoint( 0 ); + let sum = 0; + + cache.push( 0 ); + + for ( let p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + } + + updateArcLengths() { + + this.needsUpdate = true; + this.getLengths(); + + } + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping( u, distance ) { + + const arcLengths = this.getLengths(); + + let i = 0; + const il = arcLengths.length; + + let targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + let low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + const lengthBefore = arcLengths[ i ]; + const lengthAfter = arcLengths[ i + 1 ]; + + const segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + const segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + const t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + } + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent( t, optionalTarget ) { + + const delta = 0.0001; + let t1 = t - delta; + let t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + const pt1 = this.getPoint( t1 ); + const pt2 = this.getPoint( t2 ); + + const tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() ); + + tangent.copy( pt2 ).sub( pt1 ).normalize(); + + return tangent; + + } + + getTangentAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getTangent( t, optionalTarget ); + + } + + computeFrenetFrames( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + const normal = new Vector3(); + + const tangents = []; + const normals = []; + const binormals = []; + + const vec = new Vector3(); + const mat = new Matrix4(); + + // compute the tangent vectors for each segment on the curve + + for ( let i = 0; i <= segments; i ++ ) { + + const u = i / segments; + + tangents[ i ] = this.getTangentAt( u, new Vector3() ); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs( tangents[ 0 ].x ); + const ty = Math.abs( tangents[ 0 ].y ); + const tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( let i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + const theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + let theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( let i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + } + + fromJSON( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + +} + +class EllipseCurve extends Curve { + + constructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) { + + super(); + + this.type = 'EllipseCurve'; + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation; + + } + + getPoint( t, optionalTarget ) { + + const point = optionalTarget || new Vector2(); + + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + const angle = this.aStartAngle + t * deltaAngle; + let x = this.aX + this.xRadius * Math.cos( angle ); + let y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + const cos = Math.cos( this.aRotation ); + const sin = Math.sin( this.aRotation ); + + const tx = x - this.aX; + const ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + } + + copy( source ) { + + super.copy( source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + } + +} + +EllipseCurve.prototype.isEllipseCurve = true; + +class ArcCurve extends EllipseCurve { + + constructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + super( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + +} + +ArcCurve.prototype.isArcCurve = true; + +/** + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + +/* +Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + +This CubicPoly class could be used for reusing some variables and calculations, +but for three.js curve use, it could be possible inlined and flatten into a single function call +which can be placed in CurveUtils. +*/ + +function CubicPoly() { + + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + let t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + let t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + const t2 = t * t; + const t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + +} + +// + +const tmp = new Vector3(); +const px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + +class CatmullRomCurve3 extends Curve { + + constructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) { + + super(); + + this.type = 'CatmullRomCurve3'; + + this.points = points; + this.closed = closed; + this.curveType = curveType; + this.tension = tension; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const points = this.points; + const l = points.length; + + const p = ( l - ( this.closed ? 0 : 1 ) ) * t; + let intPoint = Math.floor( p ); + let weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + let p0, p3; // 4 points (p1 & p2 defined below) + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + const p1 = points[ intPoint % l ]; + const p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + const pow = this.curveType === 'chordal' ? 0.5 : 0.25; + let dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + let dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + let dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + } + +} + +CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + +/** + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + +function CatmullRom( t, p0, p1, p2, p3 ) { + + const v0 = ( p2 - p0 ) * 0.5; + const v1 = ( p3 - p1 ) * 0.5; + const t2 = t * t; + const t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + +} + +// + +function QuadraticBezierP0( t, p ) { + + const k = 1 - t; + return k * k * p; + +} + +function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + +} + +function QuadraticBezierP2( t, p ) { + + return t * t * p; + +} + +function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + +} + +// + +function CubicBezierP0( t, p ) { + + const k = 1 - t; + return k * k * k * p; + +} + +function CubicBezierP1( t, p ) { + + const k = 1 - t; + return 3 * k * k * t * p; + +} + +function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + +} + +function CubicBezierP3( t, p ) { + + return t * t * t * p; + +} + +function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + +} + +class CubicBezierCurve extends Curve { + + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) { + + super(); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +CubicBezierCurve.prototype.isCubicBezierCurve = true; + +class CubicBezierCurve3 extends Curve { + + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) { + + super(); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + +class LineCurve extends Curve { + + constructor( v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + this.type = 'LineCurve'; + + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + + getTangent( t, optionalTarget ) { + + const tangent = optionalTarget || new Vector2(); + + tangent.copy( this.v2 ).sub( this.v1 ).normalize(); + + return tangent; + + } + + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +LineCurve.prototype.isLineCurve = true; + +class LineCurve3 extends Curve { + + constructor( v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + this.type = 'LineCurve3'; + this.isLineCurve3 = true; + + this.v1 = v1; + this.v2 = v2; + + } + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +class QuadraticBezierCurve extends Curve { + + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + +class QuadraticBezierCurve3 extends Curve { + + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + +class SplineCurve extends Curve { + + constructor( points = [] ) { + + super(); + + this.type = 'SplineCurve'; + + this.points = points; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const points = this.points; + const p = ( points.length - 1 ) * t; + + const intPoint = Math.floor( p ); + const weight = p - intPoint; + + const p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + const p1 = points[ intPoint ]; + const p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + const p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + } + +} + +SplineCurve.prototype.isSplineCurve = true; + +var Curves = /*#__PURE__*/Object.freeze({ + __proto__: null, + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve +}); + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +class CurvePath extends Curve { + + constructor() { + + super(); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + add( curve ) { + + this.curves.push( curve ); + + } + + closePath() { + + // Add a line curve if start and end of lines are not connected + const startPoint = this.curves[ 0 ].getPoint( 0 ); + const endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + } + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint( t, optionalTarget ) { + + const d = t * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + const diff = curveLengths[ i ] - d; + const curve = this.curves[ i ]; + + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u, optionalTarget ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + } + + copy( source ) { + + super.copy( source ); + + this.curves = []; + + for ( let i = 0, l = source.curves.length; i < l; i ++ ) { + + const curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( let i = 0, l = this.curves.length; i < l; i ++ ) { + + const curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( let i = 0, l = json.curves.length; i < l; i ++ ) { + + const curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + +} + +class Path extends CurvePath { + + constructor( points ) { + + super(); + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + setFromPoints( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( let i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + return this; + + } + + moveTo( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + return this; + + } + + lineTo( x, y ) { + + const curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + return this; + + } + + quadraticCurveTo( aCPx, aCPy, aX, aY ) { + + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + splineThru( pts /*Array of Vector*/ ) { + + const npts = [ this.currentPoint.clone() ].concat( pts ); + + const curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + return this; + + } + + arc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + absarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + ellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + return this; + + } + + absellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + const firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + const lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + return this; + + } + + copy( source ) { + + super.copy( source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + +} + +class Shape extends Path { + + constructor( points ) { + + super( points ); + + this.uuid = generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + getPointsHoles( divisions ) { + + const holesPts = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + } + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + } + + copy( source ) { + + super.copy( source ); + + this.holes = []; + + for ( let i = 0, l = source.holes.length; i < l; i ++ ) { + + const hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.uuid = this.uuid; + data.holes = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + const hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( let i = 0, l = json.holes.length; i < l; i ++ ) { + + const hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + +} + +/** + * Port from https://github.com/mapbox/earcut (v2.2.2) + */ + +const Earcut = { + + triangulate: function ( data, holeIndices, dim = 2 ) { + + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length; + let outerNode = linkedList( data, 0, outerLen, dim, true ); + const triangles = []; + + if ( ! outerNode || outerNode.next === outerNode.prev ) return triangles; + + let minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( let i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 1 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize ); + + return triangles; + + } + +}; + +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList( data, start, end, dim, clockwise ) { + + let i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + +} + +// eliminate colinear or duplicate points +function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + let p = start, + again; + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + let stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim ); + triangles.push( ear.i / dim ); + triangles.push( next.i / dim ); + + removeNode( ear ); + + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if ( ear === stop ) { + + // try filtering points and slicing again + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( filterPoints( ear ), triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + +} + +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar( ear ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + let p = ear.next.next; + + while ( p !== ear.prev ) { + + if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.next; + + } + + return true; + +} + +function isEarHashed( ear, minX, minY, invSize ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + const minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ), + minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ), + maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ), + maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y ); + + // z-order range for the current triangle bbox; + const minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + let p = ear.prevZ, + n = ear.nextZ; + + // look for points inside the triangle in both directions + while ( p && p.z >= minZ && n && n.z <= maxZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + if ( n !== ear.prev && n !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) && + area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + // look for remaining points in decreasing z-order + while ( p && p.z >= minZ ) { + + if ( p !== ear.prev && p !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + } + + // look for remaining points in increasing z-order + while ( n && n.z <= maxZ ) { + + if ( n !== ear.prev && n !== ear.next && + pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) && + area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + return true; + +} + +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections( start, triangles, dim ) { + + let p = start; + do { + + const a = p.prev, + b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim ); + triangles.push( p.i / dim ); + triangles.push( b.i / dim ); + + // remove two nodes involved + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return filterPoints( p ); + +} + +// try splitting polygon into two and triangulate them independently +function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + let a = start; + do { + + let b = a.next.next; + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + let c = splitPolygon( a, b ); + + // filter colinear points around the cuts + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + earcutLinked( a, triangles, dim, minX, minY, invSize ); + earcutLinked( c, triangles, dim, minX, minY, invSize ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles( data, holeIndices, outerNode, dim ) { + + const queue = []; + let i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + for ( i = 0; i < queue.length; i ++ ) { + + eliminateHole( queue[ i ], outerNode ); + outerNode = filterPoints( outerNode, outerNode.next ); + + } + + return outerNode; + +} + +function compareX( a, b ) { + + return a.x - b.x; + +} + +// find a bridge between vertices that connects hole with an outer ring and and link it +function eliminateHole( hole, outerNode ) { + + outerNode = findHoleBridge( hole, outerNode ); + if ( outerNode ) { + + const b = splitPolygon( outerNode, hole ); + + // filter collinear points around the cuts + filterPoints( outerNode, outerNode.next ); + filterPoints( b, b.next ); + + } + +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge( hole, outerNode ) { + + let p = outerNode; + const hx = hole.x; + const hy = hole.y; + let qx = - Infinity, m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + const x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + if ( x <= hx && x > qx ) { + + qx = x; + if ( x === hx ) { + + if ( hy === p.y ) return p; + if ( hy === p.next.y ) return p.next; + + } + + m = p.x < p.next.x ? p : p.next; + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + if ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + const stop = m, + mx = m.x, + my = m.y; + let tanMin = Infinity, tan; + + p = m; + + do { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } while ( p !== stop ); + + return m; + +} + +// whether sector in vertex m contains sector in vertex p in the same coordinates +function sectorContainsSector( m, p ) { + + return area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0; + +} + +// interlink polygon nodes in z-order +function indexCurve( start, minX, minY, invSize ) { + + let p = start; + do { + + if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked( list ) { + + let i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + +} + +// z-order of a point given coords and inverse of the longer side of data bbox +function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + x = 32767 * ( x - minX ) * invSize; + y = 32767 * ( y - minY ) * invSize; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + +} + +// find the leftmost node of a polygon ring +function getLeftmost( start ) { + + let p = start, + leftmost = start; + do { + + if ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + +} + +// check if a point lies within a convex triangle +function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 && + ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 && + ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0; + +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges + ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible + ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors + equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case + +} + +// signed area of a triangle +function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + +} + +// check if two points are equal +function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + +} + +// check if two segments intersect +function intersects( p1, q1, p2, q2 ) { + + const o1 = sign( area( p1, q1, p2 ) ); + const o2 = sign( area( p1, q1, q2 ) ); + const o3 = sign( area( p2, q2, p1 ) ); + const o4 = sign( area( p2, q2, q1 ) ); + + if ( o1 !== o2 && o3 !== o4 ) return true; // general case + + if ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; + +} + +// for collinear points p, q, r, check if point q lies on segment pr +function onSegment( p, q, r ) { + + return q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y ); + +} + +function sign( num ) { + + return num > 0 ? 1 : num < 0 ? - 1 : 0; + +} + +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon( a, b ) { + + let p = a; + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) return true; + p = p.next; + + } while ( p !== a ); + + return false; + +} + +// check if a polygon diagonal is locally inside the polygon +function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + +} + +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside( a, b ) { + + let p = a, + inside = false; + const px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) + inside = ! inside; + p = p.next; + + } while ( p !== a ); + + return inside; + +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon( a, b ) { + + const a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + +} + +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode( i, x, y, last ) { + + const p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + +} + +function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + +} + +function Node( i, x, y ) { + + // vertex index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + +} + +function signedArea( data, start, end, dim ) { + + let sum = 0; + for ( let i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + +} + +class ShapeUtils { + + // calculate area of the contour polygon + + static area( contour ) { + + const n = contour.length; + let a = 0.0; + + for ( let p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + } + + static isClockWise( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + static triangulateShape( contour, holes ) { + + const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + const holeIndices = []; // array of hole indices + const faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + let holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( let i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + const triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( let i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + +} + +function removeDupEndPts( points ) { + + const l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + +} + +function addContour( vertices, contour ) { + + for ( let i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + +} + +/** + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline (including bevelOffset) is bevel + * bevelOffset: , // how far from shape outline does bevel start + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + +class ExtrudeGeometry extends BufferGeometry { + + constructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) { + + super(); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + const scope = this; + + const verticesArray = []; + const uvArray = []; + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + const placeholder = []; + + // options + + const curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + const steps = options.steps !== undefined ? options.steps : 1; + let depth = options.depth !== undefined ? options.depth : 1; + + let bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + let bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2; + let bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1; + let bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0; + let bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + const extrudePath = options.extrudePath; + + const uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + let extrudePts, extrudeByPath = false; + let splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + bevelOffset = 0; + + } + + // Variables initialization + + const shapePoints = shape.extractPoints( curveSegments ); + + let vertices = shapePoints.shape; + const holes = shapePoints.holes; + + const reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + const faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + const contour = vertices; // vertices has all points but contour has only points of circumference + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + const vlen = vertices.length, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + let v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + const v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + const v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + const v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + const collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + const v_prev_len = Math.sqrt( v_prev_lensq ); + const v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + const ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + const ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + const ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + const ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + const sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + const v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + let direction_eq = false; // assumes: opposite + + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + const contourMovements = []; + + for ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + const holesMovements = []; + let oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( let b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + const bs = bevelSize + bevelOffset; + + // Back facing vertices + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + for ( let s = 1; s <= steps; s ++ ) { + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( let b = bevelSegments - 1; b >= 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + const start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + let layer = 0; // steps + 1 + let offset = vlen * layer; + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + const start = verticesArray.length / 3; + let layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + let i = contour.length; + + while ( -- i >= 0 ) { + + const j = i; + let k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + for ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) { + + const slen1 = vlen * s; + const slen2 = vlen * ( s + 1 ); + + const a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + const options = this.parameters.options; + + return toJSON$1( shapes, options, data ); + + } + + static fromJSON( data, shapes ) { + + const geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + const extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + return new ExtrudeGeometry( geometryShapes, data.options ); + + } + +} + +const WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const a_z = vertices[ indexA * 3 + 2 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const b_z = vertices[ indexB * 3 + 2 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + const c_z = vertices[ indexC * 3 + 2 ]; + const d_x = vertices[ indexD * 3 ]; + const d_y = vertices[ indexD * 3 + 1 ]; + const d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + +}; + +function toJSON$1( shapes, options, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + +} + +class IcosahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + + const vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + const indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new IcosahedronGeometry( data.radius, data.detail ); + + } + +} + +class LatheGeometry extends BufferGeometry { + + constructor( points = [ new Vector2( 0, 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, - 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) { + + super(); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ); + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = clamp( phiLength, 0, Math.PI * 2 ); + + // buffers + + const indices = []; + const vertices = []; + const uvs = []; + + // helper variables + + const inverseSegments = 1.0 / segments; + const vertex = new Vector3(); + const uv = new Vector2(); + + // generate vertices and uvs + + for ( let i = 0; i <= segments; i ++ ) { + + const phi = phiStart + i * inverseSegments * phiLength; + + const sin = Math.sin( phi ); + const cos = Math.cos( phi ); + + for ( let j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( let i = 0; i < segments; i ++ ) { + + for ( let j = 0; j < ( points.length - 1 ); j ++ ) { + + const base = j + i * points.length; + + const a = base; + const b = base + points.length; + const c = base + points.length + 1; + const d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + const normals = this.attributes.normal.array; + const n1 = new Vector3(); + const n2 = new Vector3(); + const n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + const base = segments * points.length * 3; + + for ( let i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + static fromJSON( data ) { + + return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength ); + + } + +} + +class OctahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + const indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new OctahedronGeometry( data.radius, data.detail ); + + } + +} + +class RingGeometry extends BufferGeometry { + + constructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + thetaSegments = Math.max( 3, thetaSegments ); + phiSegments = Math.max( 1, phiSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // some helper variables + + let radius = innerRadius; + const radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + const vertex = new Vector3(); + const uv = new Vector2(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= phiSegments; j ++ ) { + + for ( let i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + const segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( let j = 0; j < phiSegments; j ++ ) { + + const thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( let i = 0; i < thetaSegments; i ++ ) { + + const segment = i + thetaSegmentLevel; + + const a = segment; + const b = segment + thetaSegments + 1; + const c = segment + thetaSegments + 2; + const d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + static fromJSON( data ) { + + return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); + + } + +} + +class ShapeGeometry extends BufferGeometry { + + constructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) { + + super(); + this.type = 'ShapeGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let groupStart = 0; + let groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( let i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + const indexOffset = vertices.length / 3; + const points = shape.extractPoints( curveSegments ); + + let shapeVertices = points.shape; + const shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + } + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + const faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( let i = 0, l = shapeVertices.length; i < l; i ++ ) { + + const vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( let i = 0, l = faces.length; i < l; i ++ ) { + + const face = faces[ i ]; + + const a = face[ 0 ] + indexOffset; + const b = face[ 1 ] + indexOffset; + const c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + } + + static fromJSON( data, shapes ) { + + const geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + return new ShapeGeometry( geometryShapes, data.curveSegments ); + + } + +} + +function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + +} + +class SphereGeometry extends BufferGeometry { + + constructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) { + + super(); + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) ); + + const thetaEnd = Math.min( thetaStart + thetaLength, Math.PI ); + + let index = 0; + const grid = []; + + const vertex = new Vector3(); + const normal = new Vector3(); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // generate vertices, normals and uvs + + for ( let iy = 0; iy <= heightSegments; iy ++ ) { + + const verticesRow = []; + + const v = iy / heightSegments; + + // special case for the poles + + let uOffset = 0; + + if ( iy == 0 && thetaStart == 0 ) { + + uOffset = 0.5 / widthSegments; + + } else if ( iy == heightSegments && thetaEnd == Math.PI ) { + + uOffset = - 0.5 / widthSegments; + + } + + for ( let ix = 0; ix <= widthSegments; ix ++ ) { + + const u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.copy( vertex ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u + uOffset, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( let iy = 0; iy < heightSegments; iy ++ ) { + + for ( let ix = 0; ix < widthSegments; ix ++ ) { + + const a = grid[ iy ][ ix + 1 ]; + const b = grid[ iy ][ ix ]; + const c = grid[ iy + 1 ][ ix ]; + const d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + static fromJSON( data ) { + + return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); + + } + +} + +class TetrahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + const indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new TetrahedronGeometry( data.radius, data.detail ); + + } + +} + +class TorusGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) { + + super(); + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radialSegments = Math.floor( radialSegments ); + tubularSegments = Math.floor( tubularSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const center = new Vector3(); + const vertex = new Vector3(); + const normal = new Vector3(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= radialSegments; j ++ ) { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + const u = i / tubularSegments * arc; + const v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= radialSegments; j ++ ) { + + for ( let i = 1; i <= tubularSegments; i ++ ) { + + // indices + + const a = ( tubularSegments + 1 ) * j + i - 1; + const b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + const c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + const d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + static fromJSON( data ) { + + return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); + + } + +} + +class TorusKnotGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) { + + super(); + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + tubularSegments = Math.floor( tubularSegments ); + radialSegments = Math.floor( radialSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + + const P1 = new Vector3(); + const P2 = new Vector3(); + + const B = new Vector3(); + const T = new Vector3(); + const N = new Vector3(); + + // generate vertices, normals and uvs + + for ( let i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + const u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( let j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + const v = j / radialSegments * Math.PI * 2; + const cx = - tube * Math.cos( v ); + const cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + // indices + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + const cu = Math.cos( u ); + const su = Math.sin( u ); + const quOverP = q / p * u; + const cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + static fromJSON( data ) { + + return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); + + } + +} + +class TubeGeometry extends BufferGeometry { + + constructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) { + + super(); + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + const frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + const uv = new Vector2(); + let P = new Vector3(); + + // buffer + + const vertices = []; + const normals = []; + const uvs = []; + const indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( let i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + const N = frames.normals[ i ]; + const B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( let j = 0; j <= radialSegments; j ++ ) { + + const v = j / radialSegments * Math.PI * 2; + + const sin = Math.sin( v ); + const cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + for ( let j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + toJSON() { + + const data = super.toJSON(); + + data.path = this.parameters.path.toJSON(); + + return data; + + } + + static fromJSON( data ) { + + // This only works for built-in curves (e.g. CatmullRomCurve3). + // User defined curves or instances of CurvePath will not be deserialized. + return new TubeGeometry( + new Curves[ data.path.type ]().fromJSON( data.path ), + data.tubularSegments, + data.radius, + data.radialSegments, + data.closed + ); + + } + +} + +class WireframeGeometry extends BufferGeometry { + + constructor( geometry = null ) { + + super(); + this.type = 'WireframeGeometry'; + + this.parameters = { + geometry: geometry + }; + + if ( geometry !== null ) { + + // buffer + + const vertices = []; + const edges = new Set(); + + // helper variables + + const start = new Vector3(); + const end = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + const position = geometry.attributes.position; + const indices = geometry.index; + let groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( let o = 0, ol = groups.length; o < ol; ++ o ) { + + const group = groups[ o ]; + + const groupStart = group.start; + const groupCount = group.count; + + for ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) { + + for ( let j = 0; j < 3; j ++ ) { + + const index1 = indices.getX( i + j ); + const index2 = indices.getX( i + ( j + 1 ) % 3 ); + + start.fromBufferAttribute( position, index1 ); + end.fromBufferAttribute( position, index2 ); + + if ( isUniqueEdge( start, end, edges ) === true ) { + + vertices.push( start.x, start.y, start.z ); + vertices.push( end.x, end.y, end.z ); + + } + + } + + } + + } + + } else { + + // non-indexed BufferGeometry + + const position = geometry.attributes.position; + + for ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( let j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + const index1 = 3 * i + j; + const index2 = 3 * i + ( ( j + 1 ) % 3 ); + + start.fromBufferAttribute( position, index1 ); + end.fromBufferAttribute( position, index2 ); + + if ( isUniqueEdge( start, end, edges ) === true ) { + + vertices.push( start.x, start.y, start.z ); + vertices.push( end.x, end.y, end.z ); + + } + + } + + } + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + +} + +function isUniqueEdge( start, end, edges ) { + + const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`; + const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge + + if ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) { + + return false; + + } else { + + edges.add( hash1, hash2 ); + return true; + + } + +} + +var Geometries = /*#__PURE__*/Object.freeze({ + __proto__: null, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronGeometry, + EdgesGeometry: EdgesGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeGeometry, + WireframeGeometry: WireframeGeometry +}); + +/** + * parameters = { + * color: + * } + */ + +class ShadowMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + return this; + + } + +} + +ShadowMaterial.prototype.isShadowMaterial = true; + +/** + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * flatShading: + * } + */ + +class MeshStandardMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 1.0; + this.metalness = 0.0; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + return this; + + } + +} + +MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + +/** + * parameters = { + * clearcoat: , + * clearcoatMap: new THREE.Texture( ), + * clearcoatRoughness: , + * clearcoatRoughnessMap: new THREE.Texture( ), + * clearcoatNormalScale: , + * clearcoatNormalMap: new THREE.Texture( ), + * + * ior: , + * reflectivity: , + * + * sheen: , + * sheenColor: , + * sheenColorMap: new THREE.Texture( ), + * sheenRoughness: , + * sheenRoughnessMap: new THREE.Texture( ), + * + * transmission: , + * transmissionMap: new THREE.Texture( ), + * + * thickness: , + * thicknessMap: new THREE.Texture( ), + * attenuationDistance: , + * attenuationColor: , + * + * specularIntensity: , + * specularIntensityMap: new THREE.Texture( ), + * specularColor: , + * specularColorMap: new THREE.Texture( ) + * } + */ + +class MeshPhysicalMaterial extends MeshStandardMaterial { + + constructor( parameters ) { + + super(); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.type = 'MeshPhysicalMaterial'; + + this.clearcoatMap = null; + this.clearcoatRoughness = 0.0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2( 1, 1 ); + this.clearcoatNormalMap = null; + + this.ior = 1.5; + + Object.defineProperty( this, 'reflectivity', { + get: function () { + + return ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) ); + + }, + set: function ( reflectivity ) { + + this.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity ); + + } + } ); + + this.sheenColor = new Color( 0x000000 ); + this.sheenColorMap = null; + this.sheenRoughness = 1.0; + this.sheenRoughnessMap = null; + + this.transmissionMap = null; + + this.thickness = 0.01; + this.thicknessMap = null; + this.attenuationDistance = 0.0; + this.attenuationColor = new Color( 1, 1, 1 ); + + this.specularIntensity = 1.0; + this.specularIntensityMap = null; + this.specularColor = new Color( 1, 1, 1 ); + this.specularColorMap = null; + + this._sheen = 0.0; + this._clearcoat = 0; + this._transmission = 0; + + this.setValues( parameters ); + + } + + get sheen() { + + return this._sheen; + + } + + set sheen( value ) { + + if ( this._sheen > 0 !== value > 0 ) { + + this.version ++; + + } + + this._sheen = value; + + } + + get clearcoat() { + + return this._clearcoat; + + } + + set clearcoat( value ) { + + if ( this._clearcoat > 0 !== value > 0 ) { + + this.version ++; + + } + + this._clearcoat = value; + + } + + get transmission() { + + return this._transmission; + + } + + set transmission( value ) { + + if ( this._transmission > 0 !== value > 0 ) { + + this.version ++; + + } + + this._transmission = value; + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy( source.clearcoatNormalScale ); + + this.ior = source.ior; + + this.sheen = source.sheen; + this.sheenColor.copy( source.sheenColor ); + this.sheenColorMap = source.sheenColorMap; + this.sheenRoughness = source.sheenRoughness; + this.sheenRoughnessMap = source.sheenRoughnessMap; + + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + + this.thickness = source.thickness; + this.thicknessMap = source.thicknessMap; + this.attenuationDistance = source.attenuationDistance; + this.attenuationColor.copy( source.attenuationColor ); + + this.specularIntensity = source.specularIntensity; + this.specularIntensityMap = source.specularIntensityMap; + this.specularColor.copy( source.specularColor ); + this.specularColorMap = source.specularColorMap; + + return this; + + } + +} + +MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + +/** + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.MultiplyOperation, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * flatShading: + * } + */ + +class MeshPhongMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + return this; + + } + +} + +MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + +/** + * parameters = { + * color: , + * + * map: new THREE.Texture( ), + * gradientMap: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * wireframe: , + * wireframeLinewidth: , + * + * } + */ + +class MeshToonMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + this.gradientMap = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + this.gradientMap = source.gradientMap; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + return this; + + } + +} + +MeshToonMaterial.prototype.isMeshToonMaterial = true; + +/** + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * flatShading: + * } + */ + +class MeshNormalMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + + this.flatShading = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.flatShading = source.flatShading; + + return this; + + } + +} + +MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + +/** + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * } + */ + +class MeshLambertMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + return this; + + } + +} + +MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + +/** + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * flatShading: + * } + */ + +class MeshMatcapMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.flatShading = false; + + this.setValues( parameters ); + + } + + + copy( source ) { + + super.copy( source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.flatShading = source.flatShading; + + return this; + + } + +} + +MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + +/** + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + +class LineDashedMaterial extends LineBasicMaterial { + + constructor( parameters ) { + + super(); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + } + +} + +LineDashedMaterial.prototype.isLineDashedMaterial = true; + +var Materials = /*#__PURE__*/Object.freeze({ + __proto__: null, + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + MeshMatcapMaterial: MeshMatcapMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material +}); + +const AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + const n = times.length; + const result = new Array( n ); + for ( let i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + const nValues = values.length; + const result = new values.constructor( nValues ); + + for ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + const srcOffset = order[ i ] * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + let i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + let value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + }, + + subclip: function ( sourceClip, name, startFrame, endFrame, fps = 30 ) { + + const clip = sourceClip.clone(); + + clip.name = name; + + const tracks = []; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + const track = clip.tracks[ i ]; + const valueSize = track.getValueSize(); + + const times = []; + const values = []; + + for ( let j = 0; j < track.times.length; ++ j ) { + + const frame = track.times[ j ] * fps; + + if ( frame < startFrame || frame >= endFrame ) continue; + + times.push( track.times[ j ] ); + + for ( let k = 0; k < valueSize; ++ k ) { + + values.push( track.values[ j * valueSize + k ] ); + + } + + } + + if ( times.length === 0 ) continue; + + track.times = AnimationUtils.convertArray( times, track.times.constructor ); + track.values = AnimationUtils.convertArray( values, track.values.constructor ); + + tracks.push( track ); + + } + + clip.tracks = tracks; + + // find minimum .times value across all tracks in the trimmed clip + + let minStartTime = Infinity; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + if ( minStartTime > clip.tracks[ i ].times[ 0 ] ) { + + minStartTime = clip.tracks[ i ].times[ 0 ]; + + } + + } + + // shift all tracks such that clip begins at t=0 + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + clip.tracks[ i ].shift( - 1 * minStartTime ); + + } + + clip.resetDuration(); + + return clip; + + }, + + makeClipAdditive: function ( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) { + + if ( fps <= 0 ) fps = 30; + + const numTracks = referenceClip.tracks.length; + const referenceTime = referenceFrame / fps; + + // Make each track's values relative to the values at the reference frame + for ( let i = 0; i < numTracks; ++ i ) { + + const referenceTrack = referenceClip.tracks[ i ]; + const referenceTrackType = referenceTrack.ValueTypeName; + + // Skip this track if it's non-numeric + if ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue; + + // Find the track in the target clip whose name and type matches the reference track + const targetTrack = targetClip.tracks.find( function ( track ) { + + return track.name === referenceTrack.name + && track.ValueTypeName === referenceTrackType; + + } ); + + if ( targetTrack === undefined ) continue; + + let referenceOffset = 0; + const referenceValueSize = referenceTrack.getValueSize(); + + if ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + referenceOffset = referenceValueSize / 3; + + } + + let targetOffset = 0; + const targetValueSize = targetTrack.getValueSize(); + + if ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + targetOffset = targetValueSize / 3; + + } + + const lastIndex = referenceTrack.times.length - 1; + let referenceValue; + + // Find the value to subtract out of the track + if ( referenceTime <= referenceTrack.times[ 0 ] ) { + + // Reference frame is earlier than the first keyframe, so just use the first keyframe + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + referenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex ); + + } else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) { + + // Reference frame is after the last keyframe, so just use the last keyframe + const startIndex = lastIndex * referenceValueSize + referenceOffset; + const endIndex = startIndex + referenceValueSize - referenceOffset; + referenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex ); + + } else { + + // Interpolate to the reference value + const interpolant = referenceTrack.createInterpolant(); + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + interpolant.evaluate( referenceTime ); + referenceValue = AnimationUtils.arraySlice( interpolant.resultBuffer, startIndex, endIndex ); + + } + + // Conjugate the quaternion + if ( referenceTrackType === 'quaternion' ) { + + const referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate(); + referenceQuat.toArray( referenceValue ); + + } + + // Subtract the reference value from all of the track values + + const numTimes = targetTrack.times.length; + for ( let j = 0; j < numTimes; ++ j ) { + + const valueStart = j * targetValueSize + targetOffset; + + if ( referenceTrackType === 'quaternion' ) { + + // Multiply the conjugate for quaternion track types + Quaternion.multiplyQuaternionsFlat( + targetTrack.values, + valueStart, + referenceValue, + 0, + targetTrack.values, + valueStart + ); + + } else { + + const valueEnd = targetValueSize - targetOffset * 2; + + // Subtract each value for all other numeric track types + for ( let k = 0; k < valueEnd; ++ k ) { + + targetTrack.values[ valueStart + k ] -= referenceValue[ k ]; + + } + + } + + } + + } + + targetClip.blendMode = AdditiveAnimationBlendMode; + + return targetClip; + + } + +}; + +/** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + */ + +class Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + this.settings = null; + this.DefaultSettings_ = {}; + + } + + evaluate( t ) { + + const pp = this.parameterPositions; + let i1 = this._cachedIndex, + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + let right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( let giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + const t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( let giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + const mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + } + + getSettings_() { + + return this.settings || this.DefaultSettings_; + + } + + copySampleValue_( index ) { + + // copies a sample value to the result buffer + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + + // Template methods for derived classes: + + interpolate_( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + } + + intervalChanged_( /* i1, t0, t1 */ ) { + + // empty + + } + +} + +// ALIAS DEFINITIONS + +Interpolant.prototype.beforeStart_ = Interpolant.prototype.copySampleValue_; +Interpolant.prototype.afterEnd_ = Interpolant.prototype.copySampleValue_; + +/** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + */ + +class CubicInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + this.DefaultSettings_ = { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }; + + } + + intervalChanged_( i1, t0, t1 ) { + + const pp = this.parameterPositions; + let iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + const halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + const sP = - wP * ppp + 2 * wP * pp - wP * p; + const s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + const s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + +} + +class LinearInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + +} + +/** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + */ + +class DiscreteInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + +} + +class KeyframeTrack { + + constructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + static toJSON( track ) { + + const trackType = track.constructor; + + let json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== this.toJSON ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + const interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + InterpolantFactoryMethodDiscrete( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodLinear( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodSmooth( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + setInterpolation( interpolation ) { + + let factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + const message = 'unsupported interpolation for ' + + this.ValueTypeName + ' keyframe track named ' + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + } + + getInterpolation() { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + } + + getValueSize() { + + return this.values.length / this.times.length; + + } + + // move all keyframes either forwards or backwards in time + shift( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + } + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale( timeScale ) { + + if ( timeScale !== 1.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + } + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim( startTime, endTime ) { + + const times = this.times, + nKeys = times.length; + + let from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) { + + to = Math.max( to, 1 ); + from = to - 1; + + } + + const stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + } + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate() { + + let valid = true; + + const valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + const times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + let prevTime = null; + + for ( let i = 0; i !== nKeys; i ++ ) { + + const currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( let i = 0, n = values.length; i !== n; ++ i ) { + + const value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + } + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize() { + + // times or values may be shared with other tracks, so overwriting is unsafe + const times = AnimationUtils.arraySlice( this.times ), + values = AnimationUtils.arraySlice( this.values ), + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + lastIndex = times.length - 1; + + let writeIndex = 1; + + for ( let i = 1; i < lastIndex; ++ i ) { + + let keep = false; + + const time = times[ i ]; + const timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + const offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( let j = 0; j !== stride; ++ j ) { + + const value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + const readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } else { + + this.times = times; + this.values = values; + + } + + return this; + + } + + clone() { + + const times = AnimationUtils.arraySlice( this.times, 0 ); + const values = AnimationUtils.arraySlice( this.values, 0 ); + + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack( this.name, times, values ); + + // Interpolant argument to constructor is not saved, so copy the factory method directly. + track.createInterpolant = this.createInterpolant; + + return track; + + } + +} + +KeyframeTrack.prototype.TimeBufferType = Float32Array; +KeyframeTrack.prototype.ValueBufferType = Float32Array; +KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; + +/** + * A Track of Boolean keyframe values. + */ +class BooleanKeyframeTrack extends KeyframeTrack {} + +BooleanKeyframeTrack.prototype.ValueTypeName = 'bool'; +BooleanKeyframeTrack.prototype.ValueBufferType = Array; +BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of keyframe values that represent color. + */ +class ColorKeyframeTrack extends KeyframeTrack {} + +ColorKeyframeTrack.prototype.ValueTypeName = 'color'; + +/** + * A Track of numeric keyframe values. + */ +class NumberKeyframeTrack extends KeyframeTrack {} + +NumberKeyframeTrack.prototype.ValueTypeName = 'number'; + +/** + * Spherical linear unit quaternion interpolant. + */ + +class QuaternionLinearInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + let offset = i1 * stride; + + for ( let end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + +} + +/** + * A Track of quaternion keyframe values. + */ +class QuaternionKeyframeTrack extends KeyframeTrack { + + InterpolantFactoryMethodLinear( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + +} + +QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion'; +// ValueBufferType is inherited +QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; +QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track that interpolates Strings + */ +class StringKeyframeTrack extends KeyframeTrack {} + +StringKeyframeTrack.prototype.ValueTypeName = 'string'; +StringKeyframeTrack.prototype.ValueBufferType = Array; +StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of vectored keyframe values. + */ +class VectorKeyframeTrack extends KeyframeTrack {} + +VectorKeyframeTrack.prototype.ValueTypeName = 'vector'; + +class AnimationClip { + + constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) { + + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + + this.uuid = generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + + static parse( json ) { + + const tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + const clip = new this( json.name, json.duration, tracks, json.blendMode ); + clip.uuid = json.uuid; + + return clip; + + } + + static toJSON( clip ) { + + const tracks = [], + clipTracks = clip.tracks; + + const json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid, + 'blendMode': clip.blendMode + + }; + + for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + } + + static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) { + + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + + for ( let i = 0; i < numMorphTargets; i ++ ) { + + let times = []; + let values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + const order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new this( name, - 1, tracks ); + + } + + static findByName( objectOrClipArray, name ) { + + let clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( let i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + } + + static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) { + + const animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + const pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + const name = parts[ 1 ]; + + let animationMorphTargets = animationToMorphTargets[ name ]; + + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + const clips = []; + + for ( const name in animationToMorphTargets ) { + + clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + } + + // parse the animation.hierarchy format + static parseAnimation( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + const times = []; + const values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + const tracks = []; + + const clipName = animation.name || 'default'; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + + // automatic length determination in AnimationClip. + let duration = animation.length || - 1; + + const hierarchyTracks = animation.hierarchy || []; + + for ( let h = 0; h < hierarchyTracks.length; h ++ ) { + + const animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + const morphTargetNames = {}; + + let k; + + for ( k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( const morphTargetName in morphTargetNames ) { + + const times = []; + const values = []; + + for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + const animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + const boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + const clip = new this( clipName, duration, tracks, blendMode ); + + return clip; + + } + + resetDuration() { + + const tracks = this.tracks; + let duration = 0; + + for ( let i = 0, n = tracks.length; i !== n; ++ i ) { + + const track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + } + + trim() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + } + + validate() { + + let valid = true; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + } + + optimize() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + clone() { + + const tracks = []; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + tracks.push( this.tracks[ i ].clone() ); + + } + + return new this.constructor( this.name, this.duration, tracks, this.blendMode ); + + } + + toJSON() { + + return this.constructor.toJSON( this ); + + } + +} + +function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + +} + +function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + const trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + const times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + +} + +const Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + +class LoadingManager { + + constructor( onLoad, onProgress, onError ) { + + const scope = this; + + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = undefined; + const handlers = []; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + + return this; + + }; + + this.addHandler = function ( regex, loader ) { + + handlers.push( regex, loader ); + + return this; + + }; + + this.removeHandler = function ( regex ) { + + const index = handlers.indexOf( regex ); + + if ( index !== - 1 ) { + + handlers.splice( index, 2 ); + + } + + return this; + + }; + + this.getHandler = function ( file ) { + + for ( let i = 0, l = handlers.length; i < l; i += 2 ) { + + const regex = handlers[ i ]; + const loader = handlers[ i + 1 ]; + + if ( regex.global ) regex.lastIndex = 0; // see #17920 + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + }; + + } + +} + +const DefaultLoadingManager = new LoadingManager(); + +class Loader { + + constructor( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.crossOrigin = 'anonymous'; + this.withCredentials = false; + this.path = ''; + this.resourcePath = ''; + this.requestHeader = {}; + + } + + load( /* url, onLoad, onProgress, onError */ ) {} + + loadAsync( url, onProgress ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.load( url, resolve, onProgress, reject ); + + } ); + + } + + parse( /* data */ ) {} + + setCrossOrigin( crossOrigin ) { + + this.crossOrigin = crossOrigin; + return this; + + } + + setWithCredentials( value ) { + + this.withCredentials = value; + return this; + + } + + setPath( path ) { + + this.path = path; + return this; + + } + + setResourcePath( resourcePath ) { + + this.resourcePath = resourcePath; + return this; + + } + + setRequestHeader( requestHeader ) { + + this.requestHeader = requestHeader; + return this; + + } + +} + +const loading = {}; + +class FileLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + this.manager.itemStart( url ); + + setTimeout( () => { + + if ( onLoad ) onLoad( cached ); + + this.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Initialise array for duplicate requests + loading[ url ] = []; + + loading[ url ].push( { + onLoad: onLoad, + onProgress: onProgress, + onError: onError, + } ); + + // create request + const req = new Request( url, { + headers: new Headers( this.requestHeader ), + credentials: this.withCredentials ? 'include' : 'same-origin', + // An abort controller could be added within a future PR + } ); + + // start the fetch + fetch( req ) + .then( response => { + + if ( response.status === 200 || response.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( response.status === 0 ) { + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + } + + const callbacks = loading[ url ]; + const reader = response.body.getReader(); + const contentLength = response.headers.get( 'Content-Length' ); + const total = contentLength ? parseInt( contentLength ) : 0; + const lengthComputable = total !== 0; + let loaded = 0; + + // periodically read data into the new stream tracking while download progress + return new ReadableStream( { + start( controller ) { + + readData(); + + function readData() { + + reader.read().then( ( { done, value } ) => { + + if ( done ) { + + controller.close(); + + } else { + + loaded += value.byteLength; + + const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } ); + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + controller.enqueue( value ); + readData(); + + } + + } ); + + } + + } + + } ); + + } else { + + throw Error( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}` ); + + } + + } ) + .then( stream => { + + const response = new Response( stream ); + + switch ( this.responseType ) { + + case 'arraybuffer': + + return response.arrayBuffer(); + + case 'blob': + + return response.blob(); + + case 'document': + + return response.text() + .then( text => { + + const parser = new DOMParser(); + return parser.parseFromString( text, this.mimeType ); + + } ); + + case 'json': + + return response.json(); + + default: + + return response.text(); + + } + + } ) + .then( data => { + + // Add to cache only on HTTP success, so that we do not cache + // error response bodies as proper responses to requests. + Cache.add( url, data ); + + const callbacks = loading[ url ]; + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( data ); + + } + + this.manager.itemEnd( url ); + + } ) + .catch( err => { + + // Abort errors and other errors are handled the same + + const callbacks = loading[ url ]; + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( err ); + + } + + this.manager.itemError( url ); + this.manager.itemEnd( url ); + + } ); + + this.manager.itemStart( url ); + + } + + setResponseType( value ) { + + this.responseType = value; + return this; + + } + + setMimeType( value ) { + + this.mimeType = value; + return this; + + } + +} + +class AnimationLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const animations = []; + + for ( let i = 0; i < json.length; i ++ ) { + + const clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + } + +} + +/** + * Abstract Base class to block based textures loader (dds, pvr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + +class CompressedTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const images = []; + + const texture = new CompressedTexture(); + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter; + + texture.image = images; + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + for ( let i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + if ( texDatas.isCubemap ) { + + const faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( let f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( let i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + texture.image = images; + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + } + +} + +class ImageLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const image = createElementNS( 'img' ); + + function onImageLoad() { + + removeEventListeners(); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + removeEventListeners(); + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } + + function removeEventListeners() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + } + +} + +class CubeTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( urls, onLoad, onProgress, onError ) { + + const texture = new CubeTexture(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( let i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + } + +} + +/** + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + +class DataTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const texture = new DataTexture(); + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setPath( this.path ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( buffer ) { + + const texData = scope.parse( buffer ); + + if ( ! texData ) return; + + if ( texData.image !== undefined ) { + + texture.image = texData.image; + + } else if ( texData.data !== undefined ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter; + + texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1; + + if ( texData.encoding !== undefined ) { + + texture.encoding = texData.encoding; + + } + + if ( texData.flipY !== undefined ) { + + texture.flipY = texData.flipY; + + } + + if ( texData.format !== undefined ) { + + texture.format = texData.format; + + } + + if ( texData.type !== undefined ) { + + texture.type = texData.type; + + } + + if ( texData.mipmaps !== undefined ) { + + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; // presumably... + + } + + if ( texData.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + if ( texData.generateMipmaps !== undefined ) { + + texture.generateMipmaps = texData.generateMipmaps; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + +} + +class TextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const texture = new Texture(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + } + +} + +class Light extends Object3D { + + constructor( color, intensity = 1 ) { + + super(); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity; + + } + + dispose() { + + // Empty here in base class; some subclasses override. + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + +} + +Light.prototype.isLight = true; + +class HemisphereLight extends Light { + + constructor( skyColor, groundColor, intensity ) { + + super( skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + copy( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + +} + +HemisphereLight.prototype.isHemisphereLight = true; + +const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3(); +const _lookTarget$1 = /*@__PURE__*/ new Vector3(); + +class LightShadow { + + constructor( camera ) { + + this.camera = camera; + + this.bias = 0; + this.normalBias = 0; + this.radius = 1; + this.blurSamples = 8; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.mapPass = null; + this.matrix = new Matrix4(); + + this.autoUpdate = true; + this.needsUpdate = false; + + this._frustum = new Frustum(); + this._frameExtents = new Vector2( 1, 1 ); + + this._viewportCount = 1; + + this._viewports = [ + + new Vector4( 0, 0, 1, 1 ) + + ]; + + } + + getViewportCount() { + + return this._viewportCount; + + } + + getFrustum() { + + return this._frustum; + + } + + updateMatrices( light ) { + + const shadowCamera = this.camera; + const shadowMatrix = this.matrix; + + _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld$1 ); + + _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget$1 ); + shadowCamera.updateMatrixWorld(); + + _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 ); + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + getViewport( viewportIndex ) { + + return this._viewports[ viewportIndex ]; + + } + + getFrameExtents() { + + return this._frameExtents; + + } + + dispose() { + + if ( this.map ) { + + this.map.dispose(); + + } + + if ( this.mapPass ) { + + this.mapPass.dispose(); + + } + + } + + copy( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + toJSON() { + + const object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.normalBias !== 0 ) object.normalBias = this.normalBias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + +} + +class SpotLightShadow extends LightShadow { + + constructor() { + + super( new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + this.focus = 1; + + } + + updateMatrices( light ) { + + const camera = this.camera; + + const fov = RAD2DEG * 2 * light.angle * this.focus; + const aspect = this.mapSize.width / this.mapSize.height; + const far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + super.updateMatrices( light ); + + } + + copy( source ) { + + super.copy( source ); + + this.focus = source.focus; + + return this; + + } + +} + +SpotLightShadow.prototype.isSpotLightShadow = true; + +class SpotLight extends Light { + + constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) { + + super( color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.distance = distance; + this.angle = angle; + this.penumbra = penumbra; + this.decay = decay; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd) + return this.intensity * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / Math.PI; + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source ) { + + super.copy( source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +SpotLight.prototype.isSpotLight = true; + +const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld = /*@__PURE__*/ new Vector3(); +const _lookTarget = /*@__PURE__*/ new Vector3(); + +class PointLightShadow extends LightShadow { + + constructor() { + + super( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + this._frameExtents = new Vector2( 4, 2 ); + + this._viewportCount = 6; + + this._viewports = [ + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + new Vector4( 2, 1, 1, 1 ), + // negative X + new Vector4( 0, 1, 1, 1 ), + // positive Z + new Vector4( 3, 1, 1, 1 ), + // negative Z + new Vector4( 1, 1, 1, 1 ), + // positive Y + new Vector4( 3, 0, 1, 1 ), + // negative Y + new Vector4( 1, 0, 1, 1 ) + ]; + + this._cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + this._cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + } + + updateMatrices( light, viewportIndex = 0 ) { + + const camera = this.camera; + const shadowMatrix = this.matrix; + + const far = light.distance || camera.far; + + if ( far !== camera.far ) { + + camera.far = far; + camera.updateProjectionMatrix(); + + } + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + camera.position.copy( _lightPositionWorld ); + + _lookTarget.copy( camera.position ); + _lookTarget.add( this._cubeDirections[ viewportIndex ] ); + camera.up.copy( this._cubeUps[ viewportIndex ] ); + camera.lookAt( _lookTarget ); + camera.updateMatrixWorld(); + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix ); + + } + +} + +PointLightShadow.prototype.isPointLightShadow = true; + +class PointLight extends Light { + + constructor( color, intensity, distance = 0, decay = 1 ) { + + super( color, intensity ); + + this.type = 'PointLight'; + + this.distance = distance; + this.decay = decay; // for physically correct lights, should be 2. + + this.shadow = new PointLightShadow(); + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd) + return this.intensity * 4 * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / ( 4 * Math.PI ); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source ) { + + super.copy( source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +PointLight.prototype.isPointLight = true; + +class DirectionalLightShadow extends LightShadow { + + constructor() { + + super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + +} + +DirectionalLightShadow.prototype.isDirectionalLightShadow = true; + +class DirectionalLight extends Light { + + constructor( color, intensity ) { + + super( color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source ) { + + super.copy( source ); + + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +DirectionalLight.prototype.isDirectionalLight = true; + +class AmbientLight extends Light { + + constructor( color, intensity ) { + + super( color, intensity ); + + this.type = 'AmbientLight'; + + } + +} + +AmbientLight.prototype.isAmbientLight = true; + +class RectAreaLight extends Light { + + constructor( color, intensity, width = 10, height = 10 ) { + + super( color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = width; + this.height = height; + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in nits) + return this.intensity * this.width * this.height * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in nits) from the desired luminous power (in lumens) + this.intensity = power / ( this.width * this.height * Math.PI ); + + } + + copy( source ) { + + super.copy( source ); + + this.width = source.width; + this.height = source.height; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + +} + +RectAreaLight.prototype.isRectAreaLight = true; + +/** + * Primary reference: + * https://graphics.stanford.edu/papers/envmap/envmap.pdf + * + * Secondary reference: + * https://www.ppsloan.org/publications/StupidSH36.pdf + */ + +// 3-band SH defined by 9 coefficients + +class SphericalHarmonics3 { + + constructor() { + + this.coefficients = []; + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients.push( new Vector3() ); + + } + + } + + set( coefficients ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].copy( coefficients[ i ] ); + + } + + return this; + + } + + zero() { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].set( 0, 0, 0 ); + + } + + return this; + + } + + // get the radiance in the direction of the normal + // target is a Vector3 + getAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 ); + + // band 1 + target.addScaledVector( coeff[ 1 ], 0.488603 * y ); + target.addScaledVector( coeff[ 2 ], 0.488603 * z ); + target.addScaledVector( coeff[ 3 ], 0.488603 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) ); + target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) ); + target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) ); + target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) ); + target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) ); + + return target; + + } + + // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal + // target is a Vector3 + // https://graphics.stanford.edu/papers/envmap/envmap.pdf + getIrradianceAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095 + + // band 1 + target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603 + target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z ); + target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548 + target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z ); + target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3 + target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z ); + target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274 + + return target; + + } + + add( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].add( sh.coefficients[ i ] ); + + } + + return this; + + } + + addScaledSH( sh, s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s ); + + } + + return this; + + } + + scale( s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].multiplyScalar( s ); + + } + + return this; + + } + + lerp( sh, alpha ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha ); + + } + + return this; + + } + + equals( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) { + + return false; + + } + + } + + return true; + + } + + copy( sh ) { + + return this.set( sh.coefficients ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + fromArray( array, offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].fromArray( array, offset + ( i * 3 ) ); + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].toArray( array, offset + ( i * 3 ) ); + + } + + return array; + + } + + // evaluate the basis functions + // shBasis is an Array[ 9 ] + static getBasisAt( normal, shBasis ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + // band 0 + shBasis[ 0 ] = 0.282095; + + // band 1 + shBasis[ 1 ] = 0.488603 * y; + shBasis[ 2 ] = 0.488603 * z; + shBasis[ 3 ] = 0.488603 * x; + + // band 2 + shBasis[ 4 ] = 1.092548 * x * y; + shBasis[ 5 ] = 1.092548 * y * z; + shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 ); + shBasis[ 7 ] = 1.092548 * x * z; + shBasis[ 8 ] = 0.546274 * ( x * x - y * y ); + + } + +} + +SphericalHarmonics3.prototype.isSphericalHarmonics3 = true; + +class LightProbe extends Light { + + constructor( sh = new SphericalHarmonics3(), intensity = 1 ) { + + super( undefined, intensity ); + + this.sh = sh; + + } + + copy( source ) { + + super.copy( source ); + + this.sh.copy( source.sh ); + + return this; + + } + + fromJSON( json ) { + + this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON(); + this.sh.fromArray( json.sh ); + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.sh = this.sh.toArray(); + + return data; + + } + +} + +LightProbe.prototype.isLightProbe = true; + +class MaterialLoader extends Loader { + + constructor( manager ) { + + super( manager ); + this.textures = {}; + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + const material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.sheen !== undefined ) material.sheen = json.sheen; + if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor ); + if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness; + if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity; + if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat; + if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness; + if ( json.transmission !== undefined ) material.transmission = json.transmission; + if ( json.thickness !== undefined ) material.thickness = json.thickness; + if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance; + if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor ); + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.format !== undefined ) material.format = json.format; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + + if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite; + if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask; + if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc; + if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef; + if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask; + if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail; + if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail; + if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass; + + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage; + if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha; + + if ( json.visible !== undefined ) material.visible = json.visible; + + if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped; + + if ( json.userData !== undefined ) material.userData = json.userData; + + if ( json.vertexColors !== undefined ) { + + if ( typeof json.vertexColors === 'number' ) { + + material.vertexColors = ( json.vertexColors > 0 ) ? true : false; + + } else { + + material.vertexColors = json.vertexColors; + + } + + } + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( const name in json.uniforms ) { + + const uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm3': + material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + if ( json.extensions !== undefined ) { + + for ( const key in json.extensions ) { + + material.extensions[ key ] = json.extensions[ key ]; + + } + + } + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap ); + + if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap ); + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + let normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap ); + if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap ); + if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap ); + if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap ); + if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale ); + + if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap ); + if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap ); + + if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap ); + if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap ); + + return material; + + } + + setTextures( value ) { + + this.textures = value; + return this; + + } + +} + +class LoaderUtils { + + static decodeText( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + let s = ''; + + for ( let i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + try { + + // merges multi-byte utf-8 characters. + + return decodeURIComponent( escape( s ) ); + + } catch ( e ) { // see #16358 + + return s; + + } + + } + + static extractUrlBase( url ) { + + const index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + static resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + +} + +class InstancedBufferGeometry extends BufferGeometry { + + constructor() { + + super(); + + this.type = 'InstancedBufferGeometry'; + this.instanceCount = Infinity; + + } + + copy( source ) { + + super.copy( source ); + + this.instanceCount = source.instanceCount; + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + toJSON() { + + const data = super.toJSON( this ); + + data.instanceCount = this.instanceCount; + + data.isInstancedBufferGeometry = true; + + return data; + + } + +} + +InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true; + +class BufferGeometryLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const interleavedBufferMap = {}; + const arrayBufferMap = {}; + + function getInterleavedBuffer( json, uuid ) { + + if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ]; + + const interleavedBuffers = json.interleavedBuffers; + const interleavedBuffer = interleavedBuffers[ uuid ]; + + const buffer = getArrayBuffer( json, interleavedBuffer.buffer ); + + const array = getTypedArray( interleavedBuffer.type, buffer ); + const ib = new InterleavedBuffer( array, interleavedBuffer.stride ); + ib.uuid = interleavedBuffer.uuid; + + interleavedBufferMap[ uuid ] = ib; + + return ib; + + } + + function getArrayBuffer( json, uuid ) { + + if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ]; + + const arrayBuffers = json.arrayBuffers; + const arrayBuffer = arrayBuffers[ uuid ]; + + const ab = new Uint32Array( arrayBuffer ).buffer; + + arrayBufferMap[ uuid ] = ab; + + return ab; + + } + + const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); + + const index = json.data.index; + + if ( index !== undefined ) { + + const typedArray = getTypedArray( index.type, index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + const attributes = json.data.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; + bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage ); + + if ( attribute.updateRange !== undefined ) { + + bufferAttribute.updateRange.offset = attribute.updateRange.offset; + bufferAttribute.updateRange.count = attribute.updateRange.count; + + } + + geometry.setAttribute( key, bufferAttribute ); + + } + + const morphAttributes = json.data.morphAttributes; + + if ( morphAttributes ) { + + for ( const key in morphAttributes ) { + + const attributeArray = morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + array.push( bufferAttribute ); + + } + + geometry.morphAttributes[ key ] = array; + + } + + } + + const morphTargetsRelative = json.data.morphTargetsRelative; + + if ( morphTargetsRelative ) { + + geometry.morphTargetsRelative = true; + + } + + const groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( let i = 0, n = groups.length; i !== n; ++ i ) { + + const group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + const boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + const center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + if ( json.name ) geometry.name = json.name; + if ( json.userData ) geometry.userData = json.userData; + + return geometry; + + } + +} + +class ObjectLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + let json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + const metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + } + + async loadAsync( url, onProgress ) { + + const scope = this; + + const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + const text = await loader.loadAsync( url, onProgress ); + + const json = JSON.parse( text ); + + const metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url ); + + } + + return await scope.parseAsync( json ); + + } + + parse( json, onLoad ) { + + const animations = this.parseAnimations( json.animations ); + const shapes = this.parseShapes( json.shapes ); + const geometries = this.parseGeometries( json.geometries, shapes ); + + const images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + const textures = this.parseTextures( json.textures, images ); + const materials = this.parseMaterials( json.materials, textures ); + + const object = this.parseObject( json.object, geometries, materials, textures, animations ); + const skeletons = this.parseSkeletons( json.skeletons, object ); + + this.bindSkeletons( object, skeletons ); + + // + + if ( onLoad !== undefined ) { + + let hasImages = false; + + for ( const uuid in images ) { + + if ( images[ uuid ] instanceof HTMLImageElement ) { + + hasImages = true; + break; + + } + + } + + if ( hasImages === false ) onLoad( object ); + + } + + return object; + + } + + async parseAsync( json ) { + + const animations = this.parseAnimations( json.animations ); + const shapes = this.parseShapes( json.shapes ); + const geometries = this.parseGeometries( json.geometries, shapes ); + + const images = await this.parseImagesAsync( json.images ); + + const textures = this.parseTextures( json.textures, images ); + const materials = this.parseMaterials( json.materials, textures ); + + const object = this.parseObject( json.object, geometries, materials, textures, animations ); + const skeletons = this.parseSkeletons( json.skeletons, object ); + + this.bindSkeletons( object, skeletons ); + + return object; + + } + + parseShapes( json ) { + + const shapes = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + } + + parseSkeletons( json, object ) { + + const skeletons = {}; + const bones = {}; + + // generate bone lookup table + + object.traverse( function ( child ) { + + if ( child.isBone ) bones[ child.uuid ] = child; + + } ); + + // create skeletons + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const skeleton = new Skeleton().fromJSON( json[ i ], bones ); + + skeletons[ skeleton.uuid ] = skeleton; + + } + + } + + return skeletons; + + } + + parseGeometries( json, shapes ) { + + const geometries = {}; + + if ( json !== undefined ) { + + const bufferGeometryLoader = new BufferGeometryLoader(); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + let geometry; + const data = json[ i ]; + + switch ( data.type ) { + + case 'BufferGeometry': + case 'InstancedBufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + console.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' ); + + break; + + default: + + if ( data.type in Geometries ) { + + geometry = Geometries[ data.type ].fromJSON( data, shapes ); + + } else { + + console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` ); + + } + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + } + + parseMaterials( json, textures ) { + + const cache = {}; // MultiMaterial + const materials = {}; + + if ( json !== undefined ) { + + const loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + const array = []; + + for ( let j = 0; j < data.materials.length; j ++ ) { + + const material = data.materials[ j ]; + + if ( cache[ material.uuid ] === undefined ) { + + cache[ material.uuid ] = loader.parse( material ); + + } + + array.push( cache[ material.uuid ] ); + + } + + materials[ data.uuid ] = array; + + } else { + + if ( cache[ data.uuid ] === undefined ) { + + cache[ data.uuid ] = loader.parse( data ); + + } + + materials[ data.uuid ] = cache[ data.uuid ]; + + } + + } + + } + + return materials; + + } + + parseAnimations( json ) { + + const animations = {}; + + if ( json !== undefined ) { + + for ( let i = 0; i < json.length; i ++ ) { + + const data = json[ i ]; + + const clip = AnimationClip.parse( data ); + + animations[ clip.uuid ] = clip; + + } + + } + + return animations; + + } + + parseImages( json, onLoad ) { + + const scope = this; + const images = {}; + + let loader; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + } + + function deserializeImage( image ) { + + if ( typeof image === 'string' ) { + + const url = image; + + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; + + return loadImage( path ); + + } else { + + if ( image.data ) { + + return { + data: getTypedArray( image.type, image.data ), + width: image.width, + height: image.height + }; + + } else { + + return null; + + } + + } + + } + + if ( json !== undefined && json.length > 0 ) { + + const manager = new LoadingManager( onLoad ); + + loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( let i = 0, il = json.length; i < il; i ++ ) { + + const image = json[ i ]; + const url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( let j = 0, jl = url.length; j < jl; j ++ ) { + + const currentUrl = url[ j ]; + + const deserializedImage = deserializeImage( currentUrl ); + + if ( deserializedImage !== null ) { + + if ( deserializedImage instanceof HTMLImageElement ) { + + images[ image.uuid ].push( deserializedImage ); + + } else { + + // special case: handle array of data textures for cube textures + + images[ image.uuid ].push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); + + } + + } + + } + + } else { + + // load single image + + const deserializedImage = deserializeImage( image.url ); + + if ( deserializedImage !== null ) { + + images[ image.uuid ] = deserializedImage; + + } + + } + + } + + } + + return images; + + } + + async parseImagesAsync( json ) { + + const scope = this; + const images = {}; + + let loader; + + async function deserializeImage( image ) { + + if ( typeof image === 'string' ) { + + const url = image; + + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; + + return await loader.loadAsync( path ); + + } else { + + if ( image.data ) { + + return { + data: getTypedArray( image.type, image.data ), + width: image.width, + height: image.height + }; + + } else { + + return null; + + } + + } + + } + + if ( json !== undefined && json.length > 0 ) { + + loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( let i = 0, il = json.length; i < il; i ++ ) { + + const image = json[ i ]; + const url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( let j = 0, jl = url.length; j < jl; j ++ ) { + + const currentUrl = url[ j ]; + + const deserializedImage = await deserializeImage( currentUrl ); + + if ( deserializedImage !== null ) { + + if ( deserializedImage instanceof HTMLImageElement ) { + + images[ image.uuid ].push( deserializedImage ); + + } else { + + // special case: handle array of data textures for cube textures + + images[ image.uuid ].push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); + + } + + } + + } + + } else { + + // load single image + + const deserializedImage = await deserializeImage( image.url ); + + if ( deserializedImage !== null ) { + + images[ image.uuid ] = deserializedImage; + + } + + } + + } + + } + + return images; + + } + + parseTextures( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + const textures = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + let texture; + const image = images[ data.image ]; + + if ( Array.isArray( image ) ) { + + texture = new CubeTexture( image ); + + if ( image.length === 6 ) texture.needsUpdate = true; + + } else { + + if ( image && image.data ) { + + texture = new DataTexture( image.data, image.width, image.height ); + + } else { + + texture = new Texture( image ); + + } + + if ( image ) texture.needsUpdate = true; // textures can have undefined image data + + } + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + if ( data.type !== undefined ) texture.type = data.type; + if ( data.encoding !== undefined ) texture.encoding = data.encoding; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha; + if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment; + + if ( data.userData !== undefined ) texture.userData = data.userData; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + } + + parseObject( data, geometries, materials, textures, animations ) { + + let object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + const array = []; + + for ( let i = 0, l = name.length; i < l; i ++ ) { + + const uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + function getTexture( uuid ) { + + if ( textures[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined texture', uuid ); + + } + + return textures[ uuid ]; + + } + + let geometry, material; + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } else { + + object.background = getTexture( data.background ); + + } + + } + + if ( data.environment !== undefined ) { + + object.environment = getTexture( data.environment ); + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'LightProbe': + + object = new LightProbe().fromJSON( data ); + + break; + + case 'SkinnedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new SkinnedMesh( geometry, material ); + + if ( data.bindMode !== undefined ) object.bindMode = data.bindMode; + if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix ); + if ( data.skeleton !== undefined ) object.skeleton = data.skeleton; + + break; + + case 'Mesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new Mesh( geometry, material ); + + break; + + case 'InstancedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + const count = data.count; + const instanceMatrix = data.instanceMatrix; + const instanceColor = data.instanceColor; + + object = new InstancedMesh( geometry, material, count ); + object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 ); + if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize ); + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + case 'Bone': + + object = new Bone(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + const children = data.children; + + for ( let i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) ); + + } + + } + + if ( data.animations !== undefined ) { + + const objectAnimations = data.animations; + + for ( let i = 0; i < objectAnimations.length; i ++ ) { + + const uuid = objectAnimations[ i ]; + + object.animations.push( animations[ uuid ] ); + + } + + } + + if ( data.type === 'LOD' ) { + + if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate; + + const levels = data.levels; + + for ( let l = 0; l < levels.length; l ++ ) { + + const level = levels[ l ]; + const child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + bindSkeletons( object, skeletons ) { + + if ( Object.keys( skeletons ).length === 0 ) return; + + object.traverse( function ( child ) { + + if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) { + + const skeleton = skeletons[ child.skeleton ]; + + if ( skeleton === undefined ) { + + console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton ); + + } else { + + child.bind( skeleton, child.bindMatrix ); + + } + + } + + } ); + + } + + /* DEPRECATED */ + + setTexturePath( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + +} + +const TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping +}; + +const TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping +}; + +const TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipmapNearestFilter: NearestMipmapNearestFilter, + NearestMipmapLinearFilter: NearestMipmapLinearFilter, + LinearFilter: LinearFilter, + LinearMipmapNearestFilter: LinearMipmapNearestFilter, + LinearMipmapLinearFilter: LinearMipmapLinearFilter +}; + +class ImageBitmapLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.options = { premultiplyAlpha: 'none' }; + + } + + setOptions( options ) { + + this.options = options; + + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const fetchOptions = {}; + fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include'; + fetchOptions.headers = this.requestHeader; + + fetch( url, fetchOptions ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + scope.manager.itemStart( url ); + + } + +} + +ImageBitmapLoader.prototype.isImageBitmapLoader = true; + +let _context; + +const AudioContext = { + + getContext: function () { + + if ( _context === undefined ) { + + _context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return _context; + + }, + + setContext: function ( value ) { + + _context = value; + + } + +}; + +class AudioLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( buffer ) { + + try { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + const bufferCopy = buffer.slice( 0 ); + + const context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + +} + +class HemisphereLightProbe extends LightProbe { + + constructor( skyColor, groundColor, intensity = 1 ) { + + super( undefined, intensity ); + + const color1 = new Color().set( skyColor ); + const color2 = new Color().set( groundColor ); + + const sky = new Vector3( color1.r, color1.g, color1.b ); + const ground = new Vector3( color2.r, color2.g, color2.b ); + + // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI ); + const c0 = Math.sqrt( Math.PI ); + const c1 = c0 * Math.sqrt( 0.75 ); + + this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 ); + this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 ); + + } + +} + +HemisphereLightProbe.prototype.isHemisphereLightProbe = true; + +class AmbientLightProbe extends LightProbe { + + constructor( color, intensity = 1 ) { + + super( undefined, intensity ); + + const color1 = new Color().set( color ); + + // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI ); + this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) ); + + } + +} + +AmbientLightProbe.prototype.isAmbientLightProbe = true; + +const _eyeRight = /*@__PURE__*/ new Matrix4(); +const _eyeLeft = /*@__PURE__*/ new Matrix4(); + +class StereoCamera { + + constructor() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + this._cache = { + focus: null, + fov: null, + aspect: null, + near: null, + far: null, + zoom: null, + eyeSep: null + }; + + } + + update( camera ) { + + const cache = this._cache; + + const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || + cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || + cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + cache.focus = camera.focus; + cache.fov = camera.fov; + cache.aspect = camera.aspect * this.aspect; + cache.near = camera.near; + cache.far = camera.far; + cache.zoom = camera.zoom; + cache.eyeSep = this.eyeSep; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + const projectionMatrix = camera.projectionMatrix.clone(); + const eyeSepHalf = cache.eyeSep / 2; + const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; + const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom; + let xmin, xmax; + + // translate xOffset + + _eyeLeft.elements[ 12 ] = - eyeSepHalf; + _eyeRight.elements[ 12 ] = eyeSepHalf; + + // for left eye + + xmin = - ymax * cache.aspect + eyeSepOnProjection; + xmax = ymax * cache.aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * cache.aspect - eyeSepOnProjection; + xmax = ymax * cache.aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight ); + + } + +} + +class Clock { + + constructor( autoStart = true ) { + + this.autoStart = autoStart; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + start() { + + this.startTime = now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + } + + stop() { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + } + + getElapsedTime() { + + this.getDelta(); + return this.elapsedTime; + + } + + getDelta() { + + let diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + const newTime = now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +} + +function now() { + + return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + +} + +const _position$1 = /*@__PURE__*/ new Vector3(); +const _quaternion$1 = /*@__PURE__*/ new Quaternion(); +const _scale$1 = /*@__PURE__*/ new Vector3(); +const _orientation$1 = /*@__PURE__*/ new Vector3(); + +class AudioListener extends Object3D { + + constructor() { + + super(); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + this.timeDelta = 0; + + // private + + this._clock = new Clock(); + + } + + getInput() { + + return this.gain; + + } + + removeFilter() { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + } + + getFilter() { + + return this.filter; + + } + + setFilter( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + } + + getMasterVolume() { + + return this.gain.gain.value; + + } + + setMasterVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + const listener = this.context.listener; + const up = this.up; + + this.timeDelta = this._clock.getDelta(); + + this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 ); + + _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 ); + + if ( listener.positionX ) { + + // code path for Chrome (see #14393) + + const endTime = this.context.currentTime + this.timeDelta; + + listener.positionX.linearRampToValueAtTime( _position$1.x, endTime ); + listener.positionY.linearRampToValueAtTime( _position$1.y, endTime ); + listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime ); + listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime ); + listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime ); + listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime ); + listener.upX.linearRampToValueAtTime( up.x, endTime ); + listener.upY.linearRampToValueAtTime( up.y, endTime ); + listener.upZ.linearRampToValueAtTime( up.z, endTime ); + + } else { + + listener.setPosition( _position$1.x, _position$1.y, _position$1.z ); + listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z ); + + } + + } + +} + +class Audio extends Object3D { + + constructor( listener ) { + + super(); + + this.type = 'Audio'; + + this.listener = listener; + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.detune = 0; + this.loop = false; + this.loopStart = 0; + this.loopEnd = 0; + this.offset = 0; + this.duration = undefined; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.source = null; + this.sourceType = 'empty'; + + this._startedAt = 0; + this._progress = 0; + this._connected = false; + + this.filters = []; + + } + + getOutput() { + + return this.gain; + + } + + setNodeSource( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + } + + setMediaElementSource( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + } + + setMediaStreamSource( mediaStream ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaStreamNode'; + this.source = this.context.createMediaStreamSource( mediaStream ); + this.connect(); + + return this; + + } + + setBuffer( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + } + + play( delay = 0 ) { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._startedAt = this.context.currentTime + delay; + + const source = this.context.createBufferSource(); + source.buffer = this.buffer; + source.loop = this.loop; + source.loopStart = this.loopStart; + source.loopEnd = this.loopEnd; + source.onended = this.onEnded.bind( this ); + source.start( this._startedAt, this._progress + this.offset, this.duration ); + + this.isPlaying = true; + + this.source = source; + + this.setDetune( this.detune ); + this.setPlaybackRate( this.playbackRate ); + + return this.connect(); + + } + + pause() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + // update current progress + + this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate; + + if ( this.loop === true ) { + + // ensure _progress does not exceed duration with looped audios + + this._progress = this._progress % ( this.duration || this.buffer.duration ); + + } + + this.source.stop(); + this.source.onended = null; + + this.isPlaying = false; + + } + + return this; + + } + + stop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._progress = 0; + + this.source.stop(); + this.source.onended = null; + this.isPlaying = false; + + return this; + + } + + connect() { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + this._connected = true; + + return this; + + } + + disconnect() { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + this._connected = false; + + return this; + + } + + getFilters() { + + return this.filters; + + } + + setFilters( value ) { + + if ( ! value ) value = []; + + if ( this._connected === true ) { + + this.disconnect(); + this.filters = value.slice(); + this.connect(); + + } else { + + this.filters = value.slice(); + + } + + return this; + + } + + setDetune( value ) { + + this.detune = value; + + if ( this.source.detune === undefined ) return; // only set detune when available + + if ( this.isPlaying === true ) { + + this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getDetune() { + + return this.detune; + + } + + getFilter() { + + return this.getFilters()[ 0 ]; + + } + + setFilter( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + } + + setPlaybackRate( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getPlaybackRate() { + + return this.playbackRate; + + } + + onEnded() { + + this.isPlaying = false; + + } + + getLoop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + } + + setLoop( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + } + + setLoopStart( value ) { + + this.loopStart = value; + + return this; + + } + + setLoopEnd( value ) { + + this.loopEnd = value; + + return this; + + } + + getVolume() { + + return this.gain.gain.value; + + } + + setVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + +} + +const _position = /*@__PURE__*/ new Vector3(); +const _quaternion = /*@__PURE__*/ new Quaternion(); +const _scale = /*@__PURE__*/ new Vector3(); +const _orientation = /*@__PURE__*/ new Vector3(); + +class PositionalAudio extends Audio { + + constructor( listener ) { + + super( listener ); + + this.panner = this.context.createPanner(); + this.panner.panningModel = 'HRTF'; + this.panner.connect( this.gain ); + + } + + getOutput() { + + return this.panner; + + } + + getRefDistance() { + + return this.panner.refDistance; + + } + + setRefDistance( value ) { + + this.panner.refDistance = value; + + return this; + + } + + getRolloffFactor() { + + return this.panner.rolloffFactor; + + } + + setRolloffFactor( value ) { + + this.panner.rolloffFactor = value; + + return this; + + } + + getDistanceModel() { + + return this.panner.distanceModel; + + } + + setDistanceModel( value ) { + + this.panner.distanceModel = value; + + return this; + + } + + getMaxDistance() { + + return this.panner.maxDistance; + + } + + setMaxDistance( value ) { + + this.panner.maxDistance = value; + + return this; + + } + + setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.hasPlaybackControl === true && this.isPlaying === false ) return; + + this.matrixWorld.decompose( _position, _quaternion, _scale ); + + _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion ); + + const panner = this.panner; + + if ( panner.positionX ) { + + // code path for Chrome and Firefox (see #14393) + + const endTime = this.context.currentTime + this.listener.timeDelta; + + panner.positionX.linearRampToValueAtTime( _position.x, endTime ); + panner.positionY.linearRampToValueAtTime( _position.y, endTime ); + panner.positionZ.linearRampToValueAtTime( _position.z, endTime ); + panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime ); + panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime ); + panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime ); + + } else { + + panner.setPosition( _position.x, _position.y, _position.z ); + panner.setOrientation( _orientation.x, _orientation.y, _orientation.z ); + + } + + } + +} + +class AudioAnalyser { + + constructor( audio, fftSize = 2048 ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + + getFrequencyData() { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + } + + getAverageFrequency() { + + let value = 0; + const data = this.getFrequencyData(); + + for ( let i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + +} + +class PropertyMixer { + + constructor( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + let mixFunction, + mixFunctionAdditive, + setIdentity; + + // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + // + // 'add' is used for additive cumulative results + // + // 'work' is optional and is only present for quaternion types. It is used + // to store intermediate quaternion multiplication results + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + + this.buffer = new Float64Array( valueSize * 6 ); + this._workIndex = 5; + break; + + case 'string': + case 'bool': + mixFunction = this._select; + + // Use the regular mix function and for additive on these types, + // additive is not relevant for non-numeric types + mixFunctionAdditive = this._select; + + setIdentity = this._setAdditiveIdentityOther; + + this.buffer = new Array( valueSize * 5 ); + break; + + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + + this.buffer = new Float64Array( valueSize * 5 ); + + } + + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + // accumulate data in the 'incoming' region into 'accu' + accumulate( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + const buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride; + + let currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + } + + // accumulate data in the 'incoming' region into 'add' + accumulateAdditive( weight ) { + + const buffer = this.buffer, + stride = this.valueSize, + offset = stride * this._addIndex; + + if ( this.cumulativeWeightAdditive === 0 ) { + + // add = identity + + this._setIdentity(); + + } + + // add := add + incoming * weight + + this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride ); + this.cumulativeWeightAdditive += weight; + + } + + // apply the state of 'accu' to the binding when accus differ + apply( accuIndex ) { + + const stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + weightAdditive = this.cumulativeWeightAdditive, + + binding = this.binding; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + const originalValueOffset = stride * this._origIndex; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + if ( weightAdditive > 0 ) { + + // accuN := accuN + additive accuN + + this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride ); + + } + + for ( let i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + } + + // remember the state of the bound property and copy it to both accus + saveOriginalState() { + + const binding = this.binding; + + const buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * this._origIndex; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + // Add to identity for additive + this._setIdentity(); + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + } + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState() { + + const originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + } + + _setAdditiveIdentityNumeric() { + + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + + for ( let i = startIndex; i < endIndex; i ++ ) { + + this.buffer[ i ] = 0; + + } + + } + + _setAdditiveIdentityQuaternion() { + + this._setAdditiveIdentityNumeric(); + this.buffer[ this._addIndex * this.valueSize + 3 ] = 1; + + } + + _setAdditiveIdentityOther() { + + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + + for ( let i = 0; i < this.valueSize; i ++ ) { + + this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ]; + + } + + } + + + // mix functions + + _select( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + } + + _slerp( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + } + + _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + const workOffset = this._workIndex * stride; + + // Store result in intermediate buffer offset + Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset ); + + // Slerp to the intermediate result + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t ); + + } + + _lerp( buffer, dstOffset, srcOffset, t, stride ) { + + const s = 1 - t; + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t; + + } + + } + +} + +// Characters [].:/ are reserved for track binding syntax. +const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; +const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' ); + +// Attempts to allow node names from any language. ES5's `\w` regexp matches +// only latin characters, and the unicode \p{L} is not yet supported. So +// instead, we exclude reserved characters and match everything else. +const _wordChar = '[^' + _RESERVED_CHARS_RE + ']'; +const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + +// Parent directories, delimited by '/' or ':'. Currently unused, but must +// be matched to parse the rest of the track name. +const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar ); + +// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. +const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot ); + +// Object on target node, and accessor. May not contain reserved +// characters. Accessor may contain any character except closing bracket. +const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar ); + +// Property and accessor. May not contain reserved characters. Accessor may +// contain any non-bracket characters. +const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar ); + +const _trackRe = new RegExp( '' + + '^' + + _directoryRe + + _nodeRe + + _objectRe + + _propertyRe + + '$' +); + +const _supportedObjectNames = [ 'material', 'materials', 'bones' ]; + +class Composite { + + constructor( targetGroup, path, optionalParsedPath ) { + + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + getValue( array, offset ) { + + this.bind(); // bind all binding + + const firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + } + + setValue( array, offset ) { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + } + + bind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + } + + unbind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + +} + +// Note: This class uses a State pattern on a per-method basis: +// 'bind' sets 'this.getValue' / 'setValue' and shadows the +// prototype version of these methods with one that represents +// the bound state. When the property is not found, the methods +// become no-ops. +class PropertyBinding { + + constructor( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + // initial state of these methods that calls 'bind' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + + static create( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + } + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + static sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( _reservedRe, '' ); + + } + + static parseTrackName( trackName ) { + + const matches = _trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + const objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against an allowlist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + } + + static findNode( root, nodeName ) { + + if ( ! nodeName || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + const bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + const searchNodeSubtree = function ( children ) { + + for ( let i = 0; i < children.length; i ++ ) { + + const childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + const result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + const subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + // these are used to "bind" a nonexistent property + _getValue_unavailable() {} + _setValue_unavailable() {} + + // Getters + + _getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.targetObject[ this.propertyName ]; + + } + + _getValue_array( buffer, offset ) { + + const source = this.resolvedProperty; + + for ( let i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + } + + _getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + } + + _getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + // Direct + + _setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + } + + _setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // EntireArray + + _setValue_array( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + } + + _setValue_array_setNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + } + + _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // ArrayElement + + _setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + } + + _setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // HasToFromArray + + _setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + } + + _setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + } + + _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + _getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + } + + _setValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + } + + // create getter / setter pair for a property in the scene graph + bind() { + + let targetObject = this.node; + const parsedPath = this.parsedPath; + + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + let objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( let i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + const nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + const nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + let versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + let bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === 'morphTargetInfluences' ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) { + + propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ]; + + } + + + } else { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this ); + return; + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + } + + unbind() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + +} + +PropertyBinding.Composite = Composite; + +PropertyBinding.prototype.BindingType = { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 +}; + +PropertyBinding.prototype.Versioning = { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 +}; + +PropertyBinding.prototype.GetterByBindingType = [ + + PropertyBinding.prototype._getValue_direct, + PropertyBinding.prototype._getValue_array, + PropertyBinding.prototype._getValue_arrayElement, + PropertyBinding.prototype._getValue_toArray, + +]; + +PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ + + [ + // Direct + PropertyBinding.prototype._setValue_direct, + PropertyBinding.prototype._setValue_direct_setNeedsUpdate, + PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate, + + ], [ + + // EntireArray + + PropertyBinding.prototype._setValue_array, + PropertyBinding.prototype._setValue_array_setNeedsUpdate, + PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate, + + ], [ + + // ArrayElement + PropertyBinding.prototype._setValue_arrayElement, + PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, + PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate, + + ], [ + + // HasToFromArray + PropertyBinding.prototype._setValue_fromArray, + PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, + PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate, + + ] + +]; + +/** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + */ + +class AnimationObjectGroup { + + constructor() { + + this.uuid = generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + const indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + const scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + add() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + let knownObject = undefined, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid; + let index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ]; + + let binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + remove() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + const lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + // remove & forget + uncache() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_, + nObjects = objects.length; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + const lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + if ( lastIndex > 0 ) { + + indicesByUUID[ lastObject.uuid ] = index; + + } + + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + const indicesByPath = this._bindingsIndicesByPath; + let index = indicesByPath[ path ]; + const bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + const paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + const object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + } + + unsubscribe_( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + const indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + const paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + +} + +AnimationObjectGroup.prototype.isAnimationObjectGroup = true; + +class AnimationAction { + + constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + + const tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( let i = 0; i !== nTracks; ++ i ) { + + const interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false;// keep feeding the last frame? + + this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true;// clips for start, loop and end + + } + + // State & Scheduling + + play() { + + this._mixer._activateAction( this ); + + return this; + + } + + stop() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + } + + reset() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1;// forget previous loops + this._startTime = null;// forget scheduling + + return this.stopFading().stopWarping(); + + } + + isRunning() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + } + + // return true when play has been called + isScheduled() { + + return this._mixer._isActiveAction( this ); + + } + + startAt( time ) { + + this._startTime = time; + + return this; + + } + + setLoop( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + } + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + } + + // return the weight considering fading and .enabled + getEffectiveWeight() { + + return this._effectiveWeight; + + } + + fadeIn( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + } + + fadeOut( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + } + + crossFadeFrom( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + const fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + } + + crossFadeTo( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + } + + stopFading() { + + const weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + } + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + } + + // return the time scale considering warping and .paused + getEffectiveTimeScale() { + + return this._effectiveTimeScale; + + } + + setDuration( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + } + + syncWith( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + } + + halt( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + } + + warp( startTimeScale, endTimeScale, duration ) { + + const mixer = this._mixer, + now = mixer.time, + timeScale = this.timeScale; + + let interpolant = this._timeScaleInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + } + + stopWarping() { + + const timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + } + + // Object Accessors + + getMixer() { + + return this._mixer; + + } + + getClip() { + + return this._clip; + + } + + getRoot() { + + return this._localRoot || this._mixer._root; + + } + + // Interna + + _update( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + const startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + const timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + const clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + const weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + + switch ( this.blendMode ) { + + case AdditiveAnimationBlendMode: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulateAdditive( weight ); + + } + + break; + + case NormalAnimationBlendMode: + default: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + } + + } + + _updateWeight( time ) { + + let weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + const interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + } + + _updateTimeScale( time ) { + + let timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + const interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + } + + _updateTime( deltaTime ) { + + const duration = this._clip.duration; + const loop = this.loop; + + let time = this.time + deltaTime; + let loopCount = this._loopCount; + + const pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else { + + this.time = time; + + break handle_stop; + + } + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + const loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + const pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + const atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } else { + + this.time = time; + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + return duration - time; + + } + + } + + return time; + + } + + _setEndings( atStart, atEnd, pingPong ) { + + const settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + } + + _scheduleFading( duration, weightNow, weightThen ) { + + const mixer = this._mixer, now = mixer.time; + let interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + values[ 0 ] = weightNow; + times[ 1 ] = now + duration; + values[ 1 ] = weightThen; + + return this; + + } + +} + +class AnimationMixer extends EventDispatcher { + + constructor( root ) { + + super(); + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + this.time = 0; + this.timeScale = 1.0; + + } + + _bindAction( action, prototypeAction ) { + + const root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName; + + let bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( let i = 0; i !== nTracks; ++ i ) { + + const track = tracks[ i ], + trackName = track.name; + + let binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + const path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + } + + _activateAction( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + const rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + const bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + } + + _deactivateAction( action ) { + + if ( this._isActiveAction( action ) ) { + + const bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + } + + // Memory manager + + _initMemoryManager() { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + const scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + } + + // Memory management for AnimationAction objects + + _isActiveAction( action ) { + + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + } + + _addInactiveAction( action, clipUuid, rootUuid ) { + + const actions = this._actions, + actionsByClip = this._actionsByClip; + + let actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + const knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + } + + _removeInactiveAction( action ) { + + const actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + const clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + const actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + } + + _removeInactiveBindingsForAction( action ) { + + const bindings = action._propertyBindings; + + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + } + + _lendAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + const actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + } + + _takeBackAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + const actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + } + + // Memory management for PropertyMixer objects + + _addInactiveBinding( binding, rootUuid, trackName ) { + + const bindingsByRoot = this._bindingsByRootAndName, + bindings = this._bindings; + + let bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + } + + _removeInactiveBinding( binding ) { + + const bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + if ( Object.keys( bindingByName ).length === 0 ) { + + delete bindingsByRoot[ rootUuid ]; + + } + + } + + _lendBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + } + + _takeBackBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + } + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant() { + + const interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++; + + let interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + } + + _takeBackControlInterpolant( interpolant ) { + + const interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + } + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction( clip, optionalRoot, blendMode ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid; + + let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip; + + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + + const actionsForClip = this._actionsByClip[ clipUuid ]; + let prototypeAction = null; + + if ( blendMode === undefined ) { + + if ( clipObject !== null ) { + + blendMode = clipObject.blendMode; + + } else { + + blendMode = NormalAnimationBlendMode; + + } + + } + + if ( actionsForClip !== undefined ) { + + const existingAction = actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined && existingAction.blendMode === blendMode ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + } + + // get an existing action + existingAction( clip, optionalRoot ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + } + + // deactivates all previously scheduled actions + stopAllAction() { + + const actions = this._actions, + nActions = this._nActiveActions; + + for ( let i = nActions - 1; i >= 0; -- i ) { + + actions[ i ].stop(); + + } + + return this; + + } + + // advance the time and update apply the animation + update( deltaTime ) { + + deltaTime *= this.timeScale; + + const actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( let i = 0; i !== nActions; ++ i ) { + + const action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + const bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( let i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + } + + // Allows you to seek to a specific time in an animation. + setTime( timeInSeconds ) { + + this.time = 0; // Zero out time attribute for AnimationMixer object; + for ( let i = 0; i < this._actions.length; i ++ ) { + + this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects. + + } + + return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object. + + } + + // return this mixer's root target object + getRoot() { + + return this._root; + + } + + // free all resources specific to a particular clip + uncacheClip( clip ) { + + const actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + const actionsToRemove = actionsForClip.knownActions; + + for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + const action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + const cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + } + + // free all resources specific to a particular root target object + uncacheRoot( root ) { + + const rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( const clipUuid in actionsByClip ) { + + const actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + const bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( const trackName in bindingByName ) { + + const binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + } + + // remove a targeted clip from the cache + uncacheAction( clip, optionalRoot ) { + + const action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + +} + +AnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 ); + +class Uniform { + + constructor( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + clone() { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + } + +} + +class InstancedInterleavedBuffer extends InterleavedBuffer { + + constructor( array, stride, meshPerAttribute = 1 ) { + + super( array, stride ); + + this.meshPerAttribute = meshPerAttribute; + + } + + copy( source ) { + + super.copy( source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + clone( data ) { + + const ib = super.clone( data ); + + ib.meshPerAttribute = this.meshPerAttribute; + + return ib; + + } + + toJSON( data ) { + + const json = super.toJSON( data ); + + json.isInstancedInterleavedBuffer = true; + json.meshPerAttribute = this.meshPerAttribute; + + return json; + + } + +} + +InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true; + +class GLBufferAttribute { + + constructor( buffer, type, itemSize, elementSize, count ) { + + this.buffer = buffer; + this.type = type; + this.itemSize = itemSize; + this.elementSize = elementSize; + this.count = count; + + this.version = 0; + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setBuffer( buffer ) { + + this.buffer = buffer; + + return this; + + } + + setType( type, elementSize ) { + + this.type = type; + this.elementSize = elementSize; + + return this; + + } + + setItemSize( itemSize ) { + + this.itemSize = itemSize; + + return this; + + } + + setCount( count ) { + + this.count = count; + + return this; + + } + +} + +GLBufferAttribute.prototype.isGLBufferAttribute = true; + +class Raycaster { + + constructor( origin, direction, near = 0, far = Infinity ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near; + this.far = far; + this.camera = null; + this.layers = new Layers(); + + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + } + + set( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + } + + setFromCamera( coords, camera ) { + + if ( camera && camera.isPerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + this.camera = camera; + + } else if ( camera && camera.isOrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + this.camera = camera; + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type ); + + } + + } + + intersectObject( object, recursive = true, intersects = [] ) { + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + } + + intersectObjects( objects, recursive = true, intersects = [] ) { + + for ( let i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + +} + +function ascSort( a, b ) { + + return a.distance - b.distance; + +} + +function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.layers.test( raycaster.layers ) ) { + + object.raycast( raycaster, intersects ); + + } + + if ( recursive === true ) { + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + +} + +/** + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axis. + */ + +class Spherical { + + constructor( radius = 1, phi = 0, theta = 0 ) { + + this.radius = radius; + this.phi = phi; // polar angle + this.theta = theta; // azimuthal angle + + return this; + + } + + set( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + } + + copy( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + } + + // restrict phi to be betwee EPS and PI-EPS + makeSafe() { + + const EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +/** + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + */ + +class Cylindrical { + + constructor( radius = 1, theta = 0, y = 0 ) { + + this.radius = radius; // distance from the origin to a point in the x-z plane + this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = y; // height above the x-z plane + + return this; + + } + + set( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + } + + copy( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$4 = /*@__PURE__*/ new Vector2(); + +class Box2 { + + constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) { + + this.min = min; + this.max = max; + + } + + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + makeEmpty() { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + } + + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + } + + getCenter( target ) { + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + getSize( target ) { + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + containsPoint( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + } + + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + } + + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + } + + intersectsBox( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + } + + clampPoint( point, target ) { + + return target.copy( point ).clamp( this.min, this.max ); + + } + + distanceToPoint( point ) { + + const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + } + + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + } + + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} + +Box2.prototype.isBox2 = true; + +const _startP = /*@__PURE__*/ new Vector3(); +const _startEnd = /*@__PURE__*/ new Vector3(); + +class Line3 { + + constructor( start = new Vector3(), end = new Vector3() ) { + + this.start = start; + this.end = end; + + } + + set( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + } + + copy( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + } + + getCenter( target ) { + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + } + + delta( target ) { + + return target.subVectors( this.end, this.start ); + + } + + distanceSq() { + + return this.start.distanceToSquared( this.end ); + + } + + distance() { + + return this.start.distanceTo( this.end ); + + } + + at( t, target ) { + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + closestPointToPointParameter( point, clampToLine ) { + + _startP.subVectors( point, this.start ); + _startEnd.subVectors( this.end, this.start ); + + const startEnd2 = _startEnd.dot( _startEnd ); + const startEnd_startP = _startEnd.dot( _startP ); + + let t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = clamp( t, 0, 1 ); + + } + + return t; + + } + + closestPointToPoint( point, clampToLine, target ) { + + const t = this.closestPointToPointParameter( point, clampToLine ); + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + applyMatrix4( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + } + + equals( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$3 = /*@__PURE__*/ new Vector3(); + +class SpotLightHelper extends Object3D { + + constructor( light, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + const geometry = new BufferGeometry(); + + const positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + const p1 = ( i / l ) * Math.PI * 2; + const p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + dispose() { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + } + + update() { + + this.light.updateMatrixWorld(); + + const coneLength = this.light.distance ? this.light.distance : 1000; + const coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + _vector$3.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( _vector$3 ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + } + +} + +const _vector$2 = /*@__PURE__*/ new Vector3(); +const _boneMatrix = /*@__PURE__*/ new Matrix4(); +const _matrixWorldInv = /*@__PURE__*/ new Matrix4(); + + +class SkeletonHelper extends LineSegments { + + constructor( object ) { + + const bones = getBoneList( object ); + + const geometry = new BufferGeometry(); + + const vertices = []; + const colors = []; + + const color1 = new Color( 0, 0, 1 ); + const color2 = new Color( 0, 1, 0 ); + + for ( let i = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } ); + + super( geometry, material ); + + this.type = 'SkeletonHelper'; + this.isSkeletonHelper = true; + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + updateMatrixWorld( force ) { + + const bones = this.bones; + + const geometry = this.geometry; + const position = geometry.getAttribute( 'position' ); + + _matrixWorldInv.copy( this.root.matrixWorld ).invert(); + + for ( let i = 0, j = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld ); + _vector$2.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z ); + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld ); + _vector$2.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + super.updateMatrixWorld( force ); + + } + +} + + +function getBoneList( object ) { + + const boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( let i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +} + +class PointLightHelper extends Mesh { + + constructor( light, sphereSize, color ) { + + const geometry = new SphereGeometry( sphereSize, 4, 2 ); + const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + + super( geometry, material ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + this.type = 'PointLightHelper'; + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + // TODO: delete this comment? + const distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 ); + const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + const d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + + update() { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + const d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + } + +} + +const _vector$1 = /*@__PURE__*/ new Vector3(); +const _color1 = /*@__PURE__*/ new Color(); +const _color2 = /*@__PURE__*/ new Color(); + +class HemisphereLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + const geometry = new OctahedronGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + if ( this.color === undefined ) this.material.vertexColors = true; + + const position = geometry.getAttribute( 'position' ); + const colors = new Float32Array( position.count * 3 ); + + geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + dispose() { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + } + + update() { + + const mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + const colors = mesh.geometry.getAttribute( 'color' ); + + _color1.copy( this.light.color ); + _color2.copy( this.light.groundColor ); + + for ( let i = 0, l = colors.count; i < l; i ++ ) { + + const color = ( i < ( l / 2 ) ) ? _color1 : _color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + } + +} + +class GridHelper extends LineSegments { + + constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const center = divisions / 2; + const step = size / divisions; + const halfSize = size / 2; + + const vertices = [], colors = []; + + for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + const color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'GridHelper'; + + } + +} + +class PolarGridHelper extends LineSegments { + + constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const vertices = []; + const colors = []; + + // create the radials + + for ( let i = 0; i <= radials; i ++ ) { + + const v = ( i / radials ) * ( Math.PI * 2 ); + + const x = Math.sin( v ) * radius; + const z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + const color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( let i = 0; i <= circles; i ++ ) { + + const color = ( i & 1 ) ? color1 : color2; + + const r = radius - ( radius / circles * i ); + + for ( let j = 0; j < divisions; j ++ ) { + + // first vertex + + let v = ( j / divisions ) * ( Math.PI * 2 ); + + let x = Math.sin( v ) * r; + let z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'PolarGridHelper'; + + } + +} + +const _v1 = /*@__PURE__*/ new Vector3(); +const _v2 = /*@__PURE__*/ new Vector3(); +const _v3 = /*@__PURE__*/ new Vector3(); + +class DirectionalLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + let geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + dispose() { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + } + + update() { + + _v1.setFromMatrixPosition( this.light.matrixWorld ); + _v2.setFromMatrixPosition( this.light.target.matrixWorld ); + _v3.subVectors( _v2, _v1 ); + + this.lightPlane.lookAt( _v2 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( _v2 ); + this.targetLine.scale.z = _v3.length(); + + } + +} + +const _vector = /*@__PURE__*/ new Vector3(); +const _camera = /*@__PURE__*/ new Camera(); + +/** + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + +class CameraHelper extends LineSegments { + + constructor( camera ) { + + const geometry = new BufferGeometry(); + const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } ); + + const vertices = []; + const colors = []; + + const pointMap = {}; + + // colors + + const colorFrustum = new Color( 0xffaa00 ); + const colorCone = new Color( 0xff0000 ); + const colorUp = new Color( 0x00aaff ); + const colorTarget = new Color( 0xffffff ); + const colorCross = new Color( 0x333333 ); + + // near + + addLine( 'n1', 'n2', colorFrustum ); + addLine( 'n2', 'n4', colorFrustum ); + addLine( 'n4', 'n3', colorFrustum ); + addLine( 'n3', 'n1', colorFrustum ); + + // far + + addLine( 'f1', 'f2', colorFrustum ); + addLine( 'f2', 'f4', colorFrustum ); + addLine( 'f4', 'f3', colorFrustum ); + addLine( 'f3', 'f1', colorFrustum ); + + // sides + + addLine( 'n1', 'f1', colorFrustum ); + addLine( 'n2', 'f2', colorFrustum ); + addLine( 'n3', 'f3', colorFrustum ); + addLine( 'n4', 'f4', colorFrustum ); + + // cone + + addLine( 'p', 'n1', colorCone ); + addLine( 'p', 'n2', colorCone ); + addLine( 'p', 'n3', colorCone ); + addLine( 'p', 'n4', colorCone ); + + // up + + addLine( 'u1', 'u2', colorUp ); + addLine( 'u2', 'u3', colorUp ); + addLine( 'u3', 'u1', colorUp ); + + // target + + addLine( 'c', 't', colorTarget ); + addLine( 'p', 'c', colorCross ); + + // cross + + addLine( 'cn1', 'cn2', colorCross ); + addLine( 'cn3', 'cn4', colorCross ); + + addLine( 'cf1', 'cf2', colorCross ); + addLine( 'cf3', 'cf4', colorCross ); + + function addLine( a, b, color ) { + + addPoint( a, color ); + addPoint( b, color ); + + } + + function addPoint( id, color ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + super( geometry, material ); + + this.type = 'CameraHelper'; + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + update() { + + const geometry = this.geometry; + const pointMap = this.pointMap; + + const w = 1, h = 1; + + // we need just camera projection matrix inverse + // world matrix must be identity + + _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse ); + + // center / target + + setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 ); + setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 ); + + // near + + setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 ); + setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 ); + setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 ); + setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 ); + + // far + + setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 ); + setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 ); + setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 ); + setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 ); + + // up + + setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 ); + setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 ); + setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 ); + setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 ); + + setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 ); + setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 ); + setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 ); + setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + + +function setPoint( point, pointMap, geometry, camera, x, y, z ) { + + _vector.set( x, y, z ).unproject( camera ); + + const points = pointMap[ point ]; + + if ( points !== undefined ) { + + const position = geometry.getAttribute( 'position' ); + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z ); + + } + + } + +} + +const _box = /*@__PURE__*/ new Box3(); + +class BoxHelper extends LineSegments { + + constructor( object, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + const positions = new Float32Array( 8 * 3 ); + + const geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.object = object; + this.type = 'BoxHelper'; + + this.matrixAutoUpdate = false; + + this.update(); + + } + + update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + _box.setFromObject( this.object ); + + } + + if ( _box.isEmpty() ) return; + + const min = _box.min; + const max = _box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + const position = this.geometry.attributes.position; + const array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + + } + + setFromObject( object ) { + + this.object = object; + this.update(); + + return this; + + } + + copy( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + + } + +} + +class Box3Helper extends LineSegments { + + constructor( box, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + + const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ]; + + const geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.box = box; + + this.type = 'Box3Helper'; + + this.geometry.computeBoundingSphere(); + + } + + updateMatrixWorld( force ) { + + const box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + super.updateMatrixWorld( force ); + + } + +} + +class PlaneHelper extends Line { + + constructor( plane, size = 1, hex = 0xffff00 ) { + + const color = hex; + + const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = size; + + const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + const geometry2 = new BufferGeometry(); + geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) ); + + } + + updateMatrixWorld( force ) { + + let scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + super.updateMatrixWorld( force ); + + } + +} + +const _axis = /*@__PURE__*/ new Vector3(); +let _lineGeometry, _coneGeometry; + +class ArrowHelper extends Object3D { + + // dir is assumed to be normalized + + constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) { + + super(); + + this.type = 'ArrowHelper'; + + if ( _lineGeometry === undefined ) { + + _lineGeometry = new BufferGeometry(); + _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 ); + _coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + _axis.set( dir.z, 0, - dir.x ).normalize(); + + const radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( _axis, radians ); + + } + + } + + setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) { + + this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458 + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + } + + setColor( color ) { + + this.line.material.color.set( color ); + this.cone.material.color.set( color ); + + } + + copy( source ) { + + super.copy( source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + + } + +} + +class AxesHelper extends LineSegments { + + constructor( size = 1 ) { + + const vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + const colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'AxesHelper'; + + } + + setColors( xAxisColor, yAxisColor, zAxisColor ) { + + const color = new Color(); + const array = this.geometry.attributes.color.array; + + color.set( xAxisColor ); + color.toArray( array, 0 ); + color.toArray( array, 3 ); + + color.set( yAxisColor ); + color.toArray( array, 6 ); + color.toArray( array, 9 ); + + color.set( zAxisColor ); + color.toArray( array, 12 ); + color.toArray( array, 15 ); + + this.geometry.attributes.color.needsUpdate = true; + + return this; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +class ShapePath { + + constructor() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + moveTo( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + return this; + + } + + lineTo( x, y ) { + + this.currentPath.lineTo( x, y ); + + return this; + + } + + quadraticCurveTo( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + return this; + + } + + bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + return this; + + } + + splineThru( pts ) { + + this.currentPath.splineThru( pts ); + + return this; + + } + + toShapes( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + const shapes = []; + + for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) { + + const tmpPath = inSubpaths[ i ]; + + const tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + const polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + let inside = false; + for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + let edgeLowPt = inPolygon[ p ]; + let edgeHighPt = inPolygon[ q ]; + + let edgeDx = edgeHighPt.x - edgeLowPt.x; + let edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + const isClockWise = ShapeUtils.isClockWise; + + const subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + let solid, tmpPath, tmpShape; + const shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + const betterShapeHoles = []; + const newShapes = []; + let newShapeHoles = []; + let mainIdx = 0; + let tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( let i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + let ambiguous = false; + const toChange = []; + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + const sho = newShapeHoles[ sIdx ]; + + for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + const ho = sho[ hIdx ]; + let hole_unassigned = true; + + for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + let tmpHoles; + + for ( let i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + +} + +const _floatView = new Float32Array( 1 ); +const _int32View = new Int32Array( _floatView.buffer ); + +class DataUtils { + + // Converts float32 to float16 (stored as uint16 value). + + static toHalfFloat( val ) { + + if ( val > 65504 ) { + + console.warn( 'THREE.DataUtils.toHalfFloat(): value exceeds 65504.' ); + + val = 65504; // maximum representable value in float16 + + } + + // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410 + + /* This method is faster than the OpenEXR implementation (very often + * used, eg. in Ogre), with the additional benefit of rounding, inspired + * by James Tursa?s half-precision code. */ + + _floatView[ 0 ] = val; + const x = _int32View[ 0 ]; + + let bits = ( x >> 16 ) & 0x8000; /* Get the sign */ + let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */ + const e = ( x >> 23 ) & 0xff; /* Using int is faster here */ + + /* If zero, or denormal, or exponent underflows too much for a denormal + * half, return signed zero. */ + if ( e < 103 ) return bits; + + /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ + if ( e > 142 ) { + + bits |= 0x7c00; + /* If exponent was 0xff and one mantissa bit was set, it means NaN, + * not Inf, so make sure we set one mantissa bit too. */ + bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff ); + return bits; + + } + + /* If exponent underflows but not too much, return a denormal */ + if ( e < 113 ) { + + m |= 0x0800; + /* Extra rounding may overflow and set mantissa to 0 and exponent + * to 1, which is OK. */ + bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 ); + return bits; + + } + + bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 ); + /* Extra rounding. An overflow will set mantissa to 0 and increment + * the exponent, which is OK. */ + bits += m & 1; + return bits; + + } + +} + +const LineStrip = 0; +const LinePieces = 1; +const NoColors = 0; +const FaceColors = 1; +const VertexColors = 2; + +function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + +} + +function MultiMaterial( materials = [] ) { + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + + return materials; + +} + +function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + +} + +function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + +} + +// + +function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' ); + return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage ); + +} + +function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + +} + +function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + +} + +function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + +} + +function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + +} + +function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + +} + +function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + +} + +function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + +} + +function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + +} + +function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + +} + +// + +Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + +}; + +// + +Path.prototype.fromPoints = function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + return this.setFromPoints( points ); + +}; + +// + +function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + +} + +function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + +} + +function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + +}; + +SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + +}; + +function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +// + +Loader.prototype.extractUrlBase = function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + +}; + +Loader.Handlers = { + + add: function ( /* regex, loader */ ) { + + console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' ); + + }, + + get: function ( /* file */ ) { + + console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' ); + + } + +}; + +function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + +} + +function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + +} + +// + +Box2.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + +}; + +Box2.prototype.empty = function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + +}; + +Box2.prototype.isIntersectionBox = function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + +}; + +Box2.prototype.size = function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + +}; + +// + +Box3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + +}; + +Box3.prototype.empty = function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + +}; + +Box3.prototype.isIntersectionBox = function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + +}; + +Box3.prototype.isIntersectionSphere = function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + +}; + +Box3.prototype.size = function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + +}; + +// + +Sphere.prototype.empty = function () { + + console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + +}; + +// + +Frustum.prototype.setFromMatrix = function ( m ) { + + console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' ); + return this.setFromProjectionMatrix( m ); + +}; + +// + +Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + +}; + +// + +Matrix3.prototype.flattenToArrayOffset = function ( array, offset ) { + + console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); + return this.toArray( array, offset ); + +}; + +Matrix3.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + +}; + +Matrix3.prototype.multiplyVector3Array = function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + +}; + +Matrix3.prototype.applyToBufferAttribute = function ( attribute ) { + + console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' ); + return attribute.applyMatrix3( this ); + +}; + +Matrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + +}; + +Matrix3.prototype.getInverse = function ( matrix ) { + + console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); + return this.copy( matrix ).invert(); + +}; + +// + +Matrix4.prototype.extractPosition = function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + +}; + +Matrix4.prototype.flattenToArrayOffset = function ( array, offset ) { + + console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); + return this.toArray( array, offset ); + +}; + +Matrix4.prototype.getPosition = function () { + + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return new Vector3().setFromMatrixColumn( this, 3 ); + +}; + +Matrix4.prototype.setRotationFromQuaternion = function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + +}; + +Matrix4.prototype.multiplyToArray = function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + +}; + +Matrix4.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + +}; + +Matrix4.prototype.multiplyVector4 = function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + +}; + +Matrix4.prototype.multiplyVector3Array = function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + +}; + +Matrix4.prototype.rotateAxis = function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + +}; + +Matrix4.prototype.crossVector = function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + +}; + +Matrix4.prototype.translate = function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + +}; + +Matrix4.prototype.rotateX = function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + +}; + +Matrix4.prototype.rotateY = function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + +}; + +Matrix4.prototype.rotateZ = function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + +}; + +Matrix4.prototype.rotateByAxis = function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + +}; + +Matrix4.prototype.applyToBufferAttribute = function ( attribute ) { + + console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' ); + return attribute.applyMatrix4( this ); + +}; + +Matrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + +}; + +Matrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + +}; + +Matrix4.prototype.getInverse = function ( matrix ) { + + console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); + return this.copy( matrix ).invert(); + +}; + +// + +Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + +}; + +// + +Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + +}; + +Quaternion.prototype.inverse = function ( ) { + + console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' ); + return this.invert(); + +}; + +// + +Ray.prototype.isIntersectionBox = function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + +}; + +Ray.prototype.isIntersectionPlane = function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + +}; + +Ray.prototype.isIntersectionSphere = function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + +}; + +// + +Triangle.prototype.area = function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + +}; + +Triangle.prototype.barycoordFromPoint = function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + +}; + +Triangle.prototype.midpoint = function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + +}; + +Triangle.prototypenormal = function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + +}; + +Triangle.prototype.plane = function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + +}; + +Triangle.barycoordFromPoint = function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + +}; + +Triangle.normal = function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + +}; + +// + +Shape.prototype.extractAllPoints = function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + +}; + +Shape.prototype.extrude = function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + +}; + +Shape.prototype.makeGeometry = function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + +}; + +// + +Vector2.prototype.fromAttribute = function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + +}; + +Vector2.prototype.distanceToManhattan = function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + +}; + +Vector2.prototype.lengthManhattan = function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + +}; + +// + +Vector3.prototype.setEulerFromRotationMatrix = function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + +}; + +Vector3.prototype.setEulerFromQuaternion = function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + +}; + +Vector3.prototype.getPositionFromMatrix = function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + +}; + +Vector3.prototype.getScaleFromMatrix = function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + +}; + +Vector3.prototype.getColumnFromMatrix = function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + +}; + +Vector3.prototype.applyProjection = function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + +}; + +Vector3.prototype.fromAttribute = function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + +}; + +Vector3.prototype.distanceToManhattan = function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + +}; + +Vector3.prototype.lengthManhattan = function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + +}; + +// + +Vector4.prototype.fromAttribute = function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + +}; + +Vector4.prototype.lengthManhattan = function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + +}; + +// + +Object3D.prototype.getChildByName = function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + +}; + +Object3D.prototype.renderDepth = function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + +}; + +Object3D.prototype.translate = function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + +}; + +Object3D.prototype.getWorldRotation = function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + +}; + +Object3D.prototype.applyMatrix = function ( matrix ) { + + console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' ); + return this.applyMatrix4( matrix ); + +}; + +Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + +} ); + +Mesh.prototype.setDrawMode = function () { + + console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); + +}; + +Object.defineProperties( Mesh.prototype, { + + drawMode: { + get: function () { + + console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' ); + return TrianglesDrawMode; + + }, + set: function () { + + console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); + + } + } + +} ); + +SkinnedMesh.prototype.initBones = function () { + + console.error( 'THREE.SkinnedMesh: initBones() has been removed.' ); + +}; + +// + +PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' + + 'Use .setFocalLength and .filmGauge for a photographic setup.' ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + +}; + +// + +Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } +} ); + +// + +Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + dynamic: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); + return this.usage === DynamicDrawUsage; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); + this.setUsage( DynamicDrawUsage ); + + } + } + +} ); + +BufferAttribute.prototype.setDynamic = function ( value ) { + + console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' ); + this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); + return this; + +}; + +BufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + +}, + +BufferAttribute.prototype.setArray = function ( /* array */ ) { + + console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); + +}; + +// + +BufferGeometry.prototype.addIndex = function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + +}; + +BufferGeometry.prototype.addAttribute = function ( name, attribute ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' ); + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + return this.setAttribute( name, attribute ); + +}; + +BufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + +}; + +BufferGeometry.prototype.clearDrawCalls = function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + +}; + +BufferGeometry.prototype.computeOffsets = function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + +}; + +BufferGeometry.prototype.removeAttribute = function ( name ) { + + console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' ); + + return this.deleteAttribute( name ); + +}; + +BufferGeometry.prototype.applyMatrix = function ( matrix ) { + + console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' ); + return this.applyMatrix4( matrix ); + +}; + +Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + +} ); + +InterleavedBuffer.prototype.setDynamic = function ( value ) { + + console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' ); + this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); + return this; + +}; + +InterleavedBuffer.prototype.setArray = function ( /* array */ ) { + + console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); + +}; + +// + +ExtrudeGeometry.prototype.getArrays = function () { + + console.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' ); + +}; + +ExtrudeGeometry.prototype.addShapeList = function () { + + console.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' ); + +}; + +ExtrudeGeometry.prototype.addShape = function () { + + console.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' ); + +}; + +// + +Scene.prototype.dispose = function () { + + console.error( 'THREE.Scene: .dispose() has been removed.' ); + +}; + +// + +Uniform.prototype.onUpdate = function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + +}; + +// + +Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + }, + + stencilMask: { + get: function () { + + console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); + return this.stencilFuncMask; + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); + this.stencilFuncMask = value; + + } + }, + + vertexTangents: { + get: function () { + + console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' ); + + } + }, + +} ); + +Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + +} ); + +// + +WebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + +}; + +WebGLRenderer.prototype.animate = function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + +}; + +WebGLRenderer.prototype.getCurrentRenderTarget = function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + +}; + +WebGLRenderer.prototype.getMaxAnisotropy = function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + +}; + +WebGLRenderer.prototype.getPrecision = function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + +}; + +WebGLRenderer.prototype.resetGLState = function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + +}; + +WebGLRenderer.prototype.supportsFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + +}; + +WebGLRenderer.prototype.supportsHalfFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + +}; + +WebGLRenderer.prototype.supportsStandardDerivatives = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + +}; + +WebGLRenderer.prototype.supportsCompressedTextureS3TC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + +}; + +WebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + +}; + +WebGLRenderer.prototype.supportsBlendMinMax = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + +}; + +WebGLRenderer.prototype.supportsVertexTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + +}; + +WebGLRenderer.prototype.supportsInstancedArrays = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + +}; + +WebGLRenderer.prototype.enableScissorTest = function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + +}; + +WebGLRenderer.prototype.initMaterial = function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + +}; + +WebGLRenderer.prototype.addPrePlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + +}; + +WebGLRenderer.prototype.addPostPlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + +}; + +WebGLRenderer.prototype.updateShadowMap = function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + +}; + +WebGLRenderer.prototype.setFaceCulling = function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + +}; + +WebGLRenderer.prototype.allocTextureUnit = function () { + + console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' ); + +}; + +WebGLRenderer.prototype.setTexture = function () { + + console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' ); + +}; + +WebGLRenderer.prototype.setTexture2D = function () { + + console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' ); + +}; + +WebGLRenderer.prototype.setTextureCube = function () { + + console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' ); + +}; + +WebGLRenderer.prototype.getActiveMipMapLevel = function () { + + console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' ); + return this.getActiveMipmapLevel(); + +}; + +Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + context: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' ); + return this.getContext(); + + } + }, + vr: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' ); + return this.xr; + + } + }, + gammaInput: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); + + } + }, + gammaOutput: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); + return false; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); + this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding; + + } + }, + toneMappingWhitePoint: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); + return 1.0; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); + + } + }, + +} ); + +Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + +} ); + +function WebGLRenderTargetCube( width, height, options ) { + + console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' ); + return new WebGLCubeRenderTarget( width, options ); + +} + +// + +Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + +} ); + +// + +Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + const scope = this; + const audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + +}; + + +AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + +}; + +// + +CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + +}; + +CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) { + + console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' ); + return this.renderTarget.clear( renderer, color, depth, stencil ); + +}; + +ImageUtils.crossOrigin = undefined; + +ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + const loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + const texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + const loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + const texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + +}; + +ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + +}; + +// + +function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + +} + +// + +function JSONLoader() { + + console.error( 'THREE.JSONLoader has been removed.' ); + +} + +// + +const SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); + + } + +}; + +// + +function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' ); + +} + +// + +function ParametricGeometry() { + + console.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' ); + return new BufferGeometry(); + +} + +function TextGeometry() { + + console.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' ); + return new BufferGeometry(); + +} + +function FontLoader() { + + console.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' ); + +} + +function Font() { + + console.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' ); + +} + +function ImmediateRenderObject() { + + console.error( 'THREE.ImmediateRenderObject has been removed.' ); + +} + +if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + /* eslint-disable no-undef */ + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { + revision: REVISION, + } } ) ); + /* eslint-enable no-undef */ + +} + +if ( typeof window !== 'undefined' ) { + + if ( window.__THREE__ ) { + + console.warn( 'WARNING: Multiple instances of Three.js being imported.' ); + + } else { + + window.__THREE__ = REVISION; + + } + +} + +export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxGeometry as BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CatmullRomCurve3, CineonToneMapping, CircleGeometry as CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, CompressedTexture, CompressedTextureLoader, ConeGeometry as ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubeUVRefractionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry as CylinderBufferGeometry, CylinderGeometry, Cylindrical, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry as DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry as ExtrudeBufferGeometry, ExtrudeGeometry, FaceColors, FileLoader, FlatShading, Float16BufferAttribute, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GammaEncoding, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronGeometry as IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, JSONLoader, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry as LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LogLuvEncoding, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils as Math, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColors, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry as OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneGeometry as PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry as PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDEncoding, RGBEEncoding, RGBEFormat, RGBFormat, RGBIntegerFormat, RGBM16Encoding, RGBM7Encoding, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry as RingBufferGeometry, RingGeometry, SRGB8_ALPHA8_ASTC_10x10_Format, SRGB8_ALPHA8_ASTC_10x5_Format, SRGB8_ALPHA8_ASTC_10x6_Format, SRGB8_ALPHA8_ASTC_10x8_Format, SRGB8_ALPHA8_ASTC_12x10_Format, SRGB8_ALPHA8_ASTC_12x12_Format, SRGB8_ALPHA8_ASTC_4x4_Format, SRGB8_ALPHA8_ASTC_5x4_Format, SRGB8_ALPHA8_ASTC_5x5_Format, SRGB8_ALPHA8_ASTC_6x5_Format, SRGB8_ALPHA8_ASTC_6x6_Format, SRGB8_ALPHA8_ASTC_8x5_Format, SRGB8_ALPHA8_ASTC_8x6_Format, SRGB8_ALPHA8_ASTC_8x8_Format, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry as ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Sphere, SphereGeometry as SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry as TetrahedronBufferGeometry, TetrahedronGeometry, TextGeometry, Texture, TextureLoader, TorusGeometry as TorusBufferGeometry, TorusGeometry, TorusKnotGeometry as TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry as TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VideoTexture, WebGL1Renderer, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, sRGBEncoding }; diff --git a/public/three/examples/index.html b/public/three/examples/index.html new file mode 100644 index 0000000..8f4fee9 --- /dev/null +++ b/public/three/examples/index.html @@ -0,0 +1,256 @@ + + + + + xyt + + + + + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/public/three/examples/jsm/controls/OrbitControls.js b/public/three/examples/jsm/controls/OrbitControls.js new file mode 100644 index 0000000..1a2f746 --- /dev/null +++ b/public/three/examples/jsm/controls/OrbitControls.js @@ -0,0 +1,1294 @@ +import { + EventDispatcher, + MOUSE, + Quaternion, + Spherical, + TOUCH, + Vector2, + Vector3 +} from '../../../build/three.module.js'; + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one-finger move +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move + +const _changeEvent = { type: 'change' }; +const _startEvent = { type: 'start' }; +const _endEvent = { type: 'end' }; + +class OrbitControls extends EventDispatcher { + + constructor( object, domElement ) { + + super(); + + if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter "domElement" is now mandatory.' ); + if ( domElement === document ) console.error( 'THREE.OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' ); + + this.object = object; + this.domElement = domElement; + this.domElement.style.touchAction = 'none'; // disable touch scroll + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI ) + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.05; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.panSpeed = 1.0; + this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60 + + // The four arrow keys + this.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' }; + + // Mouse buttons + this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN }; + + // Touch fingers + this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // the target DOM element for key events + this._domElementKeyEvents = null; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.getDistance = function () { + + return this.object.position.distanceTo( this.target ); + + }; + + this.listenToKeyEvents = function ( domElement ) { + + domElement.addEventListener( 'keydown', onKeyDown ); + this._domElementKeyEvents = domElement; + + }; + + this.saveState = function () { + + scope.target0.copy( scope.target ); + scope.position0.copy( scope.object.position ); + scope.zoom0 = scope.object.zoom; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( _changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function () { + + const offset = new Vector3(); + + // so camera.up is the orbit axis + const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) ); + const quatInverse = quat.clone().invert(); + + const lastPosition = new Vector3(); + const lastQuaternion = new Quaternion(); + + const twoPI = 2 * Math.PI; + + return function update() { + + const position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + if ( scope.enableDamping ) { + + spherical.theta += sphericalDelta.theta * scope.dampingFactor; + spherical.phi += sphericalDelta.phi * scope.dampingFactor; + + } else { + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + } + + // restrict theta to be between desired limits + + let min = scope.minAzimuthAngle; + let max = scope.maxAzimuthAngle; + + if ( isFinite( min ) && isFinite( max ) ) { + + if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI; + + if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI; + + if ( min <= max ) { + + spherical.theta = Math.max( min, Math.min( max, spherical.theta ) ); + + } else { + + spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ? + Math.max( min, spherical.theta ) : + Math.min( max, spherical.theta ); + + } + + } + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + + if ( scope.enableDamping === true ) { + + scope.target.addScaledVector( panOffset, scope.dampingFactor ); + + } else { + + scope.target.add( panOffset ); + + } + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + panOffset.multiplyScalar( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + panOffset.set( 0, 0, 0 ); + + } + + scale = 1; + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( _changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function () { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu ); + + scope.domElement.removeEventListener( 'pointerdown', onPointerDown ); + scope.domElement.removeEventListener( 'pointercancel', onPointerCancel ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel ); + + scope.domElement.removeEventListener( 'pointermove', onPointerMove ); + scope.domElement.removeEventListener( 'pointerup', onPointerUp ); + + + if ( scope._domElementKeyEvents !== null ) { + + scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown ); + + } + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + const scope = this; + + const STATE = { + NONE: - 1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_PAN: 4, + TOUCH_DOLLY_PAN: 5, + TOUCH_DOLLY_ROTATE: 6 + }; + + let state = STATE.NONE; + + const EPS = 0.000001; + + // current position in spherical coordinates + const spherical = new Spherical(); + const sphericalDelta = new Spherical(); + + let scale = 1; + const panOffset = new Vector3(); + let zoomChanged = false; + + const rotateStart = new Vector2(); + const rotateEnd = new Vector2(); + const rotateDelta = new Vector2(); + + const panStart = new Vector2(); + const panEnd = new Vector2(); + const panDelta = new Vector2(); + + const dollyStart = new Vector2(); + const dollyEnd = new Vector2(); + const dollyDelta = new Vector2(); + + const pointers = []; + const pointerPositions = {}; + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + const panLeft = function () { + + const v = new Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + const panUp = function () { + + const v = new Vector3(); + + return function panUp( distance, objectMatrix ) { + + if ( scope.screenSpacePanning === true ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); + + } else { + + v.setFromMatrixColumn( objectMatrix, 0 ); + v.crossVectors( scope.object.up, v ); + + } + + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + const pan = function () { + + const offset = new Vector3(); + + return function pan( deltaX, deltaY ) { + + const element = scope.domElement; + + if ( scope.object.isPerspectiveCamera ) { + + // perspective + const position = scope.object.position; + offset.copy( position ).sub( scope.target ); + let targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we use only clientHeight here so aspect ratio does not distort speed + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object.isOrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyOut( dollyScale ) { + + if ( scope.object.isPerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object.isOrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyIn( dollyScale ) { + + if ( scope.object.isPerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object.isOrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + rotateEnd.set( event.clientX, event.clientY ); + + rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed ); + + const element = scope.domElement; + + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height + + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( /*event*/ ) { + + // no-op + + } + + function handleMouseWheel( event ) { + + if ( event.deltaY < 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyOut( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + let needsUpdate = false; + + switch ( event.code ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + needsUpdate = true; + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + needsUpdate = true; + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + needsUpdate = true; + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + needsUpdate = true; + break; + + } + + if ( needsUpdate ) { + + // prevent the browser from scrolling on cursor keys + event.preventDefault(); + + scope.update(); + + } + + + } + + function handleTouchStartRotate() { + + if ( pointers.length === 1 ) { + + rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY ); + + } else { + + const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX ); + const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY ); + + rotateStart.set( x, y ); + + } + + } + + function handleTouchStartPan() { + + if ( pointers.length === 1 ) { + + panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY ); + + } else { + + const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX ); + const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY ); + + panStart.set( x, y ); + + } + + } + + function handleTouchStartDolly() { + + const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX; + const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY; + + const distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartDollyPan() { + + if ( scope.enableZoom ) handleTouchStartDolly(); + + if ( scope.enablePan ) handleTouchStartPan(); + + } + + function handleTouchStartDollyRotate() { + + if ( scope.enableZoom ) handleTouchStartDolly(); + + if ( scope.enableRotate ) handleTouchStartRotate(); + + } + + function handleTouchMoveRotate( event ) { + + if ( pointers.length == 1 ) { + + rotateEnd.set( event.pageX, event.pageY ); + + } else { + + const position = getSecondPointerPosition( event ); + + const x = 0.5 * ( event.pageX + position.x ); + const y = 0.5 * ( event.pageY + position.y ); + + rotateEnd.set( x, y ); + + } + + rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed ); + + const element = scope.domElement; + + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height + + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight ); + + rotateStart.copy( rotateEnd ); + + } + + function handleTouchMovePan( event ) { + + if ( pointers.length === 1 ) { + + panEnd.set( event.pageX, event.pageY ); + + } else { + + const position = getSecondPointerPosition( event ); + + const x = 0.5 * ( event.pageX + position.x ); + const y = 0.5 * ( event.pageY + position.y ); + + panEnd.set( x, y ); + + } + + panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + } + + function handleTouchMoveDolly( event ) { + + const position = getSecondPointerPosition( event ); + + const dx = event.pageX - position.x; + const dy = event.pageY - position.y; + + const distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) ); + + dollyOut( dollyDelta.y ); + + dollyStart.copy( dollyEnd ); + + } + + function handleTouchMoveDollyPan( event ) { + + if ( scope.enableZoom ) handleTouchMoveDolly( event ); + + if ( scope.enablePan ) handleTouchMovePan( event ); + + } + + function handleTouchMoveDollyRotate( event ) { + + if ( scope.enableZoom ) handleTouchMoveDolly( event ); + + if ( scope.enableRotate ) handleTouchMoveRotate( event ); + + } + + function handleTouchEnd( /*event*/ ) { + + // no-op + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onPointerDown( event ) { + + if ( scope.enabled === false ) return; + + if ( pointers.length === 0 ) { + + scope.domElement.setPointerCapture( event.pointerId ); + + scope.domElement.addEventListener( 'pointermove', onPointerMove ); + scope.domElement.addEventListener( 'pointerup', onPointerUp ); + + } + + // + + addPointer( event ); + + if ( event.pointerType === 'touch' ) { + + onTouchStart( event ); + + } else { + + onMouseDown( event ); + + } + + } + + function onPointerMove( event ) { + + if ( scope.enabled === false ) return; + + if ( event.pointerType === 'touch' ) { + + onTouchMove( event ); + + } else { + + onMouseMove( event ); + + } + + } + + function onPointerUp( event ) { + + if ( scope.enabled === false ) return; + + if ( event.pointerType === 'touch' ) { + + onTouchEnd(); + + } else { + + onMouseUp( event ); + + } + + removePointer( event ); + + // + + if ( pointers.length === 0 ) { + + scope.domElement.releasePointerCapture( event.pointerId ); + + scope.domElement.removeEventListener( 'pointermove', onPointerMove ); + scope.domElement.removeEventListener( 'pointerup', onPointerUp ); + + } + + } + + function onPointerCancel( event ) { + + removePointer( event ); + + } + + function onMouseDown( event ) { + + let mouseAction; + + switch ( event.button ) { + + case 0: + + mouseAction = scope.mouseButtons.LEFT; + break; + + case 1: + + mouseAction = scope.mouseButtons.MIDDLE; + break; + + case 2: + + mouseAction = scope.mouseButtons.RIGHT; + break; + + default: + + mouseAction = - 1; + + } + + switch ( mouseAction ) { + + case MOUSE.DOLLY: + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + break; + + case MOUSE.ROTATE: + + if ( event.ctrlKey || event.metaKey || event.shiftKey ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } else { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } + + break; + + case MOUSE.PAN: + + if ( event.ctrlKey || event.metaKey || event.shiftKey ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( _startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + switch ( state ) { + + case STATE.ROTATE: + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + break; + + case STATE.DOLLY: + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + break; + + case STATE.PAN: + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + break; + + } + + } + + function onMouseUp( event ) { + + handleMouseUp( event ); + + scope.dispatchEvent( _endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + + scope.dispatchEvent( _startEvent ); + + handleMouseWheel( event ); + + scope.dispatchEvent( _endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + trackPointer( event ); + + switch ( pointers.length ) { + + case 1: + + switch ( scope.touches.ONE ) { + + case TOUCH.ROTATE: + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate(); + + state = STATE.TOUCH_ROTATE; + + break; + + case TOUCH.PAN: + + if ( scope.enablePan === false ) return; + + handleTouchStartPan(); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + break; + + case 2: + + switch ( scope.touches.TWO ) { + + case TOUCH.DOLLY_PAN: + + if ( scope.enableZoom === false && scope.enablePan === false ) return; + + handleTouchStartDollyPan(); + + state = STATE.TOUCH_DOLLY_PAN; + + break; + + case TOUCH.DOLLY_ROTATE: + + if ( scope.enableZoom === false && scope.enableRotate === false ) return; + + handleTouchStartDollyRotate(); + + state = STATE.TOUCH_DOLLY_ROTATE; + + break; + + default: + + state = STATE.NONE; + + } + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( _startEvent ); + + } + + } + + function onTouchMove( event ) { + + trackPointer( event ); + + switch ( state ) { + + case STATE.TOUCH_ROTATE: + + if ( scope.enableRotate === false ) return; + + handleTouchMoveRotate( event ); + + scope.update(); + + break; + + case STATE.TOUCH_PAN: + + if ( scope.enablePan === false ) return; + + handleTouchMovePan( event ); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_PAN: + + if ( scope.enableZoom === false && scope.enablePan === false ) return; + + handleTouchMoveDollyPan( event ); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_ROTATE: + + if ( scope.enableZoom === false && scope.enableRotate === false ) return; + + handleTouchMoveDollyRotate( event ); + + scope.update(); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + handleTouchEnd( event ); + + scope.dispatchEvent( _endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + } + + function addPointer( event ) { + + pointers.push( event ); + + } + + function removePointer( event ) { + + delete pointerPositions[ event.pointerId ]; + + for ( let i = 0; i < pointers.length; i ++ ) { + + if ( pointers[ i ].pointerId == event.pointerId ) { + + pointers.splice( i, 1 ); + return; + + } + + } + + } + + function trackPointer( event ) { + + let position = pointerPositions[ event.pointerId ]; + + if ( position === undefined ) { + + position = new Vector2(); + pointerPositions[ event.pointerId ] = position; + + } + + position.set( event.pageX, event.pageY ); + + } + + function getSecondPointerPosition( event ) { + + const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ]; + + return pointerPositions[ pointer.pointerId ]; + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu ); + + scope.domElement.addEventListener( 'pointerdown', onPointerDown ); + scope.domElement.addEventListener( 'pointercancel', onPointerCancel ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } ); + + // force an update at start + + this.update(); + + } + +} + + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// This is very similar to OrbitControls, another set of touch behavior +// +// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - left mouse, or arrow keys / touch: one-finger move + +class MapControls extends OrbitControls { + + constructor( object, domElement ) { + + super( object, domElement ); + + this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up + + this.mouseButtons.LEFT = MOUSE.PAN; + this.mouseButtons.RIGHT = MOUSE.ROTATE; + + this.touches.ONE = TOUCH.PAN; + this.touches.TWO = TOUCH.DOLLY_ROTATE; + + } + +} + +export { OrbitControls, MapControls }; diff --git a/public/three/examples/jsm/controls/Water.js b/public/three/examples/jsm/controls/Water.js new file mode 100644 index 0000000..1c72a03 --- /dev/null +++ b/public/three/examples/jsm/controls/Water.js @@ -0,0 +1,344 @@ +import { + Color, + FrontSide, + LinearFilter, + MathUtils, + Matrix4, + Mesh, + PerspectiveCamera, + Plane, + RGBFormat, + ShaderMaterial, + UniformsLib, + UniformsUtils, + Vector3, + Vector4, + WebGLRenderTarget +} from '../../../build/three.module.js'; + +/** + * Work based on : + * http://slayvin.net : Flat mirror for three.js + * http://www.adelphi.edu/~stemkoski : An implementation of water shader based on the flat mirror + * http://29a.ch/ && http://29a.ch/slides/2012/webglwater/ : Water shader explanations in WebGL + */ + +class Water extends Mesh { + + constructor( geometry, options = {} ) { + + super( geometry ); + + const scope = this; + + const textureWidth = options.textureWidth !== undefined ? options.textureWidth : 512; + const textureHeight = options.textureHeight !== undefined ? options.textureHeight : 512; + + const clipBias = options.clipBias !== undefined ? options.clipBias : 0.0; + const alpha = options.alpha !== undefined ? options.alpha : 1.0; + const time = options.time !== undefined ? options.time : 0.0; + const normalSampler = options.waterNormals !== undefined ? options.waterNormals : null; + const sunDirection = options.sunDirection !== undefined ? options.sunDirection : new Vector3( 0.70707, 0.70707, 0.0 ); + const sunColor = new Color( options.sunColor !== undefined ? options.sunColor : 0xffffff ); + const waterColor = new Color( options.waterColor !== undefined ? options.waterColor : 0x7F7F7F ); + const eye = options.eye !== undefined ? options.eye : new Vector3( 0, 0, 0 ); + const distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0; + const side = options.side !== undefined ? options.side : FrontSide; + const fog = options.fog !== undefined ? options.fog : false; + + // + + const mirrorPlane = new Plane(); + const normal = new Vector3(); + const mirrorWorldPosition = new Vector3(); + const cameraWorldPosition = new Vector3(); + const rotationMatrix = new Matrix4(); + const lookAtPosition = new Vector3( 0, 0, - 1 ); + const clipPlane = new Vector4(); + + const view = new Vector3(); + const target = new Vector3(); + const q = new Vector4(); + + const textureMatrix = new Matrix4(); + + const mirrorCamera = new PerspectiveCamera(); + + const parameters = { + minFilter: LinearFilter, + magFilter: LinearFilter, + format: RGBFormat + }; + + const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, parameters ); + + if ( ! MathUtils.isPowerOfTwo( textureWidth ) || ! MathUtils.isPowerOfTwo( textureHeight ) ) { + + renderTarget.texture.generateMipmaps = false; + + } + + const mirrorShader = { + + uniforms: UniformsUtils.merge( [ + UniformsLib[ 'fog' ], + UniformsLib[ 'lights' ], + { + 'normalSampler': { value: null }, + 'mirrorSampler': { value: null }, + 'alpha': { value: 1.0 }, + 'time': { value: 0.0 }, + 'size': { value: 1.0 }, + 'distortionScale': { value: 20.0 }, + 'textureMatrix': { value: new Matrix4() }, + 'sunColor': { value: new Color( 0x7F7F7F ) }, + 'sunDirection': { value: new Vector3( 0.70707, 0.70707, 0 ) }, + 'eye': { value: new Vector3() }, + 'waterColor': { value: new Color( 0x555555 ) } + } + ] ), + + vertexShader: /* glsl */` + uniform mat4 textureMatrix; + uniform float time; + + varying vec4 mirrorCoord; + varying vec4 worldPosition; + + #include + #include + #include + #include + + void main() { + mirrorCoord = modelMatrix * vec4( position, 1.0 ); + worldPosition = mirrorCoord.xyzw; + mirrorCoord = textureMatrix * mirrorCoord; + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + gl_Position = projectionMatrix * mvPosition; + + #include + #include + #include + #include + #include + }`, + + fragmentShader: /* glsl */` + uniform sampler2D mirrorSampler; + uniform float alpha; + uniform float time; + uniform float size; + uniform float distortionScale; + uniform sampler2D normalSampler; + uniform vec3 sunColor; + uniform vec3 sunDirection; + uniform vec3 eye; + uniform vec3 waterColor; + + varying vec4 mirrorCoord; + varying vec4 worldPosition; + + vec4 getNoise( vec2 uv ) { + vec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0); + vec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 ); + vec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 ); + vec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 ); + vec4 noise = texture2D( normalSampler, uv0 ) + + texture2D( normalSampler, uv1 ) + + texture2D( normalSampler, uv2 ) + + texture2D( normalSampler, uv3 ); + return noise * 0.5 - 1.0; + } + + void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) { + vec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) ); + float direction = max( 0.0, dot( eyeDirection, reflection ) ); + specularColor += pow( direction, shiny ) * sunColor * spec; + diffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse; + } + + #include + #include + #include + #include + #include + #include + #include + #include + + void main() { + + #include + vec4 noise = getNoise( worldPosition.xz * size ); + vec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) ); + + vec3 diffuseLight = vec3(0.0); + vec3 specularLight = vec3(0.0); + + vec3 worldToEye = eye-worldPosition.xyz; + vec3 eyeDirection = normalize( worldToEye ); + sunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight ); + + float distance = length(worldToEye); + + vec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale; + vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) ); + + float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 ); + float rf0 = 0.3; + float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 ); + vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor; + vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance); + vec3 outgoingLight = albedo; + gl_FragColor = vec4( outgoingLight, alpha ); + + #include + #include + }` + + }; + + const material = new ShaderMaterial( { + fragmentShader: mirrorShader.fragmentShader, + vertexShader: mirrorShader.vertexShader, + uniforms: UniformsUtils.clone( mirrorShader.uniforms ), + lights: true, + side: side, + fog: fog + } ); + + material.uniforms[ 'mirrorSampler' ].value = renderTarget.texture; + material.uniforms[ 'textureMatrix' ].value = textureMatrix; + material.uniforms[ 'alpha' ].value = alpha; + material.uniforms[ 'time' ].value = time; + material.uniforms[ 'normalSampler' ].value = normalSampler; + material.uniforms[ 'sunColor' ].value = sunColor; + material.uniforms[ 'waterColor' ].value = waterColor; + material.uniforms[ 'sunDirection' ].value = sunDirection; + material.uniforms[ 'distortionScale' ].value = distortionScale; + + material.uniforms[ 'eye' ].value = eye; + + scope.material = material; + + scope.onBeforeRender = function ( renderer, scene, camera ) { + + mirrorWorldPosition.setFromMatrixPosition( scope.matrixWorld ); + cameraWorldPosition.setFromMatrixPosition( camera.matrixWorld ); + + rotationMatrix.extractRotation( scope.matrixWorld ); + + normal.set( 0, 0, 1 ); + normal.applyMatrix4( rotationMatrix ); + + view.subVectors( mirrorWorldPosition, cameraWorldPosition ); + + // Avoid rendering when mirror is facing away + + if ( view.dot( normal ) > 0 ) return; + + view.reflect( normal ).negate(); + view.add( mirrorWorldPosition ); + + rotationMatrix.extractRotation( camera.matrixWorld ); + + lookAtPosition.set( 0, 0, - 1 ); + lookAtPosition.applyMatrix4( rotationMatrix ); + lookAtPosition.add( cameraWorldPosition ); + + target.subVectors( mirrorWorldPosition, lookAtPosition ); + target.reflect( normal ).negate(); + target.add( mirrorWorldPosition ); + + mirrorCamera.position.copy( view ); + mirrorCamera.up.set( 0, 1, 0 ); + mirrorCamera.up.applyMatrix4( rotationMatrix ); + mirrorCamera.up.reflect( normal ); + mirrorCamera.lookAt( target ); + + mirrorCamera.far = camera.far; // Used in WebGLBackground + + mirrorCamera.updateMatrixWorld(); + mirrorCamera.projectionMatrix.copy( camera.projectionMatrix ); + + // Update the texture matrix + textureMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + textureMatrix.multiply( mirrorCamera.projectionMatrix ); + textureMatrix.multiply( mirrorCamera.matrixWorldInverse ); + + // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html + // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf + mirrorPlane.setFromNormalAndCoplanarPoint( normal, mirrorWorldPosition ); + mirrorPlane.applyMatrix4( mirrorCamera.matrixWorldInverse ); + + clipPlane.set( mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant ); + + const projectionMatrix = mirrorCamera.projectionMatrix; + + q.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ]; + q.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ]; + q.z = - 1.0; + q.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ]; + + // Calculate the scaled plane vector + clipPlane.multiplyScalar( 2.0 / clipPlane.dot( q ) ); + + // Replacing the third row of the projection matrix + projectionMatrix.elements[ 2 ] = clipPlane.x; + projectionMatrix.elements[ 6 ] = clipPlane.y; + projectionMatrix.elements[ 10 ] = clipPlane.z + 1.0 - clipBias; + projectionMatrix.elements[ 14 ] = clipPlane.w; + + eye.setFromMatrixPosition( camera.matrixWorld ); + + // Render + + const currentRenderTarget = renderer.getRenderTarget(); + + const currentXrEnabled = renderer.xr.enabled; + const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate; + + scope.visible = false; + + renderer.xr.enabled = false; // Avoid camera modification and recursion + renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows + + renderer.setRenderTarget( renderTarget ); + + renderer.state.buffers.depth.setMask( true ); // make sure the depth buffer is writable so it can be properly cleared, see #18897 + + if ( renderer.autoClear === false ) renderer.clear(); + renderer.render( scene, mirrorCamera ); + + scope.visible = true; + + renderer.xr.enabled = currentXrEnabled; + renderer.shadowMap.autoUpdate = currentShadowAutoUpdate; + + renderer.setRenderTarget( currentRenderTarget ); + + // Restore viewport + + const viewport = camera.viewport; + + if ( viewport !== undefined ) { + + renderer.state.viewport( viewport ); + + } + + }; + + } + +} + +Water.prototype.isWater = true; + +export { Water }; diff --git a/public/three/examples/jsm/controls/experimental/CameraControls.js b/public/three/examples/jsm/controls/experimental/CameraControls.js new file mode 100644 index 0000000..f4514f1 --- /dev/null +++ b/public/three/examples/jsm/controls/experimental/CameraControls.js @@ -0,0 +1,1248 @@ +import { + EventDispatcher, + MOUSE, + Quaternion, + Spherical, + TOUCH, + Vector2, + Vector3 +} from '../../../../build/three.module.js'; + +var CameraControls = function ( object, domElement ) { + + if ( domElement === undefined ) console.warn( 'THREE.CameraControls: The second parameter "domElement" is now mandatory.' ); + if ( domElement === document ) console.error( 'THREE.CameraControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' ); + + this.object = object; + this.domElement = domElement; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new Vector3(); + + // Set to true to enable trackball behavior + this.trackball = false; + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.05; + + // This option enables dollying in and out; property named as "zoom" for backwards compatibility + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.panSpeed = 1.0; + this.screenSpacePanning = false; // if true, pan in screen-space + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + // auto-rotate is not supported for trackball behavior + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN }; + + // Touch fingers + this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.quaternion0 = this.object.quaternion.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.saveState = function () { + + scope.target0.copy( scope.target ); + scope.position0.copy( scope.object.position ); + scope.quaternion0.copy( scope.object.quaternion ); + scope.zoom0 = scope.object.zoom; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.quaternion.copy( scope.quaternion0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function () { + + var offset = new Vector3(); + + // so camera.up is the orbit axis + var quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().invert(); + + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + + var q = new Quaternion(); + var vec = new Vector3(); + + return function update() { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + if ( scope.trackball ) { + + // rotate around screen-space y-axis + + if ( sphericalDelta.theta ) { + + vec.set( 0, 1, 0 ).applyQuaternion( scope.object.quaternion ); + + var factor = ( scope.enableDamping ) ? scope.dampingFactor : 1; + + q.setFromAxisAngle( vec, sphericalDelta.theta * factor ); + + scope.object.quaternion.premultiply( q ); + offset.applyQuaternion( q ); + + } + + // rotate around screen-space x-axis + + if ( sphericalDelta.phi ) { + + vec.set( 1, 0, 0 ).applyQuaternion( scope.object.quaternion ); + + var factor = ( scope.enableDamping ) ? scope.dampingFactor : 1; + + q.setFromAxisAngle( vec, sphericalDelta.phi * factor ); + + scope.object.quaternion.premultiply( q ); + offset.applyQuaternion( q ); + + } + + offset.multiplyScalar( scale ); + offset.clampLength( scope.minDistance, scope.maxDistance ); + + } else { + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.setFromVector3( offset ); + + if ( scope.enableDamping ) { + + spherical.theta += sphericalDelta.theta * scope.dampingFactor; + spherical.phi += sphericalDelta.phi * scope.dampingFactor; + + } else { + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + } + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + } + + // move target to panned location + + if ( scope.enableDamping === true ) { + + scope.target.addScaledVector( panOffset, scope.dampingFactor ); + + } else { + + scope.target.add( panOffset ); + + } + + position.copy( scope.target ).add( offset ); + + if ( scope.trackball === false ) { + + scope.object.lookAt( scope.target ); + + } + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + panOffset.multiplyScalar( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + panOffset.set( 0, 0, 0 ); + + } + + scale = 1; + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function () { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.domElement.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { + NONE: - 1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_PAN: 4, + TOUCH_DOLLY_PAN: 5, + TOUCH_DOLLY_ROTATE: 6 + }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function () { + + var v = new Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function () { + + var v = new Vector3(); + + return function panUp( distance, objectMatrix ) { + + if ( scope.screenSpacePanning === true ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); + + } else { + + v.setFromMatrixColumn( objectMatrix, 0 ); + v.crossVectors( scope.object.up, v ); + + } + + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + + var offset = new Vector3(); + + return function pan( deltaX, deltaY ) { + + var element = scope.domElement; + + if ( scope.object.isPerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we use only clientHeight here so aspect ratio does not distort speed + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object.isOrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: CameraControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object.isPerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object.isOrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: CameraControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object.isPerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object.isOrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: CameraControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + rotateEnd.set( event.clientX, event.clientY ); + + rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed ); + + var element = scope.domElement; + + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height + + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( /*event*/ ) { + + // no-op + + } + + function handleMouseWheel( event ) { + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + var needsUpdate = false; + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + needsUpdate = true; + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + needsUpdate = true; + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + needsUpdate = true; + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + needsUpdate = true; + break; + + } + + if ( needsUpdate ) { + + // prevent the browser from scrolling on cursor keys + event.preventDefault(); + + scope.update(); + + } + + + } + + function handleTouchStartRotate( event ) { + + if ( event.touches.length == 1 ) { + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } else { + + var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ); + var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ); + + rotateStart.set( x, y ); + + } + + } + + function handleTouchStartPan( event ) { + + if ( event.touches.length == 1 ) { + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } else { + + var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ); + var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ); + + panStart.set( x, y ); + + } + + } + + function handleTouchStartDolly( event ) { + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartDollyPan( event ) { + + if ( scope.enableZoom ) handleTouchStartDolly( event ); + + if ( scope.enablePan ) handleTouchStartPan( event ); + + } + + function handleTouchStartDollyRotate( event ) { + + if ( scope.enableZoom ) handleTouchStartDolly( event ); + + if ( scope.enableRotate ) handleTouchStartRotate( event ); + + } + + function handleTouchMoveRotate( event ) { + + if ( event.touches.length == 1 ) { + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } else { + + var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ); + var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ); + + rotateEnd.set( x, y ); + + } + + rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed ); + + var element = scope.domElement; + + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height + + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight ); + + rotateStart.copy( rotateEnd ); + + } + + function handleTouchMovePan( event ) { + + if ( event.touches.length == 1 ) { + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } else { + + var x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ); + var y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ); + + panEnd.set( x, y ); + + } + + panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + } + + function handleTouchMoveDolly( event ) { + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) ); + + dollyIn( dollyDelta.y ); + + dollyStart.copy( dollyEnd ); + + } + + function handleTouchMoveDollyPan( event ) { + + if ( scope.enableZoom ) handleTouchMoveDolly( event ); + + if ( scope.enablePan ) handleTouchMovePan( event ); + + } + + function handleTouchMoveDollyRotate( event ) { + + if ( scope.enableZoom ) handleTouchMoveDolly( event ); + + if ( scope.enableRotate ) handleTouchMoveRotate( event ); + + } + + function handleTouchEnd( /*event*/ ) { + + // no-op + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + // Prevent the browser from scrolling. + + event.preventDefault(); + + // Manually set the focus since calling preventDefault above + // prevents the browser from setting it automatically. + + scope.domElement.focus ? scope.domElement.focus() : window.focus(); + + var mouseAction; + + switch ( event.button ) { + + case 0: + + mouseAction = scope.mouseButtons.LEFT; + break; + + case 1: + + mouseAction = scope.mouseButtons.MIDDLE; + break; + + case 2: + + mouseAction = scope.mouseButtons.RIGHT; + break; + + default: + + mouseAction = - 1; + + } + + switch ( mouseAction ) { + + case MOUSE.DOLLY: + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + break; + + case MOUSE.ROTATE: + + if ( event.ctrlKey || event.metaKey || event.shiftKey ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } else { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } + + break; + + case MOUSE.PAN: + + if ( event.ctrlKey || event.metaKey || event.shiftKey ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + switch ( state ) { + + case STATE.ROTATE: + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + break; + + case STATE.DOLLY: + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + break; + + case STATE.PAN: + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + break; + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + scope.dispatchEvent( startEvent ); + + handleMouseWheel( event ); + + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + switch ( event.touches.length ) { + + case 1: + + switch ( scope.touches.ONE ) { + + case TOUCH.ROTATE: + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case TOUCH.PAN: + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + break; + + case 2: + + switch ( scope.touches.TWO ) { + + case TOUCH.DOLLY_PAN: + + if ( scope.enableZoom === false && scope.enablePan === false ) return; + + handleTouchStartDollyPan( event ); + + state = STATE.TOUCH_DOLLY_PAN; + + break; + + case TOUCH.DOLLY_ROTATE: + + if ( scope.enableZoom === false && scope.enableRotate === false ) return; + + handleTouchStartDollyRotate( event ); + + state = STATE.TOUCH_DOLLY_ROTATE; + + break; + + default: + + state = STATE.NONE; + + } + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( state ) { + + case STATE.TOUCH_ROTATE: + + if ( scope.enableRotate === false ) return; + + handleTouchMoveRotate( event ); + + scope.update(); + + break; + + case STATE.TOUCH_PAN: + + if ( scope.enablePan === false ) return; + + handleTouchMovePan( event ); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_PAN: + + if ( scope.enableZoom === false && scope.enablePan === false ) return; + + handleTouchMoveDollyPan( event ); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_ROTATE: + + if ( scope.enableZoom === false && scope.enableRotate === false ) return; + + handleTouchMoveDollyRotate( event ); + + scope.update(); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + scope.domElement.addEventListener( 'keydown', onKeyDown, false ); + + // make sure element can receive keys. + + if ( scope.domElement.tabIndex === - 1 ) { + + scope.domElement.tabIndex = 0; + + } + + // force an update at start + + this.object.lookAt( scope.target ); + this.update(); + this.saveState(); + +}; + +CameraControls.prototype = Object.create( EventDispatcher.prototype ); +CameraControls.prototype.constructor = CameraControls; + + +// OrbitControls maintains the "up" direction, camera.up (+Y by default). +// +// Orbit - left mouse / touch: one-finger move +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move + +var OrbitControls = function ( object, domElement ) { + + CameraControls.call( this, object, domElement ); + + this.mouseButtons.LEFT = MOUSE.ROTATE; + this.mouseButtons.RIGHT = MOUSE.PAN; + + this.touches.ONE = TOUCH.ROTATE; + this.touches.TWO = TOUCH.DOLLY_PAN; + +}; + +OrbitControls.prototype = Object.create( EventDispatcher.prototype ); +OrbitControls.prototype.constructor = OrbitControls; + + +// MapControls maintains the "up" direction, camera.up (+Y by default) +// +// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - left mouse, or left right + ctrl/meta/shiftKey, or arrow keys / touch: one-finger move + + +var MapControls = function ( object, domElement ) { + + CameraControls.call( this, object, domElement ); + + this.mouseButtons.LEFT = MOUSE.PAN; + this.mouseButtons.RIGHT = MOUSE.ROTATE; + + this.touches.ONE = TOUCH.PAN; + this.touches.TWO = TOUCH.DOLLY_ROTATE; + +}; + +MapControls.prototype = Object.create( EventDispatcher.prototype ); +MapControls.prototype.constructor = MapControls; + + +// TrackballControls allows the camera to rotate over the polls and does not maintain camera.up +// +// Orbit - left mouse / touch: one-finger move +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move + +var TrackballControls = function ( object, domElement ) { + + CameraControls.call( this, object, domElement ); + + this.trackball = true; + this.screenSpacePanning = true; + this.autoRotate = false; + + this.mouseButtons.LEFT = MOUSE.ROTATE; + this.mouseButtons.RIGHT = MOUSE.PAN; + + this.touches.ONE = TOUCH.ROTATE; + this.touches.TWO = TOUCH.DOLLY_PAN; + +}; + +TrackballControls.prototype = Object.create( EventDispatcher.prototype ); +TrackballControls.prototype.constructor = TrackballControls; + + +export { CameraControls, OrbitControls, MapControls, TrackballControls }; diff --git a/public/three/examples/jsm/loaders/GLTFLoader.js b/public/three/examples/jsm/loaders/GLTFLoader.js new file mode 100644 index 0000000..3e95e53 --- /dev/null +++ b/public/three/examples/jsm/loaders/GLTFLoader.js @@ -0,0 +1,4285 @@ +import { + AnimationClip, + Bone, + Box3, + BufferAttribute, + BufferGeometry, + ClampToEdgeWrapping, + Color, + DirectionalLight, + DoubleSide, + FileLoader, + FrontSide, + Group, + ImageBitmapLoader, + InterleavedBuffer, + InterleavedBufferAttribute, + Interpolant, + InterpolateDiscrete, + InterpolateLinear, + Line, + LineBasicMaterial, + LineLoop, + LineSegments, + LinearFilter, + LinearMipmapLinearFilter, + LinearMipmapNearestFilter, + Loader, + LoaderUtils, + Material, + MathUtils, + Matrix4, + Mesh, + MeshBasicMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MirroredRepeatWrapping, + NearestFilter, + NearestMipmapLinearFilter, + NearestMipmapNearestFilter, + NumberKeyframeTrack, + Object3D, + OrthographicCamera, + PerspectiveCamera, + PointLight, + Points, + PointsMaterial, + PropertyBinding, + Quaternion, + QuaternionKeyframeTrack, + RGBFormat, + RepeatWrapping, + Skeleton, + SkinnedMesh, + Sphere, + SpotLight, + TangentSpaceNormalMap, + Texture, + TextureLoader, + TriangleFanDrawMode, + TriangleStripDrawMode, + Vector2, + Vector3, + VectorKeyframeTrack, + sRGBEncoding +} from '../../../build/three.module.js'; + +class GLTFLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.dracoLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + + this.pluginCallbacks = []; + + this.register( function ( parser ) { + + return new GLTFMaterialsClearcoatExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureBasisUExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureWebPExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsTransmissionExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsVolumeExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsIorExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsSpecularExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFLightsExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshoptCompression( parser ); + + } ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + let resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + resourcePath = this.path; + + } else { + + resourcePath = LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + this.manager.itemStart( url ); + + const _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + const loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + } + + setDRACOLoader( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + } + + setDDSLoader() { + + throw new Error( + + 'THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".' + + ); + + } + + setKTX2Loader( ktx2Loader ) { + + this.ktx2Loader = ktx2Loader; + return this; + + } + + setMeshoptDecoder( meshoptDecoder ) { + + this.meshoptDecoder = meshoptDecoder; + return this; + + } + + register( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + } + + unregister( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + } + + parse( data, path, onLoad, onError ) { + + let content; + const extensions = {}; + const plugins = {}; + + if ( typeof data === 'string' ) { + + content = data; + + } else { + + const magic = LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; + + } else { + + content = LoaderUtils.decodeText( new Uint8Array( data ) ); + + } + + } + + const json = JSON.parse( content ); + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + const parser = new GLTFParser( json, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + requestHeader: this.requestHeader, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + + } ); + + parser.fileLoader.setRequestHeader( this.requestHeader ); + + for ( let i = 0; i < this.pluginCallbacks.length; i ++ ) { + + const plugin = this.pluginCallbacks[ i ]( parser ); + plugins[ plugin.name ] = plugin; + + // Workaround to avoid determining as unknown extension + // in addUnknownExtensionsToUserData(). + // Remove this workaround if we move all the existing + // extension handlers to plugin system + extensions[ plugin.name ] = true; + + } + + if ( json.extensionsUsed ) { + + for ( let i = 0; i < json.extensionsUsed.length; ++ i ) { + + const extensionName = json.extensionsUsed[ i ]; + const extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + parser.setExtensions( extensions ); + parser.setPlugins( plugins ); + parser.parse( onLoad, onError ); + + } + +} + +/* GLTFREGISTRY */ + +function GLTFRegistry() { + + let objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + +} + +/*********************************/ +/********** EXTENSIONS ***********/ +/*********************************/ + +const EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', + KHR_MATERIALS_IOR: 'KHR_materials_ior', + KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + KHR_MATERIALS_SPECULAR: 'KHR_materials_specular', + KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_MATERIALS_VOLUME: 'KHR_materials_volume', + KHR_TEXTURE_BASISU: 'KHR_texture_basisu', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + EXT_TEXTURE_WEBP: 'EXT_texture_webp', + EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression' +}; + +/** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ +class GLTFLightsExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + // Object3D instance caches + this.cache = { refs: {}, uses: {} }; + + } + + _markDefs() { + + const parser = this.parser; + const nodeDefs = this.parser.json.nodes || []; + + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.extensions + && nodeDef.extensions[ this.name ] + && nodeDef.extensions[ this.name ].light !== undefined ) { + + parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); + + } + + } + + } + + _loadLight( lightIndex ) { + + const parser = this.parser; + const cacheKey = 'light:' + lightIndex; + let dependency = parser.cache.get( cacheKey ); + + if ( dependency ) return dependency; + + const json = parser.json; + const extensions = ( json.extensions && json.extensions[ this.name ] ) || {}; + const lightDefs = extensions.lights || []; + const lightDef = lightDefs[ lightIndex ]; + let lightNode; + + const color = new Color( 0xffffff ); + + if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); + + const range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new DirectionalLight( color ); + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + lightNode.decay = 2; + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) ); + + dependency = Promise.resolve( lightNode ); + + parser.cache.add( cacheKey, dependency ); + + return dependency; + + } + + createNodeAttachment( nodeIndex ) { + + const self = this; + const parser = this.parser; + const json = parser.json; + const nodeDef = json.nodes[ nodeIndex ]; + const lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {}; + const lightIndex = lightDef.light; + + if ( lightIndex === undefined ) return null; + + return this._loadLight( lightIndex ).then( function ( light ) { + + return parser._getNodeRef( self.cache, lightIndex, light ); + + } ); + + } + +} + +/** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ +class GLTFMaterialsUnlitExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + getMaterialType() { + + return MeshBasicMaterial; + + } + + extendParams( materialParams, materialDef, parser ) { + + const pending = []; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + const metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + } + + return Promise.all( pending ); + + } + +} + +/** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ +class GLTFMaterialsClearcoatExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.clearcoatFactor !== undefined ) { + + materialParams.clearcoat = extension.clearcoatFactor; + + } + + if ( extension.clearcoatTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); + + } + + if ( extension.clearcoatRoughnessFactor !== undefined ) { + + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; + + } + + if ( extension.clearcoatRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); + + } + + if ( extension.clearcoatNormalTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); + + if ( extension.clearcoatNormalTexture.scale !== undefined ) { + + const scale = extension.clearcoatNormalTexture.scale; + + materialParams.clearcoatNormalScale = new Vector2( scale, scale ); + + } + + } + + return Promise.all( pending ); + + } + +} + +/** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + * Draft: https://github.com/KhronosGroup/glTF/pull/1698 + */ +class GLTFMaterialsTransmissionExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.transmissionFactor !== undefined ) { + + materialParams.transmission = extension.transmissionFactor; + + } + + if ( extension.transmissionTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); + + } + + return Promise.all( pending ); + + } + +} + +/** + * Materials Volume Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume + */ +class GLTFMaterialsVolumeExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0; + + if ( extension.thicknessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) ); + + } + + materialParams.attenuationDistance = extension.attenuationDistance || 0; + + const colorArray = extension.attenuationColor || [ 1, 1, 1 ]; + materialParams.attenuationTint = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); + + return Promise.all( pending ); + + } + +} + +/** + * Materials ior Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior + */ +class GLTFMaterialsIorExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IOR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const extension = materialDef.extensions[ this.name ]; + + materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5; + + return Promise.resolve(); + + } + +} + +/** + * Materials specular Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular + */ +class GLTFMaterialsSpecularExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0; + + if ( extension.specularTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) ); + + } + + const colorArray = extension.specularColorFactor || [ 1, 1, 1 ]; + materialParams.specularTint = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] ); + + if ( extension.specularColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularTintMap', extension.specularColorTexture ).then( function ( texture ) { + + texture.encoding = sRGBEncoding; + + } ) ); + + } + + return Promise.all( pending ); + + } + +} + +/** + * BasisU Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu + */ +class GLTFTextureBasisUExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + + } + + loadTexture( textureIndex ) { + + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ this.name ]; + const source = json.images[ extension.source ]; + const loader = parser.options.ktx2Loader; + + if ( ! loader ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); + + } else { + + // Assumes that the extension is optional and that a fallback texture is present + return null; + + } + + } + + return parser.loadTextureImage( textureIndex, source, loader ); + + } + +} + +/** + * WebP Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp + */ +class GLTFTextureWebPExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + + } + + loadTexture( textureIndex ) { + + const name = this.name; + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ name ]; + const source = json.images[ extension.source ]; + + let loader = parser.textureLoader; + if ( source.uri ) { + + const handler = parser.options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + } + + detectSupport() { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + const image = new Image(); + + // Lossy test image. Support for lossy images doesn't guarantee support for all + // WebP images, unfortunately. + image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; + + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + } + +} + +/** + * meshopt BufferView Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression + */ +class GLTFMeshoptCompression { + + constructor( parser ) { + + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; + + } + + loadBufferView( index ) { + + const json = this.parser.json; + const bufferView = json.bufferViews[ index ]; + + if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { + + const extensionDef = bufferView.extensions[ this.name ]; + + const buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); + const decoder = this.parser.options.meshoptDecoder; + + if ( ! decoder || ! decoder.supported ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); + + } else { + + // Assumes that the extension is optional and that fallback buffer data is present + return null; + + } + + } + + return Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) { + + const byteOffset = extensionDef.byteOffset || 0; + const byteLength = extensionDef.byteLength || 0; + + const count = extensionDef.count; + const stride = extensionDef.byteStride; + + const result = new ArrayBuffer( count * stride ); + const source = new Uint8Array( res[ 0 ], byteOffset, byteLength ); + + decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); + return result; + + } ); + + } else { + + return null; + + } + + } + +} + +/* BINARY EXTENSION */ +const BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; +const BINARY_EXTENSION_HEADER_LENGTH = 12; +const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + +class GLTFBinaryExtension { + + constructor( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + const headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + + this.header = { + magic: LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; + const chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + let chunkIndex = 0; + + while ( chunkIndex < chunkContentsLength ) { + + const chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + const chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + const contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = LoaderUtils.decodeText( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + +} + +/** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ +class GLTFDracoMeshCompressionExtension { + + constructor( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + decodePrimitive( primitive, parser ) { + + const json = this.json; + const dracoLoader = this.dracoLoader; + const bufferViewIndex = primitive.extensions[ this.name ].bufferView; + const gltfAttributeMap = primitive.extensions[ this.name ].attributes; + const threeAttributeMap = {}; + const attributeNormalizedMap = {}; + const attributeTypeMap = {}; + + for ( const attributeName in gltfAttributeMap ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( const attributeName in primitive.attributes ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + const accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + const componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( const attributeName in geometry.attributes ) { + + const attribute = geometry.attributes[ attributeName ]; + const normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap ); + + } ); + + } ); + + } + +} + +/** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ +class GLTFTextureTransformExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + extendTexture( texture, transform ) { + + if ( transform.texCoord !== undefined ) { + + console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); + + } + + if ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) { + + // See https://github.com/mrdoob/three.js/issues/21819. + return texture; + + } + + texture = texture.clone(); + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + texture.needsUpdate = true; + + return texture; + + } + +} + +/** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + +/** + * A sub class of StandardMaterial with some of the functionality + * changed via the `onBeforeCompile` callback + * @pailhead + */ +class GLTFMeshStandardSGMaterial extends MeshStandardMaterial { + + constructor( params ) { + + super(); + + this.isGLTFSpecularGlossinessMaterial = true; + + //various chunks that need replacing + const specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif' + ].join( '\n' ); + + const glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif' + ].join( '\n' ); + + const specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif' + ].join( '\n' ); + + const glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif' + ].join( '\n' ); + + const lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', + 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', + 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', + 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', + 'material.roughness += geometryRoughness;', + 'material.roughness = min( material.roughness, 1.0 );', + 'material.specularColor = specularFactor;', + ].join( '\n' ); + + const uniforms = { + specular: { value: new Color().setHex( 0xffffff ) }, + glossiness: { value: 1 }, + specularMap: { value: null }, + glossinessMap: { value: null } + }; + + this._extraUniforms = uniforms; + + this.onBeforeCompile = function ( shader ) { + + for ( const uniformName in uniforms ) { + + shader.uniforms[ uniformName ] = uniforms[ uniformName ]; + + } + + shader.fragmentShader = shader.fragmentShader + .replace( 'uniform float roughness;', 'uniform vec3 specular;' ) + .replace( 'uniform float metalness;', 'uniform float glossiness;' ) + .replace( '#include ', specularMapParsFragmentChunk ) + .replace( '#include ', glossinessMapParsFragmentChunk ) + .replace( '#include ', specularMapFragmentChunk ) + .replace( '#include ', glossinessMapFragmentChunk ) + .replace( '#include ', lightPhysicalFragmentChunk ); + + }; + + Object.defineProperties( this, { + + specular: { + get: function () { + + return uniforms.specular.value; + + }, + set: function ( v ) { + + uniforms.specular.value = v; + + } + }, + + specularMap: { + get: function () { + + return uniforms.specularMap.value; + + }, + set: function ( v ) { + + uniforms.specularMap.value = v; + + if ( v ) { + + this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps + + } else { + + delete this.defines.USE_SPECULARMAP; + + } + + } + }, + + glossiness: { + get: function () { + + return uniforms.glossiness.value; + + }, + set: function ( v ) { + + uniforms.glossiness.value = v; + + } + }, + + glossinessMap: { + get: function () { + + return uniforms.glossinessMap.value; + + }, + set: function ( v ) { + + uniforms.glossinessMap.value = v; + + if ( v ) { + + this.defines.USE_GLOSSINESSMAP = ''; + this.defines.USE_UV = ''; + + } else { + + delete this.defines.USE_GLOSSINESSMAP; + delete this.defines.USE_UV; + + } + + } + } + + } ); + + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + + this.setValues( params ); + + } + + copy( source ) { + + super.copy( source ); + + this.specularMap = source.specularMap; + this.specular.copy( source.specular ); + this.glossinessMap = source.glossinessMap; + this.glossiness = source.glossiness; + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + return this; + + } + +} + + +class GLTFMaterialsPbrSpecularGlossinessExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS; + + this.specularGlossinessParams = [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'normalMapType', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ]; + + } + + getMaterialType() { + + return GLTFMeshStandardSGMaterial; + + } + + extendParams( materialParams, materialDef, parser ) { + + const pbrSpecularGlossiness = materialDef.extensions[ this.name ]; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + const pending = []; + + if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { + + const array = pbrSpecularGlossiness.diffuseFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); + + } + + materialParams.emissive = new Color( 0.0, 0.0, 0.0 ); + materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + materialParams.specular = new Color( 1.0, 1.0, 1.0 ); + + if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { + + materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); + + } + + if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { + + const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; + pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); + pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); + + } + + return Promise.all( pending ); + + } + + createMaterial( materialParams ) { + + const material = new GLTFMeshStandardSGMaterial( materialParams ); + material.fog = true; + + material.color = materialParams.color; + + material.map = materialParams.map === undefined ? null : materialParams.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = materialParams.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; + + material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; + material.bumpScale = 1; + + material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; + material.normalMapType = TangentSpaceNormalMap; + + if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; + material.specular = materialParams.specular; + + material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; + material.glossiness = materialParams.glossiness; + + material.alphaMap = null; + + material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + return material; + + } + +} + +/** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ +class GLTFMeshQuantizationExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + +} + +/*********************************/ +/********** INTERPOLATION ********/ +/*********************************/ + +// Spline Interpolation +// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation +class GLTFCubicSplineInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + copySampleValue_( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + const result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( let i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + +} + +GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + +GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + +GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { + + const result = this.resultBuffer; + const values = this.sampleValues; + const stride = this.valueSize; + + const stride2 = stride * 2; + const stride3 = stride * 3; + + const td = t1 - t0; + + const p = ( t - t0 ) / td; + const pp = p * p; + const ppp = pp * p; + + const offset1 = i1 * stride3; + const offset0 = offset1 - stride3; + + const s2 = - 2 * ppp + 3 * pp; + const s3 = ppp - pp; + const s0 = 1 - s2; + const s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( let i = 0; i !== stride; i ++ ) { + + const p0 = values[ offset0 + i + stride ]; // splineVertex_k + const m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + const p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + const m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + +}; + +const _q = new Quaternion(); + +class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { + + interpolate_( i1, t0, t, t1 ) { + + const result = super.interpolate_( i1, t0, t, t1 ); + + _q.fromArray( result ).normalize().toArray( result ); + + return result; + + } + +} + + +/*********************************/ +/********** INTERNALS ************/ +/*********************************/ + +/* CONSTANTS */ + +const WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 +}; + +const WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array +}; + +const WEBGL_FILTERS = { + 9728: NearestFilter, + 9729: LinearFilter, + 9984: NearestMipmapNearestFilter, + 9985: LinearMipmapNearestFilter, + 9986: NearestMipmapLinearFilter, + 9987: LinearMipmapLinearFilter +}; + +const WEBGL_WRAPPINGS = { + 33071: ClampToEdgeWrapping, + 33648: MirroredRepeatWrapping, + 10497: RepeatWrapping +}; + +const WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 +}; + +const ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv2', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', +}; + +const PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' +}; + +const INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: InterpolateLinear, + STEP: InterpolateDiscrete +}; + +const ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' +}; + +/* UTILITY FUNCTIONS */ + +function resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + +} + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ +function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + +} + +function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( const name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + +} + +/** + * @param {Object3D|Material|BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ +function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + +} + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ +function addMorphTargets( geometry, targets, parser ) { + + let hasMorphPosition = false; + let hasMorphNormal = false; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + + if ( hasMorphPosition && hasMorphNormal ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); + + const pendingPositionAccessors = []; + const pendingNormalAccessors = []; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( hasMorphPosition ) { + + const pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; + + pendingPositionAccessors.push( pendingAccessor ); + + } + + if ( hasMorphNormal ) { + + const pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; + + pendingNormalAccessors.push( pendingAccessor ); + + } + + } + + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ) + ] ).then( function ( accessors ) { + + const morphPositions = accessors[ 0 ]; + const morphNormals = accessors[ 1 ]; + + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + geometry.morphTargetsRelative = true; + + return geometry; + + } ); + +} + +/** + * @param {Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ +function updateMorphTargets( mesh, meshDef ) { + + mesh.updateMorphTargets(); + + if ( meshDef.weights !== undefined ) { + + for ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) { + + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { + + const targetNames = meshDef.extras.targetNames; + + if ( mesh.morphTargetInfluences.length === targetNames.length ) { + + mesh.morphTargetDictionary = {}; + + for ( let i = 0, il = targetNames.length; i < il; i ++ ) { + + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); + + } + + } + +} + +function createPrimitiveKey( primitiveDef ) { + + const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + let geometryKey; + + if ( dracoExtension ) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); + + } else { + + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; + + } + + return geometryKey; + +} + +function createAttributesKey( attributes ) { + + let attributesKey = ''; + + const keys = Object.keys( attributes ).sort(); + + for ( let i = 0, il = keys.length; i < il; i ++ ) { + + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; + + } + + return attributesKey; + +} + +function getNormalizedComponentScale( constructor ) { + + // Reference: + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data + + switch ( constructor ) { + + case Int8Array: + return 1 / 127; + + case Uint8Array: + return 1 / 255; + + case Int16Array: + return 1 / 32767; + + case Uint16Array: + return 1 / 65535; + + default: + throw new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' ); + + } + +} + +/* GLTF PARSER */ + +class GLTFParser { + + constructor( json = {}, options = {} ) { + + this.json = json; + this.extensions = {}; + this.plugins = {}; + this.options = options; + + // loader object cache + this.cache = new GLTFRegistry(); + + // associations between Three.js objects and glTF elements + this.associations = new Map(); + + // BufferGeometry caching + this.primitiveCache = {}; + + // Object3D instance caches + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; + + this.textureCache = {}; + + // Track node names, to ensure no duplicates + this.nodeNamesUsed = {}; + + // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the + // expensive work of uploading a texture to the GPU off the main thread. + if ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) { + + this.textureLoader = new ImageBitmapLoader( this.options.manager ); + + } else { + + this.textureLoader = new TextureLoader( this.options.manager ); + + } + + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + this.textureLoader.setRequestHeader( this.options.requestHeader ); + + this.fileLoader = new FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + setExtensions( extensions ) { + + this.extensions = extensions; + + } + + setPlugins( plugins ) { + + this.plugins = plugins; + + } + + parse( onLoad, onError ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this._invokeAll( function ( ext ) { + + return ext._markDefs && ext._markDefs(); + + } ); + + Promise.all( this._invokeAll( function ( ext ) { + + return ext.beforeRoot && ext.beforeRoot(); + + } ) ).then( function () { + + return Promise.all( [ + + parser.getDependencies( 'scene' ), + parser.getDependencies( 'animation' ), + parser.getDependencies( 'camera' ), + + ] ); + + } ).then( function ( dependencies ) { + + const result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + Promise.all( parser._invokeAll( function ( ext ) { + + return ext.afterRoot && ext.afterRoot( result ); + + } ) ).then( function () { + + onLoad( result ); + + } ); + + } ).catch( onError ); + + } + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + _markDefs() { + + const nodeDefs = this.json.nodes || []; + const skinDefs = this.json.skins || []; + const meshDefs = this.json.meshes || []; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + const joints = skinDefs[ skinIndex ].joints; + + for ( let i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Iterate over all nodes, marking references to shared resources, + // as well as skeleton joints. + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + this._addNodeRef( this.meshCache, nodeDef.mesh ); + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + if ( nodeDef.camera !== undefined ) { + + this._addNodeRef( this.cameraCache, nodeDef.camera ); + + } + + } + + } + + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + */ + _addNodeRef( cache, index ) { + + if ( index === undefined ) return; + + if ( cache.refs[ index ] === undefined ) { + + cache.refs[ index ] = cache.uses[ index ] = 0; + + } + + cache.refs[ index ] ++; + + } + + /** Returns a reference to a shared resource, cloning it if necessary. */ + _getNodeRef( cache, index, object ) { + + if ( cache.refs[ index ] <= 1 ) return object; + + const ref = object.clone(); + + // Propagates mappings to the cloned object, prevents mappings on the + // original object from being lost. + const updateMappings = ( original, clone ) => { + + const mappings = this.associations.get( original ); + if ( mappings != null ) { + + this.associations.set( clone, mappings ); + + } + + for ( const [ i, child ] of original.children.entries() ) { + + updateMappings( child, clone.children[ i ] ); + + } + + }; + + updateMappings( object, ref ); + + ref.name += '_instance_' + ( cache.uses[ index ] ++ ); + + return ref; + + } + + _invokeOne( func ) { + + const extensions = Object.values( this.plugins ); + extensions.push( this ); + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) return result; + + } + + return null; + + } + + _invokeAll( func ) { + + const extensions = Object.values( this.plugins ); + extensions.unshift( this ); + + const pending = []; + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) pending.push( result ); + + } + + return pending; + + } + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + getDependency( type, index ) { + + const cacheKey = type + ':' + index; + let dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this.loadNode( index ); + break; + + case 'mesh': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMesh && ext.loadMesh( index ); + + } ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadBufferView && ext.loadBufferView( index ); + + } ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMaterial && ext.loadMaterial( index ); + + } ); + break; + + case 'texture': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadTexture && ext.loadTexture( index ); + + } ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this.loadAnimation( index ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + default: + throw new Error( 'Unknown type: ' + type ); + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + } + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + getDependencies( type ) { + + let dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + const parser = this; + const defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + loadBuffer( bufferIndex ) { + + const bufferDef = this.json.buffers[ bufferIndex ]; + const loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } + + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { + + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); + + } + + const options = this.options; + + return new Promise( function ( resolve, reject ) { + + loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { + + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); + + } ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + loadBufferView( bufferViewIndex ) { + + const bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; + + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { + + const byteLength = bufferViewDef.byteLength || 0; + const byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + loadAccessor( accessorIndex ) { + + const parser = this; + const json = this.json; + + const accessorDef = this.json.accessors[ accessorIndex ]; + + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { + + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return Promise.resolve( null ); + + } + + const pendingBufferViews = []; + + if ( accessorDef.bufferView !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); + + } else { + + pendingBufferViews.push( null ); + + } + + if ( accessorDef.sparse !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); + + } + + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { + + const bufferView = bufferViews[ 0 ]; + + const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + const elementBytes = TypedArray.BYTES_PER_ELEMENT; + const itemBytes = elementBytes * itemSize; + const byteOffset = accessorDef.byteOffset || 0; + const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + const normalized = accessorDef.normalized === true; + let array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + const ibSlice = Math.floor( byteOffset / byteStride ); + const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + let ib = parser.cache.get( ibCacheKey ); + + if ( ! ib ) { + + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new InterleavedBuffer( array, byteStride / elementBytes ); + + parser.cache.add( ibCacheKey, ib ); + + } + + bufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); + + } else { + + if ( bufferView === null ) { + + array = new TypedArray( accessorDef.count * itemSize ); + + } else { + + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); + + } + + bufferAttribute = new BufferAttribute( array, itemSize, normalized ); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { + + const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + const TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; + + const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + const sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + const sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); + + if ( bufferView !== null ) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); + + } + + for ( let i = 0, il = sparseIndices.length; i < il; i ++ ) { + + const index = sparseIndices[ i ]; + + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); + + } + + } + + return bufferAttribute; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + loadTexture( textureIndex ) { + + const json = this.json; + const options = this.options; + const textureDef = json.textures[ textureIndex ]; + const source = json.images[ textureDef.source ]; + + let loader = this.textureLoader; + + if ( source.uri ) { + + const handler = options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.loadTextureImage( textureIndex, source, loader ); + + } + + loadTextureImage( textureIndex, source, loader ) { + + const parser = this; + const json = this.json; + const options = this.options; + + const textureDef = json.textures[ textureIndex ]; + + const cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler; + + if ( this.textureCache[ cacheKey ] ) { + + // See https://github.com/mrdoob/three.js/issues/21559. + return this.textureCache[ cacheKey ]; + + } + + const URL = self.URL || self.webkitURL; + + let sourceURI = source.uri || ''; + let isObjectURL = false; + + if ( source.bufferView !== undefined ) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { + + isObjectURL = true; + const blob = new Blob( [ bufferView ], { type: source.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; + + } ); + + } else if ( source.uri === undefined ) { + + throw new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' ); + + } + + const promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) { + + return new Promise( function ( resolve, reject ) { + + let onLoad = resolve; + + if ( loader.isImageBitmapLoader === true ) { + + onLoad = function ( imageBitmap ) { + + const texture = new Texture( imageBitmap ); + texture.needsUpdate = true; + + resolve( texture ); + + }; + + } + + loader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); + + } ); + + } ).then( function ( texture ) { + + // Clean up resources and configure Texture. + + if ( isObjectURL === true ) { + + URL.revokeObjectURL( sourceURI ); + + } + + texture.flipY = false; + + if ( textureDef.name ) texture.name = textureDef.name; + + const samplers = json.samplers || {}; + const sampler = samplers[ textureDef.sampler ] || {}; + + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping; + + parser.associations.set( texture, { textures: textureIndex } ); + + return texture; + + } ).catch( function () { + + console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI ); + return null; + + } ); + + this.textureCache[ cacheKey ] = promise; + + return promise; + + } + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + assignTexture( materialParams, mapName, mapDef ) { + + const parser = this; + + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { + + // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured + // However, we will copy UV set 0 to UV set 1 on demand for aoMap + if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { + + console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); + + } + + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { + + const transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; + + if ( transform ) { + + const gltfReference = parser.associations.get( texture ); + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + parser.associations.set( texture, gltfReference ); + + } + + } + + materialParams[ mapName ] = texture; + + return texture; + + } ); + + } + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accommodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {Object3D} mesh Mesh, Line, or Points instance. + */ + assignFinalMaterial( mesh ) { + + const geometry = mesh.geometry; + let material = mesh.material; + + const useDerivativeTangents = geometry.attributes.tangent === undefined; + const useVertexColors = geometry.attributes.color !== undefined; + const useFlatShading = geometry.attributes.normal === undefined; + + if ( mesh.isPoints ) { + + const cacheKey = 'PointsMaterial:' + material.uuid; + + let pointsMaterial = this.cache.get( cacheKey ); + + if ( ! pointsMaterial ) { + + pointsMaterial = new PointsMaterial(); + Material.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add( cacheKey, pointsMaterial ); + + } + + material = pointsMaterial; + + } else if ( mesh.isLine ) { + + const cacheKey = 'LineBasicMaterial:' + material.uuid; + + let lineMaterial = this.cache.get( cacheKey ); + + if ( ! lineMaterial ) { + + lineMaterial = new LineBasicMaterial(); + Material.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); + + this.cache.add( cacheKey, lineMaterial ); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if ( useDerivativeTangents || useVertexColors || useFlatShading ) { + + let cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; + if ( useDerivativeTangents ) cacheKey += 'derivative-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + + let cachedMaterial = this.cache.get( cacheKey ); + + if ( ! cachedMaterial ) { + + cachedMaterial = material.clone(); + + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + + if ( useDerivativeTangents ) { + + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1; + if ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1; + + } + + this.cache.add( cacheKey, cachedMaterial ); + + this.associations.set( cachedMaterial, this.associations.get( material ) ); + + } + + material = cachedMaterial; + + } + + // workarounds for mesh and geometry + + if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { + + geometry.setAttribute( 'uv2', geometry.attributes.uv ); + + } + + mesh.material = material; + + } + + getMaterialType( /* materialIndex */ ) { + + return MeshStandardMaterial; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + loadMaterial( materialIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + const materialDef = json.materials[ materialIndex ]; + + let materialType; + const materialParams = {}; + const materialExtensions = materialDef.extensions || {}; + + const pending = []; + + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { + + const sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; + materialType = sgExtension.getMaterialType(); + pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); + + } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { + + const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + const metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); + + } + + materialType = this._invokeOne( function ( ext ) { + + return ext.getMaterialType && ext.getMaterialType( materialIndex ); + + } ); + + pending.push( Promise.all( this._invokeAll( function ( ext ) { + + return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); + + } ) ) ); + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = DoubleSide; + + } + + const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.format = RGBFormat; + materialParams.transparent = false; + + if ( alphaMode === ALPHA_MODES.MASK ) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); + + materialParams.normalScale = new Vector2( 1, 1 ); + + if ( materialDef.normalTexture.scale !== undefined ) { + + const scale = materialDef.normalTexture.scale; + + materialParams.normalScale.set( scale, scale ); + + } + + } + + if ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) { + + materialParams.emissive = new Color().fromArray( materialDef.emissiveFactor ); + + } + + if ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); + + } + + return Promise.all( pending ).then( function () { + + let material; + + if ( materialType === GLTFMeshStandardSGMaterial ) { + + material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); + + } else { + + material = new materialType( materialParams ); + + } + + if ( materialDef.name ) material.name = materialDef.name; + + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if ( material.map ) material.map.encoding = sRGBEncoding; + if ( material.emissiveMap ) material.emissiveMap.encoding = sRGBEncoding; + + assignExtrasToUserData( material, materialDef ); + + parser.associations.set( material, { materials: materialIndex } ); + + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); + + return material; + + } ); + + } + + /** When Object3D instances are targeted by animation, they need unique names. */ + createUniqueName( originalName ) { + + const sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' ); + + let name = sanitizedName; + + for ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) { + + name = sanitizedName + '_' + i; + + } + + this.nodeNamesUsed[ name ] = true; + + return name; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + loadGeometries( primitives ) { + + const parser = this; + const extensions = this.extensions; + const cache = this.primitiveCache; + + function createDracoPrimitive( primitive ) { + + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { + + return addPrimitiveAttributes( geometry, primitive, parser ); + + } ); + + } + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const primitive = primitives[ i ]; + const cacheKey = createPrimitiveKey( primitive ); + + // See if we've already created this geometry + const cached = cache[ cacheKey ]; + + if ( cached ) { + + // Use the cached geometry if it exists + pending.push( cached.promise ); + + } else { + + let geometryPromise; + + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser ); + + } + + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; + + pending.push( geometryPromise ); + + } + + } + + return Promise.all( pending ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + loadMesh( meshIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + const meshDef = json.meshes[ meshIndex ]; + const primitives = meshDef.primitives; + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); + + pending.push( material ); + + } + + pending.push( parser.loadGeometries( primitives ) ); + + return Promise.all( pending ).then( function ( results ) { + + const materials = results.slice( 0, results.length - 1 ); + const geometries = results[ results.length - 1 ]; + + const meshes = []; + + for ( let i = 0, il = geometries.length; i < il; i ++ ) { + + const geometry = geometries[ i ]; + const primitive = primitives[ i ]; + + // 1. create Mesh + + let mesh; + + const material = materials[ i ]; + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined ) { + + // .isSkinnedMesh isn't in glTF spec. See ._markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new SkinnedMesh( geometry, material ) + : new Mesh( geometry, material ); + + if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { + + // we normalize floating point skin weight array to fix malformed assets (see #15319) + // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs + mesh.normalizeSkinWeights(); + + } + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode ); + + } + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { + + mesh = new LineSegments( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { + + mesh = new Line( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { + + mesh = new LineLoop( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { + + mesh = new Points( geometry, material ); + + } else { + + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); + + } + + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { + + updateMorphTargets( mesh, meshDef ); + + } + + mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) ); + + assignExtrasToUserData( mesh, meshDef ); + + if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); + + parser.assignFinalMaterial( mesh ); + + meshes.push( mesh ); + + } + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + parser.associations.set( meshes[ i ], { + meshes: meshIndex, + primitives: i + } ); + + } + + if ( meshes.length === 1 ) { + + return meshes[ 0 ]; + + } + + const group = new Group(); + + parser.associations.set( group, { meshes: meshIndex } ); + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + group.add( meshes[ i ] ); + + } + + return group; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + loadCamera( cameraIndex ) { + + let camera; + const cameraDef = this.json.cameras[ cameraIndex ]; + const params = cameraDef[ cameraDef.type ]; + + if ( ! params ) { + + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; + + } + + if ( cameraDef.type === 'perspective' ) { + + camera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); + + } else if ( cameraDef.type === 'orthographic' ) { + + camera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); + + } + + if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); + + assignExtrasToUserData( camera, cameraDef ); + + return Promise.resolve( camera ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + loadSkin( skinIndex ) { + + const skinDef = this.json.skins[ skinIndex ]; + + const skinEntry = { joints: skinDef.joints }; + + if ( skinDef.inverseBindMatrices === undefined ) { + + return Promise.resolve( skinEntry ); + + } + + return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { + + skinEntry.inverseBindMatrices = accessor; + + return skinEntry; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + loadAnimation( animationIndex ) { + + const json = this.json; + + const animationDef = json.animations[ animationIndex ]; + + const pendingNodes = []; + const pendingInputAccessors = []; + const pendingOutputAccessors = []; + const pendingSamplers = []; + const pendingTargets = []; + + for ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) { + + const channel = animationDef.channels[ i ]; + const sampler = animationDef.samplers[ channel.sampler ]; + const target = channel.target; + const name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + const input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + const output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; + + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); + + } + + return Promise.all( [ + + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) + + ] ).then( function ( dependencies ) { + + const nodes = dependencies[ 0 ]; + const inputAccessors = dependencies[ 1 ]; + const outputAccessors = dependencies[ 2 ]; + const samplers = dependencies[ 3 ]; + const targets = dependencies[ 4 ]; + + const tracks = []; + + for ( let i = 0, il = nodes.length; i < il; i ++ ) { + + const node = nodes[ i ]; + const inputAccessor = inputAccessors[ i ]; + const outputAccessor = outputAccessors[ i ]; + const sampler = samplers[ i ]; + const target = targets[ i ]; + + if ( node === undefined ) continue; + + node.updateMatrix(); + node.matrixAutoUpdate = true; + + let TypedKeyframeTrack; + + switch ( PATH_PROPERTIES[ target.path ] ) { + + case PATH_PROPERTIES.weights: + + TypedKeyframeTrack = NumberKeyframeTrack; + break; + + case PATH_PROPERTIES.rotation: + + TypedKeyframeTrack = QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: + + TypedKeyframeTrack = VectorKeyframeTrack; + break; + + } + + const targetName = node.name ? node.name : node.uuid; + + const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear; + + const targetNames = []; + + if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { + + // Node may be a Group (glTF mesh with several primitives) or a Mesh. + node.traverse( function ( object ) { + + if ( object.isMesh === true && object.morphTargetInfluences ) { + + targetNames.push( object.name ? object.name : object.uuid ); + + } + + } ); + + } else { + + targetNames.push( targetName ); + + } + + let outputArray = outputAccessor.array; + + if ( outputAccessor.normalized ) { + + const scale = getNormalizedComponentScale( outputArray.constructor ); + const scaled = new Float32Array( outputArray.length ); + + for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; + + } + + for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) { + + const track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + const interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; + + return new interpolantType( this.times, this.values, this.getValueSize() / 3, result ); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + + tracks.push( track ); + + } + + } + + const name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; + + return new AnimationClip( name, undefined, tracks ); + + } ); + + } + + createNodeMesh( nodeIndex ) { + + const json = this.json; + const parser = this; + const nodeDef = json.nodes[ nodeIndex ]; + + if ( nodeDef.mesh === undefined ) return null; + + return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { + + const node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); + + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { + + node.traverse( function ( o ) { + + if ( ! o.isMesh ) return; + + for ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) { + + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; + + } + + } ); + + } + + return node; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + loadNode( nodeIndex ) { + + const json = this.json; + const extensions = this.extensions; + const parser = this; + + const nodeDef = json.nodes[ nodeIndex ]; + + // reserve node's name before its dependencies, so the root has the intended name. + const nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; + + return ( function () { + + const pending = []; + + const meshPromise = parser._invokeOne( function ( ext ) { + + return ext.createNodeMesh && ext.createNodeMesh( nodeIndex ); + + } ); + + if ( meshPromise ) { + + pending.push( meshPromise ); + + } + + if ( nodeDef.camera !== undefined ) { + + pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { + + return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); + + } ) ); + + } + + parser._invokeAll( function ( ext ) { + + return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); + + } ).forEach( function ( promise ) { + + pending.push( promise ); + + } ); + + return Promise.all( pending ); + + }() ).then( function ( objects ) { + + let node; + + // .isBone isn't in glTF spec. See ._markDefs + if ( nodeDef.isBone === true ) { + + node = new Bone(); + + } else if ( objects.length > 1 ) { + + node = new Group(); + + } else if ( objects.length === 1 ) { + + node = objects[ 0 ]; + + } else { + + node = new Object3D(); + + } + + if ( node !== objects[ 0 ] ) { + + for ( let i = 0, il = objects.length; i < il; i ++ ) { + + node.add( objects[ i ] ); + + } + + } + + if ( nodeDef.name ) { + + node.userData.name = nodeDef.name; + node.name = nodeName; + + } + + assignExtrasToUserData( node, nodeDef ); + + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); + + if ( nodeDef.matrix !== undefined ) { + + const matrix = new Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); + + } else { + + if ( nodeDef.translation !== undefined ) { + + node.position.fromArray( nodeDef.translation ); + + } + + if ( nodeDef.rotation !== undefined ) { + + node.quaternion.fromArray( nodeDef.rotation ); + + } + + if ( nodeDef.scale !== undefined ) { + + node.scale.fromArray( nodeDef.scale ); + + } + + } + + if ( ! parser.associations.has( node ) ) { + + parser.associations.set( node, {} ); + + } + + parser.associations.get( node ).nodes = nodeIndex; + + return node; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + loadScene( sceneIndex ) { + + const json = this.json; + const extensions = this.extensions; + const sceneDef = this.json.scenes[ sceneIndex ]; + const parser = this; + + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + const scene = new Group(); + if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); + + assignExtrasToUserData( scene, sceneDef ); + + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); + + const nodeIds = sceneDef.nodes || []; + + const pending = []; + + for ( let i = 0, il = nodeIds.length; i < il; i ++ ) { + + pending.push( buildNodeHierarchy( nodeIds[ i ], scene, json, parser ) ); + + } + + return Promise.all( pending ).then( function () { + + // Removes dangling associations, associations that reference a node that + // didn't make it into the scene. + const reduceAssociations = ( node ) => { + + const reducedAssociations = new Map(); + + for ( const [ key, value ] of parser.associations ) { + + if ( key instanceof Material || key instanceof Texture ) { + + reducedAssociations.set( key, value ); + + } + + } + + node.traverse( ( node ) => { + + const mappings = parser.associations.get( node ); + + if ( mappings != null ) { + + reducedAssociations.set( node, mappings ); + + } + + } ); + + return reducedAssociations; + + }; + + parser.associations = reduceAssociations( scene ); + + return scene; + + } ); + + } + +} + +function buildNodeHierarchy( nodeId, parentObject, json, parser ) { + + const nodeDef = json.nodes[ nodeId ]; + + return parser.getDependency( 'node', nodeId ).then( function ( node ) { + + if ( nodeDef.skin === undefined ) return node; + + // build skeleton here as well + + let skinEntry; + + return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { + + skinEntry = skin; + + const pendingJoints = []; + + for ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) { + + pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); + + } + + return Promise.all( pendingJoints ); + + } ).then( function ( jointNodes ) { + + node.traverse( function ( mesh ) { + + if ( ! mesh.isMesh ) return; + + const bones = []; + const boneInverses = []; + + for ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) { + + const jointNode = jointNodes[ j ]; + + if ( jointNode ) { + + bones.push( jointNode ); + + const mat = new Matrix4(); + + if ( skinEntry.inverseBindMatrices !== undefined ) { + + mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); + + } + + boneInverses.push( mat ); + + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); + + } + + } + + mesh.bind( new Skeleton( bones, boneInverses ), mesh.matrixWorld ); + + } ); + + return node; + + } ); + + } ).then( function ( node ) { + + // build node hierachy + + parentObject.add( node ); + + const pending = []; + + if ( nodeDef.children ) { + + const children = nodeDef.children; + + for ( let i = 0, il = children.length; i < il; i ++ ) { + + const child = children[ i ]; + pending.push( buildNodeHierarchy( child, node, json, parser ) ); + + } + + } + + return Promise.all( pending ); + + } ); + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ +function computeBounds( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const box = new Box3(); + + if ( attributes.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ attributes.POSITION ]; + + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + box.set( + new Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) + ); + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + box.min.multiplyScalar( boxScale ); + box.max.multiplyScalar( boxScale ); + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + return; + + } + + } else { + + return; + + } + + const targets = primitiveDef.targets; + + if ( targets !== undefined ) { + + const maxDisplacement = new Vector3(); + const vector = new Vector3(); + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ target.POSITION ]; + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); + + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + vector.multiplyScalar( boxScale ); + + } + + // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative + // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets + // are used to implement key-frame animations and as such only two are active at a time - this results in very large + // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. + maxDisplacement.max( vector ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } + + } + + } + + // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. + box.expandByVector( maxDisplacement ); + + } + + geometry.boundingBox = box; + + const sphere = new Sphere(); + + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; + + geometry.boundingSphere = sphere; + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ +function addPrimitiveAttributes( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const pending = []; + + function assignAttributeAccessor( accessorIndex, attributeName ) { + + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { + + geometry.setAttribute( attributeName, accessor ); + + } ); + + } + + for ( const gltfAttributeName in attributes ) { + + const threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + + } + + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + + } + + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + +} + +/** + * @param {BufferGeometry} geometry + * @param {Number} drawMode + * @return {BufferGeometry} + */ +function toTrianglesDrawMode( geometry, drawMode ) { + + let index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + const indices = []; + + const position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( let i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + + } + + // + + const numberOfTriangles = index.count - 2; + const newIndices = []; + + if ( drawMode === TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( let i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( let i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); + + } + + } + + } + + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); + + } + + // build final geometry + + const newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); + + return newGeometry; + +} + +export { GLTFLoader }; diff --git a/public/three/examples/jsm/loaders/OBJLoader.js b/public/three/examples/jsm/loaders/OBJLoader.js new file mode 100644 index 0000000..745ae0e --- /dev/null +++ b/public/three/examples/jsm/loaders/OBJLoader.js @@ -0,0 +1,911 @@ +import { + BufferGeometry, + FileLoader, + Float32BufferAttribute, + Group, + LineBasicMaterial, + LineSegments, + Loader, + Material, + Mesh, + MeshPhongMaterial, + Points, + PointsMaterial, + Vector3 +} from '../../../build/three.module.js'; + +// o object_name | g group_name +const _object_pattern = /^[og]\s*(.+)?/; +// mtllib file_reference +const _material_library_pattern = /^mtllib /; +// usemtl material_name +const _material_use_pattern = /^usemtl /; +// usemap map_name +const _map_use_pattern = /^usemap /; + +const _vA = new Vector3(); +const _vB = new Vector3(); +const _vC = new Vector3(); + +const _ab = new Vector3(); +const _cb = new Vector3(); + +function ParserState() { + + const state = { + objects: [], + object: {}, + + vertices: [], + normals: [], + colors: [], + uvs: [], + + materials: {}, + materialLibraries: [], + + startObject: function ( name, fromDeclaration ) { + + // If the current object (initial from reset) is not from a g/o declaration in the parsed + // file. We need to use it for the first parsed g/o to keep things in sync. + if ( this.object && this.object.fromDeclaration === false ) { + + this.object.name = name; + this.object.fromDeclaration = ( fromDeclaration !== false ); + return; + + } + + const previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined ); + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + this.object = { + name: name || '', + fromDeclaration: ( fromDeclaration !== false ), + + geometry: { + vertices: [], + normals: [], + colors: [], + uvs: [], + hasUVIndices: false + }, + materials: [], + smooth: true, + + startMaterial: function ( name, libraries ) { + + const previous = this._finalize( false ); + + // New usemtl declaration overwrites an inherited material, except if faces were declared + // after the material, then it must be preserved for proper MultiMaterial continuation. + if ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) { + + this.materials.splice( previous.index, 1 ); + + } + + const material = { + index: this.materials.length, + name: name || '', + mtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ), + smooth: ( previous !== undefined ? previous.smooth : this.smooth ), + groupStart: ( previous !== undefined ? previous.groupEnd : 0 ), + groupEnd: - 1, + groupCount: - 1, + inherited: false, + + clone: function ( index ) { + + const cloned = { + index: ( typeof index === 'number' ? index : this.index ), + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: - 1, + groupCount: - 1, + inherited: false + }; + cloned.clone = this.clone.bind( cloned ); + return cloned; + + } + }; + + this.materials.push( material ); + + return material; + + }, + + currentMaterial: function () { + + if ( this.materials.length > 0 ) { + + return this.materials[ this.materials.length - 1 ]; + + } + + return undefined; + + }, + + _finalize: function ( end ) { + + const lastMultiMaterial = this.currentMaterial(); + if ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) { + + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + + } + + // Ignore objects tail materials if no face declarations followed them before a new o/g started. + if ( end && this.materials.length > 1 ) { + + for ( let mi = this.materials.length - 1; mi >= 0; mi -- ) { + + if ( this.materials[ mi ].groupCount <= 0 ) { + + this.materials.splice( mi, 1 ); + + } + + } + + } + + // Guarantee at least one empty material, this makes the creation later more straight forward. + if ( end && this.materials.length === 0 ) { + + this.materials.push( { + name: '', + smooth: this.smooth + } ); + + } + + return lastMultiMaterial; + + } + }; + + // Inherit previous objects material. + // Spec tells us that a declared material must be set to all objects until a new material is declared. + // If a usemtl declaration is encountered while this new object is being parsed, it will + // overwrite the inherited material. Exception being that there was already face declarations + // to the inherited material, then it will be preserved for proper MultiMaterial continuation. + + if ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) { + + const declared = previousMaterial.clone( 0 ); + declared.inherited = true; + this.object.materials.push( declared ); + + } + + this.objects.push( this.object ); + + }, + + finalize: function () { + + if ( this.object && typeof this.object._finalize === 'function' ) { + + this.object._finalize( true ); + + } + + }, + + parseVertexIndex: function ( value, len ) { + + const index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseNormalIndex: function ( value, len ) { + + const index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 3 ) * 3; + + }, + + parseUVIndex: function ( value, len ) { + + const index = parseInt( value, 10 ); + return ( index >= 0 ? index - 1 : index + len / 2 ) * 2; + + }, + + addVertex: function ( a, b, c ) { + + const src = this.vertices; + const dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addVertexPoint: function ( a ) { + + const src = this.vertices; + const dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addVertexLine: function ( a ) { + + const src = this.vertices; + const dst = this.object.geometry.vertices; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + + }, + + addNormal: function ( a, b, c ) { + + const src = this.normals; + const dst = this.object.geometry.normals; + + dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addFaceNormal: function ( a, b, c ) { + + const src = this.vertices; + const dst = this.object.geometry.normals; + + _vA.fromArray( src, a ); + _vB.fromArray( src, b ); + _vC.fromArray( src, c ); + + _cb.subVectors( _vC, _vB ); + _ab.subVectors( _vA, _vB ); + _cb.cross( _ab ); + + _cb.normalize(); + + dst.push( _cb.x, _cb.y, _cb.z ); + dst.push( _cb.x, _cb.y, _cb.z ); + dst.push( _cb.x, _cb.y, _cb.z ); + + }, + + addColor: function ( a, b, c ) { + + const src = this.colors; + const dst = this.object.geometry.colors; + + if ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] ); + if ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] ); + if ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] ); + + }, + + addUV: function ( a, b, c ) { + + const src = this.uvs; + const dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + dst.push( src[ b + 0 ], src[ b + 1 ] ); + dst.push( src[ c + 0 ], src[ c + 1 ] ); + + }, + + addDefaultUV: function () { + + const dst = this.object.geometry.uvs; + + dst.push( 0, 0 ); + dst.push( 0, 0 ); + dst.push( 0, 0 ); + + }, + + addUVLine: function ( a ) { + + const src = this.uvs; + const dst = this.object.geometry.uvs; + + dst.push( src[ a + 0 ], src[ a + 1 ] ); + + }, + + addFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) { + + const vLen = this.vertices.length; + + let ia = this.parseVertexIndex( a, vLen ); + let ib = this.parseVertexIndex( b, vLen ); + let ic = this.parseVertexIndex( c, vLen ); + + this.addVertex( ia, ib, ic ); + this.addColor( ia, ib, ic ); + + // normals + + if ( na !== undefined && na !== '' ) { + + const nLen = this.normals.length; + + ia = this.parseNormalIndex( na, nLen ); + ib = this.parseNormalIndex( nb, nLen ); + ic = this.parseNormalIndex( nc, nLen ); + + this.addNormal( ia, ib, ic ); + + } else { + + this.addFaceNormal( ia, ib, ic ); + + } + + // uvs + + if ( ua !== undefined && ua !== '' ) { + + const uvLen = this.uvs.length; + + ia = this.parseUVIndex( ua, uvLen ); + ib = this.parseUVIndex( ub, uvLen ); + ic = this.parseUVIndex( uc, uvLen ); + + this.addUV( ia, ib, ic ); + + this.object.geometry.hasUVIndices = true; + + } else { + + // add placeholder values (for inconsistent face definitions) + + this.addDefaultUV(); + + } + + }, + + addPointGeometry: function ( vertices ) { + + this.object.geometry.type = 'Points'; + + const vLen = this.vertices.length; + + for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) { + + const index = this.parseVertexIndex( vertices[ vi ], vLen ); + + this.addVertexPoint( index ); + this.addColor( index ); + + } + + }, + + addLineGeometry: function ( vertices, uvs ) { + + this.object.geometry.type = 'Line'; + + const vLen = this.vertices.length; + const uvLen = this.uvs.length; + + for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) { + + this.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) ); + + } + + for ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) { + + this.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) ); + + } + + } + + }; + + state.startObject( '', false ); + + return state; + +} + +// + +class OBJLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.materials = null; + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( text ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + setMaterials( materials ) { + + this.materials = materials; + + return this; + + } + + parse( text ) { + + const state = new ParserState(); + + if ( text.indexOf( '\r\n' ) !== - 1 ) { + + // This is faster than String.split with regex that splits on both + text = text.replace( /\r\n/g, '\n' ); + + } + + if ( text.indexOf( '\\\n' ) !== - 1 ) { + + // join lines separated by a line continuation character (\) + text = text.replace( /\\\n/g, '' ); + + } + + const lines = text.split( '\n' ); + let line = '', lineFirstChar = ''; + let lineLength = 0; + let result = []; + + // Faster to just trim left side of the line. Use if available. + const trimLeft = ( typeof ''.trimLeft === 'function' ); + + for ( let i = 0, l = lines.length; i < l; i ++ ) { + + line = lines[ i ]; + + line = trimLeft ? line.trimLeft() : line.trim(); + + lineLength = line.length; + + if ( lineLength === 0 ) continue; + + lineFirstChar = line.charAt( 0 ); + + // @todo invoke passed in handler if any + if ( lineFirstChar === '#' ) continue; + + if ( lineFirstChar === 'v' ) { + + const data = line.split( /\s+/ ); + + switch ( data[ 0 ] ) { + + case 'v': + state.vertices.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + if ( data.length >= 7 ) { + + state.colors.push( + parseFloat( data[ 4 ] ), + parseFloat( data[ 5 ] ), + parseFloat( data[ 6 ] ) + + ); + + } else { + + // if no colors are defined, add placeholders so color and vertex indices match + + state.colors.push( undefined, undefined, undefined ); + + } + + break; + case 'vn': + state.normals.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ), + parseFloat( data[ 3 ] ) + ); + break; + case 'vt': + state.uvs.push( + parseFloat( data[ 1 ] ), + parseFloat( data[ 2 ] ) + ); + break; + + } + + } else if ( lineFirstChar === 'f' ) { + + const lineData = line.substr( 1 ).trim(); + const vertexData = lineData.split( /\s+/ ); + const faceVertices = []; + + // Parse the face vertex data into an easy to work with format + + for ( let j = 0, jl = vertexData.length; j < jl; j ++ ) { + + const vertex = vertexData[ j ]; + + if ( vertex.length > 0 ) { + + const vertexParts = vertex.split( '/' ); + faceVertices.push( vertexParts ); + + } + + } + + // Draw an edge between the first vertex and all subsequent vertices to form an n-gon + + const v1 = faceVertices[ 0 ]; + + for ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) { + + const v2 = faceVertices[ j ]; + const v3 = faceVertices[ j + 1 ]; + + state.addFace( + v1[ 0 ], v2[ 0 ], v3[ 0 ], + v1[ 1 ], v2[ 1 ], v3[ 1 ], + v1[ 2 ], v2[ 2 ], v3[ 2 ] + ); + + } + + } else if ( lineFirstChar === 'l' ) { + + const lineParts = line.substring( 1 ).trim().split( ' ' ); + let lineVertices = []; + const lineUVs = []; + + if ( line.indexOf( '/' ) === - 1 ) { + + lineVertices = lineParts; + + } else { + + for ( let li = 0, llen = lineParts.length; li < llen; li ++ ) { + + const parts = lineParts[ li ].split( '/' ); + + if ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] ); + if ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] ); + + } + + } + + state.addLineGeometry( lineVertices, lineUVs ); + + } else if ( lineFirstChar === 'p' ) { + + const lineData = line.substr( 1 ).trim(); + const pointData = lineData.split( ' ' ); + + state.addPointGeometry( pointData ); + + } else if ( ( result = _object_pattern.exec( line ) ) !== null ) { + + // o object_name + // or + // g group_name + + // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869 + // let name = result[ 0 ].substr( 1 ).trim(); + const name = ( ' ' + result[ 0 ].substr( 1 ).trim() ).substr( 1 ); + + state.startObject( name ); + + } else if ( _material_use_pattern.test( line ) ) { + + // material + + state.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries ); + + } else if ( _material_library_pattern.test( line ) ) { + + // mtl file + + state.materialLibraries.push( line.substring( 7 ).trim() ); + + } else if ( _map_use_pattern.test( line ) ) { + + // the line is parsed but ignored since the loader assumes textures are defined MTL files + // (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method) + + console.warn( 'THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.' ); + + } else if ( lineFirstChar === 's' ) { + + result = line.split( ' ' ); + + // smooth shading + + // @todo Handle files that have varying smooth values for a set of faces inside one geometry, + // but does not define a usemtl for each face set. + // This should be detected and a dummy material created (later MultiMaterial and geometry groups). + // This requires some care to not create extra material on each smooth value for "normal" obj files. + // where explicit usemtl defines geometry groups. + // Example asset: examples/models/obj/cerberus/Cerberus.obj + + /* + * http://paulbourke.net/dataformats/obj/ + * or + * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf + * + * From chapter "Grouping" Syntax explanation "s group_number": + * "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off. + * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form + * surfaces, smoothing groups are either turned on or off; there is no difference between values greater + * than 0." + */ + if ( result.length > 1 ) { + + const value = result[ 1 ].trim().toLowerCase(); + state.object.smooth = ( value !== '0' && value !== 'off' ); + + } else { + + // ZBrush can produce "s" lines #11707 + state.object.smooth = true; + + } + + const material = state.object.currentMaterial(); + if ( material ) material.smooth = state.object.smooth; + + } else { + + // Handle null terminated files without exception + if ( line === '\0' ) continue; + + console.warn( 'THREE.OBJLoader: Unexpected line: "' + line + '"' ); + + } + + } + + state.finalize(); + + const container = new Group(); + container.materialLibraries = [].concat( state.materialLibraries ); + + const hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 ); + + if ( hasPrimitives === true ) { + + for ( let i = 0, l = state.objects.length; i < l; i ++ ) { + + const object = state.objects[ i ]; + const geometry = object.geometry; + const materials = object.materials; + const isLine = ( geometry.type === 'Line' ); + const isPoints = ( geometry.type === 'Points' ); + let hasVertexColors = false; + + // Skip o/g line declarations that did not follow with any faces + if ( geometry.vertices.length === 0 ) continue; + + const buffergeometry = new BufferGeometry(); + + buffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) ); + + if ( geometry.normals.length > 0 ) { + + buffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) ); + + } + + if ( geometry.colors.length > 0 ) { + + hasVertexColors = true; + buffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) ); + + } + + if ( geometry.hasUVIndices === true ) { + + buffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) ); + + } + + // Create materials + + const createdMaterials = []; + + for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + const sourceMaterial = materials[ mi ]; + const materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors; + let material = state.materials[ materialHash ]; + + if ( this.materials !== null ) { + + material = this.materials.create( sourceMaterial.name ); + + // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material. + if ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) { + + const materialLine = new LineBasicMaterial(); + Material.prototype.copy.call( materialLine, material ); + materialLine.color.copy( material.color ); + material = materialLine; + + } else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) { + + const materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } ); + Material.prototype.copy.call( materialPoints, material ); + materialPoints.color.copy( material.color ); + materialPoints.map = material.map; + material = materialPoints; + + } + + } + + if ( material === undefined ) { + + if ( isLine ) { + + material = new LineBasicMaterial(); + + } else if ( isPoints ) { + + material = new PointsMaterial( { size: 1, sizeAttenuation: false } ); + + } else { + + material = new MeshPhongMaterial(); + + } + + material.name = sourceMaterial.name; + material.flatShading = sourceMaterial.smooth ? false : true; + material.vertexColors = hasVertexColors; + + state.materials[ materialHash ] = material; + + } + + createdMaterials.push( material ); + + } + + // Create mesh + + let mesh; + + if ( createdMaterials.length > 1 ) { + + for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) { + + const sourceMaterial = materials[ mi ]; + buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi ); + + } + + if ( isLine ) { + + mesh = new LineSegments( buffergeometry, createdMaterials ); + + } else if ( isPoints ) { + + mesh = new Points( buffergeometry, createdMaterials ); + + } else { + + mesh = new Mesh( buffergeometry, createdMaterials ); + + } + + } else { + + if ( isLine ) { + + mesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] ); + + } else if ( isPoints ) { + + mesh = new Points( buffergeometry, createdMaterials[ 0 ] ); + + } else { + + mesh = new Mesh( buffergeometry, createdMaterials[ 0 ] ); + + } + + } + + mesh.name = object.name; + + container.add( mesh ); + + } + + } else { + + // if there is only the default parser state object with no geometry data, interpret data as point cloud + + if ( state.vertices.length > 0 ) { + + const material = new PointsMaterial( { size: 1, sizeAttenuation: false } ); + + const buffergeometry = new BufferGeometry(); + + buffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) ); + + if ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) { + + buffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) ); + material.vertexColors = true; + + } + + const points = new Points( buffergeometry, material ); + container.add( points ); + + } + + } + + return container; + + } + +} + +export { OBJLoader }; diff --git a/public/three/examples/jsm/objects/Sky.js b/public/three/examples/jsm/objects/Sky.js new file mode 100644 index 0000000..0c8c708 --- /dev/null +++ b/public/three/examples/jsm/objects/Sky.js @@ -0,0 +1,219 @@ +import { + BackSide, + BoxGeometry, + Mesh, + ShaderMaterial, + UniformsUtils, + Vector3 +} from '../../../build/three.module.js'; + +/** + * Based on "A Practical Analytic Model for Daylight" + * aka The Preetham Model, the de facto standard analytic skydome model + * https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight + * + * First implemented by Simon Wallner + * http://www.simonwallner.at/projects/atmospheric-scattering + * + * Improved by Martin Upitis + * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR + * + * Three.js integration by zz85 http://twitter.com/blurspline +*/ + +class Sky extends Mesh { + + constructor() { + + const shader = Sky.SkyShader; + + const material = new ShaderMaterial( { + name: 'SkyShader', + fragmentShader: shader.fragmentShader, + vertexShader: shader.vertexShader, + uniforms: UniformsUtils.clone( shader.uniforms ), + side: BackSide, + depthWrite: false + } ); + + super( new BoxGeometry( 1, 1, 1 ), material ); + + } + +} + +Sky.prototype.isSky = true; + +Sky.SkyShader = { + + uniforms: { + 'turbidity': { value: 2 }, + 'rayleigh': { value: 1 }, + 'mieCoefficient': { value: 0.005 }, + 'mieDirectionalG': { value: 0.8 }, + 'sunPosition': { value: new Vector3() }, + 'up': { value: new Vector3( 0, 1, 0 ) } + }, + + vertexShader: /* glsl */` + uniform vec3 sunPosition; + uniform float rayleigh; + uniform float turbidity; + uniform float mieCoefficient; + uniform vec3 up; + + varying vec3 vWorldPosition; + varying vec3 vSunDirection; + varying float vSunfade; + varying vec3 vBetaR; + varying vec3 vBetaM; + varying float vSunE; + + // constants for atmospheric scattering + const float e = 2.71828182845904523536028747135266249775724709369995957; + const float pi = 3.141592653589793238462643383279502884197169; + + // wavelength of used primaries, according to preetham + const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 ); + // this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function: + // (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn)) + const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 ); + + // mie stuff + // K coefficient for the primaries + const float v = 4.0; + const vec3 K = vec3( 0.686, 0.678, 0.666 ); + // MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K + const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 ); + + // earth shadow hack + // cutoffAngle = pi / 1.95; + const float cutoffAngle = 1.6110731556870734; + const float steepness = 1.5; + const float EE = 1000.0; + + float sunIntensity( float zenithAngleCos ) { + zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 ); + return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) ); + } + + vec3 totalMie( float T ) { + float c = ( 0.2 * T ) * 10E-18; + return 0.434 * c * MieConst; + } + + void main() { + + vec4 worldPosition = modelMatrix * vec4( position, 1.0 ); + vWorldPosition = worldPosition.xyz; + + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + gl_Position.z = gl_Position.w; // set z to camera.far + + vSunDirection = normalize( sunPosition ); + + vSunE = sunIntensity( dot( vSunDirection, up ) ); + + vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 ); + + float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) ); + + // extinction (absorbtion + out scattering) + // rayleigh coefficients + vBetaR = totalRayleigh * rayleighCoefficient; + + // mie coefficients + vBetaM = totalMie( turbidity ) * mieCoefficient; + + }`, + + fragmentShader: /* glsl */` + varying vec3 vWorldPosition; + varying vec3 vSunDirection; + varying float vSunfade; + varying vec3 vBetaR; + varying vec3 vBetaM; + varying float vSunE; + + uniform float mieDirectionalG; + uniform vec3 up; + + const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 ); + + // constants for atmospheric scattering + const float pi = 3.141592653589793238462643383279502884197169; + + const float n = 1.0003; // refractive index of air + const float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius) + + // optical length at zenith for molecules + const float rayleighZenithLength = 8.4E3; + const float mieZenithLength = 1.25E3; + // 66 arc seconds -> degrees, and the cosine of that + const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324; + + // 3.0 / ( 16.0 * pi ) + const float THREE_OVER_SIXTEENPI = 0.05968310365946075; + // 1.0 / ( 4.0 * pi ) + const float ONE_OVER_FOURPI = 0.07957747154594767; + + float rayleighPhase( float cosTheta ) { + return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) ); + } + + float hgPhase( float cosTheta, float g ) { + float g2 = pow( g, 2.0 ); + float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 ); + return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse ); + } + + void main() { + + vec3 direction = normalize( vWorldPosition - cameraPos ); + + // optical length + // cutoff angle at 90 to avoid singularity in next formula. + float zenithAngle = acos( max( 0.0, dot( up, direction ) ) ); + float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) ); + float sR = rayleighZenithLength * inverse; + float sM = mieZenithLength * inverse; + + // combined extinction factor + vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) ); + + // in scattering + float cosTheta = dot( direction, vSunDirection ); + + float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 ); + vec3 betaRTheta = vBetaR * rPhase; + + float mPhase = hgPhase( cosTheta, mieDirectionalG ); + vec3 betaMTheta = vBetaM * mPhase; + + vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) ); + Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) ); + + // nightsky + float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2] + float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2] + vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 ); + vec3 L0 = vec3( 0.1 ) * Fex; + + // composition + solar disc + float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta ); + L0 += ( vSunE * 19000.0 * Fex ) * sundisk; + + vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 ); + + vec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) ); + + gl_FragColor = vec4( retColor, 1.0 ); + + #include + #include + + }` + +}; + +export { Sky }; diff --git a/public/three/examples/jsm/objects/Water.js b/public/three/examples/jsm/objects/Water.js new file mode 100644 index 0000000..e179699 --- /dev/null +++ b/public/three/examples/jsm/objects/Water.js @@ -0,0 +1,344 @@ +import { + Color, + FrontSide, + LinearFilter, + MathUtils, + Matrix4, + Mesh, + PerspectiveCamera, + Plane, + RGBFormat, + ShaderMaterial, + UniformsLib, + UniformsUtils, + Vector3, + Vector4, + WebGLRenderTarget +} from '../../../build/three.module.js'; + +/** + * Work based on : + * http://slayvin.net : Flat mirror for three.js + * http://www.adelphi.edu/~stemkoski : An implementation of water shader based on the flat mirror + * http://29a.ch/ && http://29a.ch/slides/2012/webglwater/ : Water shader explanations in WebGL + */ + +class Water extends Mesh { + + constructor(geometry, options = {}) { + + super(geometry); + + const scope = this; + + const textureWidth = options.textureWidth !== undefined ? options.textureWidth : 512; + const textureHeight = options.textureHeight !== undefined ? options.textureHeight : 512; + + const clipBias = options.clipBias !== undefined ? options.clipBias : 0.0; + const alpha = options.alpha !== undefined ? options.alpha : 1.0; + const time = options.time !== undefined ? options.time : 0.0; + const normalSampler = options.waterNormals !== undefined ? options.waterNormals : null; + const sunDirection = options.sunDirection !== undefined ? options.sunDirection : new Vector3(0.70707, 0.70707, 0.0); + const sunColor = new Color(options.sunColor !== undefined ? options.sunColor : 0xffffff); + const waterColor = new Color(options.waterColor !== undefined ? options.waterColor : 0x7F7F7F); + const eye = options.eye !== undefined ? options.eye : new Vector3(0, 0, 0); + const distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0; + const side = options.side !== undefined ? options.side : FrontSide; + const fog = options.fog !== undefined ? options.fog : false; + + // + + const mirrorPlane = new Plane(); + const normal = new Vector3(); + const mirrorWorldPosition = new Vector3(); + const cameraWorldPosition = new Vector3(); + const rotationMatrix = new Matrix4(); + const lookAtPosition = new Vector3(0, 0, - 1); + const clipPlane = new Vector4(); + + const view = new Vector3(); + const target = new Vector3(); + const q = new Vector4(); + + const textureMatrix = new Matrix4(); + + const mirrorCamera = new PerspectiveCamera(); + + const parameters = { + minFilter: LinearFilter, + magFilter: LinearFilter, + format: RGBFormat + }; + + const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, parameters); + + if (!MathUtils.isPowerOfTwo(textureWidth) || !MathUtils.isPowerOfTwo(textureHeight)) { + + renderTarget.texture.generateMipmaps = false; + + } + + const mirrorShader = { + + uniforms: UniformsUtils.merge([ + UniformsLib['fog'], + UniformsLib['lights'], + { + 'normalSampler': { value: null }, + 'mirrorSampler': { value: null }, + 'alpha': { value: 1.0 }, + 'time': { value: 0.0 }, + 'size': { value: 1.0 }, + 'distortionScale': { value: 20.0 }, + 'textureMatrix': { value: new Matrix4() }, + 'sunColor': { value: new Color(0x7F7F7F) }, + 'sunDirection': { value: new Vector3(0.70707, 0.70707, 0) }, + 'eye': { value: new Vector3() }, + 'waterColor': { value: new Color(0x555555) } + } + ]), + + vertexShader: /* glsl */` + uniform mat4 textureMatrix; + uniform float time; + + varying vec4 mirrorCoord; + varying vec4 worldPosition; + + #include + #include + #include + #include + + void main() { + mirrorCoord = modelMatrix * vec4( position, 1.0 ); + worldPosition = mirrorCoord.xyzw; + mirrorCoord = textureMatrix * mirrorCoord; + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + gl_Position = projectionMatrix * mvPosition; + + #include + #include + #include + #include + #include + }`, + + fragmentShader: /* glsl */` + uniform sampler2D mirrorSampler; + uniform float alpha; + uniform float time; + uniform float size; + uniform float distortionScale; + uniform sampler2D normalSampler; + uniform vec3 sunColor; + uniform vec3 sunDirection; + uniform vec3 eye; + uniform vec3 waterColor; + + varying vec4 mirrorCoord; + varying vec4 worldPosition; + + vec4 getNoise( vec2 uv ) { + vec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0); + vec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 ); + vec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 ); + vec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 ); + vec4 noise = texture2D( normalSampler, uv0 ) + + texture2D( normalSampler, uv1 ) + + texture2D( normalSampler, uv2 ) + + texture2D( normalSampler, uv3 ); + return noise * 0.5 - 1.0; + } + + void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) { + vec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) ); + float direction = max( 0.0, dot( eyeDirection, reflection ) ); + specularColor += pow( direction, shiny ) * sunColor * spec; + diffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse; + } + + #include + #include + #include + #include + #include + #include + #include + #include + + void main() { + + #include + vec4 noise = getNoise( worldPosition.xz * size ); + vec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) ); + + vec3 diffuseLight = vec3(0.0); + vec3 specularLight = vec3(0.0); + + vec3 worldToEye = eye-worldPosition.xyz; + vec3 eyeDirection = normalize( worldToEye ); + sunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight ); + + float distance = length(worldToEye); + + vec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale; + vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) ); + + float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 ); + float rf0 = 0.3; + float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 ); + vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor; + vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance); + vec3 outgoingLight = albedo; + gl_FragColor = vec4( outgoingLight, alpha ); + + #include + #include + }` + + }; + + const material = new ShaderMaterial({ + fragmentShader: mirrorShader.fragmentShader, + vertexShader: mirrorShader.vertexShader, + uniforms: UniformsUtils.clone(mirrorShader.uniforms), + lights: true, + side: side, + fog: fog + }); + + material.uniforms['mirrorSampler'].value = renderTarget.texture; + material.uniforms['textureMatrix'].value = textureMatrix; + material.uniforms['alpha'].value = alpha; + material.uniforms['time'].value = time; + material.uniforms['normalSampler'].value = normalSampler; + material.uniforms['sunColor'].value = sunColor; + material.uniforms['waterColor'].value = waterColor; + material.uniforms['sunDirection'].value = sunDirection; + material.uniforms['distortionScale'].value = distortionScale; + + material.uniforms['eye'].value = eye; + + scope.material = material; + + scope.onBeforeRender = function (renderer, scene, camera) { + + mirrorWorldPosition.setFromMatrixPosition(scope.matrixWorld); + cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld); + + rotationMatrix.extractRotation(scope.matrixWorld); + + normal.set(0, 0, 1); + normal.applyMatrix4(rotationMatrix); + + view.subVectors(mirrorWorldPosition, cameraWorldPosition); + + // Avoid rendering when mirror is facing away + + if (view.dot(normal) > 0) return; + + view.reflect(normal).negate(); + view.add(mirrorWorldPosition); + + rotationMatrix.extractRotation(camera.matrixWorld); + + lookAtPosition.set(0, 0, - 1); + lookAtPosition.applyMatrix4(rotationMatrix); + lookAtPosition.add(cameraWorldPosition); + + target.subVectors(mirrorWorldPosition, lookAtPosition); + target.reflect(normal).negate(); + target.add(mirrorWorldPosition); + + mirrorCamera.position.copy(view); + mirrorCamera.up.set(0, 1, 0); + mirrorCamera.up.applyMatrix4(rotationMatrix); + mirrorCamera.up.reflect(normal); + mirrorCamera.lookAt(target); + + mirrorCamera.far = camera.far; // Used in WebGLBackground + + mirrorCamera.updateMatrixWorld(); + mirrorCamera.projectionMatrix.copy(camera.projectionMatrix); + + // Update the texture matrix + textureMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + textureMatrix.multiply(mirrorCamera.projectionMatrix); + textureMatrix.multiply(mirrorCamera.matrixWorldInverse); + + // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html + // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf + mirrorPlane.setFromNormalAndCoplanarPoint(normal, mirrorWorldPosition); + mirrorPlane.applyMatrix4(mirrorCamera.matrixWorldInverse); + + clipPlane.set(mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant); + + const projectionMatrix = mirrorCamera.projectionMatrix; + + q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]; + q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]; + q.z = - 1.0; + q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]; + + // Calculate the scaled plane vector + clipPlane.multiplyScalar(2.0 / clipPlane.dot(q)); + + // Replacing the third row of the projection matrix + projectionMatrix.elements[2] = clipPlane.x; + projectionMatrix.elements[6] = clipPlane.y; + projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias; + projectionMatrix.elements[14] = clipPlane.w; + + eye.setFromMatrixPosition(camera.matrixWorld); + + // Render + + const currentRenderTarget = renderer.getRenderTarget(); + + const currentXrEnabled = renderer.xr.enabled; + const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate; + + scope.visible = false; + + renderer.xr.enabled = false; // Avoid camera modification and recursion + renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows + + renderer.setRenderTarget(renderTarget); + + renderer.state.buffers.depth.setMask(true); // make sure the depth buffer is writable so it can be properly cleared, see #18897 + + if (renderer.autoClear === false) renderer.clear(); + renderer.render(scene, mirrorCamera); + + scope.visible = true; + + renderer.xr.enabled = currentXrEnabled; + renderer.shadowMap.autoUpdate = currentShadowAutoUpdate; + + renderer.setRenderTarget(currentRenderTarget); + + // Restore viewport + + const viewport = camera.viewport; + + if (viewport !== undefined) { + + renderer.state.viewport(viewport); + + } + + }; + + } + +} + +Water.prototype.isWater = true; + +export { Water }; diff --git a/public/three/examples/main.css b/public/three/examples/main.css new file mode 100644 index 0000000..7a6a2c6 --- /dev/null +++ b/public/three/examples/main.css @@ -0,0 +1,93 @@ +body { + margin: 0; + background-color: #000; + color: #fff; + font-size: 13px; + line-height: 24px; + overscroll-behavior: none; + overflow: hidden; +} + +a { + color: #ff0; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +button { + cursor: pointer; + text-transform: uppercase; +} + +#info { + position: absolute; + top: 10px; + right: 10px; + padding: 1rem; + width: 12rem; + background-color: #000a; + box-sizing: border-box; + user-select: none; + pointer-events: none; + z-index: 1; /* TODO Solve this in HTML */ +} + +a, button, input, select { + pointer-events: auto; +} + +.dg.ac { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 2 !important; /* TODO Solve this in HTML */ +} + +#overlay { + position: absolute; + font-size: 16px; + z-index: 2; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + background: rgba(0,0,0,0.7); +} + + #overlay button { + background: transparent; + border: 0; + border: 1px solid rgb(255, 255, 255); + border-radius: 4px; + color: #ffffff; + padding: 12px 18px; + text-transform: uppercase; + cursor: pointer; + } + +#notSupported { + width: 50%; + margin: auto; + background-color: #f00; + margin-top: 20px; + padding: 10px; +} + + +.catkey { + color: beige; +} + +.catval { + margin-bottom: 1rem; + border-bottom: 1px dashed gray; + font-size: 1.2rem; +} \ No newline at end of file diff --git a/public/three/examples/models/Image_0.jpg b/public/three/examples/models/Image_0.jpg new file mode 100644 index 0000000..5e947d9 Binary files /dev/null and b/public/three/examples/models/Image_0.jpg differ diff --git a/public/three/examples/models/Image_0.png b/public/three/examples/models/Image_0.png new file mode 100644 index 0000000..33ef260 Binary files /dev/null and b/public/three/examples/models/Image_0.png differ diff --git a/public/three/examples/models/Image_1.jpg b/public/three/examples/models/Image_1.jpg new file mode 100644 index 0000000..983164e Binary files /dev/null and b/public/three/examples/models/Image_1.jpg differ diff --git a/public/three/examples/models/dem_e2.bin b/public/three/examples/models/dem_e2.bin new file mode 100644 index 0000000..57cbecc Binary files /dev/null and b/public/three/examples/models/dem_e2.bin differ diff --git a/public/three/examples/models/dem_e2.gltf b/public/three/examples/models/dem_e2.gltf new file mode 100644 index 0000000..590f912 --- /dev/null +++ b/public/three/examples/models/dem_e2.gltf @@ -0,0 +1,244 @@ +{ + "asset": { + "generator": "Khronos glTF Blender I/O v1.6.16", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "name": "Scene", + "nodes": [ + 2 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "name": "Mesh_0", + "scale": [ + 1, + 1, + 0.07621166110038757 + ] + }, + { + "mesh": 1, + "name": "Mesh_0.001", + "scale": [ + 1, + 1, + 0.07621166110038757 + ] + }, + { + "children": [ + 0, + 1 + ], + "name": "dem_cliped", + "rotation": [ + -0.7071068286895752, + 0, + 0, + 0.7071068286895752 + ] + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Material_0", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1 + } + }, + { + "doubleSided": true, + "name": "Material.001", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8000000715255737, + 0.3383234739303589, + 0.14309100806713104, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 1 + } + } + ], + "meshes": [ + { + "name": "Mesh_0", + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0 + } + ] + }, + { + "name": "Mesh_0.001", + "primitives": [ + { + "attributes": { + "POSITION": 4, + "NORMAL": 5, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1 + } + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "images": [ + { + "mimeType": "image/jpeg", + "name": "Image_0", + "uri": "Image_1.jpg" + } + ], + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 86745, + "max": [ + 49.69325256347656, + 41.90980529785156, + 293.9815979003906 + ], + "min": [ + -49.69325256347656, + -41.90980529785156, + 145.98324584960938 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 86745, + "type": "VEC3" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 86745, + "type": "VEC2" + }, + { + "bufferView": 3, + "componentType": 5125, + "count": 507615, + "type": "SCALAR" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 4388, + "max": [ + 49.69325256347656, + 41.90980529785156, + 293.9815979003906 + ], + "min": [ + -49.69325256347656, + -41.90980529785156, + 119.0452651977539 + ], + "type": "VEC3" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 4388, + "type": "VEC3" + }, + { + "bufferView": 6, + "componentType": 5126, + "count": 4388, + "type": "VEC2" + }, + { + "bufferView": 7, + "componentType": 5123, + "count": 6582, + "type": "SCALAR" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 1040940, + "byteOffset": 0 + }, + { + "buffer": 0, + "byteLength": 1040940, + "byteOffset": 1040940 + }, + { + "buffer": 0, + "byteLength": 693960, + "byteOffset": 2081880 + }, + { + "buffer": 0, + "byteLength": 2030460, + "byteOffset": 2775840 + }, + { + "buffer": 0, + "byteLength": 52656, + "byteOffset": 4806300 + }, + { + "buffer": 0, + "byteLength": 52656, + "byteOffset": 4858956 + }, + { + "buffer": 0, + "byteLength": 35104, + "byteOffset": 4911612 + }, + { + "buffer": 0, + "byteLength": 13164, + "byteOffset": 4946716 + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 33071, + "wrapT": 33071 + } + ], + "buffers": [ + { + "byteLength": 4959880, + "uri": "dem_e2.bin" + } + ] +} \ No newline at end of file diff --git a/src/assets/bg/bg01submenu.png b/src/assets/bg/bg01submenu.png new file mode 100644 index 0000000..f3580d0 Binary files /dev/null and b/src/assets/bg/bg01submenu.png differ diff --git a/src/assets/bg/bg02submenu.png b/src/assets/bg/bg02submenu.png new file mode 100644 index 0000000..2e3fdbb Binary files /dev/null and b/src/assets/bg/bg02submenu.png differ diff --git a/src/assets/bg/bg03submenu.png b/src/assets/bg/bg03submenu.png new file mode 100644 index 0000000..d84c8da Binary files /dev/null and b/src/assets/bg/bg03submenu.png differ diff --git a/src/assets/bg01warp.png b/src/assets/bg01warp.png new file mode 100644 index 0000000..b1d52dc Binary files /dev/null and b/src/assets/bg01warp.png differ diff --git a/src/assets/border.png b/src/assets/border.png new file mode 100644 index 0000000..b854cea Binary files /dev/null and b/src/assets/border.png differ diff --git a/src/assets/border_bg01.png b/src/assets/border_bg01.png new file mode 100644 index 0000000..04e8b56 Binary files /dev/null and b/src/assets/border_bg01.png differ diff --git a/src/assets/box_title.png b/src/assets/box_title.png new file mode 100644 index 0000000..3256be3 Binary files /dev/null and b/src/assets/box_title.png differ diff --git a/src/assets/btnBg.png b/src/assets/btnBg.png new file mode 100644 index 0000000..dedacaa Binary files /dev/null and b/src/assets/btnBg.png differ diff --git a/src/assets/defalut.png b/src/assets/defalut.png new file mode 100644 index 0000000..d3cbad0 Binary files /dev/null and b/src/assets/defalut.png differ diff --git a/src/assets/editIcon.png b/src/assets/editIcon.png new file mode 100644 index 0000000..7d6dd70 Binary files /dev/null and b/src/assets/editIcon.png differ diff --git a/src/assets/editIcon1.png b/src/assets/editIcon1.png new file mode 100644 index 0000000..758da06 Binary files /dev/null and b/src/assets/editIcon1.png differ diff --git a/src/assets/fonts/digital-7 (mono).ttf b/src/assets/fonts/digital-7 (mono).ttf new file mode 100644 index 0000000..a481b97 Binary files /dev/null and b/src/assets/fonts/digital-7 (mono).ttf differ diff --git a/src/assets/fonts/ionicons.ttf b/src/assets/fonts/ionicons.ttf new file mode 100644 index 0000000..180ce51 Binary files /dev/null and b/src/assets/fonts/ionicons.ttf differ diff --git a/src/assets/icons/earth1.png b/src/assets/icons/earth1.png new file mode 100644 index 0000000..ba35997 Binary files /dev/null and b/src/assets/icons/earth1.png differ diff --git a/src/assets/icons/earth2.png b/src/assets/icons/earth2.png new file mode 100644 index 0000000..adeb944 Binary files /dev/null and b/src/assets/icons/earth2.png differ diff --git a/src/assets/icons/hz1.png b/src/assets/icons/hz1.png new file mode 100644 index 0000000..409b095 Binary files /dev/null and b/src/assets/icons/hz1.png differ diff --git a/src/assets/icons/hz2.png b/src/assets/icons/hz2.png new file mode 100644 index 0000000..4951c1a Binary files /dev/null and b/src/assets/icons/hz2.png differ diff --git a/src/assets/icons/hz3.png b/src/assets/icons/hz3.png new file mode 100644 index 0000000..4c6123c Binary files /dev/null and b/src/assets/icons/hz3.png differ diff --git a/src/assets/icons/hz4.png b/src/assets/icons/hz4.png new file mode 100644 index 0000000..e443b94 Binary files /dev/null and b/src/assets/icons/hz4.png differ diff --git a/src/assets/icons/hz5.png b/src/assets/icons/hz5.png new file mode 100644 index 0000000..8f33f15 Binary files /dev/null and b/src/assets/icons/hz5.png differ diff --git a/src/assets/icons/hz6.png b/src/assets/icons/hz6.png new file mode 100644 index 0000000..eae5416 Binary files /dev/null and b/src/assets/icons/hz6.png differ diff --git a/src/assets/icons/level1.png b/src/assets/icons/level1.png new file mode 100644 index 0000000..9872dbe Binary files /dev/null and b/src/assets/icons/level1.png differ diff --git a/src/assets/icons/level2.png b/src/assets/icons/level2.png new file mode 100644 index 0000000..e831907 Binary files /dev/null and b/src/assets/icons/level2.png differ diff --git a/src/assets/icons/level3.png b/src/assets/icons/level3.png new file mode 100644 index 0000000..6f3786c Binary files /dev/null and b/src/assets/icons/level3.png differ diff --git a/src/assets/icons/new.png b/src/assets/icons/new.png new file mode 100644 index 0000000..28c91fa Binary files /dev/null and b/src/assets/icons/new.png differ diff --git a/src/assets/icons/举报.png b/src/assets/icons/举报.png new file mode 100644 index 0000000..95377de Binary files /dev/null and b/src/assets/icons/举报.png differ diff --git a/src/assets/icons/值班人员.png b/src/assets/icons/值班人员.png new file mode 100644 index 0000000..fe93e18 Binary files /dev/null and b/src/assets/icons/值班人员.png differ diff --git a/src/assets/icons/值班司机.png b/src/assets/icons/值班司机.png new file mode 100644 index 0000000..63fe91e Binary files /dev/null and b/src/assets/icons/值班司机.png differ diff --git a/src/assets/icons/值班领导.png b/src/assets/icons/值班领导.png new file mode 100644 index 0000000..4836a78 Binary files /dev/null and b/src/assets/icons/值班领导.png differ diff --git a/src/assets/icons/定期.png b/src/assets/icons/定期.png new file mode 100644 index 0000000..ca4e764 Binary files /dev/null and b/src/assets/icons/定期.png differ diff --git a/src/assets/icons/巡检.png b/src/assets/icons/巡检.png new file mode 100644 index 0000000..92c01c4 Binary files /dev/null and b/src/assets/icons/巡检.png differ diff --git a/src/assets/icons/已完成.png b/src/assets/icons/已完成.png new file mode 100644 index 0000000..65d6946 Binary files /dev/null and b/src/assets/icons/已完成.png differ diff --git a/src/assets/icons/报警1.png b/src/assets/icons/报警1.png new file mode 100644 index 0000000..40f599f Binary files /dev/null and b/src/assets/icons/报警1.png differ diff --git a/src/assets/icons/报警2.png b/src/assets/icons/报警2.png new file mode 100644 index 0000000..f3468b4 Binary files /dev/null and b/src/assets/icons/报警2.png differ diff --git a/src/assets/icons/新闻.png b/src/assets/icons/新闻.png new file mode 100644 index 0000000..b2448d7 Binary files /dev/null and b/src/assets/icons/新闻.png differ diff --git a/src/assets/icons/日常.png b/src/assets/icons/日常.png new file mode 100644 index 0000000..c96ab6b Binary files /dev/null and b/src/assets/icons/日常.png differ diff --git a/src/assets/icons/未完成.png b/src/assets/icons/未完成.png new file mode 100644 index 0000000..bd7503a Binary files /dev/null and b/src/assets/icons/未完成.png differ diff --git a/src/assets/icons/水库超限.png b/src/assets/icons/水库超限.png new file mode 100644 index 0000000..a42b8af Binary files /dev/null and b/src/assets/icons/水库超限.png differ diff --git a/src/assets/icons/特别提醒.png b/src/assets/icons/特别提醒.png new file mode 100644 index 0000000..ba80748 Binary files /dev/null and b/src/assets/icons/特别提醒.png differ diff --git a/src/assets/icons/电话.png b/src/assets/icons/电话.png new file mode 100644 index 0000000..3bec4f0 Binary files /dev/null and b/src/assets/icons/电话.png differ diff --git a/src/assets/icons/评分1.png b/src/assets/icons/评分1.png new file mode 100644 index 0000000..a496a97 Binary files /dev/null and b/src/assets/icons/评分1.png differ diff --git a/src/assets/icons/评分2.png b/src/assets/icons/评分2.png new file mode 100644 index 0000000..a60e688 Binary files /dev/null and b/src/assets/icons/评分2.png differ diff --git a/src/assets/line.png b/src/assets/line.png new file mode 100644 index 0000000..bf1d1f5 Binary files /dev/null and b/src/assets/line.png differ diff --git a/src/assets/loading.gif b/src/assets/loading.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/src/assets/loading.gif differ diff --git a/src/assets/loading1.gif b/src/assets/loading1.gif new file mode 100644 index 0000000..e38b181 Binary files /dev/null and b/src/assets/loading1.gif differ diff --git a/src/assets/loginBg.jpg b/src/assets/loginBg.jpg new file mode 100644 index 0000000..4259926 Binary files /dev/null and b/src/assets/loginBg.jpg differ diff --git a/src/assets/menu-dock.png b/src/assets/menu-dock.png new file mode 100644 index 0000000..9342ff6 Binary files /dev/null and b/src/assets/menu-dock.png differ diff --git a/src/assets/tbbg.png b/src/assets/tbbg.png new file mode 100644 index 0000000..9790e15 Binary files /dev/null and b/src/assets/tbbg.png differ diff --git a/src/assets/tbbg1.png b/src/assets/tbbg1.png new file mode 100644 index 0000000..d357b1c Binary files /dev/null and b/src/assets/tbbg1.png differ diff --git a/src/assets/underhand.png b/src/assets/underhand.png new file mode 100644 index 0000000..c96262b Binary files /dev/null and b/src/assets/underhand.png differ diff --git a/src/assets/水库.png b/src/assets/水库.png new file mode 100644 index 0000000..c448db6 Binary files /dev/null and b/src/assets/水库.png differ diff --git a/src/components/AdcdTreeSelect/index.js b/src/components/AdcdTreeSelect/index.js new file mode 100644 index 0000000..e2ac334 --- /dev/null +++ b/src/components/AdcdTreeSelect/index.js @@ -0,0 +1,105 @@ +import { Popover, TextField } from '@material-ui/core'; +import React, { useRef } from 'react' +import MgrTreeView from '../../layouts/mgrmui/MgrTreeView' +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import ChevronRightIcon from '@material-ui/icons/ChevronRight'; +import TreeItem from '@material-ui/lab/TreeItem'; +import useRequest from '../../utils/useRequest'; +import { adnmExact, fetchAdcdTree } from '../../models/_/adcd'; + + +function treeItems(adcdObj, endsWith, itemLabelClicked) { + const noChildren = ( + !adcdObj.children || + adcdObj.children.length === 0 || + (endsWith && !adcdObj.ADCD.endsWith(endsWith + '000')) + ); + + let children = null; + if (!noChildren) { + children = adcdObj.children.map(o => treeItems(o, endsWith, itemLabelClicked)) + } + + return ( + + {children} + + ) +} + +function AdcdTreeSelect({ rootAdcd, endsWith, onChange, maxHeight, value, variant, label, fullWidth, helperText }) { + + const [treeAnchorEl, setTreeAnchorEl] = React.useState(null); + const rootRef = useRef(null); + const width = rootRef.current ? rootRef.current.offsetWidth : 100; + if (width < 100) { + width = 100; + } + + const { data } = useRequest(fetchAdcdTree, rootAdcd); + + const handleClick = (event) => { + event.preventDefault(); + setTreeAnchorEl(rootRef.current || event.currentTarget); + }; + + const handleClose = () => { + setTreeAnchorEl(null); + }; + + const onNodeSelect = (event, value) => { + onChange && onChange(value); + } + + const itemLabelClicked = (e) => { + e.preventDefault(); + setTreeAnchorEl(null); + } + + return ( +
+ + +
+
+ { + data ? ( + } + defaultExpandIcon={} + defaultExpanded={[data.ADCD]} + onNodeSelect={onNodeSelect} + > + {treeItems(data, endsWith, itemLabelClicked)} + + ) : null + } +
+
+
+
+ ) +} + +export default AdcdTreeSelect; diff --git a/src/components/Crud/BasicCrudModal.js b/src/components/Crud/BasicCrudModal.js new file mode 100644 index 0000000..bcb8fb9 --- /dev/null +++ b/src/components/Crud/BasicCrudModal.js @@ -0,0 +1,143 @@ +import React from 'react'; +import { STR_EDIT, STR_SAVE, STR_DEL, STR_RESTORE } from './_'; +import DpPaperComponent from '../../layouts/mui/DpPaperCompanent'; +import DpBackgroundDrop from '../../layouts/mui/DpBackdrop'; +import { Dialog, Snackbar, Typography } from '@material-ui/core'; +import DpAppBar from '../../layouts/mui/DpAppBar'; +import DpCloseButton from '../../layouts/mui/DpCloseButton'; +import { Alert } from '@material-ui/lab'; + + +class BasicCrudModal extends React.Component { + constructor(props) { + super(props); + + this.state = { + record: null, + open: false, + mode: null, + message: null, + }; + } + + showEdit(record) { + this.setState({ record, open: true, mode: STR_EDIT }); + } + + showSave(record) { + record = record || {}; + this.setState({ record, open: true, mode: STR_SAVE }); + } + + onEdit = (values) => { + this.props.service.edit(values).then((result) => { + if (result) { + this.setState({ open: false, message: { type: 'success', content: '操作成功' } }); + if (this.props.onCrudSuccess) { + this.props.onCrudSuccess(STR_EDIT, result); + } + } else { + this.setState({ message: { type: 'error', content: '操作失败' } }); + } + }) + } + + onSave = (values) => { + this.props.service.save(values).then((result) => { + if (result) { + this.setState({ open: false, message: { type: 'success', content: '操作成功' } }); + if (this.props.onCrudSuccess) { + this.props.onCrudSuccess(STR_SAVE, result); + } + } else { + this.setState({ message: { type: 'error', content: '操作失败' } }); + } + }) + } + + onDelete = (values) => { + this.props.service.del(values).then((result) => { + if (result) { + this.setState({ open: false, message: { type: 'success', content: '操作成功' } }); + if (this.props.onCrudSuccess) { + this.props.onCrudSuccess(STR_DEL, result); + } + } else { + this.setState({ message: { type: 'error', content: '操作失败' } }); + } + }) + } + + onRestore = (values) => { + this.props.service.restore(values).then((result) => { + if (result) { + this.setState({ open: false, message: { type: 'success', content: '操作成功' } }); + if (this.props.onCrudSuccess) { + this.props.onCrudSuccess(STR_RESTORE, result); + } + } else { + this.setState({ message: { type: 'error', content: '操作失败' } }); + } + }) + } + + handleCloseMessage = () => { + this.setState({ + message: null, + }) + } + + onClose = () => { + this.setState({ open: false }) + } + + render() { + const { record, open, mode, message } = this.state; + const { title, formProps, component: Component } = this.props; + + return ( + <> + { + record && open ? ( + +
+ + + {`${mode === STR_SAVE ? '增加' : '修改'}${title}`} + + + + +
+
+ ) : null + } + + + { + message ? ( + + {message?.content} + + ) : null + } + + + ); + } +} + +export default BasicCrudModal; diff --git a/src/components/Crud/CrudOpRender.js b/src/components/Crud/CrudOpRender.js new file mode 100644 index 0000000..44655d5 --- /dev/null +++ b/src/components/Crud/CrudOpRender.js @@ -0,0 +1,31 @@ +import { Button, IconButton } from '@material-ui/core'; +import { Delete, Edit, Restore } from '@material-ui/icons'; +import React from 'react'; + +export default function CrudOpRender({ command, edit, del, restore }) { + return ( +
+ { + edit ? ( + + + + ) : null + } + { + restore ? ( + + + + ) : null + } + { + del ? ( + + + + ) : null + } +
+ ) +} diff --git a/src/components/Crud/_.js b/src/components/Crud/_.js new file mode 100644 index 0000000..c9ff64d --- /dev/null +++ b/src/components/Crud/_.js @@ -0,0 +1,65 @@ +const { httpget, httppost } = require("../../utils/request"); + + +const SORT_ORDER_MAP = { + ascend: 'asc', + descend: 'desc', +}; + + +export const STR_SAVE = 'save'; +export const STR_EDIT = 'edit'; +export const STR_DEL = 'del'; +export const STR_RESTORE = 'restore'; +export const STR_FIND = 'find'; + +export async function paginate(url, params = {}) { + const { pageNumber, pageSize, sort, search } = params; + + const reqParams = { + ...search, + page: pageNumber, + size: pageSize, + }; + + if (sort && sort.field) { + reqParams.sort_field = sort.field; + reqParams.sort_order = SORT_ORDER_MAP[sort.order] || 'asc'; + } + + const result = await httpget(url, reqParams); + if (result && result.data) { + const { data } = result; + return data; + } + + return { list: [], totalRow: 0 }; +} + +export function createCrudService(urlSet) { + const save = async (params) => { + const { code } = await httppost(urlSet[STR_SAVE], params) || {}; + return code === 200; + } + + const edit = async (params) => { + const { code } = await httppost(urlSet[STR_EDIT], params) || {}; + return code === 200; + } + + const del = async (params) => { + const { code } = await httppost(urlSet[STR_DEL], params) || {}; + return code === 200; + } + + const find = async (params) => { + return paginate(urlSet[STR_FIND], params); + } + + return { + [STR_SAVE]: save, + [STR_EDIT]: edit, + [STR_DEL]: del, + [STR_FIND]: find, + } +} diff --git a/src/components/Crud/usePageTableMui.js b/src/components/Crud/usePageTableMui.js new file mode 100644 index 0000000..1be6455 --- /dev/null +++ b/src/components/Crud/usePageTableMui.js @@ -0,0 +1,77 @@ +import { useState, useRef, useEffect } from 'react'; + + +function labelDisplayedRows({ from, to, count }) { + return `${from}-${to} / ${count}`; +} + +const usePageTableMui = (service, { defaultParams, defaultPageSize, defaultSort } = {}) => { + + const [state, setState] = useState(() => ({ + data: [], + total: 0, + loading: false, + pageSize: defaultPageSize || 10, + pageNumber: 0, + sort: defaultSort, + params: defaultParams || {}, + })); + + const abort = useRef(false); + useEffect(() => { + search(); + return () => { abort.current = true; } + }, []); + + const search = (opt) => { + opt = opt || {}; + setState(s => ({ ...s, loading: true })); + const pageParams = { + pageNumber: opt?.pageNumber ?? state.pageNumber, + pageSize: opt?.pageSize ?? state.pageSize, + sort: opt?.sort ?? state.sort, + params: opt?.params ?? state.params, + }; + service({ + pageNumber: pageParams.pageNumber + 1, + pageSize: pageParams.pageSize, + sort: pageParams.sort, + search: pageParams.params + }).then((data) => { + if (!abort.current) { + setState({ + ...pageParams, + data: data.list, + total: data.totalRow, + loading: false, + }) + } + }); + } + + const onChangePage = (event, newPage) => { + search({ pageNumber: newPage }); + }; + + const onChangeRowsPerPage = (event, val) => { + search({ pageSize: parseInt(event.target.value, 10), pageNumber: 0 }); + }; + + return { + pagination: { + rowsPerPage: state.pageSize, + page: state.pageNumber, + count: state.total, + rowsPerPageOptions: ['10', '20', '50', '100'], + labelDisplayedRows, + onChangePage, + onChangeRowsPerPage, + }, + loading: state.loading, + dataSource: state.data, + search: (params) => search({ pageNumber: 0, params }), + refresh: search, + } +} + +export default usePageTableMui diff --git a/src/components/DamGraph/CoordTrans.js b/src/components/DamGraph/CoordTrans.js new file mode 100644 index 0000000..e3ae347 --- /dev/null +++ b/src/components/DamGraph/CoordTrans.js @@ -0,0 +1,23 @@ +/* eslint-disable no-debugger */ +/* eslint-disable prefer-destructuring */ +class CoordTrans { + constructor(imgBound, geoBound) { + this._ix0 = imgBound[0]; + this._iy0 = imgBound[1]; + this._gx0 = geoBound[0]; + this._gy0 = geoBound[3]; + + this._sx = (imgBound[2] - imgBound[0]) / (geoBound[2] - geoBound[0]); + this._sy = (imgBound[1] - imgBound[3]) / (geoBound[3] - geoBound[1]); + } + + geo2imgX(val) { + return parseInt(this._ix0 + ((val - this._gx0) * this._sx) + 0.5, 10); + } + + geo2imgY(val) { + return parseInt(this._iy0 + ((val - this._gy0) * this._sy) + 0.5, 10); + } +} + +export default CoordTrans; diff --git a/src/components/DamGraph/DamData.js b/src/components/DamGraph/DamData.js new file mode 100644 index 0000000..504a540 --- /dev/null +++ b/src/components/DamGraph/DamData.js @@ -0,0 +1,67 @@ +/* eslint-disable no-debugger */ +/* eslint-disable prefer-destructuring */ +class DamData { + constructor({ stnm, damel, ddz, fsltdz, zcxsw }) { + this.stnm = stnm; + this.damel = damel; + this.ddz = ddz; + this.fsltdz = fsltdz; + this.zcxsw = zcxsw; + + this._shapePts = []; + this._bound = null; + } + + setDamShape(pts) { + if (pts.length < 2) { + return false; + } + const bound = [pts[0][0], pts[0][1], pts[0][0], pts[0][1]]; + for (const pt of pts) { + this._shapePts.push([pt[0], pt[1]]); + if (bound[0] > pt[0]) { + bound[0] = pt[0]; + } + if (bound[1] > pt[1]) { + bound[1] = pt[1]; + } + if (bound[2] < pt[0]) { + bound[2] = pt[0]; + } + if (bound[3] < pt[1]) { + bound[3] = pt[1]; + } + } + this._bound = bound; + return true; + } + + getDamShape() { + return this._shapePts.map(o => o); + } + + getBound() { + return this._bound.map(o => o); + } + + caculteShps(rz) { + const [x0, y0] = this._shapePts[0]; + const [x1, y1] = this._shapePts[1]; + const x = x0 + (((rz - y0) / (y1 - y0)) * (x1 - x0)); + + const fsltdzX = x0 + (((this.fsltdz - y0) / (y1 - y0)) * (x1 - x0)); + const zcxswX = x0 + (((this.zcxsw - y0) / (y1 - y0)) * (x1 - x0)); + + const gw = this._bound[2] - this._bound[0]; + + return { + rzShp: [[this._bound[0], rz], [x, rz], [x0, y0], [this._bound[0], y0]], + ddz: [[this._bound[0], this.ddz], [gw * 0.2, this.ddz]], + damel: [this._bound[2], this.damel], + fsltdz: [[fsltdzX, this.fsltdz], [fsltdzX - (gw * 0.2), this.fsltdz]], + zcxsw: [[zcxswX, this.zcxsw], [zcxswX + (gw * 0.1), this.zcxsw]], + }; + } +} + +export default DamData; diff --git a/src/components/DamGraph/DamGraph.js b/src/components/DamGraph/DamGraph.js new file mode 100644 index 0000000..43a4248 --- /dev/null +++ b/src/components/DamGraph/DamGraph.js @@ -0,0 +1,159 @@ +import Raphael from 'raphael'; + +import CoordTrans from './CoordTrans'; + +const GRAPH_MARGIN = [10, 60, 20, 0]; + + +class DamGraph { + constructor(canvasId, width, height) { + this._width = width; + this._height = height; + this._paper = Raphael(canvasId, width, height); + } + + linePath(pts, styles, options) { + options = options || {}; + const closed = options.closed || (pts[0][0] === pts[pts.length - 1][0] && pts[0][1] === pts[pts.length - 1][1]); + const ret = []; + for (let i = 0; i < pts.length; i += 1) { + const pt0 = pts[i]; + if (i === 0) { + ret.push(`M ${this._trans.geo2imgX(pt0[0])} ${this._trans.geo2imgY(pt0[1])}`); + } else if (pt0.length === 2) { + ret.push(`L ${this._trans.geo2imgX(pt0[0])} ${this._trans.geo2imgY(pt0[1])}`); + } else if (pt0[0] === 'Q') { + ret.push(`Q${this._trans.geo2imgX(pt0[1])} ${this._trans.geo2imgY(pt0[2])} ${this._trans.geo2imgX(pt0[3])} ${this._trans.geo2imgY(pt0[4])}`); + } + } + if (closed) { + ret.push('Z'); + } + const shp = this._paper.path(ret.join('')); + for (const key in styles) { + shp.attr(key, styles[key]); + } + return shp; + } + rulerPath() { + const rulerWidth = 4; + const x0 = GRAPH_MARGIN[0] - (rulerWidth / 2); + const x1 = x0 - rulerWidth; + const numsection = 40; + const step = this._height / numsection; + const ret = []; + for (let i = 0; i < numsection; i += 1) { + const y0 = step * i; + const y1 = y0 + step; + const x = i % 2 ? x0 : x1; + ret.push(`M${x} ${y0}L${x} ${y1}`); + } + const shp = this._paper.path(ret.join('')); + shp.attr('stroke-width', rulerWidth); + shp.attr('stroke', 'gray'); + return shp; + } + textElement(x, y, txt, styles, options) { + options = options || {}; + const offX = options.offX || 0; + const offY = options.offY || 0; + if (!options.imgCoord) { + x = this._trans.geo2imgX(x); + y = this._trans.geo2imgY(y); + } + const shp = this._paper.text(x + offX, y + offY, txt); + for (const key in styles) { + shp.attr(key, styles[key]); + } + return shp; + } + markerElement(x, y) { + const shp = this._paper.circle(this._trans.geo2imgX(x), this._trans.geo2imgY(y), 5); + shp.attr('stroke-width', 3); + shp.attr('stroke', '#68c7ff'); + shp.attr('fill', 'white'); + return shp; + } + + render(damObj, { rz }) { + this._paper.clear(); + this._trans = new CoordTrans([GRAPH_MARGIN[0], GRAPH_MARGIN[1], this._width - GRAPH_MARGIN[2], this._height - GRAPH_MARGIN[3]], damObj.getBound()); + + // 断面轮廓 + this.linePath(damObj.getDamShape(), { + 'stroke-width': 1, + fill: '#e9e9e9', + }, { + closed: true, + }); + + this.textElement(GRAPH_MARGIN[0] + 5, 20, damObj.stnm, { + 'text-anchor': 'start', + 'font-size': 22, + }, { imgCoord: true }); + + const dataShps = damObj.caculteShps(rz); + if (dataShps) { + // 水位 + this.linePath(dataShps.rzShp, { + 'stroke-width': 0, + gradient: '90-#daedfa-#49519e', + }, { closed: true }); + this.textElement(GRAPH_MARGIN[0], this._trans.geo2imgY(rz), rz.toFixed(2), { + 'text-anchor': 'start', + 'font-size': 18, + fill: '#1a49c0', + }, { imgCoord: true, offY: -10 }); + + // 死水位 + this.linePath(dataShps.ddz, { + 'stroke-width': 0.5, + stroke: 'red', + }); + this.textElement(dataShps.ddz[0][0], dataShps.ddz[0][1], `死水位:${damObj.ddz.toFixed(2)}`, { + 'text-anchor': 'start', + 'font-size': 12, + fill: 'red', + }, { offY: -8 }); + + // 汛限水位 + this.linePath(dataShps.fsltdz, { + 'stroke-width': 0.5, + stroke: 'red', + }); + this.textElement(dataShps.fsltdz[0][0], dataShps.fsltdz[0][1], `汛限水位:${damObj.fsltdz.toFixed(2)}`, { + 'text-anchor': 'end', + 'font-size': 12, + fill: 'red', + }, { offY: -8 }); + + // 正常蓄水位 + this.linePath(dataShps.zcxsw, { + 'stroke-width': 0.5, + }); + this.textElement(dataShps.zcxsw[0][0], dataShps.zcxsw[0][1], `正常蓄水位:${damObj.zcxsw.toFixed(2)}`, { + 'text-anchor': 'start', + 'font-size': 12, + }, { offY: 8 }); + + // 坝顶高程 + this.textElement(dataShps.damel[0], dataShps.damel[1], `坝顶高程:${damObj.damel.toFixed(2)}`, { + 'text-anchor': 'end', + 'font-size': 12, + }, { offY: -8 }); + } + + // 标尺 + this.rulerPath(); + } + + clear() { + this._paper.clear(); + } + + destroy() { + this._paper.remove(); + } +} + +export default DamGraph; diff --git a/src/components/DamGraph/DamImage.js b/src/components/DamGraph/DamImage.js new file mode 100644 index 0000000..4688537 --- /dev/null +++ b/src/components/DamGraph/DamImage.js @@ -0,0 +1,211 @@ +import DamData from "./DamData"; +import CoordTrans from './CoordTrans'; + +const GRAPH_MARGIN = [10, 40, 5, 0]; + + +function fillPath({ trans, ctx, pts, stroke }) { + ctx.beginPath(); + for (let i = 0; i < pts.length; i += 1) { + const pt0 = pts[i]; + if (i === 0) { + ctx.moveTo(trans.geo2imgX(pt0[0]), trans.geo2imgY(pt0[1])); + } else { + ctx.lineTo(trans.geo2imgX(pt0[0]), trans.geo2imgY(pt0[1])); + } + } + ctx.closePath(); + if (stroke) { + ctx.stroke(); + } + ctx.fill() +} + +function strokePath({ trans, ctx, pts }) { + ctx.beginPath(); + for (let i = 0; i < pts.length; i += 1) { + const pt0 = pts[i]; + if (i === 0) { + ctx.moveTo(trans.geo2imgX(pt0[0]), trans.geo2imgY(pt0[1])); + } else { + ctx.lineTo(trans.geo2imgX(pt0[0]), trans.geo2imgY(pt0[1])); + } + } + ctx.stroke() +} + +/* +function render(damObj, { rz }) { + + const dataShps = damObj.caculteShps(rz); + if (dataShps) { + // 水位 + this.linePath(dataShps.rzShp, { + 'stroke-width': 0, + gradient: '90-#daedfa-#49519e', + }, { closed: true }); + this.textElement(GRAPH_MARGIN[0], this._trans.geo2imgY(rz), rz.toFixed(2), { + 'text-anchor': 'start', + 'font-size': 18, + fill: '#1a49c0', + }, { imgCoord: true, offY: -10 }); + + // 死水位 + this.linePath(dataShps.ddz, { + 'stroke-width': 0.5, + stroke: 'red', + }); + this.textElement(dataShps.ddz[0][0], dataShps.ddz[0][1], `死水位:${damObj.ddz.toFixed(2)}`, { + 'text-anchor': 'start', + 'font-size': 12, + fill: 'red', + }, { offY: -8 }); + + // 汛限水位 + this.linePath(dataShps.fsltdz, { + 'stroke-width': 0.5, + stroke: 'red', + }); + this.textElement(dataShps.fsltdz[0][0], dataShps.fsltdz[0][1], `汛限水位:${damObj.fsltdz.toFixed(2)}`, { + 'text-anchor': 'end', + 'font-size': 12, + fill: 'red', + }, { offY: -8 }); + + // 正常蓄水位 + this.linePath(dataShps.zcxsw, { + 'stroke-width': 0.5, + }); + this.textElement(dataShps.zcxsw[0][0], dataShps.zcxsw[0][1], `正常蓄水位:${damObj.zcxsw.toFixed(2)}`, { + 'text-anchor': 'start', + 'font-size': 12, + }, { offY: 8 }); + + // 坝顶高程 + this.textElement(dataShps.damel[0], dataShps.damel[1], `坝顶高程:${damObj.damel.toFixed(2)}`, { + 'text-anchor': 'end', + 'font-size': 12, + }, { offY: -8 }); + } + + // 标尺 + this.rulerPath(); +} +*/ + +export default function genDamImage(data, width, height) { + const c = document.createElement('canvas'); + c.width = width; + c.height = height; + const ctx = c.getContext('2d'); + + + ctx.fillStyle = "#fffc"; + ctx.fillRect(0, 0, width, height); + + + const { stnm, damel, ddz, fsltdz, zcxsw } = data || {}; + if (!damel || !ddz || damel <= ddz) { + ctx.font = '20px serif'; + ctx.fillStyle = "#000"; + ctx.fillText((stnm || '-') + '(水库基础数据异常)', GRAPH_MARGIN[0] + 4, 24); + + return c.toDataURL(); + } + + const y0 = ddz - ((damel - ddz) * 0.1); + + const shape = [[20, y0], [40, damel], [55, damel], [55, y0], [0, y0]]; + + const damObj = new DamData({ stnm, damel, ddz, fsltdz, zcxsw }); + damObj.setDamShape(shape); + + const trans = new CoordTrans([GRAPH_MARGIN[0], GRAPH_MARGIN[1], width - GRAPH_MARGIN[2], height - GRAPH_MARGIN[3]], damObj.getBound()); + const dataShps = damObj.caculteShps(data.rz); + + { + // 标题 + ctx.font = '20px serif'; + ctx.fillStyle = "#000"; + ctx.fillText(damObj.stnm, GRAPH_MARGIN[0] + 4, 24); + + // 水位 + var waterGradient = ctx.createLinearGradient(0, 0, 0, 500); + waterGradient.addColorStop(1, "#daedfa"); + waterGradient.addColorStop(0, "#49519e"); + ctx.fillStyle = waterGradient; + fillPath({ ctx, trans, pts: dataShps.rzShp }); + + ctx.font = '18px serif'; + ctx.fillStyle = "#1a49c0"; + ctx.fillText(data.rz.toFixed(2), GRAPH_MARGIN[0] + 4, trans.geo2imgY(data.rz) - 5); + + + // 横断面 + ctx.lineWidth = 3; + ctx.strokeStyle = "#444"; + ctx.fillStyle = "#ddd"; + + fillPath({ ctx, trans, pts: damObj.getDamShape(), stroke: true }); + + + // 死水位 + ctx.strokeStyle = 'red'; + ctx.lineWidth = 0.5; + strokePath({ ctx, trans, pts: dataShps.ddz }); + + ctx.font = '16px serif'; + ctx.fillStyle = 'red'; + ctx.fillText( + `死水位:${damObj.ddz.toFixed(2)}`, + trans.geo2imgX(dataShps.ddz[0][0]) + 4, + trans.geo2imgY(dataShps.ddz[0][1]) - 5); + + + // 汛限水位 + strokePath({ ctx, trans, pts: dataShps.fsltdz }); + ctx.textAlign = "right"; + ctx.fillText( + `汛限水位:${damObj.fsltdz.toFixed(2)}`, + trans.geo2imgX(dataShps.fsltdz[0][0]), + trans.geo2imgY(dataShps.fsltdz[0][1]) - 5); + + + // 正常蓄水位 + ctx.strokeStyle = '#000'; + ctx.lineWidth = 0.5; + strokePath({ ctx, trans, pts: dataShps.zcxsw }); + + ctx.font = '16px serif'; + ctx.fillStyle = '#000'; + ctx.textAlign = "left"; + ctx.fillText( + `正常蓄水位:${damObj.zcxsw.toFixed(2)}`, + trans.geo2imgX(dataShps.zcxsw[0][0]), + trans.geo2imgY(dataShps.zcxsw[0][1]) + 16); + + + ctx.textAlign = "right"; + ctx.fillText( + `坝顶高程:${damObj.damel.toFixed(2)}`, + trans.geo2imgX(dataShps.damel[0]), + trans.geo2imgY(dataShps.damel[1]) - 5); + + ctx.lineCap = 'butt'; + ctx.strokeStyle = "#444"; + ctx.lineWidth = GRAPH_MARGIN[0] / 2; + const x1 = GRAPH_MARGIN[0] / 4; + const x2 = x1 + GRAPH_MARGIN[0] / 2; + const step = 12; + let isLeft = false; + for (let i = 0; i < height; i += step) { + ctx.beginPath(); + ctx.moveTo(isLeft ? x1 : x2, i); + ctx.lineTo(isLeft ? x1 : x2, i + step); + ctx.stroke(); + isLeft = !isLeft; + } + } + + return c.toDataURL(); +} \ No newline at end of file diff --git a/src/components/DamGraph/index.js b/src/components/DamGraph/index.js new file mode 100644 index 0000000..d2874ef --- /dev/null +++ b/src/components/DamGraph/index.js @@ -0,0 +1,93 @@ +/* eslint-disable no-debugger */ +import React from 'react'; + +import DamGraph from './DamGraph'; +import DamData from './DamData'; + +let __factory_index = 1; + +/** + * 渗压控件 + * + * todo: 支持resize + */ +class DamSyCtrl extends React.Component { + constructor(props) { + super(props); + + this._isMounted = true; + this.ctrlId = `damgraph_${__factory_index}`; + __factory_index += 1; + this.ctrl = null; + + this._width = props.width; + this._height = props.height; + this._data = props.data; + + this._damObj = null; + } + + componentDidMount = () => { + this.ctrl = new DamGraph(this.ctrlId, this._width, this._height); + this.renderData(); + } + + componentWillReceiveProps({ data }) { + if (this._data !== data) { + this._data = data; + this.renderData(); + } + } + + shouldComponentUpdate() { + return false; + } + + componentWillUnmount = () => { + this._isMounted = false; + + if (this.ctrl != null) { + this.ctrl.destroy(); + } + } + + _createDamData() { + const { stnm, damel, ddz, fsltdz, zcxsw } = this._data || {}; + if (!damel || !ddz) { + return; + } + + const y0 = ddz - ((damel - ddz) * 0.1); + + const shape = [[20, y0], [40, damel], [55, damel], [55, y0], [0, y0]]; + + this._damObj = new DamData({ stnm, damel, ddz, fsltdz, zcxsw }); + this._damObj.setDamShape(shape); + } + + /** + * @param {*} obj.rz + * @param {*} obj.shape + * @param {*} obj.pts + * @param {*} obj.ommts + * @param {*} obj.hscd + */ + renderData() { + this._createDamData(); + + if (this.ctrl) { + this.ctrl.clear(); + if (this._damObj) { + this.ctrl.render(this._damObj, this._data); + } + } + } + + render() { + return ( +
+ ); + } +} + +export default DamSyCtrl; diff --git a/src/components/DataPreload/index.js b/src/components/DataPreload/index.js new file mode 100644 index 0000000..a39eba1 --- /dev/null +++ b/src/components/DataPreload/index.js @@ -0,0 +1,20 @@ +import React, { useEffect, useState } from 'react'; +import { initAdcd } from '../../models/_/adcd'; + +function DataPreload({ children }) { + const [state, setState] = useState(false); + + useEffect(() => { + initAdcd().then(() => { + setState(true); + }); + }, []); + + if (!state) { + return null; + } + + return children; +} + +export default DataPreload; diff --git a/src/components/Loading/index.js b/src/components/Loading/index.js new file mode 100644 index 0000000..a137443 --- /dev/null +++ b/src/components/Loading/index.js @@ -0,0 +1,44 @@ +import { makeStyles, Typography } from '@material-ui/core'; +import React, { useEffect, useReducer } from 'react'; + +const useStyles = makeStyles({ + root: { + position: 'absolute', + top: 0, + right: 0, + left: 0, + bottom: 0, + background: '#000', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'column', + color: '#fff', + + '& > h1': { + fontSize: '4rem', + lineHeight: 3, + color: '#00deff', + letterSpacing: '0.2rem', + textShadow: '0 0 2rem #00deff', + }, + + '& > h5': { + fontSize: '1rem', + lineHeight: 3, + color: '#00deff', + }, + }, +}) + +const Loading = () => { + const classes = useStyles(); + + return ( +
+
载入中
+
+ ) +} + +export default Loading; diff --git a/src/components/RpfChart/index.js b/src/components/RpfChart/index.js new file mode 100644 index 0000000..07ba525 --- /dev/null +++ b/src/components/RpfChart/index.js @@ -0,0 +1,239 @@ +import React, { useEffect, useRef } from 'react'; + +class RpfChartInfo { + constructor(rpfInfo, dmInfo) { + this.maxFlow = 0; + this.maxPop = 0; + this.minRz = 9999; + this.maxRz = 0; + + for (const data of rpfInfo) { + if (data.flow > this.maxFlow) { + this.maxFlow = data.flow; + } + if (data.pop > this.maxPop) { + this.maxPop = data.pop; + } + if (data.rz > this.maxRz) { + this.maxRz = data.rz; + } + if (data.rz < this.minRz) { + this.minRz = data.rz; + } + } + + for (const coordE of dmInfo.geometry.extra) { + if (coordE[1] < this.minRz) { + this.minRz = coordE[1]; + } + } + } + + getFlowRange() { + return [0, this.maxFlow]; + } + getPopRange() { + return [0, this.maxPop]; + } + getRzRange() { + return [Math.floor(this.minRz), Math.ceil(this.maxRz)]; + } + getMinRz() { + return this.minRz; + } +} + + +export class PredictionCaculator { + constructor(sjbycgb, rpfInfo) { + this._data = {}; + for (const rec of sjbycgb) { + this._data[rec.minutes] = [rec.v5, rec.v10, rec.v20, rec.v50, rec.v100]; + } + + this._valid = true; + const data = rpfInfo.filter(({ rp }) => + rp === 5 || rp === 10 || rp === 20 || rp === 50 || rp === 100); + if (data.length !== 5) { + this._valid = false; + } + this._rpf = data; + } + + getDrpRange(tmType) { + const rec = this._data[tmType]; + if (!rec) { + return null; + } + return { min: rec[0], max: rec[4] }; + } + + caculate(tmType, drp) { + const rec = this._data[tmType]; + if (!rec || !this._valid) { + return null; + } + + if (drp < rec[0]) { + return { result: -1 }; + } else if (drp > rec[4]) { + return { result: 1 }; + } + + let section = -1; + let ratio; + for (let i = 0; i < 4; i += 1) { + const drp0 = rec[i]; + const drp1 = rec[i + 1]; + if (drp0 <= drp && drp1 >= drp) { + section = i; + ratio = (drp - drp0) / (drp1 - drp0); + break; + } + } + if (section === -1) { + return { result: -2 }; + } + + const rpf = this._rpf; + const rz1 = rpf[section].rz; + const rz2 = rpf[section + 1].rz; + let drpRz = rz1 + ((rz2 - rz1) * ratio); + drpRz = parseFloat(drpRz.toFixed(2)); + + const pop1 = rpf[section].pop; + const pop2 = rpf[section + 1].pop; + let drpPop = pop1 + ((pop2 - pop1) * ratio); + drpPop = parseInt(drpPop + 0.5, 10); + + const flow1 = rpf[section].flow; + const flow2 = rpf[section + 1].flow; + let drpFlow = flow1 + ((flow2 - flow1) * ratio); + drpFlow = parseFloat(drpFlow.toFixed(2)); + + return { + result: 0, + drpRz, + drpPop, + drpFlow, + }; + } +} + + +export function renderChart(selector, rpfInfo, dmInfo, preData) { + const chartInfo = new RpfChartInfo(rpfInfo, dmInfo); + const data = [{ + rz: chartInfo.getMinRz(), + flow: 0, + pop: 0, + }, ...rpfInfo]; + + const d3 = window.d3; + + const svg = d3.select(selector); + const w = parseInt(svg.style('width'), 10); + const h = parseInt(svg.style('height'), 10); + svg.selectAll('*').remove(); + + const xscaleFlow = d3.scaleLinear() + .domain(chartInfo.getFlowRange()) + .range([w / 2, w - 20]); + svg.append('g').attr('class', 'd3axisWhite') + .attr('transform', `translate(0,${h - 20})`) + .call(d3.axisBottom(xscaleFlow).ticks(4)); + + const xscalePop = d3.scaleLinear() + .domain(chartInfo.getPopRange()) + .range([w / 2, 20]); + svg.append('g').attr('class', 'd3axisWhite') + .attr('transform', `translate(0,${h - 20})`) + .call(d3.axisBottom(xscalePop).ticks(4)); + + const yscale = d3.scaleLinear() + .domain(chartInfo.getRzRange()) + .range([h - 20, 20]); + svg.append('g').attr('class', 'd3axisWhite') + .attr('transform', `translate(${w / 2},0)`) + .call(d3.axisLeft(yscale).ticks(5)); + + const lineFlow = d3.line() + .x(d => xscaleFlow(d.flow)) + .y(d => yscale(d.rz)); + svg.append('path') + .attr('d', lineFlow(data)) + .attr('stroke', '#69a5f1') + .attr('stroke-width', 2) + .attr('fill', 'none'); + + const linePop = d3.line() + .x(d => xscalePop(d.pop)) + .y(d => yscale(d.rz)); + svg.append('path') + .attr('d', linePop(data)) + .attr('stroke', '#ff9697') + .attr('stroke-width', 2) + .attr('fill', 'none'); + + svg.append('text').attr('fill', '#ccc').attr('x', 20).attr('y', h - 25).text('累计人口(人)'); + svg.append('text').attr('fill', '#ccc').attr('x', w - 80).attr('y', h - 25).text('流量(m³/s)'); + svg.append('text').attr('fill', '#ccc').attr('x', w / 2 + 2).attr('y', 25).text('水位(m)'); + + if (preData && preData.result === 0) { + const { drpRz, drpFlow, drpPop } = preData; + + const lineDrpRz = d3.line() + .x(d => 20 + d * (w - 40)) + .y(() => yscale(drpRz)); + svg.append('path') + .attr('d', lineDrpRz([0, 1])) + .attr('stroke', '#ff9697') + .attr('stroke-width', 1) + .attr('fill', 'none'); + svg.append('text') + .attr('x', w - 120) + .attr('y', yscale(drpRz) + 14) + .attr('fill', '#ff9697') + .text(`预测水位:${drpRz.toFixed(2)}`); + + svg.append('circle') + .attr('cx', xscaleFlow(drpFlow)) + .attr('cy', yscale(drpRz)) + .attr('r', 4) + .attr('fill', '#69a5f1'); + svg.append('text') + .attr('x', xscaleFlow(drpFlow) - 40) + .attr('y', yscale(drpRz)) + .attr('fill', '#69a5f1') + .text(drpFlow.toFixed(2)); + + svg.append('circle') + .attr('cx', xscalePop(drpPop)) + .attr('cy', yscale(drpRz)) + .attr('r', 4) + .attr('fill', '#ff9697'); + svg.append('text') + .attr('x', xscalePop(drpPop)) + .attr('y', yscale(drpRz) - 2) + .attr('fill', '#ff9697') + .text(drpPop.toFixed(0)); + } + + return svg; +} + + +export default function RpfChart({ data, preData, ...props }) { + + const canvasRef = useRef(); + + useEffect(() => { + if (data && data.hdm && data.rpf) { + renderChart(canvasRef.current, data.rpf, data.hdm, preData); + } + }, [preData, data]); + + return ( + + ); +} \ No newline at end of file diff --git a/src/components/ScrollReset/index.js b/src/components/ScrollReset/index.js new file mode 100644 index 0000000..d912714 --- /dev/null +++ b/src/components/ScrollReset/index.js @@ -0,0 +1,14 @@ +import { useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; + +const ScrollReset = () => { + const location = useLocation(); + + useEffect(() => { + window.scrollTo(0, 0); + }, [location.pathname]); + + return null; +}; + +export default ScrollReset; diff --git a/src/components/SocketIOFrame/index.js b/src/components/SocketIOFrame/index.js new file mode 100644 index 0000000..723c72b --- /dev/null +++ b/src/components/SocketIOFrame/index.js @@ -0,0 +1,58 @@ +import React from 'react'; + + +export default class SocketIOFrame extends React.Component { + constructor(props) { + super(props); + + this.valid = !window.__socketIoCtx; + + window.__socketIoCtx = { + onMessage: this.onMessage, + onError: this.onError, + onLoad: props.onLoad, + }; + } + + componentDidMount() { + if (!this.valid) { + console.log('code error: context duplicated'); + } + } + + componentWillUnmount() { + window.__socketIoCtx = null; + } + + onMessage = (type, obj) => { + console.log(type, obj); + if (this.props[type]) { + this.props[type](obj); + } + } + + onError = (error) => { + console.log(error); + } + + sendCmd = (cmd) => { + this.refs.iframe.contentWindow.sendCmd(cmd); + } + + render() { + return ( +
+